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

📄 aphearsayrdfile.c

📁 本电子词典是名人928的学习机代码,主要是电子学习机AP,其他还没有传
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************/
/*                                                                          */
/*              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 + -