Diff for /parser3/src/main/pa_dictionary.C between versions 1.17.2.2 and 1.22.14.1

version 1.17.2.2, 2003/01/24 11:33:03 version 1.22.14.1, 2005/08/05 13:03:01
Line 1 Line 1
 /**     @file  /**     @file
         Parser: dictionary class  impl.          Parser: dictionary class  impl.
   
         Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
 */  */
   
 static const char* IDENT_DICTIONARY_C="$Date$";  static const char * const IDENT_DICTIONARY_C="$Date$";
   
 #include "pa_dictionary.h"  #include "pa_dictionary.h"
 #include "pa_exception.h"  #include "pa_exception.h"
   
 static void add_first(Table::element_type row, Dictionary* self) {  // could not make this static: gcc complains "prev decl was extern"
   void pa_dictionary_add_first(Table::element_type row, Dictionary* self) {
         // get a=>b values          // get a=>b values
         ConstStringPtr a=row->get(0);          const String* a=row->get(0);
         ConstStringPtr b=row->get(1);  
         // empty 'a' check          // empty 'a' check
         if(a->is_empty()) {          if(a->is_empty()) {
                 throw Exception("parser.runtime",                  throw Exception("parser.runtime",
                         a,                           0, //&a, 
                         "dictionary table 'from' column elements must not be empty");                          "dictionary table 'from' column elements must not be empty");
         }          }
           const String* b;
           if(row->count()>1) { // are there any b?
                   b=row->get(1);
                   if(b->is_empty())
                           b=0;
           } else
                   b=0;
   
           // record simplier 'a' for quick comparisons in 'starts' extremely-tight-callback
           self->substs+=Dictionary::Subst(a->cstr(), b);
   
         unsigned char c=(unsigned char)a->first_char();          unsigned char c=(unsigned char)a->first_char();
         if(!self->starting_line_of[c])          if(!self->starting_line_of[c])
                 self->starting_line_of[c]=self->constructor_line;                  self->starting_line_of[c]=self->constructor_line;
   
         double ratio=((double)b->size())/a->size();  
         if(ratio>self->fmax_ratio)  
                 self->fmax_ratio=ratio;  
   
         self->constructor_line++;          self->constructor_line++;
 }  }
 Dictionary::Dictionary(TablePtr  atable, double amin_ratio):  Dictionary::Dictionary(Table& atable): substs(atable.count()) {
         table(atable),   
         fmax_ratio(amin_ratio)  {  
   
         // clear starting_lines          // clear starting_lines
         memset(starting_line_of, 0, sizeof(starting_line_of));          memset(starting_line_of, 0, sizeof(starting_line_of));
         // grab first letters of first column of a table          // grab first letters of first column of a table
         constructor_line=1;  table->for_each(add_first, this);          constructor_line=1;  atable.for_each(pa_dictionary_add_first, this);
 }  }
   
 #ifndef DOXYGEN  #ifndef DOXYGEN
 struct First_that_starts_info {  struct First_that_begins_info {
         int line;          int line;
         const char *src;  size_t src_size;          const char* str;
 };  };
 #endif  #endif
 static bool starts(Table::element_type row, First_that_starts_info* info) {  static bool starts(Dictionary::Subst subst, First_that_begins_info* info) {
         // skip irrelevant lines          // skip irrelevant lines
         if(info->line>1) {          if(info->line>1) {
                 --info->line;                  --info->line;
                 return 0;                  return 0;
         }          }
   
         int partial;          return strncmp(subst.from, info->str, subst.from_length)==0;
         row->get(0)->cmp(partial, info->src, info->src_size);  
         return (  
                 partial==0 || // full match  
                 partial==1); // typo left column starts 'src'  
 }  }
   Dictionary::Subst Dictionary::first_that_begins(const char* str) const {
 Table::element_type Dictionary::first_that_starts(const char *src, size_t src_size) const {          First_that_begins_info info;
         First_that_starts_info info;          if((info.line=starting_line_of[(unsigned char)*str])) {
         if(info.line=starting_line_of[(unsigned char)*src]) {                  info.str=str;
                 info.src=src;                  return substs.first_that(starts, &info);
                 info.src_size=src_size;  
                 return table->first_that(starts, &info);  
         } else          } else
                 return Table::element_type(0);                  return 0;
 }  }

Removed from v.1.17.2.2  
changed lines
  Added in v.1.22.14.1


E-mail: