|
|
| version 1.129, 2003/11/20 16:34:23 | version 1.136, 2004/03/01 08:54:16 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: @b string parser class. | Parser: @b string parser class. |
| Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| */ | */ |
| Line 36 DECLARE_CLASS_VAR(string, new MString, 0 | Line 36 DECLARE_CLASS_VAR(string, new MString, 0 |
| // defines for statics | // defines for statics |
| #define MATCH_VAR_NAME "match" | #define MATCH_VAR_NAME "match" |
| #define TRIM_START_OPTION "start" | |
| #define TRIM_BOTH_OPTION "both" | |
| #define TRIM_END_OPTION "end" | |
| // statics | // statics |
| Line 157 static int split_options(const String* o | Line 160 static int split_options(const String* o |
| {"r", "R", SPLIT_RIGHT, SPLIT_LEFT}, | {"r", "R", SPLIT_RIGHT, SPLIT_LEFT}, |
| {"h", "H", SPLIT_HORIZONTAL, SPLIT_VERTICAL}, | {"h", "H", SPLIT_HORIZONTAL, SPLIT_VERTICAL}, |
| {"v", "V", SPLIT_VERTICAL, SPLIT_HORIZONTAL}, | {"v", "V", SPLIT_VERTICAL, SPLIT_HORIZONTAL}, |
| {0} | {0, 0, 0, 0} |
| }; | }; |
| int result=0; | int result=0; |
| Line 203 static Table& split_horizontal(ArrayStri | Line 206 static Table& split_horizontal(ArrayStri |
| Table& table=*new Table(Table::columns_type(0) /* nameless */); | Table& table=*new Table(Table::columns_type(0) /* nameless */); |
| Table::element_type row(new ArrayString(pieces.count())); | Table::element_type row(new ArrayString(pieces.count())); |
| if(right) { // right | if(right) { // right |
| for(size_t i=pieces.count(); --i>=0; ) | for(int i=pieces.count(); --i>=0; ) |
| *row+=pieces[i]; | *row+=pieces[i]; |
| } else { // left | } else { // left |
| for(Array_iterator<const String*> i(pieces); i.has_next(); ) | for(Array_iterator<const String*> i(pieces); i.has_next(); ) |
| Line 310 static void _match(Request& r, MethodPar | Line 313 static void _match(Request& r, MethodPar |
| String result; | String result; |
| VTable* vtable=new VTable; | VTable* vtable=new VTable; |
| Replace_action_info info={0}; | Replace_action_info info={ |
| info.request=&r; | &r, |
| info.src=&src; | &src, |
| info.dest=&result; | &result, |
| info.vtable=vtable; | vtable, |
| info.replacement_code=&replacement_code; | &replacement_code |
| }; | |
| Temp_value_element temp_match_var( | Temp_value_element temp_match_var( |
| *replacement_code.get_junction()->method_frame, | *replacement_code.get_junction()->method_frame, |
| match_var_name, vtable); | match_var_name, vtable); |
| Line 400 const String* sql_result_string(Request& | Line 404 const String* sql_result_string(Request& |
| if(params.count()>1) { | if(params.count()>1) { |
| Value& voptions=params.as_no_junction(1, "options must be hash, not code"); | Value& voptions=params.as_no_junction(1, "options must be hash, not code"); |
| if(!voptions.is_string()) | if(!voptions.is_string()) |
| if(options=voptions.get_hash()) { | if((options=voptions.get_hash())) { |
| if(Value* vlimit=options->get(sql_limit_name)) | if(Value* vlimit=options->get(sql_limit_name)) |
| limit=(ulong)r.process_to_value(*vlimit).as_double(); | limit=(ulong)r.process_to_value(*vlimit).as_double(); |
| if(Value* voffset=options->get(sql_offset_name)) | if(Value* voffset=options->get(sql_offset_name)) |
| offset=(ulong)r.process_to_value(*voffset).as_double(); | offset=(ulong)r.process_to_value(*voffset).as_double(); |
| if(default_code=options->get(sql_default_name)) { | if((default_code=options->get(sql_default_name))) { |
| if(Junction* default_junction=default_code->get_junction()) | if(!default_code->get_junction()) |
| ;//default_junction->change_context(statement.get_junction()); | |
| else | |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| 0, | 0, |
| "default option must be code"); | "default option must be code"); |
| Line 495 static void _normalize(Request& r, Metho | Line 497 static void _normalize(Request& r, Metho |
| r.write_assign_lang(src); | r.write_assign_lang(src); |
| } | } |
| static void _trim(Request& r, MethodParams& params) { | |
| const String& src=GET_SELF(r, VString).string(); | |
| String::Trim_kind kind=String::TRIM_BOTH; | |
| const char* chars=0; | |
| 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(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(); | |
| } | |
| } | |
| r.write_assign_lang(src.trim(kind, chars)); | |
| } | |
| // constructor | // constructor |
| MString::MString(): Methoded("string") { | MString::MString(): Methoded("string") { |
| Line 551 MString::MString(): Methoded("string") { | Line 585 MString::MString(): Methoded("string") { |
| // ^string.normalize[] | // ^string.normalize[] |
| add_native_method("normalize", Method::CT_DYNAMIC, _normalize, 0, 0); | add_native_method("normalize", Method::CT_DYNAMIC, _normalize, 0, 0); |
| // ^string.trim[[start|both|end][;chars]] | |
| add_native_method("trim", Method::CT_DYNAMIC, _trim, 0, 2); | |
| } | } |