--- parser3/src/classes/op.C 2001/08/06 16:18:26 1.37 +++ parser3/src/classes/op.C 2001/10/09 07:06:00 1.48 @@ -2,10 +2,10 @@ Parser: parser @b operators. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: op.C,v 1.48 2001/10/09 07:06:00 parser Exp $ */ -static const char *RCSId="$Id: op.C,v 1.37 2001/08/06 16:18:26 parser Exp $"; #include "classes.h" #include "pa_config_includes.h" @@ -22,9 +22,6 @@ static const char *RCSId="$Id: op.C,v 1. #define OP_CLASS_NAME "OP" -#define MAIN_SQL_NAME "SQL" -#define MAIN_SQL_DRIVERS_NAME "drivers" - // class class MOP : public Methoded { @@ -42,7 +39,7 @@ private: // methods static void _if(Request& r, const String&, MethodParams *params) { - Value& condition_code=params->get(0); + Value& condition_code=params->as_junction(0, "condition must be expression"); bool condition=r.process(condition_code, 0/*no name*/, @@ -56,7 +53,7 @@ static void _if(Request& r, const String static void _untaint(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& lang_name=r.process(params->get(0)).as_string(); + const String& lang_name=params->as_string(0, "lang must be string"); String::Untaint_lang lang=static_cast( untaint_lang_name2enum->get_int(lang_name)); if(!lang) @@ -79,8 +76,7 @@ static void _taint(Request& r, const Str if(params->size()==1) lang=String::UL_TAINTED; // mark as simply 'tainted'. useful in table:set else { - const String& lang_name= - r.process(params->get(0)).as_string(); + const String& lang_name=params->as_string(0, "lang must be string"); lang=static_cast( untaint_lang_name2enum->get_int(lang_name)); if(!lang) @@ -110,7 +106,7 @@ static void _process(Request& r, const S origin.file, 1+origin.line, method_name.cstr()); #else - strncpy(place, MAX_STRING, method_name.cstr()); + strncpy(place, method_name.cstr(), MAX_STRING-1); place[MAX_STRING-1]=0; #endif VStateless_class& self_class=*r.self->get_class(); @@ -122,7 +118,7 @@ static void _process(Request& r, const S // evaluate source to process const String& source= - r.process(params->get(0)).as_string(); + r.process(params->as_no_junction(0, "body must be string")).as_string(); // process source code, append processed methods to 'self' class // maybe-define new @main @@ -174,11 +170,11 @@ static void _use(Request& r, const Strin static void _for(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& var_name=r.process(params->get(0)).as_string(); - int from=r.process(params->get(1)).as_int(); - int to=r.process(params->get(2)).as_int(); + const String& var_name=params->as_string(0, "var name must be string"); + int from=params->as_int(1, "from must be int", r); + int to=params->as_int(2, "to must be int", r); Value& body_code=params->as_junction(3, "body must be code"); - Value *delim_code=params->size()==3+1+1?¶ms->get(3+1):0; + Value *delim_code=params->size()==3+1+1?¶ms->as_junction(3+1, "delim must be code"):0; bool need_delim=false; VInt *vint=new(pool) VInt(pool, 0); @@ -189,7 +185,7 @@ static void _for(Request& r, const Strin &method_name, "endless loop detected"); vint->set_int(i); - r.root->put_element(var_name, vint); + r.self/*root*/->put_element(var_name, vint); Value& processed_body=r.process(body_code); if(delim_code) { // delimiter set? @@ -221,7 +217,7 @@ static void _eval(Request& r, const Stri } -static void _connect(Request& r, const String&, MethodParams *params) { +static void _connect(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); Value& url=params->as_no_junction(0, "url must not be code"); @@ -232,7 +228,7 @@ static void _connect(Request& r, const S // connect SQL_Connection& connection=SQL_driver_manager->get_connection( - url.as_string(), protocol2driver_and_client); + url.as_string(), method_name, protocol2driver_and_client); Exception rethrow_me; // remember/set current connection @@ -270,12 +266,13 @@ static void _connect(Request& r, const S rethrow_me.comment()); } +#ifndef DOXYGEN struct Switch_data { Value *searching; Value *found; Value *_default; }; - +#endif static void _switch(Request& r, const String&, MethodParams *params) { void *backup=r.classes_conf.get(*switch_data_name); Switch_data data={&r.process(params->get(0))}; @@ -289,8 +286,14 @@ static void _switch(Request& r, const St r.write_pass_lang(r.process(*code)); } -static void _case(Request& r, const String&, MethodParams *params) { - Switch_data& data=*static_cast(r.classes_conf.get(*switch_data_name)); +static void _case(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + + Switch_data *data=static_cast(r.classes_conf.get(*switch_data_name)); + if(!data) + PTHROW(0, 0, + &method_name, + "without switch"); int count=params->size(); Value *code=¶ms->as_junction(--count, "case result must be code"); @@ -298,18 +301,18 @@ static void _case(Request& r, const Stri Value& value=r.process(params->get(i)); if(value.as_string() == *case_default_value) { - data._default=code; + data->_default=code; break; } bool matches; - if(data.searching->is_string()) - matches=data.searching->as_string() == value.as_string(); + if(data->searching->is_string()) + matches=data->searching->as_string() == value.as_string(); else - matches=data.searching->as_double() == value.as_double(); + matches=data->searching->as_double() == value.as_double(); if(matches) { - data.found=code; + data->found=code; break; } } @@ -371,7 +374,6 @@ Methoded *MOP_create(Pool& pool) { return new(pool) MOP(pool); } - void MOP::configure_user(Request& r) { Pool& pool=r.pool();