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