--- parser3/src/main/pa_string.C 2003/02/17 09:56:15 1.172.2.16 +++ parser3/src/main/pa_string.C 2003/03/05 16:58:24 1.172.2.20 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_STRING_C="$Date: 2003/02/17 09:56:15 $"; +static const char* IDENT_STRING_C="$Date: 2003/03/05 16:58:24 $"; #include "pcre.h" @@ -105,9 +105,12 @@ int String::cmp(int& partial, const Stri bool a_break; bool b_break; - while(!( - (a_break=(a_current==a_end)) - || (b_break=(b_current==b_end)))) { + while(true) { + a_break=(a_current==a_end); + b_break=(b_current==b_end); + if(a_break || b_break) + break; + if(pos+a_current->size > this_offset) { if(lang!=UL_UNSPECIFIED && a_current->lang>(String_UL)lang) return -1; // wrong lang -- bail out @@ -171,9 +174,10 @@ int String::cmp(int& partial, const char bool a_break; bool b_break=b_size==0; - while(!( - (a_break=(a_current==a_end)) - || b_break)) { + while(true) { + a_break=(a_current==a_end); + if(a_break || b_break) + break; if(pos+a_current->size > this_offset) { if(lang!=UL_UNSPECIFIED && a_current->lang>(String_UL)lang) return -1; // wrong lang -- bail out @@ -385,8 +389,7 @@ TablePtr String::match(Charset& source_c const String& regexp, StringPtr options, Row_action row_action, void *info, - bool *was_global) const { - + bool& just_matched) const { if(regexp.is_empty()) throw Exception(0, aorigin, @@ -397,8 +400,7 @@ TablePtr String::match(Charset& source_c int erroffset; bool need_pre_post_match=false; int option_bits[2]; regex_options(options, option_bits, need_pre_post_match); - if(was_global) - *was_global=option_bits[1]!=0; + bool global=option_bits[1]!=0; pcre *code=pcre_compile(pattern.get(), option_bits[0], &errptr, &erroffset, source_charset.pcre_tables); @@ -408,13 +410,13 @@ TablePtr String::match(Charset& source_c regexp.mid(erroffset, regexp.size()), "regular expression syntax error - %s", errptr); - int info_substrings=pcre_info(code, 0, 0); - if(info_substrings<0) { + int subpatterns=pcre_info(code, 0, 0); + if(subpatterns<0) { pcre_free(code); throw Exception(0, aorigin, "pcre_info error (%d)", - info_substrings); + subpatterns); } CharPtr subject=cstr(); @@ -423,7 +425,7 @@ TablePtr String::match(Charset& source_c int ovector[ovecsize]; // create table - TablePtr result(new Table(string_match_table_template)); + TablePtr table(new Table(string_match_table_template)); int exec_option_bits=0; int prestart=0; @@ -436,11 +438,12 @@ TablePtr String::match(Charset& source_c if(exec_substrings==PCRE_ERROR_NOMATCH) { pcre_free(code); - row_action(result, ArrayStringPtr(0)/*last time, no raw*/, 0, 0, poststart, postfinish, info); - if(option_bits[1]) - return result; // global=true+result - else - return TablePtr(0);// not global=no result + row_action(table, ArrayStringPtr(0)/*last time, no raw*/, 0, 0, poststart, postfinish, info); + if(global || subpatterns) + return table; // global or with subpatterns=true+result + else { + just_matched=false; return TablePtr(0); // not global=no result + } } if(exec_substrings<0) { @@ -469,12 +472,12 @@ TablePtr String::match(Charset& source_c *row+=mid(ovector[i*2+0], ovector[i*2+1]); // .i column value } - row_action(result, row, prestart, prefinish, poststart, postfinish, info); + row_action(table, row, prestart, prefinish, poststart, postfinish, info); - if(!option_bits[1] || prestart==poststart) { // not global | going to hang + if(!global || prestart==poststart) { // not global | going to hang pcre_free(code); - row_action(result, ArrayStringPtr(0)/*last time, no row*/, 0, 0, poststart, postfinish, info); - return result; + row_action(table, ArrayStringPtr(0)/*last time, no row*/, 0, 0, poststart, postfinish, info); + return table; } prestart=poststart; @@ -531,7 +534,7 @@ StringPtr String::change_case(Pool& pool } /// @test if in some piece were found no dict words, append it, not it's duplicate -StringPtr String::replace(Pool& pool, Dictionary& dict) const { +StringPtr String::replace(Pool& pool, const Dictionary& dict) const { StringPtr result(new String()); CharPtr lcstr(cstr()); const char* current=lcstr.get(); @@ -541,7 +544,7 @@ IFNDEF_NO_STRING_ORIGIN( const char* joined_origin_file=fragment->origin.file; const size_t joined_origin_line=fragment->origin.line; ); - uchar joined_lang=fragment->lang; + String_UL joined_lang=fragment->lang; const char* joined_ptr=current; // calc size size_t joined_size=0; @@ -594,7 +597,7 @@ IFNDEF_NO_STRING_ORIGIN( const char* joined_origin_file=fragment->origin.file; const size_t joined_origin_line=fragment->origin.line; ); - uchar joined_lang=fragment->lang; + String_UL joined_lang=fragment->lang; const char* joined_ptr=current; // calc size size_t joined_size=0; @@ -700,7 +703,7 @@ inline uint uchars2uint(uchar *bytes) { void String::serialize(Pool& pool, size_t prolog_size, char *& buf, size_t& buf_size) const { buf_size= prolog_size - +fused*(sizeof(uchar)+sizeof(size_t)) + +fused*(sizeof(String_UL)+sizeof(size_t)) +size(); buf=new(pool) char[buf_size]; char *cur=buf+prolog_size; @@ -728,17 +731,17 @@ bool String::deserialize(size_t prolog_s buf_size-=prolog_size; while(buf_size) { - if(sizeof(uchar)+sizeof(size_t)>buf_size) // lang+size + if(sizeof(String_UL)+sizeof(size_t)>buf_size) // lang+size return false; String_UL lang=*(String_UL *)(cur); size_t size=uchars2uint((uchar *)cur); - size_t piece_size=sizeof(uchar)+sizeof(size_t)+size; + size_t piece_size=sizeof(String_UL)+sizeof(size_t)+size; if(piece_size>buf_size) // buffer overrun, can be on incomplete cache files return false; - const char* ptr=(const char*)(cur+sizeof(uchar)+sizeof(size_t)); + const char* ptr=(const char*)(cur+sizeof(String_UL)+sizeof(size_t)); APPEND(ptr, size, lang, file, 0); cur+=piece_size;