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

📄 de_api.c

📁 arena SDK开发应用
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************
*   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 + -