Diff for /parser3/src/main/pa_string.C between versions 1.35 and 1.45

version 1.35, 2001/03/10 12:12:51 version 1.45, 2001/03/19 16:44:02
Line 1 Line 1
 /*  /** @file
   $Id$          Parser
           Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
           Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
   
           $Id$
 */  */
   
 #include <string.h>  #include <string.h>
Line 11 Line 15
   
 // String  // String
   
 String::String(Pool& apool) :  String::String(Pool& apool, const char *src, bool tainted) :
         Pooled(apool) {          Pooled(apool) {
         last_chunk=&head;          last_chunk=&head;
         head.count=CR_PREALLOCATED_COUNT;          head.count=CR_PREALLOCATED_COUNT;
Line 19  String::String(Pool& apool) : Line 23  String::String(Pool& apool) :
         head.preallocated_link=0;          head.preallocated_link=0;
         link_row=&head.rows[head.count];          link_row=&head.rows[head.count];
         fused_rows=fsize=0;          fused_rows=fsize=0;
   
           if(src)
                   if(tainted)
                           APPEND_TAINTED(src, 0, 0, 0);
                   else
                           APPEND(src, 0, 0, 0);
 }  }
   
 void String::expand() {  void String::expand() {
Line 32  void String::expand() { Line 42  void String::expand() {
         link_row->link=0;          link_row->link=0;
 }  }
   
 String::String(const String& src) :  String::String(const String& src) :     Pooled(src.pool()) {
         Pooled(src.pool()) {  
         head.count=CR_PREALLOCATED_COUNT;          head.count=CR_PREALLOCATED_COUNT;
                   
         int src_used_rows=src.used_rows();          int src_used_rows=src.fused_rows;
         if(src_used_rows<=head.count) {          if(src_used_rows<=head.count) {
                 // all new rows fit into preallocated area                  // all new rows fit into preallocated area
                 int curr_chunk_rows=head.count;                  int curr_chunk_rows=head.count;
Line 90  String::String(const String& src) : Line 99  String::String(const String& src) :
         fsize=src.fsize;          fsize=src.fsize;
 }  }
   
 String& String::append(const String& src, Untaint_lang lang) {  String& String::append(const String& src, Untaint_lang lang, bool forced) {
         int src_used_rows=src.used_rows();          int src_used_rows=src.fused_rows;
         int dst_free_rows=link_row-append_here;          int dst_free_rows=link_row-append_here;
                   
         if(src_used_rows<=dst_free_rows) {          if(src_used_rows<=dst_free_rows) {
                 // all new rows fit into last chunk                  // all new rows fit into last chunk
                 memcpy(append_here, src.head.rows, sizeof(Chunk::Row)*src_used_rows);                  memcpy(append_here, src.head.rows, sizeof(Chunk::Row)*src_used_rows);
                 set_lang(append_here, lang, src_used_rows);                  set_lang(append_here, lang, forced, src_used_rows);
                 append_here+=src_used_rows;                  append_here+=src_used_rows;
         } else {          } else {
                 // not all new rows fit into last chunk: shrinking it to used part,                  // not all new rows fit into last chunk: shrinking it to used part,
Line 122  String& String::append(const String& src Line 131  String& String::append(const String& src
                                 // not last source chunk                                  // not last source chunk
                                 // taking it all                                  // taking it all
                                 memcpy(new_rows, old_chunk->rows, sizeof(Chunk::Row)*old_count);                                  memcpy(new_rows, old_chunk->rows, sizeof(Chunk::Row)*old_count);
                                 set_lang(new_rows, lang, old_count);                                  set_lang(new_rows, lang, forced, old_count);
                                 new_rows+=old_count;                                  new_rows+=old_count;
                                 rows_left_to_copy-=old_count;                                  rows_left_to_copy-=old_count;
   
Line 131  String& String::append(const String& src Line 140  String& String::append(const String& src
                                 // the last source chunk                                  // the last source chunk
                                 // taking only those rows of chunk that _left_to_copy                                  // taking only those rows of chunk that _left_to_copy
                                 memcpy(new_rows, old_chunk->rows, sizeof(Chunk::Row)*rows_left_to_copy);                                  memcpy(new_rows, old_chunk->rows, sizeof(Chunk::Row)*rows_left_to_copy);
                                 set_lang(new_rows, lang, rows_left_to_copy);                                  set_lang(new_rows, lang, forced, rows_left_to_copy);
                                 break;                                  break;
                         }                          }
                 }                  }
Line 142  String& String::append(const String& src Line 151  String& String::append(const String& src
   
         return *this;          return *this;
 }  }
 void String::set_lang(Chunk::Row *row, Untaint_lang lang, size_t size) {  void String::set_lang(Chunk::Row *row, Untaint_lang lang, bool forced, size_t size) {
         if(lang==PASS_APPENDED)          if(lang==PASS_APPENDED)
                 return;                  return;
   
         while(size--) {          while(size--) {
                 Untaint_lang& item_lang=(row++)->item.lang;                  Untaint_lang& item_lang=(row++)->item.lang;
                 if(item_lang==YES) // tainted? need untaint language assignment                  if(item_lang==YES || forced) // tainted? need untaint language assignment
                         item_lang=lang;  // assign untaint language                          item_lang=lang;  // assign untaint language
         }          }
 }  }
   
   /*void String::change_lang(Untaint_lang lang) {
           Chunk *chunk=&head; 
           do {
                   Chunk::Row *row=chunk->rows;
                   for(int i=0; i<chunk->count; i++) {
                           if(row==append_here)
                                   goto break2;
   
                           row->item.lang=lang;
                           row++;
                   }
                   chunk=row->link;
           } while(chunk);
   break2:
           return;
   }
   */
 String& String::real_append(STRING_APPEND_PARAMS) {  String& String::real_append(STRING_APPEND_PARAMS) {
         if(!src)          if(!src)
                 return *this;                  return *this;
Line 166  String& String::real_append(STRING_APPEN Line 192  String& String::real_append(STRING_APPEN
   
         append_here->item.ptr=src;          append_here->item.ptr=src;
         fsize+=append_here->item.size=size;          fsize+=append_here->item.size=size;
         append_here->item.lang=tainted?/*Untaint_lang::*/YES:Untaint_lang::NO;          append_here->item.lang=tainted?YES:NO;
 #ifndef NO_STRING_ORIGIN  #ifndef NO_STRING_ORIGIN
         append_here->item.origin.file=file;          append_here->item.origin.file=file;
         append_here->item.origin.line=line;          append_here->item.origin.line=line;
Line 176  String& String::real_append(STRING_APPEN Line 202  String& String::real_append(STRING_APPEN
         return *this;          return *this;
 }  }
   
 char *String::cstr() const {  
         char *result=static_cast<char *>(malloc(size()+1));  
   
         char *copy_here=result;  
         const Chunk *chunk=&head;   
         do {  
                 const Chunk::Row *row=chunk->rows;  
                 for(int i=0; i<chunk->count; i++) {  
                         if(row==append_here)  
                                 goto break2;  
   
                         switch(row->item.lang) {  
                         case NO:  
                         case YES: // for VString.get_double of tainted values  
                         case AS_IS:   
                                 memcpy(copy_here, row->item.ptr, row->item.size);   
                                 break;  
                         case HTML_TYPO:   
                                 memset(copy_here, '?', row->item.size);   
                                 break;  
                         default:  
                                 THROW(0,0,  
                                         this,  
                                         "unknown untaint language #%d of %d piece",   
                                                 static_cast<int>(row->item.lang),  
                                                 i);  
                         }  
                         copy_here+=row->item.size;  
                         row++;  
                 }  
                 chunk=row->link;  
         } while(chunk);  
 break2:  
         *copy_here=0;  
         return result;  
 }  
   
 uint String::hash_code() const {  uint String::hash_code() const {
         uint result=0;          uint result=0;
   
Line 296  int String::cmp(const String& src) const Line 285  int String::cmp(const String& src) const
         return result;          return result;
 }  }
   
 bool String::operator == (char* b_ptr) const {  bool String::operator == (const char* b_ptr) const {
         size_t b_size=b_ptr?strlen(b_ptr):0;          size_t b_size=b_ptr?strlen(b_ptr):0;
         if(size() != b_size)          if(size() != b_size)
                 return false;                  return false;

Removed from v.1.35  
changed lines
  Added in v.1.45


E-mail: