--- parser3/src/classes/int.C 2001/10/09 07:06:00 1.35 +++ parser3/src/classes/int.C 2002/04/18 10:50:59 1.44 @@ -1,10 +1,10 @@ /** @file Parser: @b int parser class. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) - $Id: int.C,v 1.35 2001/10/09 07:06:00 parser Exp $ + $Id: int.C,v 1.44 2002/04/18 10:50:59 paf Exp $ */ #include "classes.h" @@ -16,10 +16,6 @@ void _string_format(Request& r, const String& method_name, MethodParams *); -// defines - -#define INT_CLASS_NAME "int" - // class class MInt : public Methoded { @@ -31,20 +27,24 @@ public: // Methoded // methods -static void _int(Request& r, const String& method_name, MethodParams *) { +static void _int(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); + // just checking (default) syntax validity, never really using it here, just for string.int compatibility + if(params->size()>0) + params->as_junction(0, "default must be int"); + VInt *vint=static_cast(r.self); - Value& result=*new(pool) VInt(pool, vint->get_int()); - result.set_name(method_name); - r.write_no_lang(result); + r.write_no_lang(*new(pool) VInt(pool, vint->get_int())); } -static void _double(Request& r, const String& method_name, MethodParams *) { +static void _double(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); + // just checking (default) syntax validity, never really using it here, just for string.doube compatibility + if(params->size()>0) + params->as_junction(0, "default must be double"); + VInt *vint=static_cast(r.self); - Value& result=*new(pool) VDouble(pool, vint->as_double()); - result.set_name(method_name); - r.write_no_lang(result); + r.write_no_lang(*new(pool) VDouble(pool, vint->as_double())); } typedef void (*vint_op_func_ptr)(VInt& vint, double param); @@ -70,49 +70,37 @@ static void _mod(Request& r, const Strin // from string.C extern -const String* sql_result_string(Request& r, const String& method_name, - MethodParams *params, - Hash *&options); +const String* sql_result_string(Request& r, const String& method_name, MethodParams *params, + Hash *& options, Value *& default_code); static void _sql(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); int val; Hash *options; - if(const String *string=sql_result_string(r, method_name, params, options)) + Value *default_code; + if(const String *string=sql_result_string(r, method_name, params, options, default_code)) val=string->as_int(); else - if(options) { - if(Value *vdefault=(Value *)options->get(*sql_default_name)) - val=r.process(*vdefault).as_int(); - else { - PTHROW(0, 0, - &method_name, - "produced no result, but no default option specified"); - val=0; //calm, compiler - } - } else { - PTHROW(0, 0, + if(default_code) + val=r.process_to_value(*default_code).as_int(); + else { + throw Exception("parser.runtime", &method_name, - "produced no result, but no options (no default) specified"); + "produced no result, but no default option specified"); val=0; //calm, compiler } - VInt& result=*new(pool) VInt(pool, val); - result.set_name(method_name); - r.write_assign_lang(result); + r.write_no_lang(*new(pool) VInt(pool, val)); } // constructor -MInt::MInt(Pool& apool) : Methoded(apool) { - set_name(*NEW String(pool(), INT_CLASS_NAME)); - - +MInt::MInt(Pool& apool) : Methoded(apool, "int") { // ^int.int[] - add_native_method("int", Method::CT_DYNAMIC, _int, 0, 0); + add_native_method("int", Method::CT_DYNAMIC, _int, 0, 1); // ^int.double[] - add_native_method("double", Method::CT_DYNAMIC, _double, 0, 0); + add_native_method("double", Method::CT_DYNAMIC, _double, 0, 1); // ^int.inc[] // ^int.inc[offset]