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

📄 dict_get_word.c

📁 在mtk平台上开发的电子词典源码
💻 C
📖 第 1 页 / 共 4 页
字号:
}
//////////////////////////////////////////////////////////////////////////////

////手机系统中,此库函数的结果不是很正确,需要自己编写代码
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 + -