📄 aphearsayrdfile.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: ApHearSayRdFile.c */
/* MODULE NAME: AP应用程序 */
/* DESCRIPTION: Hearsya Browser Read File */
/* */
/* FUNCTIONS: */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* DennyHan 2006-03-11 V1.00B */
/****************************************************************************/
// 包含必要的头文件
#include "Ap.h"
#include "ApHearSay.h"
extern RrParam g_RrParam;
#define RR_MST_SEPRATOR ' ' //0xE
// 缺省的复读路径
#define REREAD_DEFAULT_NAME ".MST"
#define REREAD_MTL_FILE ".MTL"
#define REREAD_TXT_FILE ".TXT"
//mtl格式用到的关键字解压
#define DICT_WORD_LEN 3
#define DICT_MAX_LEN 0x8000
//-------------------------
#define AU_MAX_FILELEN (15*1024) // Max File Length
#define AU_2_BLK_FILELEN (8*1024) // Max File Length
#define AU_MAX_FILELEN_ADD (0*1024) // Max File Length
//===============================
//句子之间分隔符号改为空格
static BOOL MstFileFilter(char *pBuf, UINT St, UINT End, BOOL Flag)
{
UINT j;
for (j = St; j < End; j ++)
{
if (pBuf[j] == 0)
{
pBuf[j] = RR_MST_SEPRATOR;
Flag = TRUE;
}
else
{
if ((Flag == TRUE) && (j))
{
pBuf[j-1] = 0x0D;
}
Flag = FALSE;
}
}
return Flag;
}
/****************************************************************************/
/* FUNCTION: BOOL __RrReadMstFile() */
/* DESCRIPTION: */
/* INPUTS: NULL */
/* OUTPUTS: NONE */
/* RETURN: TURE OR FAULSE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Poul 2005-04-19 创建 */
/* DennyHan 2006-03-13 V1.00B */
/****************************************************************************/
BOOL __RrReadMstFile(VOID)
{
SYNCDATAITEM syncData;
MSTFILE_HEADER mstFileHeader;
//判断复读文件格式
if (FileRead(g_RrParam.hRrMstFile, (char *)&mstFileHeader,sizeof(MSTFILE_HEADER))
!= sizeof(MSTFILE_HEADER) )
{
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
if (mstFileHeader.dwSignature != 0x54534D
|| mstFileHeader.wHeaderSize != sizeof(MSTFILE_HEADER)
|| mstFileHeader.wReserved1 != 0
|| mstFileHeader.wReserved2 != 0)
{
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
// 没有分段
if (mstFileHeader.wNodes == 0)
{
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
//申请读取复读文件Buf
g_RrParam.dwDispLength = FileLength(g_RrParam.hRrMstFile);
if(g_RrParam.dwDispLength > (AU_MAX_FILELEN + AU_MAX_FILELEN_ADD))
{
MsgBoxRun(MSGBOX_NONE,(UINT8*)"文本文件太长,打开失败!");
return FALSE;
}
g_RrParam.pDispBuf = MemAlloc(g_RrParam.dwDispLength + 1);
if (g_RrParam.pDispBuf == NULL)
{
MsgBoxRun(MSGBOX_NONE,(UINT8*)"内存不足,打开文件失败!");
return FALSE;
}
memset(g_RrParam.pDispBuf, 0, g_RrParam.dwDispLength + 1);
// 读取第一段节点
if (FileRead(g_RrParam.hRrMstFile, (char *)&syncData,sizeof(SYNCDATAITEM))
!= sizeof(SYNCDATAITEM))
{
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
g_RrParam.dwDispHead = syncData.dwDataOffset;
//读取复读文件
FileSeek(g_RrParam.hRrMstFile, 0, FILESEEK_BEGIN);
if (FileRead(g_RrParam.hRrMstFile,(char*) g_RrParam.pDispBuf, g_RrParam.dwDispLength)
!= (INT)g_RrParam.dwDispLength)
{
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
//句子之间分隔符号改为空格
{
MstFileFilter(g_RrParam.pDispBuf, g_RrParam.dwDispHead,
g_RrParam.dwDispLength - 1,FALSE);
#if 0
BOOL bPre;
bPre = FALSE;
for (i = g_RrParam.dwDispHead; i < g_RrParam.dwDispLength - 1; i ++)
{
if (g_RrParam.pDispBuf[i] == 0)
{
g_RrParam.pDispBuf[i] = RR_MST_SEPRATOR;
bPre = TRUE;
}
else
{
if ((bPre == TRUE) && (i))
{
g_RrParam.pDispBuf[i-1] = 0x0D;
}
bPre = FALSE;
}
}
#endif
}
g_RrParam.pTextBuf=g_RrParam.pDispBuf+g_RrParam.dwDispHead;
g_RrParam.pMstFileHdr = (MSTFILE_HEADER*) g_RrParam.pDispBuf;
return TRUE;
}
//===============================
static BOOL CopyMstToTmpFile(INT fdDst, INT fdSrc)
{
#define TEMP_BUF_LEN (4*1024)
char * pBuf;
INT i,Len;
MSTFILE_HEADER *pmstFileHeader;
BOOL Filter;
//temp Buf
pBuf = MemAlloc(TEMP_BUF_LEN+1);
if (!pBuf)
{
MsgBoxRun(MSGBOX_NONE,(UINT8*)"内存不足,打开文件失败!");
return FALSE;
}
FileSeek(fdSrc, 0, FILESEEK_BEGIN);
if (FileRead(fdSrc, (char *)pBuf, sizeof(MSTFILE_HEADER) + sizeof(SYNCDATAITEM) )
!= (sizeof(MSTFILE_HEADER) +sizeof(SYNCDATAITEM)) )
{
MemFree(pBuf);
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
pmstFileHeader = (MSTFILE_HEADER *)pBuf;
if (pmstFileHeader->dwSignature != 0x54534D
|| (pmstFileHeader->wHeaderSize != sizeof(MSTFILE_HEADER))
|| (pmstFileHeader->wReserved1 != 0)
|| (pmstFileHeader->wReserved2 != 0)
|| (pmstFileHeader->wNodes == 0) )
{
MemFree(pBuf);
MsgBoxRun (MSGBOX_NONE, (UINT8*)"无法打开MST同步文件,可能是文件格式错误或者文件已损坏!");
return FALSE;
}
// Start Copy
i = ((SYNCDATAITEM *)(pBuf+sizeof(MSTFILE_HEADER)))->dwDataOffset;
FileSeek(fdSrc, i, FILESEEK_BEGIN); // to Text Data
Len = FileLength(fdSrc);
Filter = FALSE;
while(i < Len)
{
int j;
// Read;
j = FileRead(fdSrc,pBuf,TEMP_BUF_LEN );
if (j<=0)
{
break;
}
pBuf[j] = '\0';
//句子之间分隔符号改为空格
Filter = MstFileFilter(pBuf, 0, j-1, Filter);
// Write to Temp File
if (j != FileWrite(fdDst,pBuf,j))
{
MemFree(pBuf);
return FALSE;
}
i+=j;
}
pBuf[0] =0;
pBuf[1] =0;
pBuf[2] =0;
FileWrite(fdDst,pBuf,3);
MemFree(pBuf);
return TRUE;
}
/*************************************************************************
Function : UnzipData
Description: unzip dictionary data
Input:
UINT32 dwKeyOffset -
UINT8* pUnZipDataBuf -
UINT8* pZipDataBuf -
UINT32 dwZipLength -
Return:
UINT32 - unzip data size
DATE AUTHOR VERSION REMARKS
==========================================================================
2004-05-25 HuangXM 1.0 create
**************************************************************************/
INT _CommInvert3ByteToInt(UINT8 *pNumStr)
{
INT Temp;
Temp = 0;
memcpy(&Temp, pNumStr, 3);
return Temp;
}
UINT32 _Error(VOID)
{
return 0;
}
static BOOL _SaveTempFile(INT f, UINT8 *pBuf, UINT uLen)
{
if ( (INT)uLen != FileWrite(f,pBuf,uLen) )
{ // Error
_Error();
return FALSE;
}
return TRUE;
}
//--------------------------------------------
// 2006.4.14. Dennyhan Change to temp file,
// INT fSrc: Mtl File Handle
// INT fDst: Mtl Temp Output file Handle
//----------------------------------
UINT32 UnzipData(UINT32 dwKeyOffset, UINT8* pUnZipDataBuf,
UINT8* pZipDataBuf, UINT32 dwLength,
INT fSrc, INT fDst )
{
UINT32 dwStatusBits, dwDictDataLen;//, i;
UINT32 dwZipOffset, dwKeyDataStart, dwKeyDataEnd;
UINT32 dwKey;
UINT8 byStatus;//, byFlag;
UINT8 *pKeyTable, *pKeyBuf;
BOOL bNeedSpace;
UINT32 dwKeyNum;
UINT32 j,k,dwTotalLen;
FileSeek(fSrc, 8, FILESEEK_BEGIN); // 8 is Mst file head size
//关键字个数
// dwKeyNum = *(UINT32 *)dwKeyOffset;
dwKeyNum = READ_DWORD(dwKeyOffset);
////关键字索引 地址
pKeyTable = (UINT8 *)(dwKeyOffset + sizeof(UINT32));
//关键字内容 地址
pKeyBuf = (UINT8 *) (dwKeyOffset + sizeof(UINT32) + (dwKeyNum + 1) * DICT_WORD_LEN);
dwStatusBits = 0;
bNeedSpace = FALSE;
dwZipOffset = 0;
dwTotalLen = 0;
dwDictDataLen = 0;
// i=0; //Debug
while(1)
{
INT nCurLen;
nCurLen = FileRead(fSrc,&pZipDataBuf[dwZipOffset], dwLength - dwZipOffset);
// here should be check the dwZpOffset
// but by now it is ignored, because of the last one is zipped flag, skip the next following
//i += nCurLen;
if (nCurLen <= 0)
{
break;
}
else
{
nCurLen += dwZipOffset;
dwZipOffset = 0;
}
while( dwZipOffset < (UINT32)nCurLen)
{
if (dwStatusBits == 0)
{
byStatus = pZipDataBuf[dwZipOffset];
dwStatusBits = 8;
dwZipOffset ++;
}
if(byStatus & 0x80) //判断是否被压缩
{ //被压缩数据
if ( dwZipOffset >= (UINT32)(nCurLen-1) )
{
if (dwZipOffset >= (UINT32)(nCurLen))
{// last one is flag
dwZipOffset = 0;
break;
}
pZipDataBuf[0] = pZipDataBuf[dwZipOffset];
dwZipOffset = 1;
break;
}
dwKey = 0;
//得到压缩索引号
dwKey = (((UINT32)pZipDataBuf[dwZipOffset]) << 8) | pZipDataBuf[dwZipOffset + 1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -