|
|
| version 1.52, 2001/03/25 08:52:36 | version 1.53, 2001/03/29 15:00:22 |
|---|---|
| Line 14 | Line 14 |
| #include "pa_string.h" | #include "pa_string.h" |
| #include "pa_hash.h" | #include "pa_hash.h" |
| #include "pa_exception.h" | #include "pa_exception.h" |
| #include "pa_common.h" | |
| // String | // String |
| Line 30 String::String(Pool& apool, const char * | Line 31 String::String(Pool& apool, const char * |
| if(tainted) | if(tainted) |
| APPEND_TAINTED(src, 0, 0, 0); | APPEND_TAINTED(src, 0, 0, 0); |
| else | else |
| APPEND(src, 0, 0, 0); | APPEND_CONST(src); |
| } | } |
| void String::expand() { | void String::expand() { |
| Line 352 const Origin& String::origin() const { | Line 353 const Origin& String::origin() const { |
| return append_here[-1].item.origin; | return append_here[-1].item.origin; |
| } | } |
| #endif | #endif |
| String& String::piece(size_t start, size_t finish) const { | |
| start=max(0, start); | |
| finish=min(size(), finish); | |
| String& result=*NEW String(pool()); | |
| size_t pos=0; | |
| const Chunk *chunk=&head; | |
| do { | |
| const Chunk::Row *row=chunk->rows; | |
| for(int i=0; i<chunk->count; pos+=row->item.size, i++, row++) { | |
| if(row==append_here) | |
| goto break2; | |
| if(start>=pos) { // started now or already? | |
| size_t item_finish=pos+row->item.size; | |
| bool started=start < item_finish; // started now? | |
| bool finished=finish < item_finish; // finished now? | |
| size_t offset=started?start-pos:0; | |
| size_t size=finished?finish-pos:row->item.size; | |
| result.APPEND( | |
| row->item.ptr+offset, size-offset, | |
| row->item.lang, | |
| row->item.origin.file, row->item.origin.line); | |
| if(finished) | |
| goto break2; | |
| } | |
| } | |
| chunk=row->link; | |
| } while(chunk); | |
| break2: | |
| return result; | |
| } | |