--- parser3/src/main/pa_string.C 2001/04/05 19:35:16 1.73 +++ parser3/src/main/pa_string.C 2001/05/04 10:42:46 1.81 @@ -5,7 +5,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: pa_string.C,v 1.73 2001/04/05 19:35:16 paf Exp $ + $Id: pa_string.C,v 1.81 2001/05/04 10:42:46 paf Exp $ */ #include "pa_config_includes.h" @@ -26,7 +26,7 @@ // String -String::String(Pool& apool, const char *src, bool tasize_ted) : +String::String(Pool& apool, const char *src, size_t src_size, bool tainted) : Pooled(apool) { last_chunk=&head; head.count=CR_PREALLOCATED_COUNT; @@ -36,10 +36,10 @@ String::String(Pool& apool, const char * fused_rows=fsize=0; if(src) - if(tasize_ted) - APPEND_TAINTED(src, 0, 0, 0); + if(tainted) + APPEND_TAINTED(src, src_size, 0, 0); else - APPEND_CONST(src); + APPEND_CLEAN(src, src_size, 0, 0); } void String::expand() { @@ -336,7 +336,11 @@ const Origin& String::origin() const { // determining origin by last appended piece // because first one frequently constant. // ex: ^load[/file] "document_root" + "/file" - return append_here[-1].item.origin; + // when last peice is constant, + // ex: parser_root_auto_path{dynamic} / auto.p{const} + // using first piece + Origin& last_origin=append_here[-1].item.origin; + return last_origin.file ? last_origin : head.rows[0].item.origin; } #endif @@ -456,7 +460,6 @@ void String::split(Array& result, } } -/// @test really @b test: s x m [tested: i & g ] static void regex_options(char *options, int *result){ struct Regex_option { char key; @@ -464,7 +467,7 @@ static void regex_options(char *options, int *result; } regex_option[]={ {'i', 0, PCRE_CASELESS, result}, // a=A - {'s', 0, PCRE_DOTALL, result}, // \n\n$ + {'s', 0, PCRE_DOTALL, result}, // \n\n$ [default] {'x', 0, PCRE_EXTENDED, result}, // whitespace in regex ignored {'m', PCRE_DOTALL, PCRE_MULTILINE, result}, // ^aaa\n$^bbb\n$ {'g', 0, true, result+1}, // many rows @@ -487,21 +490,16 @@ static void regex_options(char *options, returns true if fills table. table format is defined and fixed[can be used by others]: @verbatim - pre-match/match/post-match/1/2/3/... + prematch/match/postmatch/1/2/3/... @endverbatim */ -bool String::match(const String *aorigin, +bool String::match(const unsigned char *pcre_tables, + const String *aorigin, const String& regexp, const String *options, Table **table, Row_action row_action, void *info) const { - static const unsigned char *tables=0; { SYNCHRONIZED(true); - if(!tables) - tables=pcre_maketables(); - } - - if(!regexp.size()) THROW(0, 0, aorigin, @@ -512,19 +510,19 @@ bool String::match(const String *aorigin int option_bits[2]; regex_options(options?options->cstr():0, option_bits); pcre *code=pcre_compile(pattern, option_bits[0], &errptr, &erroffset, - tables); + pcre_tables); if(!code) THROW(0, 0, ®exp.mid(erroffset, regexp.size()), - "match error - %s", errptr); + "regular expression syntax error - %s", errptr); int info_substrings=pcre_info(code, 0, 0); if(info_substrings<0) { (*pcre_free)(code); THROW(0, 0, aorigin, - "pcre_info error #%d", + "pcre_info error (%d)", info_substrings); } @@ -564,14 +562,14 @@ bool String::match(const String *aorigin (*pcre_free)(code); THROW(0, 0, aorigin, - "pcre_exec error #%d", + "regular expression execute error (%d)", exec_substrings); } Array& row=*NEW Array(pool()); - row+=&mid(0, ovector[0]); // .pre-match column value + row+=&mid(0, ovector[0]); // .prematch column value row+=&mid(ovector[0], ovector[1]); // .match - row+=&mid(ovector[1], size()); // .post-match + row+=&mid(ovector[1], size()); // .postmatch for(int i=1; i