01 CTask *trie_task=Fs;
02 class CFileState {
03   U8 buf[BLK_SIZE];
04 };
05 //U8 *word_file=FileRead("/English.json.Z");
06 class CTrie {
07   U8 *str;
08   I64 flags;
09   CTrie *branches[26];
10   CTrie *next;
11 };
12 CTrie root;
13 MemSet(&root,0,sizeof(CTrie));
14 CTrie *TrieGet(U8 *name,CTrie *of=&root) {
15 ent:
16   if(!of) return NULL;
17   if(!*name) {
18     while(!of->str) {
19       of=of->next;
20       if(!of) return NULL;
21     }
22     return of;
23   }
24   if('A'<=ToUpper(*name)<='Z') {
25     of=of->branches[ToUpper(*name)-'A'];
26     name++;
27     goto ent;
28   }
29   return NULL;
30 }
31 CTrie *TrieExists(U8 *name,I64 flags) {
32   CTrie *t=TrieGet(name),*ret=t;
33   while(t) {
34     if(t->flags==flags)
35       return t;
36     t=t->next;
37   }
38   return NULL;
39 }
40 CTrie *TrieAdd(U8 *name,I64 flags=0) {
41   I64 idx;
42   CTrie *new=CAlloc(sizeof(CTrie),trie_task),*to=&root,**ins_at=&to->next,*new2;
43   new->str=StrNew(name,trie_task);
44   new->flags=flags;
45   while(*name) {
46     if('A'<=(idx=ToUpper(*name))<='Z') {
47       idx-='A';
48       if(to->branches[idx]) {
49         to=to->branches[idx];
50       } else {
51         new2=CAlloc(sizeof(CTrie),trie_task);
52         to->branches[idx]=new2;
53         to=new2;
54       }
55       ins_at=&to->next;
56       name++;
57     } else if(*name)
58       throw('InvChr');
59   }
60   while(ins_at[0])
61     ins_at=&ins_at[0]->next;
62   *ins_at=new;
63   return new;
64 };
65 
66 
67 
68