504 lines
11 KiB
C
504 lines
11 KiB
C
/*++
|
|
|
|
Copyright (c) 1996-1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
parse.c
|
|
|
|
Abstract:
|
|
|
|
Parse a text file.
|
|
|
|
Environment:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
//
|
|
// Macros
|
|
//
|
|
|
|
#define IS_COMMENT(c) ((c) == (BYTE)';')
|
|
#define EOL '\n'
|
|
|
|
//
|
|
// Local function prototypes
|
|
//
|
|
|
|
PBYTE PubSkipComment( PBYTE );
|
|
|
|
extern DWORD gdwOutputFlags;
|
|
|
|
INT
|
|
IGetCart(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
CARTLIST *pCartlist);
|
|
|
|
INT
|
|
IGetFont(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
CARTLIST *pCartList);
|
|
|
|
INT
|
|
IGetTrans(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
CARTLIST *pCartList);
|
|
|
|
//
|
|
// Main function
|
|
//
|
|
|
|
BOOL
|
|
BGetInfo(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
DWORD dwSize,
|
|
FILELIST *pFileList)
|
|
{
|
|
|
|
CARTLIST *pCartList;
|
|
|
|
BYTE aubType[32];
|
|
PBYTE pstrType;
|
|
PBYTE pTextData;
|
|
INT iRet;
|
|
|
|
ASSERT(pData != NULL && pFileList != NULL);
|
|
|
|
if (gdwOutputFlags & OUTPUT_VERBOSE)
|
|
{
|
|
fprintf( stdout, "Start BGetInfo\n");
|
|
}
|
|
|
|
pstrType = aubType;
|
|
pTextData = pData;
|
|
|
|
do
|
|
{
|
|
pTextData = PubSkipComment(pTextData);
|
|
|
|
if (pTextData == NULL)
|
|
{
|
|
iRet = EOF;
|
|
break;
|
|
}
|
|
|
|
iRet = sscanf( pTextData, "%s:", pstrType);
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
pTextData += strlen(pstrType);
|
|
}
|
|
else
|
|
*pstrType = 0;
|
|
|
|
pTextData = PubSkipComment(pTextData);
|
|
|
|
switch(*pstrType)
|
|
{
|
|
case 'c':
|
|
case 'C':
|
|
if(!_stricmp(pstrType+1, "artridgename:"))
|
|
{
|
|
if( !(pCartList = (CARTLIST *)HeapAlloc(
|
|
hHeap,
|
|
0,
|
|
sizeof(CARTLIST))))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
ZeroMemory(pCartList, sizeof(CARTLIST));
|
|
|
|
iRet = IGetCart(hHeap,
|
|
pTextData,
|
|
pCartList);
|
|
|
|
if (pFileList->pCurrentCartList)
|
|
{
|
|
pFileList->pCurrentCartList->pNext = pCartList;
|
|
pFileList->pCurrentCartList = pCartList;
|
|
}
|
|
else
|
|
{
|
|
pFileList->pCartList =
|
|
pFileList->pCurrentCartList = pCartList;
|
|
}
|
|
|
|
pFileList->dwCartridgeNum ++;
|
|
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
while (*pTextData != EOL)
|
|
pTextData ++;
|
|
pTextData ++;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'f':
|
|
case 'F':
|
|
if(!_stricmp(pstrType+1, "ont:"))
|
|
{
|
|
iRet = IGetFont(hHeap,
|
|
pTextData,
|
|
pFileList->pCurrentCartList);
|
|
|
|
if (iRet != EOF)
|
|
{
|
|
while (*pTextData != EOL)
|
|
pTextData ++;
|
|
pTextData ++;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case 't':
|
|
case 'T':
|
|
if(!_stricmp(pstrType+1, "rans:"))
|
|
{
|
|
iRet = IGetTrans(hHeap,
|
|
pTextData,
|
|
pFileList->pCurrentCartList);
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
while (*pTextData != EOL)
|
|
pTextData ++;
|
|
pTextData ++;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
pTextData++;
|
|
}
|
|
}
|
|
while(*pTextData != EOF && dwSize > (DWORD)(pTextData - pData));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
PBYTE
|
|
PubSkipComment(
|
|
PBYTE pData)
|
|
{
|
|
ASSERT(pData != NULL);
|
|
|
|
do
|
|
{
|
|
if (IS_COMMENT(*pData))
|
|
{
|
|
while (*pData != EOL)
|
|
pData++;
|
|
pData++;
|
|
}
|
|
else if (*pData == ' ')
|
|
{
|
|
pData++;
|
|
}
|
|
else if (*pData == 0x0d)
|
|
{
|
|
pData++;
|
|
}
|
|
else if (*pData == EOL)
|
|
{
|
|
pData++;
|
|
}
|
|
else if (*pData == EOF)
|
|
{
|
|
pData = NULL;
|
|
break;
|
|
}
|
|
else
|
|
break;
|
|
|
|
} while (TRUE);
|
|
|
|
return pData;
|
|
}
|
|
|
|
INT
|
|
IGetCart(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
CARTLIST *pCartList)
|
|
{
|
|
PWSTR pwstrCartName;
|
|
PBYTE pDataTmp;
|
|
INT iCount, iStrLen, iRet, iCartID, iI;
|
|
|
|
pwstrCartName = NULL;
|
|
|
|
iRet = sscanf( pData, "%d", &iCartID);
|
|
|
|
while (*pData != '"' && *pData != EOF)
|
|
{
|
|
pData++;
|
|
}
|
|
|
|
if (*pData == '"')
|
|
{
|
|
pData++;
|
|
iCount = 0;
|
|
pDataTmp = pData;
|
|
|
|
iStrLen = 0;
|
|
while(*pDataTmp != '"')
|
|
{
|
|
pDataTmp ++;
|
|
iStrLen ++;
|
|
}
|
|
|
|
if (iStrLen)
|
|
{
|
|
if( !(pwstrCartName = (PWSTR)HeapAlloc( hHeap,
|
|
0,
|
|
(iStrLen + 1) * sizeof(WCHAR))) )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
iRet = MultiByteToWideChar(CP_ACP,
|
|
0,
|
|
pData,
|
|
iStrLen,
|
|
pwstrCartName,
|
|
FILENAME_SIZE);
|
|
|
|
*(pwstrCartName + iRet) = (WCHAR)NULL;
|
|
}
|
|
|
|
}
|
|
|
|
iCount++;
|
|
|
|
for (iI = 1; iI < iCartID && pCartList->pNext; iI ++)
|
|
{
|
|
pCartList = pCartList->pNext;
|
|
}
|
|
|
|
if (pCartList)
|
|
{
|
|
if (pwstrCartName)
|
|
pCartList->pwstrCartName = pwstrCartName;
|
|
else
|
|
pCartList->pwstrCartName = NULL;
|
|
}
|
|
|
|
return iCount;
|
|
}
|
|
|
|
INT
|
|
IGetFont(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
CARTLIST *pCartList)
|
|
{
|
|
DATAFILE *pFontFileTmp, *pFontFile;
|
|
PBYTE pDataTmp, pNameString;
|
|
INT iCount;
|
|
INT iRet;
|
|
INT iFileStrLen, iNameStrLen;
|
|
DWORD dwRCID;
|
|
|
|
iRet = sscanf( pData, "%d", &dwRCID);
|
|
|
|
while (*pData != '"' && *pData != EOF)
|
|
{
|
|
pData++;
|
|
}
|
|
|
|
|
|
if (*pData == '"')
|
|
{
|
|
pData++;
|
|
iNameStrLen = 0;
|
|
pNameString = pData;
|
|
while (*pData!= '"')
|
|
{
|
|
pData++;
|
|
iNameStrLen ++;
|
|
}
|
|
}
|
|
|
|
pData++;
|
|
|
|
while (*pData != '"' && *pData != EOF)
|
|
{
|
|
pData++;
|
|
}
|
|
|
|
if (*pData == '"')
|
|
{
|
|
pData++;
|
|
iFileStrLen = 0;
|
|
pDataTmp = pData;
|
|
|
|
while(*pDataTmp != '"')
|
|
{
|
|
pDataTmp ++;
|
|
iFileStrLen ++;
|
|
}
|
|
|
|
|
|
if( !(pFontFile = (DATAFILE *)HeapAlloc(
|
|
hHeap,
|
|
0,
|
|
sizeof(DATAFILE) +
|
|
(iNameStrLen + 1) * sizeof(WCHAR) +
|
|
(iFileStrLen + 1) * sizeof(WCHAR))))
|
|
{
|
|
fprintf( stderr, "Can't allocate memory\n");
|
|
return 0;
|
|
}
|
|
|
|
ZeroMemory(pFontFile, sizeof(DATAFILE) +
|
|
(iNameStrLen + 1) * sizeof(WCHAR)
|
|
(iFileStrLen + 1) * sizeof(WCHAR));
|
|
|
|
pFontFile->rcID = dwRCID;
|
|
pFontFile->pwstrFileName = (PWSTR)(pFontFile + 1);
|
|
pFontFile->pwstrDataName = pFontFile->pwstrFileName + iFileStrLen + 1;
|
|
|
|
iRet = MultiByteToWideChar(CP_ACP,
|
|
0,
|
|
pNameString,
|
|
iNameStrLen,
|
|
pFontFile->pwstrDataName,
|
|
FILENAME_SIZE);
|
|
|
|
*(pFontFile->pwstrDataName + iRet) = (WCHAR)NULL;
|
|
|
|
iRet = MultiByteToWideChar(CP_ACP,
|
|
0,
|
|
pData,
|
|
iFileStrLen,
|
|
pFontFile->pwstrFileName,
|
|
FILENAME_SIZE);
|
|
|
|
*(pFontFile->pwstrFileName + iRet) = (WCHAR)NULL;
|
|
|
|
if (pFontFileTmp = pCartList->pFontFile)
|
|
{
|
|
while (pFontFileTmp->pNext)
|
|
{
|
|
pFontFileTmp = pFontFileTmp->pNext;
|
|
}
|
|
|
|
pFontFileTmp->pNext = pFontFile;
|
|
|
|
}
|
|
else
|
|
{
|
|
pCartList->pFontFile = pFontFile;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (gdwOutputFlags & OUTPUT_VERBOSE)
|
|
{
|
|
fprintf(stdout, "IGetFont\n");
|
|
fprintf(stdout, "rcID=%d, pwstrFileName=\"%ws\", pwstrDataName=\"%ws\"\n",
|
|
pFontFile->rcID,
|
|
pFontFile->pwstrFileName,
|
|
pFontFile->pwstrDataName);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
INT
|
|
IGetTrans(
|
|
HANDLE hHeap,
|
|
PBYTE pData,
|
|
CARTLIST *pCartList)
|
|
{
|
|
DATAFILE *pTransFileTmp, *pTransFile;
|
|
PBYTE pDataTmp;
|
|
INT iCount;
|
|
INT iRet;
|
|
INT iStrLen;
|
|
DWORD dwRCID;
|
|
|
|
iRet = sscanf( pData, "%d", &dwRCID);
|
|
|
|
|
|
while (*pData != '"' && *pData != EOF)
|
|
{
|
|
pData++;
|
|
}
|
|
|
|
iCount = 0;
|
|
|
|
if (*pData == '"')
|
|
{
|
|
pData++;
|
|
iStrLen = 0;
|
|
pDataTmp = pData;
|
|
|
|
while(*pDataTmp != '"')
|
|
{
|
|
pDataTmp ++;
|
|
iStrLen ++;
|
|
}
|
|
|
|
|
|
if( !(pTransFile = (DATAFILE *)HeapAlloc(
|
|
hHeap,
|
|
0,
|
|
sizeof(DATAFILE) + (iStrLen + 1) * sizeof(WCHAR))))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
ZeroMemory(pTransFile, sizeof(DATAFILE) + iStrLen * sizeof(WCHAR));
|
|
|
|
pTransFile->rcID = dwRCID;
|
|
pTransFile->pwstrFileName = (PWSTR)(pTransFile + 1);
|
|
|
|
iRet = MultiByteToWideChar(CP_ACP,
|
|
0,
|
|
pData,
|
|
iStrLen,
|
|
pTransFile->pwstrFileName,
|
|
FILENAME_SIZE);
|
|
|
|
*(pTransFile->pwstrFileName + iRet) = (WCHAR)NULL;
|
|
|
|
if (pTransFileTmp = pCartList->pTransFile)
|
|
{
|
|
while (pTransFileTmp->pNext)
|
|
{
|
|
pTransFileTmp = pTransFileTmp->pNext;
|
|
}
|
|
|
|
pTransFileTmp->pNext = pTransFile;
|
|
|
|
}
|
|
else
|
|
{
|
|
pCartList->pTransFile = pTransFile;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
iCount++;
|
|
|
|
return iCount;
|
|
}
|
|
|