data: one trie for maps and dictionaries, one loader
The hash map served a single exact-match lookup that the trie already answers, at the price of a second container, a second file loader with its own drift, and a Str-to-UTF-8 conversion on every chain probe. The files are small (kanji.dict is 7.5k lines), so the trie holds both. trieopen validates keys and each space-separated value word against Str and reports path:line; trielookup takes the Str every caller holds and treats a nil trie as an unloaded map; trienew/trieput exist for tests. The overflow guards on growth, Trie.root (always 0) and the per-language init loop written twice are gone.
This commit is contained in:
11
fn.h
11
fn.h
@@ -9,19 +9,16 @@ int scmp(Str*, Str*);
|
||||
int stoutf(Str*, char*, int);
|
||||
Rune slastr(Str*);
|
||||
|
||||
Hmap* hmapalloc(int);
|
||||
void hmapfree(Hmap*);
|
||||
void hmapset(Hmap**, Str*, const char*, int);
|
||||
Hnode* hmapget(Hmap*, Str*);
|
||||
int mapget(Trie*, Str*, Str*);
|
||||
|
||||
Trie* trienew(void);
|
||||
void trieput(Trie*, char*, int, char*, int);
|
||||
Trie* trieopen(char*);
|
||||
void trieclose(Trie*);
|
||||
int trielookup(Trie*, char*, int, char**, int*);
|
||||
int trielookup(Trie*, Str*, char**, int*);
|
||||
|
||||
Lang* getlang(int);
|
||||
void mapinit(char*);
|
||||
void dictinit(char*);
|
||||
void langinit(char*);
|
||||
|
||||
void dictthread(void*);
|
||||
void dictlookup(Dictreq*, Dictres*);
|
||||
|
||||
Reference in New Issue
Block a user