📄 de_api.c
字号:
/********************************************************************
* VERSION: 1.3 Motech -Ian 20050602 *
* REASON: - removed some info *
* REFERENCE: - *
* DESCRIPTION: release version *
* *
* VERSION: 1.2 Sunv-Ian 20050428 *
* REASON: - fixed a bug of ExpandFile *
* REFERENCE: - *
* DESCRIPTION: release version *
* *
* VERSION: 1.1 Sunv-Ian 20050421 *
* REASON: - fixed a bug of DEInstantGetWordContent *
* REFERENCE: - *
* DESCRIPTION: release version *
* *
* VERSION: 1.0 Sunv-Ian *
* REASON: - fixed some warnings reported by PC-Lint *
* REFERENCE: - *
* DESCRIPTION: release version *
* *
* VERSION: 0.1 Sunv-IUnknown *
* REASON: - *
* REFERENCE: - *
* DESCRIPTION: Initial draft *
********************************************************************/
#include "de_api.h"
#include "SJTU_str.h"
#include "zlib\SJTU_zlib.h"
#define MATCH_CASE /* currently, match case is disable; NOKIA can configure it, open for match case search, if not, close*/
#define TEST_VALID /* test RUN-TIME memory is valid */
/*-----------CPU align number------------------*/
#define ALIGN_NUM 4
#define SIMP_CHINESE 0x04 /* Simplified Chinese */
#define TRAD_CHINESE 0x08 /* Traditional Chinese */
#define FLAG_ENGLISH 0x09 /* English */
#define COMPOST_JUMPINGOFF 0x9001 /* inner sort code start position */
#define MIN_JUMP 0x90
#define MIN_UNICODE 0x4e00 /* the minimum unicode value */
#define MIN_PERCH 0x4e
#define MAX_UNICODE 0x9fa5 /* the maximum unicode value */
#define TW_UNICODE 0x4200
#define SRC_LANGUAGE_FLAG 0x00 /* source language flag, 0x09-English, 0x04-Simplified Chn, 0x08-Traditional Chn */
#define DES_LANGUAGE_FLAG 0x01 /* destination language flag, 0x09-English, 0x04-Simplified Chn, 0x08-Traditional Chn */
#define PINYINZHUYIN_ADDRESS 0x02 /* pinyin/zhuyin address */
#define FILE_TOTAL_SIZE 0x04 /* total size of this dict file */
#define KEYVALUE_ADDRESS 0x08 /* a pointer to the keyvalue array */
#define BLOCK_FILE_ADDRESS 0x0c /* a pointer to the block_files_array(compressed) */
#define ADDR_OFFSET_WORDLIST 0x10 /* offset of words list */
#define BLOCK_PAGE_SIZE 32
#define MAX_POS_NUM 20
#define CH_YB 0x80 //phone symbol
#define CH_CX 0x81 //type
#define CH_PINYIN 0x82 //for Pinyin/Zhuyin
#define CH_JS 0x83 //explanation
#define CH_BGZ 0x85 //irregularity
#define CH_TYC 0x86 //synonym
#define CH_FYC 0x87 //antonym
#define CH_FY 0x88 //pronunciation
#define CH_COMPART 0x3b //separate symbol, ';'
#define T_EMPTY 0x00 /* no word type */
#define T_NOUN 0x01 /* noun */
#define T_PRON 0x02 /* pronoun */
#define T_VI 0x03 /* verb intransitive */
#define T_VT 0x04 /* verb transitive */
#define T_ADJ 0x05 /* adjective */
#define T_ADV 0x06 /* adverb*/
#define T_PREP 0x07 /* preposition */
#define T_CONJ 0x08 /* conjunction */
#define T_INT 0x09 /* interjection*/
#define T_ABBR 0x0a /* abbreviation */
#define T_USER 0x0b /* user lib */
#define T_END 0x0c /* type end */
typedef enum
{
SEC = 0,
SCE = 1,
TEC = 2,
TCE = 3
} DICT_FLAG;
typedef struct
{
DWORD ulFile;
DWORD ulBlock;
DWORD ulEntry;
} POS;
typedef enum
{
BEGINING_BLOCK = 0,
ENDING_BLOCK = 1,
OTHER_BLOCK = 2
} BLOCK_POS;
typedef struct
{
POS pos;
BLOCK_POS block_index; /* flag == 0 begining block of a file; flag == 1 ending block of a file; flag == other , other block */
DECHAR ushWordList[BLOCK_PAGE_SIZE][MAX_WORD_SIZE];
} HisWordList;
typedef struct {
DE_HANDLE hLib;
DWORD dwTotalFilesNum;
DWORD dwBlockFilesIndex;
DWORD dwWordsListIndex;
DWORD dwWordsList;
DWORD dwLibSize;
} LibInfor;
typedef struct{
DWORD dwTotalBlocksNum;
DWORD dwExpandedFileSize;
} FileInfor;
typedef struct
{
/* for global use */
BYTE uchECLib;
BYTE uchCELib;
BOOL bTW;
DWORD keyvalue;
DWORD pinyindata;
DWORD pinyinbuflen;
ZLib_Alloc_t ZLibAllocMem; /* used to compress and expand the dictionary data */
DE_HANDLE hLastCompressedLib;
DWORD dwLastCompressedBufFileIndex;
DWORD dwLastCompressedBufSize;
#define MAX_BLOCK_FILE_SIZE (8 * 1024)
BYTE CompressedBuf[MAX_BLOCK_FILE_SIZE];
#define MAX_OUTPUT_BUF (10 * 1024 + 100)
BYTE UnCompressedBuf[MAX_OUTPUT_BUF];
/* current search */
BYTE uchLastSearchLib;
POS posFocus;
DICT_FLAG flag;
HisWordList his;
/* current library */
LibInfor curLib;
/* current expanded file */
FileInfor curFile;
BYTE* pInstantBuf;
BOOL bInstantEng;
/* recite module */
BYTE uchLibFlag;
unsigned short ushBeg;
unsigned short ushEnd;
unsigned long ulHisIndex;
POS posReciteHis;
} DEGlobalData, *LPDEGlobalData;
POS g_curPos;
BOOL g_bEng;
#ifdef TEST_VALID
static unsigned char CheckDEData(DEData *pData)
{
BYTE i;
if(!pData)
return DE_NO_ENOUGH_MEMORY;
if(!pData->pRAM)
return DE_NO_ENOUGH_MEMORY;
if(pData->NumofStandardLib == 0 || pData->NumofStandardLib >= 32)
return DE_NO_DICT;
for(i = 0; i < pData->NumofStandardLib; i ++)
{
if(pData->pStandardLib[i] == 0)
return DE_NO_ENOUGH_MEMORY;
}
return DE_OK;
}
#endif // _DEBUG
static unsigned short GetUShortFromBuf(void *buf)
{
unsigned short val;
unsigned char *p = (unsigned char *)buf;
val = (unsigned short)(p[1] | (((unsigned short)p[0]) << 8));
return val;
}
static DWORD GetULongFromBuf(const void *buf)
{
DWORD val;
unsigned char *p = (unsigned char *)buf;
val = p[3]
| (((DWORD)p[2]) << 8)
| (((DWORD)p[1]) << 16)
| (((DWORD)p[0]) << 24);
return val;
}
static DWORD AlignSize(DWORD ulSize)
{
if(ulSize % ALIGN_NUM != 0)
ulSize += ALIGN_NUM - ulSize % ALIGN_NUM;
return ulSize;
}
static BOOL CheckLibEC(LPDEData pData, DE_HANDLE pStandardLib)
{
unsigned char ch;
unsigned char chTemp[2];
(void)pData->Seek((DE_HANDLE)pStandardLib, 0, DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)pStandardLib, (char*)chTemp, 2);
ch = chTemp[SRC_LANGUAGE_FLAG];
if(ch == FLAG_ENGLISH)
return TRUE;
return FALSE;
}
static unsigned short GetPinyinBufLen(LPDEData pData, unsigned short wIndex)
{
LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
unsigned char chTemp[4];
(void)pData->Seek((DE_HANDLE)pData->pStandardLib[lpGlobal->uchCELib], lpGlobal->pinyindata + 2 * wIndex, DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)pData->pStandardLib[lpGlobal->uchCELib], (char*)chTemp, 4);
return (WORD)(GetUShortFromBuf((BYTE*)chTemp + 2) - GetUShortFromBuf((BYTE*)chTemp));
}
static void GetPinyinBuf(LPDEData pData, unsigned short wIndex, DESTR chPinyinBuf)
{
LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
unsigned char chTemp[4];
unsigned short ushBufLen;
unsigned char ccTemp[MAX_WORD_SIZE * 2];
int i;
(void)pData->Seek((DE_HANDLE)pData->pStandardLib[lpGlobal->uchCELib], (DWORD)(lpGlobal->pinyindata + 2 * wIndex), DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)pData->pStandardLib[lpGlobal->uchCELib], (char*)chTemp, 4);
ushBufLen = (WORD)(GetUShortFromBuf((BYTE*)chTemp + 2) - GetUShortFromBuf((BYTE*)chTemp));
(void)pData->Seek((DE_HANDLE)pData->pStandardLib[lpGlobal->uchCELib], (DWORD)(lpGlobal->pinyindata + GetUShortFromBuf((BYTE*)chTemp)), DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)pData->pStandardLib[lpGlobal->uchCELib], (char*)ccTemp, ushBufLen);
for(i = 0; i < ushBufLen; i += 2)
{
*chPinyinBuf++ = (unsigned short)((unsigned short)(ccTemp[i] << 8) | ccTemp[i + 1]);
}
*chPinyinBuf = 0x00;
}
static unsigned char CheckLib(LPDEData pData, DE_HANDLE pStandardLib, BOOL* bTradChn)
{
unsigned char ch;
unsigned char chTemp[2];
(void)pData->Seek((DE_HANDLE)pStandardLib, 0, DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)pStandardLib, (char*)chTemp, 2);
ch = chTemp[SRC_LANGUAGE_FLAG];
if(ch != FLAG_ENGLISH && ch != SIMP_CHINESE && ch != TRAD_CHINESE)
return DE_INVALID_DICT;
if(ch == TRAD_CHINESE)
*bTradChn = TRUE;
else if(ch == SIMP_CHINESE)
*bTradChn = FALSE;
ch = chTemp[DES_LANGUAGE_FLAG];
if(ch != FLAG_ENGLISH && ch != SIMP_CHINESE && ch != TRAD_CHINESE)
return DE_INVALID_DICT;
if(ch == TRAD_CHINESE)
*bTradChn = TRUE;
else if(ch == SIMP_CHINESE)
*bTradChn = FALSE;
return DE_OK;
}
static unsigned short UC2Sortcode(unsigned short x)
{
unsigned short i;
unsigned short t;
if(x < MIN_UNICODE)
return x;
t = COMPOST_JUMPINGOFF;
for(i = MIN_UNICODE; i < x; i ++)
{
t ++;
if(t % 0x100 == 0)
t ++;
}
return t;
}
static void ConvertTWUnicodeToSort(const DESTR Input, DESTR Output)
{
DESTR lpInput = Input;
DESTR lpOut = Output;
DECHAR ch;
BOOL bEng;
int i;
if(lpInput == NULL || lpOut == NULL)
return;
bEng = FALSE;
if(lpInput[0] >= 0x20 && lpInput[0] <= 0x7f)
bEng = TRUE;
i = 0;
while((i < MAX_WORD_SIZE - 1) && ((ch = *lpInput++) != 0) )
{
if( (ch <= 0x007f) && (ch >= 0x0020) )
{
if(bEng)
{
/* latin character and Arabic number */
*lpOut ++ = (unsigned char)ch;
i ++;
}
}
else
{
if(!bEng)
{
*lpOut ++ = UC2Sortcode(ch);
i++;
}
}
} /* while(!eos) */
*lpOut = 0;
}
static unsigned short GetValueFromKey(LPDEData pData, BYTE iCEDict, DWORD pKeyValueBuf, unsigned short shInput)
{
if( (shInput >= MIN_UNICODE) && (shInput <= MAX_UNICODE) )
{
BYTE chTemp[2];
unsigned long offset = 4 * (shInput - MIN_UNICODE);
(void)pData->Seek((DE_HANDLE)pData->pStandardLib[iCEDict], (DWORD)(pKeyValueBuf + offset), DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)pData->pStandardLib[iCEDict], (char*)chTemp, 2);
return (unsigned short)( ((unsigned short)(chTemp[0]) << 8) | chTemp[1]);
}
return shInput;
}
static void ConvertUnicodeToSort(LPDEData pData, BYTE iCEDict, DWORD pKeyValueBuf, const DESTR a_lpInput, DESTR lpOut)
{
DESTR lpInput = a_lpInput;
DECHAR ch;
BOOL bEng;
int i;
if(lpInput == NULL)
return;
bEng = FALSE;
if( (lpInput[0] <= 0x007f) && (lpInput[0] >= 0x0020) )
bEng = TRUE;
i = 0;
while( i < MAX_WORD_SIZE-1 && (ch=*lpInput++) != 0 )
{
if( (ch <= 0x007f) && (ch >= 0x0020) )
{
if(bEng)
{
/* latin character and Arabic number */
*lpOut ++ = (unsigned char)ch;
i ++;
}
}
else
{
if(!bEng)
{
*lpOut++ = GetValueFromKey(pData, iCEDict, pKeyValueBuf, ch);
i++;
}
}
} /* while(!eos) */
*lpOut = 0;
}
static DWORD FileReadLine(LPDEData pData, DE_HANDLE hFile, DWORD lpBuf, DESTR OutputLine, BOOL bEvenByte)
{
BYTE chTemp[MAX_WORD_SIZE * 2];
BYTE *p = chTemp;
(void)pData->Seek((DE_HANDLE)hFile, lpBuf, DE_FILE_BEGIN);
(void)pData->Read((DE_HANDLE)hFile, (char*)p, MAX_WORD_SIZE * 2);
// If OutputLine == NULL, just used to calculate the number of buffer to be needed.
if(!OutputLine)
{
while(!(p[0] == 0x0d && p[1] == 0x0a))
p++;
return (DWORD)((BYTE*)p - (BYTE*)chTemp);
}
else
{
while(!(p[0] == 0x0d && p[1] == 0x0a))
{
if(bEvenByte)
{
*OutputLine++ = (DECHAR)(((DECHAR)p[0] << 8) | (DECHAR)p[1]);
p += 2;
}
else
*OutputLine++ = (DECHAR)*p++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -