⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dict_get_word.c

📁 在mtk平台上开发的电子词典源码
💻 C
📖 第 1 页 / 共 4 页
字号:
#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 + -