--- parser3/src/classes/string.C 2001/07/07 16:38:01 1.59 +++ parser3/src/classes/string.C 2001/07/11 16:32:13 1.61 @@ -5,7 +5,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) */ -static const char *RCSId="$Id: string.C,v 1.59 2001/07/07 16:38:01 parser Exp $"; +static const char *RCSId="$Id: string.C,v 1.61 2001/07/11 16:32:13 parser Exp $"; #include "classes.h" #include "pa_request.h" @@ -112,13 +112,20 @@ static void _lsplit(Request& r, const St Pool& pool=r.pool(); const String& string=*static_cast(r.self)->get_string(); - Array& row=*new(pool) Array(pool); - split_list(r, method_name, params, string, row); + Array pieces(pool); + split_list(r, method_name, params, string, pieces); - Table& table=*new(pool) Table(pool, &string, - 0/*nameless*/, 1/*row preallocate(and only)*/); - table+=&row; + Array& columns=*new(pool) Array(pool); + columns+=new(pool) String(pool, "piece"); + Table& table=*new(pool) Table(pool, &string, + &columns, pieces.size()); + int size=pieces.quick_size(); + for(int i=0; i(r.self)->get_string(); - Array list(pool); - split_list(r, method_name, params, string, list); + Array pieces(pool); + split_list(r, method_name, params, string, pieces); - Array& row=*new(pool) Array(pool); - for(int i=list.size(); --i>=0; ) - row+=list.get(i); + Array& columns=*new(pool) Array(pool); + columns+=new(pool) String(pool, "piece"); Table& table=*new(pool) Table(pool, &string, - 0/*nameless*/, 1/*row preallocate(and only)*/); - table+=&row; + &columns, pieces.size()); + for(int i=pieces.size(); --i>=0; ) { + Array& row=*new(pool) Array(pool); + row+=pieces.get(i); + table+=&row; + } r.write_no_lang(*new(pool) VTable(pool, &table)); } @@ -200,19 +210,17 @@ 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(r.pcre_tables, + bool matched=src.match(r.pcre_tables, &method_name, regexp.as_string(), options, &table, - search_action, 0)) { - // matched - if(table->columns()->size()==3 && // just matched[3=pre/match/post], no substrings - table->size()==1) // just one row, not /g_lobal search - result=new(pool) VBool(pool, true); - else // table of pre/match/post+substrings - result=new(pool) VTable(pool, table); - } else // not matched [not global] - result=new(pool) VBool(pool, false); + search_action, 0); + // matched + if(table->columns()->size()==3 && // just matched[3=pre/match/post], no substrings + table->size()<=1) // just one row, not /g_lobal search + result=new(pool) VBool(pool, matched); + else // table of pre/match/post+substrings + result=new(pool) VTable(pool, table); } else { // replace Value& replacement_code=params->as_junction(2, "replacement code must be code");