--- parser3/src/main/pa_string.C 2003/09/23 09:54:28 1.175.2.1 +++ parser3/src/main/pa_string.C 2003/09/24 08:02:09 1.175.2.4 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_STRING_C="$Date: 2003/09/23 09:54:28 $"; +static const char* IDENT_STRING_C="$Date: 2003/09/24 08:02:09 $"; #include "pcre.h" @@ -23,22 +23,22 @@ typedef struct { char target; /* Character we're looking for */ } chr_data; #endif -static int CORD_nnchr_proc(char c, size_t size, void* client_data) +static int CORD_range_contains_chr_greater_then_proc(char c, size_t size, void* client_data) { register chr_data * d = (chr_data *)client_data; if (d -> countdown<=0) return(2); d -> countdown -= size; - if (c != d -> target) return(1); + if (c > d -> target) return(1); return(0); } -int CORD_nnchr(CORD x, size_t i, size_t n, int not_c) +int CORD_range_contains_chr_greater_then(CORD x, size_t i, size_t n, int c) { chr_data d; - d.countdown = i+n; - d.target = not_c; - return(CORD_block_iter(x, i, CORD_nnchr_proc, &d) == 1/*alternatives: 0 normally ended, 2=struck 'n'*/); + d.countdown = n; + d.target = c; + return(CORD_block_iter(x, i, CORD_range_contains_chr_greater_then_proc, &d) == 1/*alternatives: 0 normally ended, 2=struck 'n'*/); } // helpers @@ -105,6 +105,7 @@ String& String::append_know_length(const // next: letters themselves body.append_know_length(str, known_length); + ASSERT_STRING_INVARIANT(*this); return *this; } String& String::append_help_length(const char* str, size_t helper_length, Language lang) { @@ -126,6 +127,7 @@ String& String::append_strdup(const char // next: letters themselves body.append_strdup_know_length(str, known_length); + ASSERT_STRING_INVARIANT(*this); return *this; } @@ -140,18 +142,19 @@ String& String::mid(size_t substr_begin, return result; // first: their langs - result.langs.append(result.body, langs, substr_begin, substr_end); + result.langs.append(result.body, langs, substr_begin, substr_end-substr_begin); // next: letters themselves result.body=body.mid(substr_begin, substr_end-substr_begin); // SAPI::log("piece of '%s' from %d to %d is '%s'", //cstr(), substr_begin, substr_end, result.cstr()); + ASSERT_STRING_INVARIANT(result); return result; } size_t String::pos(const StringBody substr, size_t this_offset, Language lang) const { size_t substr_begin=body.pos(substr, this_offset); - if(substr_begin==CORD_NOT_FOUND || !langs.check_lang(lang, this_offset, substr.length())) + if(substr_begin==CORD_NOT_FOUND || !langs.check_lang(lang, substr_begin, substr.length())) return STRING_NOT_FOUND; return substr_begin; @@ -420,6 +423,7 @@ const String& String::replace(const Dict result.body.append_strdup_know_length(prematch_begin, postmatch_length); } + ASSERT_STRING_INVARIANT(result); return result; }