--- parser3/src/classes/string.C 2004/03/01 08:54:16 1.136 +++ parser3/src/classes/string.C 2004/06/18 15:55:47 1.140 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_STRING_C="$Date: 2004/03/01 08:54:16 $"; +static const char * const IDENT_STRING_C="$Date: 2004/06/18 15:55:47 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -104,14 +104,25 @@ static void _double(Request& r, MethodPa } static void _left(Request& r, MethodParams& params) { - size_t n=(size_t)params.as_int(0, "n must be int", r); - + ssize_t sn=params.as_int(0, "n must be int", r); + if(sn<0) + throw Exception("parser.runtime", + 0, + "n(%d) must be >=0", sn); + size_t n=(size_t)sn; + 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); + ssize_t sn=(size_t)params.as_int(0, "n must be int", r); + if(sn<0) + throw Exception("parser.runtime", + 0, + "n(%d) must be >=0", sn); + size_t n=(size_t)sn; + const String& string=GET_SELF(r, VString).string(); size_t length=string.length(); @@ -121,11 +132,25 @@ static void _right(Request& r, MethodPar static void _mid(Request& r, MethodParams& params) { const String& string=GET_SELF(r, VString).string(); - 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(); + ssize_t sbegin=params.as_int(0, "p must be int", r); + if(sbegin<0) + throw Exception("parser.runtime", + 0, + "p(%d) must be >=0", sbegin); + size_t begin=(size_t)sbegin; + + size_t end; + if(params.count()>1) { + ssize_t sn=params.as_int(1, "n must be int", r); + if(sn<0) + throw Exception("parser.runtime", + 0, + "n(%d) must be >=0", sn); + end=begin+(size_t)sn; + } else + end=string.length(); - r.write_assign_lang(string.mid(p, p+n)); + r.write_assign_lang(string.mid(begin, end)); } static void _pos(Request& r, MethodParams& params) { @@ -428,7 +453,9 @@ const String* sql_result_string(Request& statement_string.cstr(String::L_UNSPECIFIED, r.connection()); String_sql_event_handlers handlers(statement_string, statement_cstr); r.connection()->query( - statement_cstr, offset, limit, + statement_cstr, + 0, 0, + offset, limit, handlers, statement_string); @@ -505,30 +532,38 @@ static void _trim(Request& r, MethodPara if(params.count()>0) { const String& skind=params.as_string(0, "'where' must be string"); - if(skind==TRIM_START_OPTION) - kind=String::TRIM_START; - else if(skind==TRIM_END_OPTION) - kind=String::TRIM_END; - else if(skind==TRIM_BOTH_OPTION) - kind=String::TRIM_BOTH; - else - throw Exception("parser.runtime", - &skind, - "'kind' should be one of "TRIM_START_OPTION", "TRIM_BOTH_OPTION", "TRIM_END_OPTION); + if(skind.length()) + if(skind==TRIM_START_OPTION) + kind=String::TRIM_START; + else if(skind==TRIM_END_OPTION) + kind=String::TRIM_END; + else if(skind==TRIM_BOTH_OPTION) + kind=String::TRIM_BOTH; + else + throw Exception("parser.runtime", + &skind, + "'kind' must be one of "TRIM_START_OPTION", "TRIM_BOTH_OPTION", "TRIM_END_OPTION); if(params.count()>1) { const String& schars=params.as_string(1, "'chars' must be string"); - if(!schars.length()) - throw Exception("parser.runtime", - 0, - "'chars' must not be empty"); - chars=schars.cstr(); + if(schars.length()) + chars=schars.cstr(); } } r.write_assign_lang(src.trim(kind, chars)); } +static void _append(Request& r, MethodParams& params) { + // c=a+b + VString& va=GET_SELF(r, VString); + const String& a=va.string(); + const String& b=params.as_string(0, "parameter must be string"); + String& c=*new String(a); + c.append(b, String::L_PASS_APPENDED); + va.set_string(c); +} + // constructor MString::MString(): Methoded("string") { @@ -588,4 +623,7 @@ MString::MString(): Methoded("string") { // ^string.trim[[start|both|end][;chars]] add_native_method("trim", Method::CT_DYNAMIC, _trim, 0, 2); + + // ^string.append[string] + add_native_method("append", Method::CT_DYNAMIC, _append, 1, 1); }