hschumann2/TempleOS-Source-Code
0832
1 2#help_index "AutoComplete/Dictionary"3acd.has_words=FileFind(ACD_WORD_FILENAME);4acd.has_defs =FileFind(ACD_DEF_FILENAME)||FileFind(ACD_DEF_FILENAME_Z);5 6public U0 ACDWordsLoad()7{//Put words from word list into hash table.8 I64 size;9 CHashGeneric *tmph;10 U8 *in_ptr,*in_start,*st2;11 U16 *d;12 acd.num_words=0;13 if (in_ptr=FileRead(ACD_WORD_FILENAME,&size)) {14 in_start=in_ptr;15 Free(acd.word_lst);16 acd.word_lst=AMAlloc(size);17 MemCpy(acd.word_lst,in_start,size);18 acd.word_lst_size=size;19 20 while (in_ptr<in_start+size) {21 if (*in_ptr==ACD_WORD_CHAR)22 in_ptr++;23 if (*in_ptr) {24 st2=MStrUtil(in_ptr,SUF_TO_UPPER);25 tmph=ACAlloc(sizeof(CHashGeneric)+StrLen(st2)+1);26 StrCpy(tmph+1,st2);27 Free(st2);28 in_ptr+=StrLen(in_ptr)+1;29 tmph->str=tmph+1;30 tmph->use_cnt=1;31 tmph->type=HTT_DICT_WORD;32 d=in_ptr;33 tmph->user_data0=*d;34 in_ptr+=2;35 HashAdd(tmph,ac.hash_table);36 acd.num_words++;37 } else38 in_ptr+=3;39 }40 Free(in_start);41 }42}43 44#help_index "AutoComplete"45CHashAC *ACHashAdd(U8 *w)46{47 CHashAC *tmpw=HashFind(w,ac.hash_table,HTT_WORD);48 if (tmpw) {49 tmpw->hits++;50 return tmpw;51 }52 tmpw=ACAlloc(sizeof(CHashAC));53 tmpw->str=AStrNew(w);54 tmpw->type=HTT_WORD;55 tmpw->use_cnt=1;56 tmpw->hits=1;57 HashAdd(tmpw,ac.hash_table);58 ac.num_words++;59 return tmpw;60}61 62U0 ACSingleFileAdd(U8 *buf)63{64 I64 ch;65 U8 *ptr=buf,*ptr2,*ptr3;66 while (TRUE) {67 while (TRUE) {68 if (ch=*ptr++) {69 if (Bt(char_bmp_alpha_numeric,ch))70 break;71 } else72 return;73 }74 ptr3=ptr;75 ptr2=ptr;76 ptr--;77 while (TRUE) {78 if (ch=*ptr2++) {79 if (Bt(char_bmp_alpha_numeric,ch))80 *ptr3++=ch;81 else if (ch!=CH_CURSOR)82 break;83 } else {84 ptr2--;85 break;86 }87 }88 *ptr3=0;89 ACHashAdd(ptr);90 ptr=ptr2;91 }92}93 94U0 ACMainFileLstTraverse(U8 *files_find_mask)95{96 U8 *buf;97 CDirEntry *tmpde,*tmpde1;98 try {99 tmpde=tmpde1=FilesFind(files_find_mask,100 FUF_RECURSE|FUF_JUST_TXT|FUF_JUST_FILES|FUF_CLUS_ORDER);101 while (tmpde) {102 "%s\n",tmpde->full_name;103 buf=FileRead(tmpde->full_name);104 ACSingleFileAdd(buf);105 Free(buf);106 tmpde=tmpde->next;107 }108 } catch109 Fs->catch_except=TRUE;110 DirTreeDel(tmpde1);111}112 113U0 ACProgressTask(Bool *_start_flag)114{115 I64 start=blkdev.write_cnt;116 progress1=0;117 progress1_max=(Size(ACD_DEF_FILENAME_Z,"+x+s")+BLK_SIZE-1)>>BLK_SIZE_BITS;118 StrCpy(progress1_desc,"Uncompressing Dictionary");119 start=blkdev.write_cnt;120 *_start_flag=TRUE;121 while (progress1<progress1_max) {122 progress1=blkdev.write_cnt-start;123 Sleep(10);124 }125 *progress1_desc=progress1=progress1_max=0;126}127 128public U0 ACInit(U8 *mask=NULL)129{//Read files and build AutoComplete statistics.130 Bool start_flag;131 CBlkDev *bd=Let2BlkDev;132 133 LBtr(&sys_run_level,RLf_AUTO_COMPLETE);134 AutoComplete;135 while (LBts(&ac.flags,ACf_INIT_IN_PROGRESS))136 Yield;137 if (DrvIsWritable && FileFind(ACD_DEF_FILENAME_Z) &&138 !FileFind(ACD_DEF_FILENAME)) {139 if (bd->type!=BDT_RAM) {140 start_flag=FALSE;141 Spawn(&ACProgressTask,&start_flag);142 while (!start_flag)143 Yield;144 }145 Move(ACD_DEF_FILENAME_Z,ACD_DEF_FILENAME);146 }147 148 HashTableDel(ac.hash_table);149 ac.hash_table=HashTableNew(2048,adam_task);150 151 ac.num_words=0;152 Free(ac.cur_word);153 ac.cur_word=NULL;154 155 if (mask)156 ACMainFileLstTraverse(mask);157 158 ACDWordsLoad;159 LBtr(&ac.flags,ACf_INIT_IN_PROGRESS);160 LBts(&sys_run_level,RLf_AUTO_COMPLETE);161 AutoComplete(ON);162}163 164I64 AutoCompleteSize()165{166 if (ac.hash_table)167 return HashTableSize2(ac.hash_table)+MSize2(acd.word_lst);168 else169 return 0;170}171 