--- parser3/src/classes/op.C 2001/07/26 16:16:57 1.35 +++ parser3/src/classes/op.C 2001/09/06 06:11:13 1.41 @@ -5,7 +5,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) */ -static const char *RCSId="$Id: op.C,v 1.35 2001/07/26 16:16:57 parser Exp $"; +static const char *RCSId="$Id: op.C,v 1.41 2001/09/06 06:11:13 parser Exp $"; #include "classes.h" #include "pa_config_includes.h" @@ -22,12 +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" - -#define SWITCH_DATA_NAME "SWITCH-DATA" -#define DEFAULT_VALUE "DEFAULT" - // class class MOP : public Methoded { @@ -36,6 +30,7 @@ public: public: // Methoded bool used_directly() { return true; } void configure_user(Request& r); + private: String main_sql_name; String main_sql_drivers_name; @@ -112,7 +107,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(); @@ -171,7 +166,7 @@ static void _while(Request& r, const Str static void _use(Request& r, const String& method_name, MethodParams *params) { Value& vfile=params->as_no_junction(0, "file name must not be code"); - r.use_file(r.absolute(vfile.as_string())); + r.use_file(vfile.as_string()); } static void _for(Request& r, const String& method_name, MethodParams *params) { @@ -272,15 +267,13 @@ static void _connect(Request& r, const S rethrow_me.comment()); } -static String *switch_data_name; -static String *default_value; - +#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))}; @@ -294,27 +287,33 @@ 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"); for(int i=0; iget(i)); - if(value.as_string() == *default_value) { - data._default=code; + if(value.as_string() == *case_default_value) { + 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; } } @@ -328,9 +327,6 @@ MOP::MOP(Pool& apool) : Methoded(apool), { set_name(*NEW String(pool(), OP_CLASS_NAME)); - switch_data_name=NEW String(pool(), SWITCH_DATA_NAME); - default_value=NEW String(pool(), DEFAULT_VALUE); - // ^if(condition){code-when-true} // ^if(condition){code-when-true}{code-when-false} add_native_method("if", Method::CT_ANY, _if, 2, 3);