|
|
| version 1.107, 2001/10/11 10:21:44 | version 1.108, 2001/10/11 14:00:10 |
|---|---|
| Line 654 break2: | Line 654 break2: |
| return result; | return result; |
| } | } |
| /// @test restructure string to link pieces of same language together prior to this. | void String::join_chain(Pool& pool, |
| String& String::replace(Pool& pool, Dictionary& dict) const { | size_t& ai, const Chunk*& achunk, const Chunk::Row*& arow, |
| Untaint_lang& joined_lang, const char *& joined_ptr, size_t& joined_size) const { | |
| joined_lang=arow->item.lang; | |
| // calc size | |
| joined_size=0; | |
| { | |
| size_t start_i=ai; | |
| const Chunk::Row *start_row=arow; | |
| const Chunk *chunk=achunk; | |
| do { | |
| const Chunk::Row *row=start_row; | |
| for(size_t i=start_i; i<chunk->count; i++, row++) { | |
| if(row==append_here) | |
| goto break21; | |
| if(row->item.lang==joined_lang) | |
| joined_size+=row->item.size; | |
| else | |
| break; | |
| } | |
| if(chunk=row->link) { | |
| start_i=0; | |
| start_row=chunk->rows; | |
| } else | |
| break; | |
| } while(true); | |
| break21:; | |
| } | |
| // if one row, return simply itself | |
| if(joined_size==arow->item.size) { | |
| joined_ptr=arow->item.ptr; | |
| ai++; arow++; | |
| if(ai==achunk->count) | |
| achunk=arow->link; | |
| } else { | |
| // join adjacent rows | |
| char *ptr=(char *)pool.malloc(joined_size); | |
| joined_ptr=ptr; | |
| size_t start_i=ai; | |
| const Chunk::Row *start_row=arow; | |
| const Chunk *chunk=achunk; | |
| size_t i; | |
| const Chunk::Row *row; | |
| do { | |
| row=start_row; | |
| for(i=start_i; i<chunk->count; i++, row++) { | |
| if(row==append_here) | |
| goto break22; | |
| if(row->item.lang==joined_lang) { | |
| memcpy(ptr, row->item.ptr, row->item.size); | |
| ptr+=row->item.size; | |
| } else | |
| break; | |
| } | |
| if(chunk=row->link) { | |
| start_i=0; | |
| start_row=chunk->rows; | |
| } else | |
| break; | |
| } while(true); | |
| break22:; | |
| // return joined rows | |
| ai=i; | |
| arow=row; | |
| achunk=chunk; | |
| } | |
| } | |
| String& String::reconstruct(Pool& pool) const { | |
| //_asm int 3; | |
| String& result=*new(pool) String(pool); | |
| const Chunk *chunk=&head; | |
| do { | |
| const Chunk::Row *row=chunk->rows; | |
| for(size_t i=0; i<chunk->count; ) { | |
| if(row==append_here) | |
| goto break2; | |
| Untaint_lang joined_lang; | |
| char *joined_ptr; | |
| size_t joined_size; | |
| join_chain(pool, i, chunk, row, | |
| joined_lang, joined_ptr, joined_size); | |
| result.APPEND(joined_ptr, joined_size, | |
| joined_lang, | |
| row->item.origin.file, row->item.origin.line); | |
| if(!chunk) | |
| goto break2; | |
| } | |
| } while(true); | |
| break2: | |
| return result; | |
| }; | |
| String& String::replace_in_reconstructed(Pool& pool, Dictionary& dict) const { | |
| //_asm int 3; | //_asm int 3; |
| String& result=*new(pool) String(pool); | String& result=*new(pool) String(pool); |
| const Chunk *chunk=&head; | const Chunk *chunk=&head; |
| Line 696 break2: | Line 796 break2: |
| return result; | return result; |
| } | } |
| String& String::replace(Pool& pool, Dictionary& dict) const { | |
| return reconstruct(pool).replace_in_reconstructed(pool, dict); | |
| } | |
| double String::as_double() const { | double String::as_double() const { |
| double result; | double result; |
| const char *cstr=this->cstr(); | const char *cstr=this->cstr(); |