Diff for /parser3/src/main/pa_string.C between versions 1.52 and 1.53

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;
   }
   

Removed from v.1.52  
changed lines
  Added in v.1.53


E-mail: