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

📄 ecdic.c

📁 国家ASIC工程中心使用的嵌入式操作系统
💻 C
字号:
// ecdict.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "Tchar.H"
//#include "CTYPE.H"
#include "dic.h"

extern unsigned char ec_dict[0];
extern unsigned char ce_dict[0];

#ifdef SIM_ON_PC
#include "diclib.c"
#define ECDICTLIB_ENTRY		ec_dict		// 英汉字典
#define CEDICTLIB_ENTRY		ce_dict		// 汉英字典
#else
////#include "sys\cdevice.h"
////#define ECDICTLIB_ENTRY		ECDICTIONARY_LIB_START
////#define CEDICTLIB_ENTRY		CEDICTIONARY_LIB_START
#define ECDICTLIB_ENTRY		ec_dict		// 英汉字典
#define CEDICTLIB_ENTRY		ce_dict		// 汉英字典sp by DSA gfd
#endif

long	ec_lib[]={0, 22974, 38936, 58485, 70125, 78957, 86968, 92508, 97814, 106244, 107681, 108710, 113493,\
		 119908, 123135, 126322, 136451, 137438, 145506, 164060, 173152, 180839, 183994, 189911, 189980, \
		 190729, 190967};
unsigned short ec_lib_index[]={0, 1020, 1766, 2552, 3042, 3407, 3733, 3957, 4168, 4432, 4478, 4520, 4688, 4902, 5004, 5109, \
			5448, 5480, 5763, 6326, 6619, 6860, 6980, 7171, 7174, 7207};

long	ce_lib[]={0, 2099, 4841, 8069, 12398, 17332, 21597, 25098, 29679, 33012, 37348, 41974, 47002, 50970, 55019,\
		 58800, 62640, 66586, 69618, 72632, 76110, 79528, 82730, 86641, 90611, 94432, 98625, 103876, 107921,\
		  111377, 116143, 120140, 124205, 129350, 133044, 137189, 140948, 143912, 147283, 151676, 156826, \
		  157369, 157769, 158367, 158531, 158724, 158990, 159312, 159676, 159923, 160248, 160600, 161043, \
		  161349, 161790, 162472, 162843, 163167, 163496, 163951, 164256, 164633, 164790, 165167, 165366, \
		  165924, 166171, 166317, 166655, 166902, 167265, 167406, 167697};
unsigned short ce_lib_index[]={0, 128, 275, 449, 674, 926, 1162, 1365, 1621, 1804, 2032, 2261, 2507, 2721, 2941, 3149, \
		 3353, 3560, 3732, 3906, 4098, 4288, 4468, 4672, 4881, 5085, 5304, 5578, 5793, 5979, 6218, 6435, 6655, 6929, 7123,\
		 7335, 7542, 7712, 7899, 8130, 8376, 8408, 8431, 8465, 8472, 8482, 8501, 8521, 8542, 8559, 8580, 8604, 8629, 8648, \
		 8677, 8713, 8734, 8757, 8781, 8806, 8828, 8853, 8861, 8883, 8898, 8932, 8949, 8960, 8984, 9000, 9026, 9035};


extern int find_explain_e2c(unsigned char *Word, unsigned char *Explain, unsigned char *Index, int OffsetWord, int Line, int LineLength, unsigned char **ResumePoint, unsigned short *TotalLength, unsigned short *PresentIndex); 

int read_next_word(unsigned char **Word)
{
	unsigned char	*PointWord, *PreWord;
	
	
	PointWord = *Word;
	PreWord = *Word;
	while( (*PointWord != '*') && (*PointWord != '\0') )
		PointWord ++;
	if(*PointWord != '\0')
	{
		*Word = PointWord;
		return 1;
	}
	else
	{
		*Word = PreWord;
		return -1;
	}
}

int read_previous_word(unsigned char **Word, unsigned char *BeginWord)
{
	unsigned char	*PointWord, *PreWord;
	
	PointWord = *Word;
	PreWord = *Word;
	if(PointWord > BeginWord)
		PointWord -=2;
	else
	{
		*Word = PreWord;
		return -1;
	}
	while( (*PointWord != '*') && (PointWord > BeginWord) )
		PointWord --;
	PointWord ++;
	*Word = PointWord;
	return 1;
}


