--- parser3/src/main/pa_dictionary.C 2003/03/18 15:14:18 1.17.2.6.2.1 +++ parser3/src/main/pa_dictionary.C 2003/03/20 11:11:55 1.17.2.6.2.3 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_DICTIONARY_C="$Date: 2003/03/18 15:14:18 $"; +static const char* IDENT_DICTIONARY_C="$Date: 2003/03/20 11:11:55 $"; #include "pa_dictionary.h" #include "pa_exception.h" @@ -13,10 +13,9 @@ static const char* IDENT_DICTIONARY_C="$ // 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 - const String& a=row->get(0); - const String& b=row->get(1); + const String* a=row->get(0); // empty 'a' check - if(a->is_empty()) { + if(!*a) { throw Exception("parser.runtime", a, "dictionary table 'from' column elements must not be empty"); @@ -25,26 +24,17 @@ void pa_dictionary_add_first(Table::elem if(!self->starting_line_of[c]) 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++; } -Dictionary::Dictionary(Table* atable, double amin_ratio): - table(atable), - fmax_ratio(amin_ratio) { - - // clear starting_lines - memset(starting_line_of, 0, sizeof(starting_line_of)); +Dictionary::Dictionary(Table& atable): table(atable) { // grab first letters of first column of a table - constructor_line=1; table->for_each(pa_dictionary_add_first, this); + constructor_line=1; table.for_each(pa_dictionary_add_first, this); } #ifndef DOXYGEN struct First_that_starts_info { int line; - const char* src; size_t src_size; + const char* str; }; #endif static bool starts(Table::element_type row, First_that_starts_info* info) { @@ -54,19 +44,13 @@ static bool starts(Table::element_type r return 0; } - int partial; - row->get(0)->cmp(partial, info->src, info->src_size); - return ( - partial==0 || // full match - partial==1); // typo left column starts 'src' + return row->get(0)->this_starts(info->str); } - -Table::element_type Dictionary::first_that_starts(const char* src, size_t src_size) const { +Table::element_type Dictionary::first_that_starts(const char* str) const { First_that_starts_info info; - if(info.line=starting_line_of[(unsigned char)*src]) { - info.src=src; - info.src_size=src_size; - return table->first_that(starts, &info); + if(info.line=starting_line_of[(unsigned char)*str]) { + info.str=str; + return table.first_that(starts, &info); } else return Table::element_type(0); }