--- parser3/src/classes/string.C 2001/08/31 09:26:12 1.72 +++ parser3/src/classes/string.C 2001/10/09 07:06:00 1.78 @@ -2,10 +2,10 @@ Parser: @b string parser class. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: string.C,v 1.78 2001/10/09 07:06:00 parser Exp $ */ -static const char *RCSId="$Id: string.C,v 1.72 2001/08/31 09:26:12 parser Exp $"; #include "classes.h" #include "pa_request.h" @@ -51,7 +51,7 @@ static void _int(Request& r, const Strin rethrow_me=e; converted=0; } else - converted=params->as_int(0, r); // (default) + converted=params->as_int(0, "default must be int", r); // (default) } PEND_CATCH if(convert_problem) @@ -76,7 +76,7 @@ static void _double(Request& r, const St rethrow_me=e; converted=0; } else - converted=params->as_double(0, r); // (default) + converted=params->as_double(0, "default must be double", r); // (default) } PEND_CATCH if(convert_problem) @@ -107,7 +107,7 @@ static void _double(Request& r, const St static void _left(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - size_t n=(size_t)r.process(params->get(0)).as_double(); + size_t n=(size_t)params->as_int(0, "n must be int", r); const String& string=*static_cast(r.self)->get_string(); r.write_assign_lang(*new(pool) VString(string.mid(0, n))); @@ -116,7 +116,7 @@ static void _left(Request& r, const Stri static void _right(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - size_t n=(size_t)r.process(params->get(0)).as_double(); + size_t n=(size_t)params->as_int(0, "n must be int", r); const String& string=*static_cast(r.self)->get_string(); r.write_assign_lang(*new(pool) VString(string.mid(string.size()-n, string.size()))); @@ -125,8 +125,8 @@ static void _right(Request& r, const Str static void _mid(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - size_t p=(size_t)r.process(params->get(0)).as_double(); - size_t n=(size_t)r.process(params->get(1)).as_double(); + size_t p=(size_t)params->as_int(0, "p must be int", r); + size_t n=(size_t)params->as_int(1, "n must be int", r); const String& string=*static_cast(r.self)->get_string(); r.write_assign_lang(*new(pool) VString(string.mid(p, p+n))); @@ -196,13 +196,14 @@ static void search_action(Table& table, table+=row; } -/// used by string: _match / replace_action +#ifndef DOXYGEN struct Replace_action_info { Request *request; const String *origin; const String *src; String *dest; Value *replacement_code; const String *post_match; }; +#endif static void replace_action(Table& table, Array *row, int start, int finish, void *info) { Replace_action_info& ai=*static_cast(info); @@ -253,7 +254,7 @@ static void _match(Request& r, const Str Table *table; if(params->size()<3) { // search bool was_global; - bool matched=src.match(r.pcre_tables, + bool matched=src.match(r.pcre_tables(), &method_name, regexp.as_string(), options, &table, @@ -275,7 +276,7 @@ static void _match(Request& r, const Str &replacement_code, &src }; - src.match(r.pcre_tables, + src.match(r.pcre_tables(), &method_name, r.process(regexp).as_string(), options, &table, @@ -291,7 +292,7 @@ static void change_case(Request& r, cons Pool& pool=r.pool(); const String& src=*static_cast(r.self)->get_string(); - r.write_assign_lang(*new(pool) VString(src.change_case(pool, r.pcre_tables, + r.write_assign_lang(*new(pool) VString(src.change_case(pool, r.pcre_tables(), kind))); } static void _upper(Request& r, const String& method_name, MethodParams *params) { @@ -355,16 +356,17 @@ const String* sql_result_string(Request& ulong limit=0; ulong offset=0; if(params->size()>1) { - Value& options_param=params->as_no_junction(1, "options must be hash, not code"); - if(options=options_param.get_hash()) { - if(Value *vlimit=(Value *)options->get(*sql_limit_name)) - limit=(ulong)r.process(*vlimit).as_double(); - if(Value *voffset=(Value *)options->get(*sql_offset_name)) - offset=(ulong)r.process(*voffset).as_double(); - } else - PTHROW(0, 0, - &method_name, - "options must be hash"); + Value& voptions=params->as_no_junction(1, "options must be hash, not code"); + if(voptions.is_defined()) + if(options=voptions.get_hash()) { + if(Value *vlimit=(Value *)options->get(*sql_limit_name)) + limit=(ulong)r.process(*vlimit).as_double(); + if(Value *voffset=(Value *)options->get(*sql_offset_name)) + offset=(ulong)r.process(*voffset).as_double(); + } else + PTHROW(0, 0, + &method_name, + "options must be hash"); } else options=0;