📄 ecdic.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 + -