--- parser3/src/main/pa_dictionary.C 2002/02/08 07:27:47 1.11 +++ parser3/src/main/pa_dictionary.C 2003/02/04 10:57:16 1.17.2.6 @@ -1,77 +1,72 @@ /** @file Parser: dictionary class impl. - Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://paf.design.ru) - - $Id: pa_dictionary.C,v 1.11 2002/02/08 07:27:47 paf Exp $ + Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) */ +static const char* IDENT_DICTIONARY_C="$Date: 2003/02/04 10:57:16 $"; + #include "pa_dictionary.h" #include "pa_exception.h" -void Dictionary::add_first(Array::Item *value, void *info) { - Dictionary& self=*static_cast(info); - Array *row=static_cast(value); +// 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_string(0); - const String& b=*row->get_string(1); + StringPtr a=row->get(0); + StringPtr b=row->get(1); // empty 'a' check - if(a.size()==0) { - Pool& pool=self.pool(); - throw Exception(0, 0, - &a, + if(a->is_empty()) { + throw Exception("parser.runtime", + a, "dictionary table 'from' column elements must not be empty"); } - unsigned char c=(unsigned char)a.first_char(); - 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; + unsigned char c=(unsigned char)a->first_char(); + 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++; + self->constructor_line++; } -Dictionary::Dictionary(Table& atable, double amin_ratio) : Pooled(atable.pool()), +Dictionary::Dictionary(TablePtr atable, double amin_ratio): table(atable), fmax_ratio(amin_ratio) { // clear starting_lines memset(starting_line_of, 0, sizeof(starting_line_of)); // grab first letters of first column of a table - constructor_line=1; table.for_each(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* src; size_t src_size; }; #endif -static void *starts(Array::Item *value, void *info) { - First_that_starts_info& i=*static_cast(info); +static bool starts(Table::element_type row, First_that_starts_info* info) { // skip irrelevant lines - if(i.line>1) { - --i.line; + if(info->line>1) { + --info->line; return 0; } - Array *row=static_cast(value); int partial; - row->get_string(0)->cmp(partial, i.src, i.src_size); + row->get(0)->cmp(partial, info->src, info->src_size); return ( partial==0 || // full match - partial==1) // typo left column starts 'src' - ?value:0; + partial==1); // typo left column starts 'src' } -void* Dictionary::first_that_starts(const char *src, size_t src_size) const { +Table::element_type Dictionary::first_that_starts(const char* src, size_t src_size) 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); + return table->first_that(starts, &info); } else - return 0; + return Table::element_type(0); }