int find_explain_e2c(unsigned char *Word, unsigned char *Explain, unsigned char *Index, \
					 int OffsetWord, int Line, int LineLength, unsigned char **ResumePoint, \
					 unsigned short *TotalLength, unsigned short *PresentIndex)
{
	unsigned char	*NowWord;
	unsigned char	*BaseAddr;
	unsigned char	StoreWord[30];
	int	Offset;
	int	i, j;
	int	TotalWord;
	int	LineNum=0;
	int	IndexNum=0, ExplainNum;
	
	while(*Word == ' ')
		Word ++;
////gfd add: replace strcpy by STRCPY for after using strcpy, the address of Word will be modified.
/*
#define STRCPY(dest, src)	do{\
							char *destadd; \
							const char *srcadd; \
							destadd = dest; \
							srcadd = src}while(0);
*/
	strcpy((char *)StoreWord, (char *)Word);
	i = 0;
	while(StoreWord[i] != '\0')
	{
		if( (StoreWord[i] >= 'A') && (StoreWord[i] <= 'Z') )
			StoreWord[i] += 0x20;                       //大写换小写
		i++;
	}
	TotalWord = i;
	if(!( ( (StoreWord[0] >= 'a') && (StoreWord[0] <= 'z') ) || (StoreWord[0] > 0xa0) ) )
		StoreWord[0] = 'a';
	
	if(Word[0] < 0xa0)
	{
		*TotalLength = ENGLISH_LEN;
		if(OffsetWord == 0)
		{
			Offset = StoreWord[0] - 'a';
			BaseAddr = (unsigned int *)((unsigned int *)ECDICTLIB_ENTRY + ec_lib[Offset]);
			NowWord = BaseAddr;
			*PresentIndex = ec_lib_index[Offset];
			while(1)
			{
				if(memcmp((char *)NowWord, (char *)StoreWord, TotalWord) >= 0)
					break;read_next_word(&NowWord);
				NowWord ++;
				(*PresentIndex) ++;
			}
			*ResumePoint = NowWord;
		}
		else
		{
			NowWord = *ResumePoint;
			if(OffsetWord > 0)
			{
				for(j=0; j<OffsetWord; j++)
				{
					if(read_next_word(&NowWord) == 1)
						NowWord++;
					else
						break;
				}
			}
			if(OffsetWord < 0)
			{
				for(j=0; j>OffsetWord; j--)
				{
					read_previous_word(&NowWord, (unsigned char *)ECDICTLIB_ENTRY );
				}
			}
			*ResumePoint = NowWord;
		}
		i = 0;
		for(j=0; j<Line; j++)
		{
			Word2Bytes((Index+IndexNum*2), (unsigned short)i);
			IndexNum++;
			LineNum++;
			while( (*NowWord != '[') && (*NowWord < 0xa0) && (*NowWord != '\0') )
			{
				Explain[i] = *NowWord;
				if(i > LineLength)
					break;
				i++;
				NowWord ++;
				
			}
			Explain[i] = '\0';
			if(i > LineLength)
				break;
			i++;
			if(j == 0)
				ExplainNum = i;
			while( (*NowWord != '*') && (*NowWord != '\0') )
			{
				if(j == 0)
				{
					Explain[i] = *NowWord;
					if(i > LineLength)
						break;
					i++;
				}
				NowWord++;
			}
			if(i > LineLength)
				break;
			if(j == 0)
			{
				Explain[i] = '\0';
				i++;
			}
			NowWord++;
			if(*NowWord == '\0')
				break;
		}
		Word2Bytes((Index+IndexNum*2), (unsigned short)ExplainNum);
	}
	else
	{
		*TotalLength = CHINESE_LEN;
		if(OffsetWord == 0)
		{
			Offset = StoreWord[0] - 0xb0;
			BaseAddr = ECDICTLIB_ENTRY + ce_lib[Offset];
			NowWord = BaseAddr;
			*PresentIndex = ce_lib_index[Offset];
			while(1)
			{
				if(memcmp((char *)NowWord, (char *)StoreWord, TotalWord) >= 0)
					break;
				read_next_word(&NowWord);
				NowWord ++;
				(*PresentIndex) ++;
			}
			*ResumePoint = NowWord;
		}
		else
		{
			NowWord = *ResumePoint;
			if(OffsetWord > 0)
			{
				for(j=0; j<OffsetWord; j++)
				{
					if(read_next_word(&NowWord) == 1)
						NowWord++;
					else
						break;
				}
			}
			if(OffsetWord < 0)
			{
				for(j=0; j>OffsetWord; j--)
				{
					read_previous_word(&NowWord, (unsigned char *)ECDICTLIB_ENTRY);
				}
			}
			*ResumePoint = NowWord;
		}
		i = 0;
		for(j=0; j<Line; j++)
		{
			Word2Bytes((Index+IndexNum*2), (unsigned short)i);
			IndexNum++;
			LineNum++;
			while( (*NowWord > 0xa0) && (*NowWord != '\0') )
			{
				Explain[i] = *NowWord;
				if(i > LineLength)
					break;
				i++;
				NowWord ++;
				
			}
			if(i > LineLength)
				break;
			Explain[i] = '\0';
			i++;
			if(j == 0)
				ExplainNum = i;
			while( (*NowWord != '*') && (*NowWord != '\0') )
			{
				if(j == 0)
				{
					Explain[i] = *NowWord;
					if(i > LineLength)
						break;
					i++;
				}
				NowWord++;
			}
			if(i > LineLength)
				break;
			if(j == 0)
			{
				Explain[i] = '\0';
				i++;
			}
			NowWord++;
			if(*NowWord == '\0')
				break;
		}
		Word2Bytes((Index+IndexNum*2), (unsigned short)ExplainNum);
	}
	Explain[i] = '\0';
	return LineNum;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -