|
|
| version 1.172.2.21.2.32, 2003/03/27 10:04:08 | version 1.172.2.21.2.35, 2003/04/02 10:10:01 |
|---|---|
| Line 28 public: | Line 28 public: |
| *this+=new String("match"); | *this+=new String("match"); |
| *this+=new String("postmatch"); | *this+=new String("postmatch"); |
| for(int i=0; i<MAX_MATCH_GROUPS; i++) { | for(int i=0; i<MAX_MATCH_GROUPS; i++) { |
| char *cname=new(PointerFreeGC) char[3/*strlen("100")*/+1/*terminating 0*/]; | *this+=new String(StringBody::Format(1+i), String::L_CLEAN); |
| *this+=new String(cname, sprintf(cname, "%d", 1+i)); | |
| } | } |
| } | } |
| }; | }; |
| Line 46 void String::ArrayFragment::append_posit | Line 45 void String::ArrayFragment::append_posit |
| 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 element_type& fragment=i.next(); | const element_type fragment=i.next(); |
| fragment_end=fragment_begin+fragment.length; | fragment_end=fragment_begin+fragment.length; |
| if(substr_begin<fragment_begin) // not reached fragments which may include 'substr'? | if(substr_begin<fragment_begin) // not reached fragments which may include 'substr'? |
| Line 62 void String::ArrayFragment::append_posit | Line 61 void String::ArrayFragment::append_posit |
| while(substr_end>fragment_end) { // are there more fragments including pieces of 'substr'? | while(substr_end>fragment_end) { // are there more fragments including pieces of 'substr'? |
| fragment_begin=fragment_end; | fragment_begin=fragment_end; |
| const element_type& fragment=i.next(); | const element_type fragment=i.next(); |
| fragment_end=fragment_begin+fragment.length; | fragment_end=fragment_begin+fragment.length; |
| if(substr_end>fragment_end) // are there still more? | if(substr_end>fragment_end) // are there still more? |
| Line 105 uint StringBody::hash_code() const { | Line 104 uint StringBody::hash_code() const { |
| // String methods | // String methods |
| String::String(const char* cstr, size_t length, bool tainted): body(CORD_EMPTY) { | String::String(const char* cstr, size_t help_length, bool tainted): body(CORD_EMPTY) { |
| append(cstr, length, tainted?L_TAINTED:L_CLEAN); | append_help_length(cstr, help_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); |
| } | } |
| String& String::append(const char* str, size_t 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; |
| size_t use_length=length?length:strlen(str); | size_t use_length=helper_length?helper_length:strlen(str); |
| if(!use_length) | if(!use_length) |
| return *this; | return *this; |
| body.append(str, use_length); | body.append_help_length(str, use_length); |
| fragments+=Fragment(lang, use_length); | fragments+=Fragment(lang, use_length); |
| return *this; | return *this; |
| } | } |
| String& String::append_strdup(const char* str, size_t length, Language lang) { | |
| body.append_strdup(str, length); | |
| fragments+=Fragment(lang, length); | |
| return *this; | |
| } | |
| /// @todo check in doc: whether it documents NOW bad situation "abc".mid(-1, 3) =were?="ab" | /// @todo check in doc: whether it documents NOW bad situation "abc".mid(-1, 3) =were?="ab" |
| String& String::mid(size_t substr_begin, size_t substr_end) const { | String& String::mid(size_t substr_begin, size_t substr_end) const { |
| Line 164 size_t String::pos(const StringBody subs | Line 169 size_t String::pos(const StringBody subs |
| size_t fragment_begin=0; | size_t fragment_begin=0; |
| size_t fragment_end; | size_t fragment_end; |
| for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); fragment_begin=fragment_end) { | for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); 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; |
| if(substr_begin<fragment_begin) // not reached fragments which may include 'result'? | if(substr_begin<fragment_begin) // not reached fragments which may include 'result'? |
| Line 432 const String& String::replace(const Dict | Line 437 const String& String::replace(const Dict |
| if(Table::element_type row=dict.first_that_begins(current)) { | if(Table::element_type row=dict.first_that_begins(current)) { |
| // prematch | // prematch |
| if(size_t prematch_length=current-prematch_begin) { | if(size_t prematch_length=current-prematch_begin) { |
| result.body.append(prematch_begin, prematch_length); | result.body.append_strdup(prematch_begin, prematch_length); |
| result.fragments.append_positions(fragments, prematch_begin-old_cstr, current-old_cstr); | result.fragments.append_positions(fragments, prematch_begin-old_cstr, current-old_cstr); |
| } | } |
| Line 455 const String& String::replace(const Dict | Line 460 const String& String::replace(const Dict |
| // postmatch | // postmatch |
| if(size_t postmatch_length=current-prematch_begin) { | if(size_t postmatch_length=current-prematch_begin) { |
| result.body.append(prematch_begin, postmatch_length); | result.body.append_strdup(prematch_begin, postmatch_length); |
| result.fragments.append_positions(fragments, prematch_begin-old_cstr, current-old_cstr); | result.fragments.append_positions(fragments, prematch_begin-old_cstr, current-old_cstr); |
| } | } |
| Line 552 String::C String::serialize(size_t prolo | Line 557 String::C String::serialize(size_t prolo |
| // 3: lang info | // 3: lang info |
| for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); ) { | for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); ) { |
| const Fragment& fragment=i.next(); | const Fragment fragment=i.next(); |
| // lang | // lang |
| memcpy(cur, &fragment.lang, sizeof(fragment.lang)); cur+=sizeof(fragment.lang); | memcpy(cur, &fragment.lang, sizeof(fragment.lang)); cur+=sizeof(fragment.lang); |
| // length | // length |