--- parser3/src/classes/op.C 2001/07/26 16:16:57 1.35 +++ parser3/src/classes/op.C 2001/09/28 15:58:26 1.46 @@ -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.46 2001/09/28 15:58:26 parser Exp $ */ -static const char *RCSId="$Id: op.C,v 1.35 2001/07/26 16:16:57 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) { @@ -191,7 +186,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? @@ -223,7 +218,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"); @@ -234,7 +229,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 @@ -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); @@ -379,6 +375,68 @@ Methoded *MOP_create(Pool& pool) { return new(pool) MOP(pool); } +/* +static void element2ctypes(unsigned char *tables, + Value& ctype, const String& name, + unsigned char bit, + int group_offset=-1, + bool skip_ws=true) { + Value *value=ctype.get_element(name); + if(!value) + return; + + unsigned char *ctypes_table=tables+ctypes_offset; + const unsigned char *cstr= + (const unsigned char *)value->as_string().cstr(String::UL_AS_IS); + for(; *cstr; cstr++) { + unsigned char c=*cstr; + if(skip_ws && (c=='\n' || c=='\t' || c==' ')) + continue; + ctypes_table[c]|=bit; + + if(group_offset>=0) + tables[cbits_offset+group_offset+c/8] |= 1 << (c%8); + } +} +static void cstr2ctypes(unsigned char *tables, const unsigned char *cstr, + unsigned char bit) { + unsigned char *ctypes_table=tables+ctypes_offset; + ctypes_table[0]=bit; + for(; *cstr; cstr++) { + unsigned char c=*cstr; + ctypes_table[c]|=bit; + } +} +static void prepare_case_tables(unsigned char *tables) { + unsigned char *lcc_table=tables+lcc_offset; + unsigned char *fcc_table=tables+fcc_offset; + for(int i=0; i<0x100; i++) + lcc_table[i]=fcc_table[i]=i; +} +static void element2case(unsigned char *tables, Value& ctype, const String& name) { + Value *value=ctype.get_element(name); + if(!value) + return; + + unsigned char *lcc_table=tables+lcc_offset; + unsigned char *fcc_table=tables+fcc_offset; + const unsigned char *cstr= + (const unsigned char *)value->as_string().cstr(String::UL_AS_IS); + unsigned char from=0; + for(; *cstr; cstr++) { + unsigned char c=*cstr; + if(c=='\n' || c=='\t' || c==' ') + continue; + if(from) { + lcc_table[from]=c; + fcc_table[from]=c; fcc_table[c]=from; + from=0; + } else + from=c; + } +} + +*/ void MOP::configure_user(Request& r) { Pool& pool=r.pool(); @@ -388,4 +446,7 @@ void MOP::configure_user(Request& r) { if(Value *element=sql->get_element(main_sql_drivers_name)) if(Table *protocol2library=element->get_table()) r.classes_conf.put(name(), protocol2library); + + + }