227 lines
4.8 KiB
HolyC
227 lines
4.8 KiB
HolyC
|
#help_index "AutoComplete/Dictionary"
|
||
|
public U8 *ACDDefGet(U8 *st,I64 def_num=1)
|
||
|
{//MAlloc str holding single dict definition of word.
|
||
|
CFile *f;
|
||
|
CHashGeneric *tmph;
|
||
|
U8 *res=NULL,*buf,*in_ptr,
|
||
|
*st2=MStrUtil(st,SUF_TO_UPPER);
|
||
|
tmph=HashFind(st2,ac.hash_table,HTT_DICT_WORD);
|
||
|
Free(st2);
|
||
|
if (tmph) {
|
||
|
if (f=FOpen(ACD_DEF_FILENAME,"r")) {
|
||
|
buf=MAlloc(ACD_BLK_SIZE*2+1);
|
||
|
buf[ACD_BLK_SIZE*2]=0; //terminate
|
||
|
FBlkRead(f,buf,tmph->user_data0*ACD_BLK_SIZE/BLK_SIZE,
|
||
|
ACD_BLK_SIZE*2/BLK_SIZE);
|
||
|
FClose(f);
|
||
|
in_ptr=buf;
|
||
|
while (in_ptr<buf+ACD_BLK_SIZE*2) {
|
||
|
while (*in_ptr!=ACD_WORD_CHAR && in_ptr<buf+ACD_BLK_SIZE*2)
|
||
|
in_ptr++;
|
||
|
if (*in_ptr++==ACD_WORD_CHAR) {
|
||
|
if (!StrICmp(st,in_ptr)) {
|
||
|
while (def_num && *in_ptr!=ACD_WORD_CHAR
|
||
|
&& in_ptr<buf+ACD_BLK_SIZE*2) {
|
||
|
if (*in_ptr==ACD_DEF_CHAR) {
|
||
|
if (!--def_num)
|
||
|
break;
|
||
|
else
|
||
|
in_ptr++;
|
||
|
} else
|
||
|
in_ptr++;
|
||
|
}
|
||
|
if (*in_ptr++==ACD_DEF_CHAR) {
|
||
|
res=StrNew(in_ptr);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Free(buf);
|
||
|
}
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public U8 *ACDDefsGet(U8 *st)
|
||
|
{//MAlloc str with all dict definitions of word.
|
||
|
CFile *f;
|
||
|
CHashGeneric *tmph;
|
||
|
U8 *res=NULL,*buf,*in_ptr,*in_ptr2,
|
||
|
*st2=MStrUtil(st,SUF_TO_UPPER);
|
||
|
tmph=HashFind(st2,ac.hash_table,HTT_DICT_WORD);
|
||
|
Free(st2);
|
||
|
if (tmph) {
|
||
|
if (f=FOpen(ACD_DEF_FILENAME,"r")) {
|
||
|
buf=MAlloc(ACD_BLK_SIZE*2+1);
|
||
|
buf[ACD_BLK_SIZE*2]=0; //terminate
|
||
|
FBlkRead(f,buf,tmph->user_data0*ACD_BLK_SIZE/BLK_SIZE,
|
||
|
ACD_BLK_SIZE*2/BLK_SIZE);
|
||
|
FClose(f);
|
||
|
in_ptr=buf;
|
||
|
while (in_ptr<buf+ACD_BLK_SIZE*2) {
|
||
|
while (*in_ptr!=ACD_WORD_CHAR && in_ptr<buf+ACD_BLK_SIZE*2)
|
||
|
in_ptr++;
|
||
|
if (*in_ptr++==ACD_WORD_CHAR) {
|
||
|
if (!StrICmp(st,in_ptr)) {
|
||
|
in_ptr2=in_ptr;
|
||
|
in_ptr--;
|
||
|
while (*in_ptr2!=ACD_WORD_CHAR
|
||
|
&& in_ptr2<buf+ACD_BLK_SIZE*2) {
|
||
|
in_ptr2++;
|
||
|
}
|
||
|
res=MAlloc(in_ptr2+1-in_ptr);
|
||
|
MemCpy(res,in_ptr,in_ptr2-in_ptr);
|
||
|
res[in_ptr2-in_ptr]=ACD_END_CHAR;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Free(buf);
|
||
|
}
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
/*Fmt of word lst entry:
|
||
|
U8 ACD_WORD_CHAR
|
||
|
U8 word[] with terminating zero
|
||
|
I16 block;
|
||
|
*/
|
||
|
public U8 *ACDWordPtAt(U8 *st)
|
||
|
{//Point to word in word list.
|
||
|
I64 i;
|
||
|
U8 *start=acd.word_lst,*r=start,
|
||
|
*end=acd.word_lst+acd.word_lst_size;
|
||
|
if (!st || !*st)
|
||
|
return acd.word_lst;
|
||
|
if (acd.word_lst_size) {
|
||
|
while (start+3<end) {
|
||
|
r=(start+end)>>1;
|
||
|
while (TRUE) {
|
||
|
while (*r!=ACD_WORD_CHAR && r>acd.word_lst)
|
||
|
r--;
|
||
|
if ((r[2]==ACD_WORD_CHAR||r[1]==ACD_WORD_CHAR)&&r-3>acd.word_lst)
|
||
|
r--;
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
if (*r==ACD_WORD_CHAR) {
|
||
|
i=StrICmp(st,r+1);
|
||
|
if (i<0)
|
||
|
end=r-1;
|
||
|
else if (i>0)
|
||
|
start=r+StrLen(r)+3;
|
||
|
else
|
||
|
return r;
|
||
|
} else
|
||
|
break;
|
||
|
}
|
||
|
r=(start+end)>>1;
|
||
|
while (TRUE) {
|
||
|
while (*r!=ACD_WORD_CHAR && r>acd.word_lst)
|
||
|
r--;
|
||
|
if ((r[2]==ACD_WORD_CHAR||r[1]==ACD_WORD_CHAR)&&r-3>acd.word_lst)
|
||
|
r--;
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
if (*r==ACD_WORD_CHAR && StrICmp(st,r+1)>0)
|
||
|
r+=StrLen(r)+3;
|
||
|
}
|
||
|
if (*r==ACD_WORD_CHAR)
|
||
|
return r;
|
||
|
else
|
||
|
return acd.word_lst;
|
||
|
}
|
||
|
|
||
|
U0 ACDFillin(I64 n)
|
||
|
{
|
||
|
U8 *s;
|
||
|
I64 len;
|
||
|
if (0<=n<acd.num_fillins) {
|
||
|
s=acd.fillins[n]+1;
|
||
|
len=StrLen(s);
|
||
|
if (len>ac.partial_len)
|
||
|
In(s+ac.partial_len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public U0 ACDDefsPut(CDoc *doc=NULL,U8 *st,I64 num=-1)
|
||
|
{//Put to doc a dictionary definition(s) of a word.
|
||
|
U8 *st2,*st3;
|
||
|
I64 ch,i=0;
|
||
|
if (!st) return;
|
||
|
if (*st==ACD_WORD_CHAR)
|
||
|
st++;
|
||
|
DocPrint(doc,"$$WW,1$$$$RED$$%s:$$FG$$\n\n",st);
|
||
|
if (num<0) {
|
||
|
if (st3=ACDDefsGet(st)) {
|
||
|
st2=st3;
|
||
|
while (ch=*st2++) {
|
||
|
switch (ch) {
|
||
|
case ACD_WORD_CHAR:
|
||
|
break;
|
||
|
case ACD_DEF_CHAR:
|
||
|
DocPrint(doc,"$$GREEN$$(%d)$$FG$$ %s\n",
|
||
|
++i,st2);
|
||
|
break;
|
||
|
case ACD_PRONUNCIATION_CHAR:
|
||
|
DocPrint(doc,"$$LTGREEN$$%s$$FG$$\n",st2);
|
||
|
break;
|
||
|
case ACD_POS_CHAR:
|
||
|
DocPrint(doc,"$$BLACK$$%s$$FG$$\n",st2);
|
||
|
break;
|
||
|
case ACD_EXTRA_CHAR:
|
||
|
DocPrint(doc,"$$LTBLUE$$%s$$FG$$\n",st2);
|
||
|
break;
|
||
|
}
|
||
|
st2+=StrLen(st2)+1;
|
||
|
}
|
||
|
Free(st3);
|
||
|
}
|
||
|
} else {
|
||
|
while (st2=ACDDefGet(st,++i)) {
|
||
|
if (i==num)
|
||
|
DocPrint(doc,"$$GREEN$$(%d)$$FG$$ %s\n",
|
||
|
i,st2);
|
||
|
Free(st2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
U0 ACDPopUpDef(U8 *st,I64 num=-1,CTask *parent=NULL)
|
||
|
{
|
||
|
U8 *buf;
|
||
|
buf=MStrPrint("ACDDefsPut(DocPut,\"%s\",%d);View;",st,num);
|
||
|
PopUp(buf,parent);
|
||
|
Free(buf);
|
||
|
}
|
||
|
|
||
|
U0 ACDDef(I64 n,CTask *parent=NULL)
|
||
|
{
|
||
|
if (0<=n<acd.num_fillins)
|
||
|
ACDPopUpDef(acd.fillins[n],-1,parent);
|
||
|
}
|
||
|
|
||
|
#help_index "AutoComplete"
|
||
|
U0 ACFillIn(I64 n)
|
||
|
{
|
||
|
U8 *s;
|
||
|
if (0<=--n<ac.num_fillins) {
|
||
|
s=ac.fillin_matches[n]->str;
|
||
|
if (StrLen(s)>ac.partial_len)
|
||
|
In(s+ac.partial_len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
U0 ACMan(I64 n,CTask *parent_task=NULL)
|
||
|
{
|
||
|
CHashAC *tmpw;
|
||
|
CHashSrcSym *tmph;
|
||
|
if (0<=--n<ac.num_fillins && (tmpw=ac.fillin_matches[n]) &&
|
||
|
(tmph=HashFind(tmpw->str,Fs->hash_table,HTG_SRC_SYM)) &&
|
||
|
tmph->src_link)
|
||
|
PopUpEd(tmph->src_link,parent_task);
|
||
|
}
|