Annotation of parser3/src/main/pa_dictionary.C, revision 1.17.2.1

1.1       parser      1: /**    @file
                      2:        Parser: dictionary class  impl.
                      3: 
1.17      paf         4:        Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.12      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.15      paf         6: */
1.1       parser      7: 
1.17.2.1! paf         8: static const char* IDENT_DICTIONARY_C="$Date: 2003/01/21 15:51:14 $";
1.1       parser      9: 
                     10: #include "pa_dictionary.h"
1.4       parser     11: #include "pa_exception.h"
1.1       parser     12: 
1.17.2.1! paf        13: static void add_first(Table::element_type row, Dictionary* self) {
1.4       parser     14:        // get a=>b values
1.17.2.1! paf        15:        ConstStringPtr a=row->get(0);
        !            16:        ConstStringPtr b=row->get(1);
1.4       parser     17:        // empty 'a' check
1.17.2.1! paf        18:        if(a->is_empty()) {
1.14      paf        19:                throw Exception("parser.runtime",
1.17.2.1! paf        20:                        a, 
1.4       parser     21:                        "dictionary table 'from' column elements must not be empty");
                     22:        }
1.17.2.1! paf        23:        unsigned char c=(unsigned char)a->first_char();
        !            24:        if(!self->starting_line_of[c])
        !            25:                self->starting_line_of[c]=self->constructor_line;
        !            26: 
        !            27:        double ratio=((double)b->size())/a->size();
        !            28:        if(ratio>self->fmax_ratio)
        !            29:                self->fmax_ratio=ratio;
1.4       parser     30: 
1.17.2.1! paf        31:        self->constructor_line++;
1.1       parser     32: }
1.17.2.1! paf        33: Dictionary::Dictionary(TablePtr  atable, double amin_ratio):
1.4       parser     34:        table(atable), 
                     35:        fmax_ratio(amin_ratio)  {
                     36: 
                     37:        // clear starting_lines
                     38:        memset(starting_line_of, 0, sizeof(starting_line_of));
1.1       parser     39:        // grab first letters of first column of a table
1.17.2.1! paf        40:        constructor_line=1;  table->for_each(add_first, this);
1.1       parser     41: }
                     42: 
1.4       parser     43: #ifndef DOXYGEN
                     44: struct First_that_starts_info {
                     45:        int line;
1.7       parser     46:        const char *src;  size_t src_size;
1.4       parser     47: };
                     48: #endif
1.17.2.1! paf        49: static bool starts(Table::element_type row, First_that_starts_info* info) {
1.4       parser     50:        // skip irrelevant lines
1.17.2.1! paf        51:        if(info->line>1) {
        !            52:                --info->line;
1.4       parser     53:                return 0;
                     54:        }
1.1       parser     55: 
                     56:        int partial;
1.17.2.1! paf        57:        row->get(0)->cmp(partial, info->src, info->src_size);
1.3       parser     58:        return (
1.1       parser     59:                partial==0 || // full match
1.17.2.1! paf        60:                partial==1); // typo left column starts 'src'
1.1       parser     61: }
                     62: 
1.17.2.1! paf        63: Table::element_type Dictionary::first_that_starts(const char *src, size_t src_size) const {
1.4       parser     64:        First_that_starts_info info;
                     65:        if(info.line=starting_line_of[(unsigned char)*src]) {
                     66:                info.src=src;
1.7       parser     67:                info.src_size=src_size;
1.17.2.1! paf        68:                return table->first_that(starts, &info);
1.4       parser     69:        } else
1.17.2.1! paf        70:                return 0;//Table::element_type(0);
1.1       parser     71: }

E-mail: