|
|
| version 1.123, 2001/11/19 12:17:06 | version 1.129, 2001/12/10 09:44:17 |
|---|---|
| Line 189 break2: | Line 189 break2: |
| int String::cmp(int& partial, const String& src, | int String::cmp(int& partial, const String& src, |
| size_t this_offset, Untaint_lang lang) const { | size_t this_offset, Untaint_lang lang) const { |
| partial=-1; | partial=-1; |
| this_offset=min(this_offset, size()-1); | size_t a_size=size(); |
| this_offset=min(this_offset, a_size-1); | |
| const Chunk *a_chunk=&head; | const Chunk *a_chunk=&head; |
| const Chunk *b_chunk=&src.head; | const Chunk *b_chunk=&src.head; |
| Line 204 int String::cmp(int& partial, const Stri | Line 205 int String::cmp(int& partial, const Stri |
| int result; | int result; |
| size_t pos=0; | size_t pos=0; |
| bool a_break=size()==0; | bool a_break=a_size==0; |
| bool b_break=src.size()==0; | bool b_break=src.size()==0; |
| if(!(a_break || b_break)) while(true) { | if(!(a_break || b_break)) while(true) { |
| if(pos+a_row->item.size > this_offset) { | if(pos+a_row->item.size > this_offset) { |
| Line 277 int String::cmp(int& partial, const Stri | Line 278 int String::cmp(int& partial, const Stri |
| int String::cmp(int& partial, const char* b_ptr, size_t src_size, | int String::cmp(int& partial, const char* b_ptr, size_t src_size, |
| size_t this_offset, Untaint_lang lang) const { | size_t this_offset, Untaint_lang lang) const { |
| partial=-1; | partial=-1; |
| size_t a_size=size(); | |
| size_t b_size=src_size?src_size:b_ptr?strlen(b_ptr):0; | size_t b_size=src_size?src_size:b_ptr?strlen(b_ptr):0; |
| this_offset=min(this_offset, size()-1); | this_offset=min(this_offset, a_size-1); |
| const Chunk *a_chunk=&head; | const Chunk *a_chunk=&head; |
| const Chunk::Row *a_row=a_chunk->rows; | const Chunk::Row *a_row=a_chunk->rows; |
| Line 288 int String::cmp(int& partial, const char | Line 290 int String::cmp(int& partial, const char |
| uint a_countdown=a_chunk->count; | uint a_countdown=a_chunk->count; |
| size_t pos=0; | size_t pos=0; |
| bool a_break=size()==0; | bool a_break=a_size==0; |
| bool b_break=b_size==0; | bool b_break=b_size==0; |
| if(!(a_break || b_break)) while(true) { | if(!(a_break || b_break)) while(true) { |
| if(pos+a_row->item.size > this_offset) { | if(pos+a_row->item.size > this_offset) { |
| Line 395 break2: | Line 397 break2: |
| int String::pos(const String& substr, | int String::pos(const String& substr, |
| int result, Untaint_lang lang) const { | int result, Untaint_lang lang) const { |
| for(; result<size(); result++) { | size_t self_size=size(); |
| for(; result<self_size; result++) { | |
| int partial; cmp(partial, substr, result, lang); | int partial; cmp(partial, substr, result, lang); |
| if( | if( |
| partial==0 || // full match | partial==0 || // full match |
| Line 408 int String::pos(const String& substr, | Line 411 int String::pos(const String& substr, |
| int String::pos(const char *substr, size_t substr_size, | int String::pos(const char *substr, size_t substr_size, |
| int result, Untaint_lang lang) const { | int result, Untaint_lang lang) const { |
| for(; result<size(); result++) { | size_t self_size=size(); |
| for(; result<self_size; result++) { | |
| int partial; cmp(partial, substr, substr_size, result, lang); | int partial; cmp(partial, substr, substr_size, result, lang); |
| if( | if( |
| partial==0 || // full match | partial==0 || // full match |
| Line 423 void String::split(Array& result, | Line 427 void String::split(Array& result, |
| size_t* pos_after_ref, | size_t* pos_after_ref, |
| const char *delim, size_t delim_size, | const char *delim, size_t delim_size, |
| Untaint_lang lang, int limit) const { | Untaint_lang lang, int limit) const { |
| size_t self_size=size(); | |
| if(delim_size) { | if(delim_size) { |
| size_t pos_after=pos_after_ref?*pos_after_ref:0; | size_t pos_after=pos_after_ref?*pos_after_ref:0; |
| int pos_before; | int pos_before; |
| Line 432 void String::split(Array& result, | Line 437 void String::split(Array& result, |
| pos_after=pos_before+delim_size; | pos_after=pos_before+delim_size; |
| } | } |
| // last piece | // last piece |
| if(pos_after<size() && limit) { | if(pos_after<self_size && limit) { |
| result+=&mid(pos_after, size()); | result+=&mid(pos_after, self_size); |
| pos_after=size(); | pos_after=self_size; |
| } | } |
| if(pos_after_ref) | if(pos_after_ref) |
| *pos_after_ref=pos_after; | *pos_after_ref=pos_after; |
| } else { // empty delim | } else { // empty delim |
| result+=this; | result+=this; |
| if(pos_after_ref) | if(pos_after_ref) |
| *pos_after_ref+=size(); | *pos_after_ref+=self_size; |
| } | } |
| } | } |
| Line 673 void String::join_chain(Pool& pool, | Line 678 void String::join_chain(Pool& pool, |
| if(row->item.lang==joined_lang) | if(row->item.lang==joined_lang) |
| joined_size+=row->item.size; | joined_size+=row->item.size; |
| else | else |
| break; | goto break21; |
| } | } |
| if(chunk=row->link) { | if(chunk=row->link) { |
| start_i=0; | start_i=0; |
| Line 709 break21:; | Line 714 break21:; |
| memcpy(ptr, row->item.ptr, row->item.size); | memcpy(ptr, row->item.ptr, row->item.size); |
| ptr+=row->item.size; | ptr+=row->item.size; |
| } else | } else |
| break; | goto break22; |
| } | } |
| if(chunk=row->link) { | if(chunk=row->link) { |
| start_i=0; | start_i=0; |
| Line 847 int String::as_int() const { | Line 852 int String::as_int() const { |
| return result; | return result; |
| } | } |
| inline void ushort2uchars(ushort word, uchar& byte1, uchar& byte2) { | |
| byte1=word&0xFF; | |
| byte2=word>>8; | |
| } | |
| inline ushort uchars2ushort(uchar byte1, uchar byte2) { | |
| return (byte2<<8) | byte1; | |
| } | |
| /* @todo maybe network order worth spending some effort? | /* @todo maybe network order worth spending some effort? |
| don't bothering myself with network byte order, | don't bothering myself with network byte order, |
| am not planning to be able to move resulting file across platforms | am not planning to be able to move resulting file across platforms |
| Line 855 int String::as_int() const { | Line 867 int String::as_int() const { |
| void String::serialize(size_t prolog_size, void *& buf, size_t& buf_size) const { | void String::serialize(size_t prolog_size, void *& buf, size_t& buf_size) const { |
| buf_size= | buf_size= |
| prolog_size | prolog_size |
| +used_rows()*(sizeof(Untaint_lang)+sizeof(size_t)) | +used_rows()*(sizeof(uchar)+sizeof(ushort)) |
| +size(); | +size(); |
| buf=malloc(buf_size,15); | buf=malloc(buf_size,15); |
| char *cur=(char *)buf+prolog_size; | char *cur=(char *)buf+prolog_size; |
| STRING_FOREACH_ROW( | STRING_FOREACH_ROW( |
| // lang | // lang |
| memcpy(cur, &row->item.lang, sizeof(Untaint_lang)); | memcpy(cur, &row->item.lang, sizeof(uchar)); |
| cur+=sizeof(Untaint_lang); | cur+=sizeof(uchar); |
| // size | // size |
| memcpy(cur, &row->item.size, sizeof(size_t)); | uchar byte1; uchar byte2; |
| cur+=sizeof(size_t); | ushort2uchars(row->item.size, byte1, byte2); |
| memcpy(cur, &byte1, sizeof(uchar)); cur+=sizeof(uchar); | |
| memcpy(cur, &byte2, sizeof(uchar)); cur+=sizeof(uchar); | |
| // bytes | // bytes |
| memcpy(cur, row->item.ptr, row->item.size); | memcpy(cur, row->item.ptr, row->item.size); |
| cur+=row->item.size; | cur+=row->item.size; |
| Line 874 void String::serialize(size_t prolog_siz | Line 888 void String::serialize(size_t prolog_siz |
| break2: | break2: |
| ; | ; |
| } | } |
| /* @todo maybe network order worth spending some effort? | |
| don't bothering myself with network byte order, | |
| am not planning to be able to move resulting file across platforms | |
| for now | |
| */ | |
| #ifndef DOXYGEN | |
| struct Serialized_piece { | |
| String::Untaint_lang lang; | |
| size_t size; | |
| char ptr[1]; | |
| }; | |
| #endif | |
| void String::deserialize(size_t prolog_size, void *buf, size_t buf_size, const char *file) { | void String::deserialize(size_t prolog_size, void *buf, size_t buf_size, const char *file) { |
| char *cur=((char *)buf)+prolog_size; | char *cur=(char *)buf+prolog_size; |
| buf_size-=prolog_size; | buf_size-=prolog_size; |
| while(buf_size) { | while(buf_size) { |
| Serialized_piece& p=*(Serialized_piece *)cur; | uchar lang=*(uchar *)(cur); |
| APPEND(p.ptr, p.size, p.lang, file, 0); | |
| ushort size=uchars2ushort( | |
| *(uchar*)(cur+sizeof(uchar)*1), | |
| *(uchar*)(cur+sizeof(uchar)*2) | |
| ); | |
| size_t piece_size=sizeof(p.lang)+sizeof(p.size)+p.size; | const char *ptr=(const char*)(cur+sizeof(uchar)*3); |
| APPEND(ptr, size, lang, file, 0); | |
| size_t piece_size=sizeof(uchar)+sizeof(ushort)+size; | |
| cur+=piece_size; | cur+=piece_size; |
| buf_size-=piece_size; | buf_size-=piece_size; |
| } | } |
| } | } |