|
|
| version 1.172.2.21.2.36, 2003/04/08 11:08:12 | version 1.172.2.21.2.38, 2003/04/08 13:58:30 |
|---|---|
| Line 42 void String::ArrayFragment::append_posit | Line 42 void String::ArrayFragment::append_posit |
| if(substr_begin==substr_end) | if(substr_begin==substr_end) |
| return; | return; |
| FILE *err=fopen("append.log", "wt"); | // FILE *err=fopen("append.log", "wt"); |
| size_t fragment_begin=0; | size_t fragment_begin=0; |
| size_t fragment_end; | size_t fragment_end; |
| for(Array_iterator<element_type> i(src); ; fragment_begin=fragment_end) { | for(Array_iterator<element_type> i(src); ; fragment_begin=fragment_end) { |
| const Fragment fragment=i.next(); | const Fragment fragment=i.next(); |
| fragment_end=fragment_begin+fragment.length; | fragment_end=fragment_begin+fragment.length; |
| fprintf(err, "1end=%u\n", fragment_end);fflush(err); | //fprintf(err, "1end=%u\n", fragment_end);fflush(err); |
| // not reached fragments which may include 'substr'? | // not reached fragments which may include 'substr'? |
| if(!(substr_begin>=fragment_begin && substr_begin<=fragment_end)) | if(!(substr_begin>=fragment_begin && substr_begin<=fragment_end)) |
| Line 63 void String::ArrayFragment::append_posit | Line 63 void String::ArrayFragment::append_posit |
| while(true) { | while(true) { |
| const Fragment fragment=i.next(); | const Fragment fragment=i.next(); |
| fragment_end=(fragment_begin=fragment_end)+fragment.length; | fragment_end=(fragment_begin=fragment_end)+fragment.length; |
| fprintf(err, "2end=%u\n", fragment_end);fflush(err); | //fprintf(err, "2end=%u\n", fragment_end);fflush(err); |
| if(substr_end>fragment_end) // are there still more? | if(substr_end>fragment_end) // are there still more? |
| append(Fragment(fragment.lang, fragment.length)); // appending whole fragment | append(Fragment(fragment.lang, fragment.length)); // appending whole fragment |
| else { // no, it was last | else { // no, it was last |
| append(Fragment(fragment.lang, substr_end-fragment_begin)); | append(Fragment(fragment.lang, substr_end-fragment_begin)); |
| fclose(err); | //fclose(err); |
| return; | return; |
| } | } |
| } | } |
| Line 77 void String::ArrayFragment::append_posit | Line 77 void String::ArrayFragment::append_posit |
| break; | break; |
| } | } |
| fclose(err); | //fclose(err); |
| } | } |
| // StringBody methods | // StringBody methods |
| Line 111 uint StringBody::hash_code() const { | Line 111 uint StringBody::hash_code() const { |
| String::String(const char* cstr, size_t helper_length, bool tainted): body(CORD_EMPTY) { | String::String(const char* cstr, size_t helper_length, bool tainted): body(CORD_EMPTY) { |
| append_help_length(cstr, helper_length, tainted?L_TAINTED:L_CLEAN); | append_help_length(cstr, helper_length, tainted?L_TAINTED:L_CLEAN); |
| } | } |
| String::String(const String::C cstr, bool tainted): body(CORD_EMPTY) { | |
| append_know_length(cstr.str, cstr.length, tainted?L_TAINTED:L_CLEAN); | |
| } | |
| String::String(const String& src): body(src.body) { | String::String(const String& src): body(src.body) { |
| fragments.append(src.fragments); | fragments.append(src.fragments); |
| ASSERT_STRING_INVARIANT(*this); | |
| } | } |
| String& String::append_know_length(const char* str, size_t known_length, Language lang) { | |
| body.append_know_length(str, known_length); | |
| fragments+=Fragment(lang, known_length); | |
| ASSERT_STRING_INVARIANT(*this); | |
| return *this; | |
| } | |
| String& String::append_help_length(const char* str, size_t helper_length, Language lang) { | String& String::append_help_length(const char* str, size_t helper_length, Language lang) { |
| if(!str) | if(!str) |
| return *this; | return *this; |
| Line 123 String& String::append_help_length(const | Line 134 String& String::append_help_length(const |
| if(!known_length) | if(!known_length) |
| return *this; | return *this; |
| body.append_know_length(str, known_length); | return append_know_length(str, known_length, lang); |
| fragments+=Fragment(lang, known_length); | |
| return *this; | |
| } | } |
| String& String::append_strdup(const char* str, size_t helper_length, Language lang) { | String& String::append_strdup(const char* str, size_t helper_length, Language lang) { |
| size_t known_length=helper_length?helper_length:strlen(str); | size_t known_length=helper_length?helper_length:strlen(str); |
| Line 136 String& String::append_strdup(const char | Line 144 String& String::append_strdup(const char |
| body.append_strdup_know_length(str, known_length); | body.append_strdup_know_length(str, known_length); |
| fragments+=Fragment(lang, known_length); | fragments+=Fragment(lang, known_length); |
| ASSERT_STRING_INVARIANT(*this); | |
| return *this; | return *this; |
| } | } |
| Line 157 String& String::mid(size_t substr_begin, | Line 166 String& String::mid(size_t substr_begin, |
| // SAPI::log("piece of '%s' from %d to %d is '%s'", | // SAPI::log("piece of '%s' from %d to %d is '%s'", |
| //cstr(), substr_begin, substr_end, result.cstr()); | //cstr(), substr_begin, substr_end, result.cstr()); |
| ASSERT_STRING_INVARIANT(result); | |
| return result; | return result; |
| } | } |
| Line 469 const String& String::replace(const Dict | Line 479 const String& String::replace(const Dict |
| result.fragments.append_positions(fragments, prematch_begin-old_cstr, current-old_cstr); | result.fragments.append_positions(fragments, prematch_begin-old_cstr, current-old_cstr); |
| } | } |
| ASSERT_STRING_INVARIANT(result); | |
| return result; | return result; |
| } | } |
| Line 545 static int serialize_body_piece(const ch | Line 556 static int serialize_body_piece(const ch |
| memcpy(*cur, s, length); *cur+=length; | memcpy(*cur, s, length); *cur+=length; |
| return 0; | return 0; |
| }; | }; |
| String::C String::serialize(size_t prolog_length) const { | String::Cm String::serialize(size_t prolog_length) const { |
| size_t buf_length= | size_t buf_length= |
| prolog_length | prolog_length |
| +fragments.count()*(sizeof(Language)+sizeof(size_t)) | +fragments.count()*(sizeof(Language)+sizeof(size_t)) |
| +length(); | +length(); |
| C result(new(PointerFreeGC) char[buf_length], buf_length); | String::Cm result(new(PointerFreeGC) char[buf_length], buf_length); |
| // 1: prolog | // 1: prolog |
| char *cur=result.str+prolog_length; | char *cur=result.str+prolog_length; |
| Line 611 bool String::deserialize(size_t prolog_l | Line 622 bool String::deserialize(size_t prolog_l |
| body=StringBody(cur, buf_length); | body=StringBody(cur, buf_length); |
| } | } |
| ASSERT_STRING_INVARIANT(*this); | |
| return true; | return true; |
| } | } |