📄 dict_get_word.c
字号:
#ifdef __PALM_LEARN_MACHINE__
#include "dict.h"
chn_info LM_Dicts_ChinaWord_info;
unsigned char chn_alpha_sound_buf[64];////字母拼音
unsigned char chn_old_sound_buf[64];////汉字拼音(老写的拼音)
struct CLASS_WORD_INFO class_word_info;
//struct WORD_INFOMATION Word_Info_List[GET_WORD_MAX_NUM]={0};
unsigned long Word_Info_List_index=0;
//struct WORD_AREA Word_Area_List[100];
//unsigned long Long_ID_index[100];
unsigned long cur_long_index=0;
unsigned long alpha_long=0;
unsigned long area_long=0;
unsigned long data_long=0;
char idiom_list_buf[3328]; //联表数据缓冲
char *idiom_explain_buf=idiom_list_buf;
unsigned char ENG_CHN_DATA_FILE_NAME[128]=
{"dict\\eng_chn_data.bjld"};
unsigned char CLASS_DATA_FILE_NAME[128]=////class word file
{"dict\\class_word.bjld"};
chn_info chinese_info[256]; //汉字结构信息数组,及每次读取数据信息缓冲
int Get_English_Word_List ////根据输入获取单词,返回值为获取单词的个数。当输入不
////不匹配时,联想最接近的 20 个,或者少于 20 个.
(
const unsigned char *input, ////输入用户的输入要查询的单词
unsigned char *word_list, ////所联想到的单词列表
const int page ////0.向下正常联想1.向下翻页2.向上翻页
)
{
int fp=0;
unsigned char Input_word[128];
unsigned char Get_word[128];
unsigned long ii=0, kk=0;
unsigned long ll=0;
unsigned char *pz=NULL;
int cmp_result=0;
unsigned int read_byte=0;
// char buf[128];
////////////////////////////
if(input==NULL || word_list==NULL){ return 0; }
memset(Input_word, 0, 128);
memcpy(Input_word, input,64);// strlen((char *)input));
if(OrderStr((char *)Input_word, ENGLISHWORDLEN_LIMIT)==0){ return 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, &read_byte);
FS_Seek(fp, 0-4*alpha_long, FS_FILE_END);
FS_Read(fp, Long_ID_index, 4*alpha_long, &read_byte);
ii = (unsigned long)To_lower(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), &read_byte);
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, &read_byte); kk=100; }
else
{ FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA)*kk, &read_byte); }
////寻找基本区
for(ii=0, ll=0; ii<kk; ii++)
{
////100个索引中没搜索到,而且后面还有数据
if(ii>=99 && xumx_stricmp((unsigned char *)(Word_Area_List[ii].area_str), Input_word)<0)
{
FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA)*100, &read_byte);
kk=100;
ii=0;
}
//////////////////////////////////////////
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 0; }
////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, &read_byte);
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, &read_byte); }
else{ FS_Read(fp, Long_ID_index, (data_long-kk)*4, &read_byte); }
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, &read_byte);
delete_tab(Get_word, 128);
cmp_result = xumx_stricmp(Get_word, Input_word);
if(page!=1 && page!=2)////正常联想
{
if(cmp_result>=0){ break; }
}
else////翻页
{
if(cmp_result==0){ break; }
else if(cmp_result>0){ FS_Close(fp); return 0; }
}
cur_long_index++;
}
if(cur_long_index>=100 || cur_long_index+kk>=data_long-2)
{ FS_Close(fp); return 0; }
if(page==1)////向下翻页
{
if(kk+cur_long_index+1 >= data_long-3){ kk = data_long-3; }
else{ kk = kk+cur_long_index+1; }
}
else if(page==2)////向上翻页
{
if(kk+cur_long_index<GET_WORD_MAX_NUM){ kk=0; }
else{ kk = kk+cur_long_index-GET_WORD_MAX_NUM; }
}
else////联想
{
kk = kk+cur_long_index;
}
FS_Seek(fp, 0-4*alpha_long-sizeof(struct WORD_AREA)*area_long-(data_long-kk)*4, FS_FILE_END);
FS_Read(fp, Long_ID_index, GET_WORD_MAX_NUM*4+16, &read_byte);
cur_long_index=0;
pz=word_list;
while(cur_long_index<GET_WORD_MAX_NUM && cur_long_index+kk<data_long-2)
{
FS_Seek(fp, Long_ID_index[cur_long_index], FS_FILE_BEGIN);
FS_Read(fp, Get_word, 120, &read_byte);
delete_tab(Get_word, 128);////整理出干净的单词
////纪录信息
note_word_info(Get_word, Long_ID_index[cur_long_index], Long_ID_index[cur_long_index+1]);
////添加到列表
ll=strlen((char *)Get_word);
memcpy(pz, Get_word, ll);
pz += ll; *pz=0; pz++;
cur_long_index++;
}///while()
FS_Close(fp);
memset(pz, 0, 8);
return ((int)cur_long_index);
}
////////////////////////////////////////////////////////////////////////
int get_english_word_explain ////根据单词,获取此单词的中文解释.成功返回1,失败返回0
(
const unsigned char *input, ////输入的单词
unsigned char *phonetic, ////音标
unsigned char *explain ////得到的解释
)
{
unsigned long ii=0;
unsigned long explain_start=0, explain_end=0;
int fp=0;
unsigned char *pz=NULL, *pt=NULL, *pp=NULL;
unsigned char data_buf[1024];
unsigned char Input_word[128];
unsigned long kk=0,ll=0;
int flag=0;
unsigned int read_byte=0;
////////////////////////////////
if(input==NULL || input[0]==0 || phonetic==NULL || explain==NULL){ return 0; }
for(ii=0; ii<GET_WORD_MAX_NUM; ii++)
{
if(strcmp((char *)Word_Info_List[ii].word, (char *)input)==0)
{
explain_start = Word_Info_List[ii].data_start;
explain_end = Word_Info_List[ii].data_end;
break;
}
}////for(ii)
if(ii<GET_WORD_MAX_NUM) ////有信息
{
fp = MY_OPENFILE(DISK_TYPE, (char *)ENG_CHN_DATA_FILE_NAME, FS_READ_ONLY);
if(fp<0 || explain_end-explain_start>1000) return 0;
FS_Seek(fp, explain_start, FS_FILE_BEGIN);
memset(data_buf, 0, 1024);
FS_Read(fp, data_buf, explain_end-explain_start, &read_byte);
FS_Close(fp);
////天宇手机系统中,FFS_fread读取长度为4的整数倍
memset(data_buf+explain_end-explain_start, 0, 4);
///////
pz=(unsigned char *)strchr((char *)data_buf, '\t');
if(pz==NULL){ return 0; }
pz++;
decode_data(pz, explain_end-explain_start-(unsigned long)(pz-data_buf));////解码
if(*pz!='\t')////音标
{
pt=(unsigned char *)strchr((char *)pz, '\t');
if(pt==NULL){return 0; }
memcpy(phonetic, pz, (unsigned long)(pt-pz));
memset(phonetic+(unsigned long)(pt-pz), 0, 2);
}
else{ memset(phonetic, 0, 2); }
pz=(unsigned char *)strchr((char *)pz, '\t');
if(pz==NULL){ return 0; }
pz++;pp=explain;ii=0;
////解释
pt=(unsigned char *)strchr((char *)pz, '\t');
if(pt==NULL)
{
memcpy(explain, pz, (unsigned long)(explain_end-explain_start)+4);
return 1;
}
else
{
memcpy(pp, pz, (unsigned long)(pt-pz));
pp = pp+(unsigned long)(pt-pz);
}
////例句
pz=pt+1;
if(*pz!='\t' && *pz!=0)
{
memcpy(pp, "\n[例]", 5);
pp+=5;
pt=(unsigned char *)strchr((char *)pz, '\t');
if(pt==NULL)
{
memcpy(pp, pz, strlen((char *)pz)+4);
return 1;
}
else
{
memcpy(pp, pz, (unsigned long)(pt-pz));
pp = pp+(unsigned long)(pt-pz);
pz=pt+1;
}
}
else{ pz++; }
////同义词
if(*pz!='\t' && *pz!=0)
{
memcpy(pp, "\n[同]", 5);
pp+=5;
pt=(unsigned char *)strchr((char *)pz, '\t');
if(pt==NULL)
{
memcpy(pp, pz, strlen((char *)pz)+4);
return 1;
}
else
{
memcpy(pp, pz, (unsigned long)(pt-pz));
pp = pp+(unsigned long)(pt-pz);
pz=pt+1;
}
}
else{ pz++; }
////反义词
if(*pz!='\t' && *pz!=0)
{
memcpy(pp, "\n[反]", 5);
pp+=5;
pt=(unsigned char *)strchr((char *)pz, '\t');
if(pt==NULL)
{
memcpy(pp, pz, strlen((char *)pz)+4);
return 1;
}
else
{
memcpy(pp, pz, (unsigned long)(pt-pz));
pp = pp+(unsigned long)(pt-pz);
pz=pt+1;
}
}
memset(pp, 0, 4);
return 1;
}////if(有信息)
/////////////////////////////////////////////
////搜索一下
memset(Input_word, 0, 128);
memcpy(Input_word, input, strlen((char *)input));
if(OrderStr((char *)Input_word, ENGLISHWORDLEN_LIMIT)==0){ return 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, &read_byte);
FS_Seek(fp, 0-4*alpha_long, FS_FILE_END);
FS_Read(fp, &Long_ID_index, 4*alpha_long, &read_byte);
ii = (unsigned long)To_lower(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), &read_byte);
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, &read_byte); kk=100; }
else
{ FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA)*kk, &read_byte); }
////寻找基本区
for(ii=0, ll=0; ii<kk; ii++)
{
////100个索引中没搜索到,而且后面还有数据
if(ii>=99 && xumx_stricmp((unsigned char *)(Word_Area_List[ii].area_str), Input_word)<0)
{
FS_Read(fp, Word_Area_List, sizeof(struct WORD_AREA)*100, &read_byte);
kk=100;
ii=0;
}
//////////////////////////////////////////
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 0; }
////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, &read_byte);
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, &read_byte); }
else{ FS_Read(fp, Long_ID_index, (data_long-kk)*4, &read_byte); }
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, data_buf, 120, &read_byte);
delete_tab(data_buf, 128);
flag = strcmp((char *)data_buf, (char *)Input_word);
if(flag==0){ break; }
else if(xumx_stricmp(data_buf, Input_word)>0){ FS_Close(fp); return 0; }////没有
cur_long_index++;
}
FS_Close(fp);
if(cur_long_index>=100 || cur_long_index+kk>=data_long-2){ return 0; }
note_word_info(data_buf, Long_ID_index[cur_long_index], Long_ID_index[cur_long_index+1]);
if(get_english_word_explain(data_buf, phonetic, explain)==0){ return 0; }////递归调用
return 1;
}
////////////////////////////////////////////////////////////////////////
void decode_data(unsigned char *data, unsigned len)
{
unsigned char *pz=data;
//////////////////
while(*pz!=0 && (unsigned long)(pz-data)<len)
{
*pz = (unsigned char)((unsigned char)(*pz>>4) | (unsigned char)(*pz<<4));
pz++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -