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

📄 de_api.c

📁 arena SDK开发应用
💻 C
📖 第 1 页 / 共 5 页
字号:
    BYTE* p = pBuf;
    if(p[0] == 0x0d && p[1] == 0x0a)
        p += 2;
    while(!(p[0] == 0x0d && p[1] == 0x0a))
        p++;
    p += 2;
    return (DWORD)(p - pBuf);
}
static int GetCompareValue(DESTR pConstantString, DESTR pInputString)
{
    DECHAR *p = pConstantString; 
    DECHAR *q = pInputString;
    int n = 0;
    DECHAR chp, chq;
    
    while (0 != (chp=*p)  &&  0 != (chq=*q)  )
    {
        if (chp >='A' && chp <='Z')
            chp |= 0x20;
        else if ( chp != ' ' && (chp <'a' || chp >'z') )
            chp = 0x21;
        
        if (chq >='A' && chq <='Z')
            chq |= 0x20;
        else if (chq != ' ' && (chq <'a' || chq >'z') )
            chq = 0x21;
        
        if(chp == chq)
            n++;
        else
            break;
        
        p++;
        q++;
    }
    
    return n;
}

static DWORD GetEntryNumOfBlock(DEData *pData, FileInfor *file, DWORD ulBlockIndex)
{
    LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
    BYTE* pEntryIndex;
    BYTE* pBlockIndex;
    BYTE* pDicEnd = (BYTE*)lpGlobal->UnCompressedBuf + file->dwExpandedFileSize;
    DWORD ulNum = 0;

    pBlockIndex = (BYTE*)lpGlobal->UnCompressedBuf + 2 * ulBlockIndex;
    pEntryIndex = (BYTE*)lpGlobal->UnCompressedBuf + GetUShortFromBuf(pBlockIndex);
    
    while(pEntryIndex < pDicEnd)
    {
        pEntryIndex += GetNextEntryInBlock((BYTE*)pEntryIndex);
        ulNum++;
    }

    if(ulNum > BLOCK_PAGE_SIZE)
        ulNum = BLOCK_PAGE_SIZE;
        
    return ulNum;
}

static DWORD FindNearestWordIndex(DEData *pData, FileInfor *file, DESTR lpInputSort, DICT_FLAG flag, DWORD ulBlockIndex)
{
    LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
    DECHAR uchWord[MAX_WORD_SIZE];
    BYTE* pEntryIndex;
    BYTE* pBlockIndex;
    int (*pFuncCmp)(unsigned short* p1, unsigned short* p2);
    int nRet;
    int i;
    BYTE* pBegEntryIndex;
    int nPreValue;
    BYTE* pDicEnd = (BYTE*)lpGlobal->UnCompressedBuf + file->dwExpandedFileSize;

    pBlockIndex = (BYTE*)lpGlobal->UnCompressedBuf + 2 * ulBlockIndex;
    pEntryIndex = (BYTE*)lpGlobal->UnCompressedBuf + GetUShortFromBuf(pBlockIndex);
    pBegEntryIndex = pEntryIndex;

    if(flag == SEC || flag == TEC)
        pFuncCmp = SJTU_stricmpExW;
    else
        pFuncCmp = SJTU_strcmpW;
                
    nPreValue = -1;
    for(i = 0; i < BLOCK_PAGE_SIZE && pEntryIndex < pDicEnd; i++)
    {
        int nCurValue = -1;

        if(flag == SEC || flag == TEC)
            (void)ReadWord((BYTE*)pEntryIndex, uchWord, FALSE);
        else
            (void)ReadWord((BYTE*)pEntryIndex, uchWord, TRUE);
        
        nRet = pFuncCmp(uchWord, lpInputSort);
        nCurValue = GetCompareValue(uchWord, lpInputSort);
        if(nRet >= 0)
        {
            if(nRet == 0)
            {
#ifdef MATCH_CASE
                BYTE* pEntry = pEntryIndex;
                int t;
                for(t = 0; t < BLOCK_PAGE_SIZE - i && pEntry < pDicEnd; t++)
                {
                    if(flag == SEC || flag == TEC)
                        (void)ReadWord((BYTE*)pEntry, uchWord, FALSE);
                    else
                        (void)ReadWord((BYTE*)pEntry, uchWord, TRUE);
                    if(SJTU_strcmpW(uchWord, lpInputSort) == 0)
                    {
                        pEntryIndex = pEntry;
                        i += t;
                        break;
                    }
                    pEntry += GetNextEntryInBlock((BYTE*)pEntry);
                }
                if(flag == SEC && flag == TEC)
                {
                    pEntry = pEntryIndex;
                    for(t = 0; t < BLOCK_PAGE_SIZE - i && pEntry < pDicEnd; t++)
                    {
                        if(flag == SEC || flag == TEC)
                            (void)ReadWord((BYTE*)pEntry, uchWord, FALSE);
                        if(SJTU_stricmpW(uchWord, lpInputSort) == 0)
                        {
                            pEntryIndex = pEntry;
                            i += 5;
                            break;
                        }
                        pEntry += GetNextEntryInBlock((BYTE*)pEntry);
                    }
                }
                break;
#else
                BYTE* pEntry = pEntryIndex;
                int t;
                for(t = 0; t < BLOCK_PAGE_SIZE - i && pEntry < pDicEnd; t++)
                {
                    if(flag == SEC || flag == TEC)
                        (void)ReadWord((BYTE*)pEntry, uchWord, FALSE);
                    else
                        (void)ReadWord((BYTE*)pEntry, uchWord, TRUE);
                    if(SJTU_stricmpW(uchWord, lpInputSort) == 0)
                    {
                        pEntryIndex = pEntry;
                        i += t;
                        break;
                    }
                    pEntry += GetNextEntryInBlock((BYTE*)pEntry);
                }
                break;
#endif
            }
            else
            {
                if(nCurValue <= nPreValue)
                {
                    if(pEntryIndex > pBegEntryIndex)
                        pEntryIndex -= GetPreEntryInBlock((BYTE*)pEntryIndex);
                }
                break;
            }
        }
        nPreValue = nCurValue;
        pEntryIndex += GetNextEntryInBlock((BYTE*)pEntryIndex);
    }
    
    if(pEntryIndex >= pDicEnd)
        i--;
    return (DWORD)i;
}

static DWORD FindNearestBlockIndex(DEData *pData, DESTR lpInputSort, DICT_FLAG flag)
{
    LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
    DECHAR uchWord[MAX_WORD_SIZE];
    BYTE* pIndex = lpGlobal->UnCompressedBuf;
    BYTE* pIndexEnd = (BYTE*)lpGlobal->UnCompressedBuf 
        + GetUShortFromBuf(lpGlobal->UnCompressedBuf);
    
    int (*pFuncCmp)(unsigned short* p1, unsigned short* p2);
    int nRet;
    BYTE* pOffset;
    
    if(flag == SEC || flag == TEC)
        pFuncCmp = SJTU_stricmpExW;
    else
        pFuncCmp = SJTU_strcmpW;
    
    while(pIndex < pIndexEnd)
    {
        pOffset = (BYTE*)lpGlobal->UnCompressedBuf + GetUShortFromBuf(pIndex);
        if(flag == SEC || flag == TEC)
            (void)ReadWord((BYTE*)pOffset, uchWord, FALSE);
        else
            (void)ReadWord((BYTE*)pOffset, uchWord, TRUE);
        
        nRet = pFuncCmp(uchWord, lpInputSort);
        if(nRet >= 0)
        {
            if(nRet == 0)
            {
#ifdef MATCH_CASE
                BYTE* pPreIndex = pIndex;
                BYTE* pPreOffset;
                int i;
                
                if(flag == TCE || flag == SCE)
                    break;
                if(SJTU_strcmpExW(uchWord, lpInputSort) == 0)
                    break;
                
                if(pIndex > (BYTE*)lpGlobal->UnCompressedBuf)
                    pPreIndex = pIndex - 2;
                else
                    break;
                pPreOffset = (BYTE*)lpGlobal->UnCompressedBuf + GetUShortFromBuf(pPreIndex);
                
                for(i = 0; i < BLOCK_PAGE_SIZE - 1; i++)
                {
                    pPreOffset += GetNextEntryInBlock((BYTE*)pPreOffset);
                }
                
                if(flag == SEC || flag == TEC)
                    (void)ReadWord((BYTE*)pPreOffset, uchWord, FALSE);
                
                nRet = SJTU_strcmpExW(uchWord, lpInputSort);
                if(nRet == 0)
                {
                    pIndex = pPreIndex;
                }
                break;
#else
                BYTE* pPreIndex = pIndex;
                BYTE* pPreOffset;
                int i;
                
                if(flag == SCE || flag == TCE)
                    break;

                if(pIndex > (BYTE*)lpGlobal->UnCompressedBuf)
                    pPreIndex = pIndex - 2;
                else
                    break;
                pPreOffset = (BYTE*)lpGlobal->UnCompressedBuf + GetUShortFromBuf(pPreIndex);
                
                for(i = 0; i < BLOCK_PAGE_SIZE - 1; i++)
                {
                    pPreOffset += GetNextEntryInBlock((BYTE*)pPreOffset);
                }
                
                if(flag == SEC || flag == TEC)
                    (void)ReadWord((BYTE*)pPreOffset, uchWord, FALSE);
                
                nRet = SJTU_stricmpExW(uchWord, lpInputSort);
                if(nRet == 0)
                {
                    pIndex = pPreIndex;
                }
                break;
#endif
            }
            else
            {
                BYTE* pPreIndex = pIndex;
                BYTE* pPreOffset;
                int i;
                if(pIndex > (BYTE*)lpGlobal->UnCompressedBuf)
                    pPreIndex = pIndex - 2;
                else
                    break;
                pPreOffset = (BYTE*)lpGlobal->UnCompressedBuf + GetUShortFromBuf(pPreIndex);
                
                for(i = 0; i < BLOCK_PAGE_SIZE; i++)
                {
                    if(flag == SEC || flag == TEC)
                        (void)ReadWord((BYTE*)pPreOffset, uchWord, FALSE);
                    else
                        (void)ReadWord((BYTE*)pPreOffset, uchWord, TRUE);
                    
                    nRet = pFuncCmp(uchWord, lpInputSort);
                    if(nRet >= 0)
                        break;
                    
                    pPreOffset += GetNextEntryInBlock((BYTE*)pPreOffset);
                }
                if(i < BLOCK_PAGE_SIZE)
                {
                    pIndex = pPreIndex;
                    break;
                }
                break;
            }
        }
        // to be continued... IUnknown.
        pIndex += 2;
    }
    if(pIndex >= pIndexEnd)
        pIndex = pIndexEnd - 2;

    return (DWORD)((BYTE*)pIndex - (BYTE*)lpGlobal->UnCompressedBuf) / 2;
}

static void ExpandFile(DEData *pData, LibInfor *lib, FileInfor *file, DWORD ulIndex)
{
    BYTE chTemp[4];
    DWORD ulOutput = MAX_OUTPUT_BUF;
    DWORD ulLength;
    DWORD ulTotalNum;
    LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
    DWORD pBlockFileOffset = lib->dwBlockFilesIndex + 4 * ulIndex;
    DWORD pBlockFile;

    /* already expanded */
    if(lpGlobal->hLastCompressedLib == lib->hLib
        && ulIndex == lpGlobal->dwLastCompressedBufFileIndex)
    {
        file->dwTotalBlocksNum = (DWORD)GetUShortFromBuf((BYTE*)lpGlobal->UnCompressedBuf) / 2;
        file->dwExpandedFileSize = lpGlobal->dwLastCompressedBufSize;
        
        return;
    }
    
	// added by Ian 20050428
	if(lib->hLib == 0xffffffff || lib->hLib == 0x0)
		return;
	
    (void)pData->Seek((DE_HANDLE)lib->hLib, pBlockFileOffset, DE_FILE_BEGIN);
    (void)pData->Read((DE_HANDLE)lib->hLib, (char*)chTemp, 4);

    pBlockFile = GetULongFromBuf((BYTE*)chTemp);
    
    (void)pData->Seek((DE_HANDLE)lib->hLib, lib->dwBlockFilesIndex, DE_FILE_BEGIN);
    (void)pData->Read((DE_HANDLE)lib->hLib, (char*)chTemp, 4);

    ulTotalNum = (GetULongFromBuf((BYTE*)chTemp) - lib->dwBlockFilesIndex) / 4;
    if(ulIndex < ulTotalNum - 1)
    {
        DWORD dwSec, dwFir;
        (void)pData->Seek((DE_HANDLE)lib->hLib, lib->dwBlockFilesIndex + 4 * ulIndex + 4, DE_FILE_BEGIN);
        (void)pData->Read((DE_HANDLE)lib->hLib, (char*)chTemp, 4);
        dwSec = GetULongFromBuf((BYTE*)chTemp);

        (void)pData->Seek((DE_HANDLE)lib->hLib, lib->dwBlockFilesIndex + 4 * ulIndex, DE_FILE_BEGIN);
        (void)pData->Read((DE_HANDLE)lib->hLib, (char*)chTemp, 4);
        dwFir = GetULongFromBuf((BYTE*)chTemp);

        ulLength = dwSec - dwFir;
    }
    else
    {
        (void)pData->Seek((DE_HANDLE)lib->hLib, lib->dwBlockFilesIndex + 4 * ulIndex, DE_FILE_BEGIN);
        (void)pData->Read((DE_HANDLE)lib->hLib, (char*)chTemp, 4);
        
        ulLength = lib->dwLibSize - GetULongFromBuf((BYTE*)chTemp);
    }

    if(ulLength < MAX_BLOCK_FILE_SIZE)
    {
        (void)pData->Seek((DE_HANDLE)lib->hLib, pBlockFile, DE_FILE_BEGIN);
        (void)pData->Read((DE_HANDLE)lib->hLib, lpGlobal->CompressedBuf, ulLength);

        (void)zLib_uncompress((BYTE*)lpGlobal->UnCompressedBuf, (uLongf *)&ulOutput,
                        (const BYTE*)lpGlobal->CompressedBuf, ulLength, &lpGlobal->ZLibAllocMem);

        file->dwExpandedFileSize = ulOutput;
        file->dwTotalBlocksNum = (DWORD)GetUShortFromBuf((BYTE*)lpGlobal->UnCompressedBuf) / 2;
        
        lpGlobal->dwLastCompressedBufFileIndex = ulIndex;
        lpGlobal->hLastCompressedLib = lib->hLib;
        lpGlobal->dwLastCompressedBufSize = ulOutput;
    }
}

static BYTE* GetEntryExpFromFileBlockEntryIndex(DEData *pData, LibInfor *lib, DWORD ulFile, DWORD ulBlock, DWORD ulEntry, BOOL bEvenByte)
{
    LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
    BYTE* pBlock;
    BYTE* pEntry;
    DWORD i;
    DECHAR uch;
    FileInfor file;

    ExpandFile(pData, lib, &file, ulFile);
    pBlock = (BYTE*)lpGlobal->UnCompressedBuf;
    pEntry = (BYTE*)pBlock + GetUShortFromBuf(pBlock + 2 * ulBlock);
    
    for(i = 0; i < ulEntry; i++)
    {
        pEntry += GetNextEntryInBlock(pEntry);
    }
    
    if(bEvenByte)
    {
        while((uch = (DECHAR)(((DECHAR)pEntry[0] << 8) | (DECHAR)pEntry[1])) >= 0x9000)
        {   
            pEntry += 2;
        }
    }
    else
    {
        while((uch = (DECHAR)*pEntry) != 0x00)
            pEntry++;
    }
    
    (void)uch;
    return pEntry;
}

static BYTE* GetEntryExpBuf(BYTE* pBuf, BOOL bEvenByte)
{
    DECHAR uch;
    BYTE* pEntry = pBuf;
    
    if(bEvenByte)
    {
        while((uch = (DECHAR)(((DECHAR)pEntry[0] << 8) | (DECHAR)pEntry[1])) >= 0x9000)
        {   
            pEntry += 2;
        }
    }
    else
    {
        while((uch = (DECHAR)*pEntry) != 0x00)
            pEntry++;
    }
    
    (void)uch;
    return pEntry;
}

static BYTE* GetEntryFromFileBlockEntryIndex(DEData *pData, LibInfor *lib, DWORD ulFile, DWORD ulBlock, DWORD ulEntry)
{
    LPDEGlobalData lpGlobal = (LPDEGlobalData)pData->pRAM;
    BYTE* pBlock;
    BYTE* pEntry;
    DWORD i;

⌨️ 快捷键说明

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