--- parser3/src/classes/string.C 2001/04/15 13:12:18 1.38 +++ parser3/src/classes/string.C 2001/05/07 13:29:47 1.45 @@ -5,20 +5,29 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: string.C,v 1.38 2001/04/15 13:12:18 paf Exp $ + $Id: string.C,v 1.45 2001/05/07 13:29:47 paf Exp $ */ +#include "classes.h" #include "pa_request.h" -#include "_string.h" #include "pa_vdouble.h" #include "pa_vint.h" #include "pa_vtable.h" #include "pa_vbool.h" #include "pa_string.h" -// global var +// defines -VStateless_class *string_class; +#define STRING_CLASS_NAME "string" + +// class + +class MString : public Methoded { +public: + MString(Pool& pool); +public: // Methoded + bool used_directly() { return false; } +}; // methods @@ -40,7 +49,6 @@ static void _double(Request& r, const St r.write_no_lang(value); } -/// ^string.format{format} /*not static*/void _string_format(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); @@ -92,11 +100,9 @@ static void _pos(Request& r, const Strin static void split_list(Request& r, const String& method_name, MethodParams *params, const String& string, Array& result) { - Pool& pool=r.pool(); - Value& delim_value=params->get_no_junction(0, "delimiter must not be code"); - string.split(result, 0, delim_value.as_string(), String::UL_CLEAN, -1); + string.split(result, 0, delim_value.as_string()); } static void _lsplit(Request& r, const String& method_name, MethodParams *params) { @@ -136,6 +142,7 @@ static void search_action(Table& table, table+=row; } +/// used by string: _match / replace_action struct Replace_action_info { Request *request; const String *origin; const String *src; String *dest; @@ -192,7 +199,8 @@ static void _match(Request& r, const Str Temp_lang temp_lang(r, String::UL_PASS_APPENDED); Table *table; if(params->size()<3) { // search - if(src.match(&method_name, + if(src.match(r.pcre_tables, + &method_name, regexp.as_string(), options, &table, search_action, 0)) { @@ -214,7 +222,8 @@ static void _match(Request& r, const Str &replacement_code, &src }; - src.match(&method_name, + src.match(r.pcre_tables, + &method_name, r.process(regexp).as_string(), options, &table, replace_action, &replace_action_info); @@ -224,38 +233,50 @@ static void _match(Request& r, const Str r.write_assign_lang(*result); } -// initialize +// constructor + +MString::MString(Pool& apool) : Methoded(apool) { + set_name(*NEW String(pool(), STRING_CLASS_NAME)); + -void initialize_string_class(Pool& pool, VStateless_class& vclass) { // ^string.length[] - vclass.add_native_method("length", Method::CT_DYNAMIC, _length, 0, 0); + add_native_method("length", Method::CT_DYNAMIC, _length, 0, 0); // ^string.int[] - vclass.add_native_method("int", Method::CT_DYNAMIC, _int, 0, 0); + add_native_method("int", Method::CT_DYNAMIC, _int, 0, 0); // ^string.double[] - vclass.add_native_method("double", Method::CT_DYNAMIC, _double, 0, 0); + add_native_method("double", Method::CT_DYNAMIC, _double, 0, 0); // ^string.format{format} - vclass.add_native_method("format", Method::CT_DYNAMIC, _string_format, 1, 1); + add_native_method("format", Method::CT_DYNAMIC, _string_format, 1, 1); // ^string.left(n) - vclass.add_native_method("left", Method::CT_DYNAMIC, _left, 1, 1); + add_native_method("left", Method::CT_DYNAMIC, _left, 1, 1); // ^string.right(n) - vclass.add_native_method("right", Method::CT_DYNAMIC, _right, 1, 1); + add_native_method("right", Method::CT_DYNAMIC, _right, 1, 1); // ^string.mid(p;n) - vclass.add_native_method("mid", Method::CT_DYNAMIC, _mid, 2, 2); + add_native_method("mid", Method::CT_DYNAMIC, _mid, 2, 2); // ^string.pos[substr] - vclass.add_native_method("pos", Method::CT_DYNAMIC, _pos, 1, 1); + add_native_method("pos", Method::CT_DYNAMIC, _pos, 1, 1); // ^string.lsplit[delim] - vclass.add_native_method("lsplit", Method::CT_DYNAMIC, _lsplit, 1, 1); + add_native_method("lsplit", Method::CT_DYNAMIC, _lsplit, 1, 1); // ^string.rsplit[delim] - vclass.add_native_method("rsplit", Method::CT_DYNAMIC, _rsplit, 1, 1); + add_native_method("rsplit", Method::CT_DYNAMIC, _rsplit, 1, 1); // ^string.match[regexp][options] // ^string.match[regexp][options]{replacement-code} - vclass.add_native_method("match", Method::CT_DYNAMIC, _match, 1, 3); + add_native_method("match", Method::CT_DYNAMIC, _match, 1, 3); } +// global variable + +Methoded *string_class; + +// creator + +Methoded *MString_create(Pool& pool) { + return string_class=new(pool) MString(pool); +}