X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkeyword.cc;h=de6aca9e495cd7a6c6496384a0c3d7e2d6b377ca;hb=d02e96479e11bc7e3714ab92a460a08d8a68f54f;hp=0274d1653fc2bdd5a8bcc75749e8e48cf6c27343;hpb=2862b1027f316a2f0444fa92e441ee28acf7a463;p=lilypond.git diff --git a/lily/keyword.cc b/lily/keyword.cc index 0274d1653f..de6aca9e49 100644 --- a/lily/keyword.cc +++ b/lily/keyword.cc @@ -1,77 +1,35 @@ /* keyword.cc -- keywords and identifiers */ - +#include #include - -#include "my-lily-lexer.hh" - -/* for the keyword table */ -struct Keyword_ent -{ - char const *name; - int tokcode; -}; - -struct Keyword_table -{ - Keyword_ent *table; - int maxkey; - Keyword_table (Keyword_ent *); - int lookup (char const *s) const; -}; +#include "keyword.hh" /* for qsort */ -int - tabcmp (void const * p1, void const * p2) +int tabcmp (Keyword_ent const &p1, Keyword_ent const &p2) { - return strcmp (((Keyword_ent const *) p1)->name, - ((Keyword_ent const *) p2)->name); + return strcmp (p1.name_, p2.name_); } Keyword_table::Keyword_table (Keyword_ent *tab) { - table = tab; - - /* count keywords */ - for (maxkey = 0; table[maxkey].name; maxkey++); + while (tab->name_) + { + table_.push (*tab++); + } - /* sort them */ - qsort (table, maxkey, sizeof (Keyword_ent), tabcmp); + table_.sort (tabcmp); } -/* - lookup with binsearch, return tokencode. -*/ int Keyword_table::lookup (char const *s) const { - int lo, - hi, - cmp, - result; - lo = 0; - hi = maxkey; - - /* binary search */ - do - { - cmp = (lo + hi) / 2; - - result = strcmp (s, table[cmp].name); - - if (result < 0) - hi = cmp; - else - lo = cmp; - } - while (hi - lo > 1); - if (!strcmp (s, table[lo].name)) - { - return table[lo].tokcode; - } + Keyword_ent e ; + e.name_ = s; + int idx = binary_search (table_, e, tabcmp); + if (idx >= 0) + return table_[idx].tokcode_; else - return -1; /* not found */ + return -1; } -