--- parser3/src/classes/string.C 2003/03/24 11:45:28 1.125.2.15.2.14 +++ parser3/src/classes/string.C 2003/11/20 16:34:23 1.129 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_STRING_C="$Date: 2003/03/24 11:45:28 $"; +static const char * const IDENT_STRING_C="$Date: 2003/11/20 16:34:23 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -43,15 +43,15 @@ static const String match_var_name(MATCH // methods -static void _length(Request& r, MethodParams* ) { +static void _length(Request& r, MethodParams&) { double result=GET_SELF(r, VString).string().length(); r.write_no_lang(*new VDouble(result)); } -static void _int(Request& r, MethodParams* params) { +static void _int(Request& r, MethodParams& params) { const String& self_string=GET_SELF(r, VString).string(); int converted; - Value* default_code=params->count()>0?¶ms->as_junction(0, "default must be int") + Value* default_code=params.count()>0?¶ms.as_junction(0, "default must be int") :0; // (default) try { if(self_string.is_empty()) @@ -68,10 +68,10 @@ static void _int(Request& r, MethodParam r.write_no_lang(*new VInt(converted)); } -static void _double(Request& r, MethodParams* params) { +static void _double(Request& r, MethodParams& params) { const String& self_string=GET_SELF(r, VString).string(); double converted; - Value* default_code=params->count()>0?¶ms->as_junction(0, "default must be double") + Value* default_code=params.count()>0?¶ms.as_junction(0, "default must be double") :0; // (default) try { if(self_string.is_empty()) @@ -89,9 +89,9 @@ static void _double(Request& r, MethodPa r.write_no_lang(*new VDouble(converted)); } -/*not static*/void _string_format(Request& r, MethodParams* params) { +/*not static*/void _string_format(Request& r, MethodParams& params) { - Value& fmt_maybe_code=*(*params)[0]; + Value& fmt_maybe_code=params[0]; // for some time due to stupid {} in original design const String& fmt=r.process_to_string(fmt_maybe_code); @@ -100,42 +100,42 @@ static void _double(Request& r, MethodPa r.write_no_lang(String(buf)); } -static void _left(Request& r, MethodParams* params) { - size_t n=(size_t)params->as_int(0, "n must be int", r); +static void _left(Request& r, MethodParams& params) { + size_t n=(size_t)params.as_int(0, "n must be int", r); const String& string=GET_SELF(r, VString).string(); r.write_assign_lang(string.mid(0, n)); } -static void _right(Request& r, MethodParams* params) { - size_t n=(size_t)params->as_int(0, "n must be int", r); +static void _right(Request& r, MethodParams& params) { + size_t n=(size_t)params.as_int(0, "n must be int", r); const String& string=GET_SELF(r, VString).string(); - r.write_assign_lang(string.mid(string.length()-n, string.length())); + size_t length=string.length(); + r.write_assign_lang(nas_int(0, "p must be int", r)); - size_t n=params->count()>1? - (size_t)max(0, params->as_int(1, "n must be int", r)):string.length(); + size_t p=(size_t)max(0, params.as_int(0, "p must be int", r)); + size_t n=params.count()>1? + (size_t)max(0, params.as_int(1, "n must be int", r)):string.length(); r.write_assign_lang(string.mid(p, p+n)); } -static void _pos(Request& r, MethodParams* params) { - Value& substr=params->as_no_junction(0, "substr must not be code"); +static void _pos(Request& r, MethodParams& params) { + Value& substr=params.as_no_junction(0, "substr must not be code"); const String& string=GET_SELF(r, VString).string(); - r.write_assign_lang(*new VInt(string.pos(substr.as_string()))); + r.write_assign_lang(*new VInt((int)string.pos(substr.as_string()))); } -static void split_list(Request& r, - MethodParams* params, int paramIndex, +static void split_list(MethodParams& params, int paramIndex, const String& string, ArrayString& result) { - Value& delim_value=params->as_no_junction(paramIndex, "delimiter must not be code"); + Value& delim_value=params.as_no_junction(paramIndex, "delimiter must not be code"); size_t pos_after=0; string.split(result, pos_after, delim_value.as_string()); @@ -163,8 +163,8 @@ static int split_options(const String* o int result=0; if(options) { for(Split_option *o=split_option; o->keyL; o++) - if(options->pos(o->keyL)>=0 - || (o->keyU && options->pos(o->keyU)>=0)) { + if(options->pos(o->keyL)!=STRING_NOT_FOUND + || (o->keyU && options->pos(o->keyU)!=STRING_NOT_FOUND)) { if(result & o->checkBit) throw Exception("parser.runtime", options, @@ -176,8 +176,7 @@ static int split_options(const String* o return result; } -static Table& split_vertical(Request& r, ArrayString& pieces, bool right) { - +static Table& split_vertical(ArrayString& pieces, bool right) { Table::columns_type columns(new ArrayString); *columns+=new String("piece"); @@ -200,53 +199,50 @@ static Table& split_vertical(Request& r, return table; } -static Table& split_horizontal(Request& r, ArrayString& pieces, bool right) { +static Table& split_horizontal(ArrayString& pieces, bool right) { Table& table=*new Table(Table::columns_type(0) /* nameless */); Table::element_type row(new ArrayString(pieces.count())); if(right) { // right - for(int i=pieces.count(); --i>=0; ) { + for(size_t i=pieces.count(); --i>=0; ) *row+=pieces[i]; - } } else { // left - Array_iterator i(pieces); - while(i.has_next()) { + for(Array_iterator i(pieces); i.has_next(); ) *row+=i.next(); - } } table+=row; return table; } -static void split_with_options(Request& r, MethodParams* params, +static void split_with_options(Request& r, MethodParams& params, int bits) { const String& string=GET_SELF(r, VString).string(); ArrayString pieces; - split_list(r, params, 0, string, pieces); + split_list(params, 0, string, pieces); if(!bits) { const String* options=0; - if(params->count()>1) - options=¶ms->as_string(1, "options must not be code"); + if(params.count()>1) + options=¶ms.as_string(1, "options must not be code"); bits=split_options(options); } bool right=(bits & SPLIT_RIGHT) != 0; bool horizontal=(bits & SPLIT_HORIZONTAL) !=0; - Table& table=horizontal?split_horizontal(r, pieces, right) - :split_vertical(r, pieces, right); + Table& table=horizontal?split_horizontal(pieces, right) + :split_vertical(pieces, right); r.write_no_lang(*new VTable(&table)); } -static void _split(Request& r, MethodParams* params) { +static void _split(Request& r, MethodParams& params) { split_with_options(r, params, 0 /* maybe-determine from param #2 */); } -static void _lsplit(Request& r, MethodParams* params) { +static void _lsplit(Request& r, MethodParams& params) { split_with_options(r, params, SPLIT_LEFT); } -static void _rsplit(Request& r, MethodParams* params) { +static void _rsplit(Request& r, MethodParams& params) { split_with_options(r, params, SPLIT_RIGHT); } @@ -288,17 +284,17 @@ static void replace_action(Table& table, } /// @todo use pcre:study somehow -static void _match(Request& r, MethodParams* params) { - Value& regexp=params->as_no_junction(0, "regexp must not be code"); +static void _match(Request& r, MethodParams& params) { + Value& regexp=params.as_no_junction(0, "regexp must not be code"); const String* options= - params->count()>1? - ¶ms->as_no_junction(1, "options must not be code").as_string():0; + params.count()>1? + ¶ms.as_no_junction(1, "options must not be code").as_string():0; Temp_lang temp_lang(r, String::L_PASS_APPENDED); const String& src=GET_SELF(r, VString).string(); bool just_matched; - if(params->count()<3) { // search + if(params.count()<3) { // search Table* table=src.match(r.charsets.source(), regexp.as_string(), options, search_action, 0, @@ -310,11 +306,11 @@ static void _match(Request& r, MethodPar result=new VBool(just_matched); r.write_assign_lang(*result); } else { // replace - Value& replacement_code=params->as_junction(2, "replacement param must be code"); + Value& replacement_code=params.as_junction(2, "replacement param must be code"); String result; VTable* vtable=new VTable; - Replace_action_info info; + Replace_action_info info={0}; info.request=&r; info.src=&src; info.dest=&result; @@ -331,16 +327,16 @@ static void _match(Request& r, MethodPar } } -static void change_case(Request& r, MethodParams* params, +static void change_case(Request& r, MethodParams&, String::Change_case_kind kind) { const String& src=GET_SELF(r, VString).string(); r.write_assign_lang(src.change_case(r.charsets.source(), kind)); } -static void _upper(Request& r, MethodParams* params) { +static void _upper(Request& r, MethodParams& params) { change_case(r, params, String::CC_UPPER); } -static void _lower(Request& r, MethodParams* params) { +static void _lower(Request& r, MethodParams& params) { change_case(r, params, String::CC_LOWER); } @@ -359,7 +355,7 @@ public: got_cell(false), result(*new String) {} - bool add_column(SQL_Error& error, void *ptr, size_t size) { + bool add_column(SQL_Error& error, const char* /*str*/, size_t /*length*/) { if(got_column) { error=SQL_Error("parser.runtime", //statement_string, @@ -371,7 +367,7 @@ public: } bool before_rows(SQL_Error& /*error*/ ) { /* ignore */ return false; } bool add_row(SQL_Error& /*error*/) { /* ignore */ return false; } - bool add_row_cell(SQL_Error& error, void *ptr, size_t size) { + bool add_row_cell(SQL_Error& error, const char* str, size_t length) { if(got_cell) { error=SQL_Error("parser.runtime", //statement_string, @@ -381,7 +377,7 @@ public: try { got_cell=true; - result.append((const char* )ptr, size, String::L_TAINTED); + result.append_know_length(str, length, String::L_TAINTED); return false; } catch(...) { error=SQL_Error("exception occured in String_sql_event_handlers::add_row_cell"); @@ -390,19 +386,19 @@ public: } }; #endif -extern const String& sql_limit_name; -extern const String& sql_offset_name; -extern const String& sql_default_name; -extern const String& sql_distinct_name; -const String* sql_result_string(Request& r, MethodParams* params, +extern String sql_limit_name; +extern String sql_offset_name; +extern String sql_default_name; +extern String sql_distinct_name; +const String* sql_result_string(Request& r, MethodParams& params, HashStringValue*& options, Value*& default_code) { - Value& statement=params->as_junction(0, "statement must be code"); + Value& statement=params.as_junction(0, "statement must be code"); ulong limit=0; ulong offset=0; default_code=0; - if(params->count()>1) { - Value& voptions=params->as_no_junction(1, "options must be hash, not code"); + if(params.count()>1) { + Value& voptions=params.as_no_junction(1, "options must be hash, not code"); if(!voptions.is_string()) if(options=voptions.get_hash()) { if(Value* vlimit=options->get(sql_limit_name)) @@ -440,7 +436,7 @@ const String* sql_result_string(Request& return &handlers.result; } -static void _sql(Request& r, MethodParams* params) { +static void _sql(Request& r, MethodParams& params) { HashStringValue* options; Value* default_code; @@ -457,10 +453,10 @@ static void _sql(Request& r, MethodParam r.write_assign_lang(*string); } -static void _replace(Request& r, MethodParams* params) { +static void _replace(Request& r, MethodParams& params) { const String& src=GET_SELF(r, VString).string(); - Table* table=params->as_no_junction(0, "parameter must not be code").get_table(); + Table* table=params.as_no_junction(0, "parameter must not be code").get_table(); if(!table) throw Exception("parser.runtime", 0, @@ -470,15 +466,15 @@ static void _replace(Request& r, MethodP r.write_assign_lang(src.replace(dict)); } -static void _save(Request& r, MethodParams* params) { - const String& file_name=params->as_string(params->count()-1, +static void _save(Request& r, MethodParams& params) { + const String& file_name=params.as_string(params.count()-1, "file name must be string"); const String& src=GET_SELF(r, VString).string(); bool do_append=false; - if(params->count()>1) { - const String& mode=params->as_string(0, "mode must be string"); + if(params.count()>1) { + const String& mode=params.as_string(0, "mode must be string"); if(mode=="append") do_append=true; else @@ -493,7 +489,7 @@ static void _save(Request& r, MethodPara buf, strlen(buf), true, do_append); } -static void _normalize(Request& r, MethodParams* /*params*/) { +static void _normalize(Request& r, MethodParams&) { const String& src=GET_SELF(r, VString).string(); r.write_assign_lang(src);