hschumann2/TempleOS-Source-Code
0847
1 2#help_index "AutoComplete/Dictionary"3public U8 *ACDDefGet(U8 *st,I64 def_num=1)4{//MAlloc str holding single dict definition of word.5 CFile *f;6 CHashGeneric *tmph;7 U8 *res=NULL,*buf,*in_ptr,8 *st2=MStrUtil(st,SUF_TO_UPPER);9 tmph=HashFind(st2,ac.hash_table,HTT_DICT_WORD);10 Free(st2);11 if (tmph) {12 if (f=FOpen(ACD_DEF_FILENAME,"r")) {13 buf=MAlloc(ACD_BLK_SIZE*2+1);14 buf[ACD_BLK_SIZE*2]=0; //terminate15 FBlkRead(f,buf,tmph->user_data0*ACD_BLK_SIZE/BLK_SIZE,16 ACD_BLK_SIZE*2/BLK_SIZE);17 FClose(f);18 in_ptr=buf;19 while (in_ptr<buf+ACD_BLK_SIZE*2) {20 while (*in_ptr!=ACD_WORD_CHAR && in_ptr<buf+ACD_BLK_SIZE*2)21 in_ptr++;22 if (*in_ptr++==ACD_WORD_CHAR) {23 if (!StrICmp(st,in_ptr)) {24 while (def_num && *in_ptr!=ACD_WORD_CHAR25 && in_ptr<buf+ACD_BLK_SIZE*2) {26 if (*in_ptr==ACD_DEF_CHAR) {27 if (!--def_num)28 break;29 else30 in_ptr++;31 } else32 in_ptr++;33 }34 if (*in_ptr++==ACD_DEF_CHAR) {35 res=StrNew(in_ptr);36 break;37 }38 }39 }40 }41 Free(buf);42 }43 }44 return res;45}46 47public U8 *ACDDefsGet(U8 *st)48{//MAlloc str with all dict definitions of word.49 CFile *f;50 CHashGeneric *tmph;51 U8 *res=NULL,*buf,*in_ptr,*in_ptr2,52 *st2=MStrUtil(st,SUF_TO_UPPER);53 tmph=HashFind(st2,ac.hash_table,HTT_DICT_WORD);54 Free(st2);55 if (tmph) {56 if (f=FOpen(ACD_DEF_FILENAME,"r")) {57 buf=MAlloc(ACD_BLK_SIZE*2+1);58 buf[ACD_BLK_SIZE*2]=0; //terminate59 FBlkRead(f,buf,tmph->user_data0*ACD_BLK_SIZE/BLK_SIZE,60 ACD_BLK_SIZE*2/BLK_SIZE);61 FClose(f);62 in_ptr=buf;63 while (in_ptr<buf+ACD_BLK_SIZE*2) {64 while (*in_ptr!=ACD_WORD_CHAR && in_ptr<buf+ACD_BLK_SIZE*2)65 in_ptr++;66 if (*in_ptr++==ACD_WORD_CHAR) {67 if (!StrICmp(st,in_ptr)) {68 in_ptr2=in_ptr;69 in_ptr--;70 while (*in_ptr2!=ACD_WORD_CHAR71 && in_ptr2<buf+ACD_BLK_SIZE*2) {72 in_ptr2++;73 }74 res=MAlloc(in_ptr2+1-in_ptr);75 MemCpy(res,in_ptr,in_ptr2-in_ptr);76 res[in_ptr2-in_ptr]=ACD_END_CHAR;77 break;78 }79 }80 }81 Free(buf);82 }83 }84 return res;85}86 87/*Fmt of word lst entry:88 U8 ACD_WORD_CHAR89 U8 word[] with terminating zero90 I16 block;91*/92public U8 *ACDWordPtAt(U8 *st)93{//Point to word in word list.94 I64 i;95 U8 *start=acd.word_lst,*r=start,96 *end=acd.word_lst+acd.word_lst_size;97 if (!st || !*st)98 return acd.word_lst;99 if (acd.word_lst_size) {100 while (start+3<end) {101 r=(start+end)>>1;102 while (TRUE) {103 while (*r!=ACD_WORD_CHAR && r>acd.word_lst)104 r--;105 if ((r[2]==ACD_WORD_CHAR||r[1]==ACD_WORD_CHAR)&&r-3>acd.word_lst)106 r--;107 else108 break;109 }110 if (*r==ACD_WORD_CHAR) {111 i=StrICmp(st,r+1);112 if (i<0)113 end=r-1;114 else if (i>0)115 start=r+StrLen(r)+3;116 else117 return r;118 } else119 break;120 }121 r=(start+end)>>1;122 while (TRUE) {123 while (*r!=ACD_WORD_CHAR && r>acd.word_lst)124 r--;125 if ((r[2]==ACD_WORD_CHAR||r[1]==ACD_WORD_CHAR)&&r-3>acd.word_lst)126 r--;127 else128 break;129 }130 if (*r==ACD_WORD_CHAR && StrICmp(st,r+1)>0)131 r+=StrLen(r)+3;132 }133 if (*r==ACD_WORD_CHAR)134 return r;135 else136 return acd.word_lst;137}138 139U0 ACDFillin(I64 n)140{141 U8 *s;142 I64 len;143 if (0<=n<acd.num_fillins) {144 s=acd.fillins[n]+1;145 len=StrLen(s);146 if (len>ac.partial_len)147 In(s+ac.partial_len);148 }149}150 151public U0 ACDDefsPut(CDoc *doc=NULL,U8 *st,I64 num=-1)152{//Put to doc a dictionary definition(s) of a word.153 U8 *st2,*st3;154 I64 ch,i=0;155 if (!st) return;156 if (*st==ACD_WORD_CHAR)157 st++;158 DocPrint(doc,"$WW,1$$RED$%s:$FG$\n\n",st);159 if (num<0) {160 if (st3=ACDDefsGet(st)) {161 st2=st3;162 while (ch=*st2++) {163 switch (ch) {164 case ACD_WORD_CHAR:165 break;166 case ACD_DEF_CHAR:167 DocPrint(doc,"$GREEN$(%d)$FG$ %s\n",168 ++i,st2);169 break;170 case ACD_PRONUNCIATION_CHAR:171 DocPrint(doc,"$LTGREEN$%s$FG$\n",st2);172 break;173 case ACD_POS_CHAR:174 DocPrint(doc,"$BLACK$%s$FG$\n",st2);175 break;176 case ACD_EXTRA_CHAR:177 DocPrint(doc,"$LTBLUE$%s$FG$\n",st2);178 break;179 }180 st2+=StrLen(st2)+1;181 }182 Free(st3);183 }184 } else {185 while (st2=ACDDefGet(st,++i)) {186 if (i==num)187 DocPrint(doc,"$GREEN$(%d)$FG$ %s\n",188 i,st2);189 Free(st2);190 }191 }192}193 194U0 ACDPopUpDef(U8 *st,I64 num=-1,CTask *parent=NULL)195{196 U8 *buf;197 buf=MStrPrint("ACDDefsPut(DocPut,\"%s\",%d);View;",st,num);198 PopUp(buf,parent);199 Free(buf);200}201 202U0 ACDDef(I64 n,CTask *parent=NULL)203{204 if (0<=n<acd.num_fillins)205 ACDPopUpDef(acd.fillins[n],-1,parent);206}207 208#help_index "AutoComplete"209U0 ACFillIn(I64 n)210{211 U8 *s;212 if (0<=--n<ac.num_fillins) {213 s=ac.fillin_matches[n]->str;214 if (StrLen(s)>ac.partial_len)215 In(s+ac.partial_len);216 }217}218 219U0 ACMan(I64 n,CTask *parent_task=NULL)220{221 CHashAC *tmpw;222 CHashSrcSym *tmph;223 if (0<=--n<ac.num_fillins && (tmpw=ac.fillin_matches[n]) &&224 (tmph=HashFind(tmpw->str,Fs->hash_table,HTG_SRC_SYM)) &&225 tmph->src_link)226 PopUpEd(tmph->src_link,parent_task);227}228 