📄 dict_get_word.c
字号:
}
//////////////////////////////////////////////////////////////////////////////
////手机系统中,此库函数的结果不是很正确,需要自己编写代码
int xumx_stricmp(unsigned char *str1, unsigned char *str2)
{
unsigned char ch1=0, ch2=0;
////////////////////////////
while(*str1!=0 || *str2!=0)
{
if(*str1>='A' && *str1<='Z')////大写
{ ch1 = (unsigned char)(*str1+32); }
else{ ch1=*str1; }
if(*str2>='A' && *str2<='Z')////大写
{ ch2 = (unsigned char)(*str2+32); }
else{ ch2=*str2; }
if(ch1>ch2) return 1;
else if(ch1<ch2) return -1;
str1++; str2++;
}
return 0;
}
////////////////////////////////////////////////////////////////////
unsigned char To_lower(unsigned char ch)
{
if(ch>=65 && ch<=90) return((unsigned char)(ch+32));
else {return ch;}
}
unsigned char To_upper(unsigned char ch)
{
if(ch>=97 && ch<=122) return((unsigned char)(ch-32));
else {return ch;}
}
////////////////////////////////////////////////////////////////////
void delete_tab(unsigned char *str, unsigned long len)
{
unsigned char *pz=str;
while(*pz!='\t' && *pz!=0) pz++;
if(len>(unsigned long)(pz-str))
{ memset(pz, 0, len-(unsigned long)(pz-str)); }
else{ memset(str, 0, len); }
}
////////////////////////////////////////////////////////////////////
////记录单词的信息
void note_word_info(unsigned char *wd, unsigned long byte_start, unsigned long byte_end)
{
memset(Word_Info_List[Word_Info_List_index].word, 0, 128);
strcpy((char *)(Word_Info_List[Word_Info_List_index].word), (char *)wd);
Word_Info_List[Word_Info_List_index].data_start = byte_start;
Word_Info_List[Word_Info_List_index].data_end = byte_end;
Word_Info_List_index++;
if(Word_Info_List_index>=GET_WORD_MAX_NUM)
{ Word_Info_List_index=0; }
}
////////////////////////////////////////////////////////////////////
////xumx_ 整理,正规化客户输入的不规范的单词。返回1时正常,0时错误。
int OrderStr(char *buf, unsigned long StrLen)
{
char *pz1=NULL, *pz2=NULL;
pz1=buf; pz2=pz1;
while(*pz2==' '||*pz2=='\t') pz2++; ////xumx_ 跳过最前面的无效空格和'\t'
if(pz2>pz1) ////xumx_ 如果有无效空格
{
while(*pz2!=0) ////xumx_ 覆盖掉无效空格
{
*pz1=*pz2;
pz1++; pz2++;
}
*pz1=0;
}
////xumx_ 去回车符号 '\r','\n'
pz1=strchr(buf,'\r');
if(pz1!=NULL) *pz1=0;
pz1=strchr(buf,'\n');
if(pz1!=NULL) *pz1=0;
pz1=buf+strlen(buf)-1; ////xumx_ 最后
while(*pz1==' '||*pz1=='\t') pz1--; ////xumx_ 单词后面的无效空格和'\t'.
*(pz1+1)=0; *(pz1+2)=0;
////xumx_ 判断单词长度
if(buf[0]==0||Is_alpha(buf[0])==0||strlen(buf)>StrLen)
{return 0;}
////拼写错误
pz1=buf;
while(*pz1!=0)
{
if(*pz1!=' ' && *pz1!='-' && *pz1!='\'' && *pz1!='/' && *pz1!='(' && *pz1!=')' && *pz1!='.' && Is_alpha(*pz1)==0)
{ return 0; }
pz1++;
}
return 1;
}
//////////////////////////////////////////////////////////////////////////////
int Is_alpha( char ch) ////xumx_ 是否是字母(自己定义函数)
{
if((ch>=65 && ch<=90) || (ch>=97 && ch<=122))
{ return 1; }
else
{ return 0; }
}
//////////////////////////////////////////////////////////////////////////////
////根据单词的ID号,取单词。0.失败1.成功
int get_word_by_ID(unsigned long word_ID, unsigned char *wd)
{
int fp=0;
unsigned char Input_word[128];
unsigned int byte_num=0;
////////////////////////////
fp = MY_OPENFILE(DISK_TYPE, (char *)ENG_CHN_DATA_FILE_NAME, FS_READ_ONLY);
if(fp<0){ return 0; }
////字符索引
FS_Seek(fp, 0-4, FS_FILE_END);
FS_Read(fp, &alpha_long, 4, &byte_num);
////搜索索引
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA), FS_FILE_END);
FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA), &byte_num);
area_long = Word_Area_List[0].Start_ID;
////data 索引
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA)*area_long-4, FS_FILE_END);
FS_Read(fp, &data_long, 4, &byte_num);
if(word_ID>data_long-3){ FS_Close(fp); return 0; }
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA)*area_long- \
(data_long-word_ID)*4, FS_FILE_END);
FS_Read(fp, Long_ID_index, 8, &byte_num);
FS_Seek(fp, Long_ID_index[0], FS_FILE_BEGIN);
memset(Input_word, 0, 128);
FS_Read(fp, Input_word, 128, &byte_num);
FS_Close(fp);
delete_tab(Input_word, 128);
memcpy(wd, Input_word, strlen((char *)Input_word)+4);
note_word_info(Input_word, Long_ID_index[0], Long_ID_index[1]);
return 1;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
void Change_Explain_Text(char *exp)
{
char buf[512];
char *pz1=NULL, *pz2=NULL;
unsigned long len=0;
///////////////////////////
if(exp==NULL || exp[0]==0) return;
memset(buf, 0, 512);
pz1=exp; pz2=buf;
while(*pz1!=0)
{
len = Match_cixing(pz1);
if(len>0)////词性
{
if(pz2>buf)
{
*pz2='\n';
pz2++;
}
memcpy(pz2, pz1, len);
pz1+=len; pz2+=len;
}
else
{
if(*pz1>0)////ASCII
{
*pz2=*pz1;
pz1++;pz2++;
}
else////汉字
{
memcpy(pz2, pz1, 2);
pz1+=2;pz2+=2;
}
}
}////(pz1)
len=strlen(buf);
memcpy(exp, buf, len+4);
}
///////////////////////////////////////////////
unsigned long Match_cixing(char *str)
{
unsigned long ii=0;
const char cixing[][16]=
{
"n.\0\0",
"adj.\0\0",
"vt.\0\0",
"vi.\0\0",
"v.\0\0",
"adv.\0\0",
"prep.\0\0",
"pron.\0\0",
"int.\0\0",
"abbr.\0\0",
"conj.\0\0",
"vbl.\0\0",
"aux.\0\0",
"comb.\0\0",
"num.\0\0",
"art.\0\0",
"pref.\0\0",
"pl.\0\0",
"\0\0\0\0"
};
///////////////////
for(ii=0; cixing[ii][0]!=0; ii++)
{
if(strncmp(str, cixing[ii], strlen(cixing[ii]))==0)
{ return(strlen(cixing[ii])); }
}////for(ii)
return 0;
}
/////////////////////////////////////////////////////
////根据单词取ID号,失败时返回-1
int get_word_ID(char *wd, unsigned long *id)
{
int fp=0;
unsigned char Input_word[128];
unsigned char Get_word[128];
unsigned long ii=0, kk=0;
unsigned long ll=0;
int cmp_result=0;
unsigned int byte_num=0;
////////////////////////////
if(wd==NULL || id==NULL || wd[0]==0){ return -1; }
memset(Input_word, 0, 128);
memcpy(Input_word, wd, strlen((char *)wd));
if(OrderStr((char *)Input_word, ENGLISHWORDLEN_LIMIT)==0){ return -1; } ////用户输入非法
fp = MY_OPENFILE(DISK_TYPE, (char *)ENG_CHN_DATA_FILE_NAME, FS_READ_ONLY);
if(fp<0){ return -1; }
////字符索引
FS_Seek(fp, 0-4, FS_FILE_END);
FS_Read(fp, &alpha_long, 4, &byte_num);
FS_Seek(fp, 0-4*alpha_long, FS_FILE_END);
FS_Read(fp, &Long_ID_index, 4*alpha_long, &byte_num);
ii = (unsigned long)To_lower((char)Input_word[0])-'a';
ii = Long_ID_index[ii];
////搜索索引
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA), FS_FILE_END);
FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA), &byte_num);
area_long = Word_Area_List[0].Start_ID;
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA)*(area_long-ii), FS_FILE_END);
kk = area_long-ii;
if( kk >= 100)
{ FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA)*100, &byte_num); kk=100; }
else
{ FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA)*kk, &byte_num); }
////寻找基本区
for(ii=0, ll=0; ii<kk; ii++)
{
if( xumx_stricmp((unsigned char *)(Word_Area_List[ii].area_str), Input_word)<=0
&& (xumx_stricmp((unsigned char *)(Word_Area_List[ii+1].area_str), Input_word)>=0
|| Word_Area_List[ii+1].area_str[0]==0)
)
{
kk = Word_Area_List[ii].Start_ID;
ll=1;
break;
}
}////for(ii)
if(ll==0)////没有结果
{ FS_Close(fp); return -1; }
////data_index
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA)*area_long-4, FS_FILE_END);
FS_Read(fp, &data_long, 4, &byte_num);
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA)*area_long-(data_long-kk)*4, FS_FILE_END);
if(data_long-kk>=100)
{ FS_Read(fp, Long_ID_index, 400, &byte_num); }
else{ FS_Read(fp, Long_ID_index, (data_long-kk)*4, &byte_num); }
cur_long_index=0;
while(cur_long_index<100 && cur_long_index+kk<data_long-2)////定位到具体的单词位置
{
FS_Seek(fp, Long_ID_index[cur_long_index], FS_FILE_BEGIN);
FS_Read(fp, Get_word, 128, &byte_num);
delete_tab(Get_word, 128);
cmp_result = strcmp((char *)Get_word, (char *)Input_word);
if(cmp_result == 0) break;
cur_long_index++;
}
FS_Close(fp);
if(cur_long_index>=100 || cur_long_index+kk>=data_long-2){ return -1; }
*id = (cur_long_index+kk);
return 1;
}
//////////////////////////////////////////////
////根据输入,得到联想的汉字词---------------------------------------
int Get_Chinese_Word_List
(
unsigned char *Input, ////输入用户的输入要查询的汉字词
unsigned char *word_list, ////所联想到的汉字词表
int page ////0.正常联想 1.下翻页 2.上翻页
)
{
int fp=0;
unsigned long single_word_num=0;
unsigned long chn_word_num=0;
unsigned long start_id=0, end_id=0;
unsigned long ll=0;
unsigned long offset=0, ii=0;
struct CHN_WORD_STRUCT *chn_word_struct_list=NULL;
unsigned long *LONG_POINT=NULL;
int cmp_flag=0;
unsigned char Get_Word[128];
unsigned char *pz=NULL;
unsigned int read_byte=0;
///////////////////////////
if(Input==NULL || word_list==NULL || Input[0]==0) return 0;
fp = MY_OPENFILE(DISK_TYPE, "dict\\chn_eng_data.bjld", FS_READ_ONLY);
if(fp<0){ return 0; }
////为节省空间,在这里重复利用Word_Area_List[]数组
chn_word_struct_list = (struct CHN_WORD_STRUCT *)Word_Area_List;
FS_Seek(fp, 0-sizeof(struct CHN_WORD_STRUCT), FS_FILE_END);
FS_Read(fp, chn_word_struct_list, sizeof(struct CHN_WORD_STRUCT), &read_byte);
single_word_num = chn_word_struct_list->start_ID;
////搜索
FS_Seek(fp, 0-single_word_num*sizeof(struct CHN_WORD_STRUCT), FS_FILE_END);
offset=0;ii=0;
cmp_flag = 1;
while(offset<single_word_num-2)
{
if(offset%248==0)
{
////Word_Area_List[]数组的空间正好是2000 byte
if(single_word_num-2-offset>=250)
{ FS_Read(fp, chn_word_struct_list, 2000, &read_byte); }
else{ FS_Read(fp, chn_word_struct_list, (single_word_num-2-offset)*8, &read_byte); }
ii=offset;
}
cmp_flag = memcmp(chn_word_struct_list[offset-ii].chn_word, Input, 2);
if(cmp_flag==0)////找到
{
start_id = chn_word_struct_list[offset-ii].start_ID;
end_id = chn_word_struct_list[offset-ii+1].start_ID;
break;
}
offset++;
}////while(offset)
if(cmp_flag!=0){ FS_Close(fp); return 0; }////没有找到
FS_Seek(fp, 0-4-single_word_num*sizeof(struct CHN_WORD_STRUCT), FS_FILE_END);
FS_Read(fp, &chn_word_num, 4, &read_byte);
ll = 0-single_word_num*sizeof(struct CHN_WORD_STRUCT)-(chn_word_num-start_id)*4;
FS_Seek(fp, ll, FS_FILE_END);
////利用Word_Area_List[]的空间,足够大了
if(chn_word_num-start_id >= 500)
{ FS_Read(fp, Word_Area_List, 2000, &read_byte); }
else
{ FS_Read(fp, Word_Area_List, (chn_word_num-start_id)*4, &read_byte); }
LONG_POINT = (unsigned long *)Word_Area_List;
ii=start_id;
offset=0;
cmp_flag=0;
pz = word_list;
if(page!=1 && page!=2)////联想模式
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -