📄 de_api.c
字号:
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 + -