--- parser3/src/classes/string.C 2002/04/22 14:10:38 1.107 +++ parser3/src/classes/string.C 2002/08/06 12:48:14 1.115 @@ -3,10 +3,10 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - - $Id: string.C,v 1.107 2002/04/22 14:10:38 paf Exp $ */ +static const char* IDENT_STRING_C="$Date: 2002/08/06 12:48:14 $"; + #include "classes.h" #include "pa_request.h" #include "pa_vdouble.h" @@ -88,7 +88,7 @@ static void _left(Request& r, const Stri size_t n=(size_t)params->as_int(0, "n must be int", r); - const String& string=static_cast(r.self)->string(r.origins_mode()); + const String& string=static_cast(r.self)->string(); r.write_assign_lang(string.mid(0, n)); } @@ -97,13 +97,13 @@ static void _right(Request& r, const Str size_t n=(size_t)params->as_int(0, "n must be int", r); - const String& string=static_cast(r.self)->string(r.origins_mode()); + const String& string=static_cast(r.self)->string(); r.write_assign_lang(string.mid(string.size()-n, string.size())); } static void _mid(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - const String& string=static_cast(r.self)->optimized_string(r.origins_mode()); + const String& string=*r.self->get_string(); size_t p=(size_t)params->as_int(0, "p must be int", r); size_t n=params->size()>1? @@ -117,7 +117,7 @@ static void _pos(Request& r, const Strin Value& substr=params->as_no_junction(0, "substr must not be code"); - const String& string=static_cast(r.self)->string(r.origins_mode()); + const String& string=static_cast(r.self)->string(); r.write_assign_lang(*new(pool) VInt(pool, string.pos(substr.as_string()))); } @@ -131,7 +131,7 @@ static void split_list(Request& r, const static void _lsplit(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& string=static_cast(r.self)->optimized_string(r.origins_mode()); + const String& string=*r.self->get_string(); Array pieces(pool); split_list(r, method_name, params, string, pieces); @@ -152,7 +152,7 @@ static void _lsplit(Request& r, const St static void _rsplit(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& string=static_cast(r.self)->optimized_string(r.origins_mode()); + const String& string=*r.self->get_string(); Array pieces(pool); split_list(r, method_name, params, string, pieces); @@ -223,7 +223,7 @@ static void _match(Request& r, const Str const String& src=static_cast(r.self)->string(); bool was_global; - bool matched=src.match(0, + bool matched=src.match( &method_name, regexp.as_string(), options, &table, @@ -238,8 +238,7 @@ static void _match(Request& r, const Str result=new(pool) VBool(pool, matched); r.write_assign_lang(*result); } else { // replace - char* src_cstr; - const String& src=static_cast(r.self)->optimized_string(r.origins_mode(), &src_cstr); + const String& src=*r.self->get_string(); Value& replacement_code=params->as_junction(2, "replacement param must be code"); @@ -254,7 +253,7 @@ static void _match(Request& r, const Str Temp_value_element temp_match_var( *replacement_code.get_junction()->root, *match_var_name, &vtable); - src.match(src_cstr, + src.match( &method_name, r.process_to_string(regexp), options, &table, @@ -328,14 +327,16 @@ const String* sql_result_string(Request& default_code=0; if(params->size()>1) { Value& voptions=params->as_no_junction(1, "options must be hash, not code"); - if(voptions.is_defined()) + if(!voptions.is_string()) if(options=voptions.get_hash(&method_name)) { if(Value *vlimit=(Value *)options->get(*sql_limit_name)) limit=(ulong)r.process_to_value(*vlimit).as_double(); if(Value *voffset=(Value *)options->get(*sql_offset_name)) offset=(ulong)r.process_to_value(*voffset).as_double(); if(default_code=(Value *)options->get(*sql_default_name)) { - if(!default_code->get_junction()) + if(Junction *default_junction=default_code->get_junction()) + default_junction->change_context(statement.get_junction()); + else throw Exception("parser.runtime", &method_name, "default option must be code"); @@ -391,9 +392,7 @@ static void _sql(Request& r, const Strin static void _replace(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& src=static_cast(r.self)->optimized_string(false/*unused*/, - 0/*cstr not needed*/, true/*optimization forced, - so that replace fould strings that span across pices*/); + const String& src=*r.self->get_string(); Table *table=params->as_no_junction(0, "parameter must not be code").get_table(); if(!table) @@ -428,6 +427,10 @@ static void _save(Request& r, const Stri buf, strlen(buf), true, do_append); } +static void _normalize(Request& r, const String& method_name, MethodParams * /*params*/) { + r.write_assign_lang(r.self->get_string()->join_chains(r.pool(), 0/*cstr*/)); +} + // constructor MString::MString(Pool& apool) : Methoded(apool, "string") { @@ -477,6 +480,9 @@ MString::MString(Pool& apool) : Methoded // ^string.save[file] add_native_method("save", Method::CT_DYNAMIC, _save, 1, 2); + + // ^string.normalize[] + add_native_method("normalize", Method::CT_DYNAMIC, _normalize, 0, 0); } // global variable