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