401 lines
9.5 KiB
C
401 lines
9.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1996-1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
gpdcheck.c
|
||
|
||
Abstract:
|
||
|
||
gpd parser test program
|
||
|
||
Environment:
|
||
|
||
uni driver, gpd parser, Check build only
|
||
|
||
Revision History:
|
||
|
||
|
||
03/27/97 -peterwo-
|
||
Created it.
|
||
|
||
--*/
|
||
|
||
#include "lib.h"
|
||
|
||
|
||
PTSTR pwstrGenerateGPDfilename(
|
||
PTSTR ptstrSrcFilename
|
||
) ;
|
||
|
||
BOOL BcreateGPDbinary(
|
||
PWSTR pwstrFileName, // root GPD file
|
||
DWORD dwVerbosity );
|
||
|
||
|
||
// ---- functions defined in treewalk.c ---- //
|
||
BOOL GetGPDResourceIDs(
|
||
PDWORD pdwResArray,
|
||
DWORD dwArraySize, // number of elements in array.
|
||
PDWORD pdwNeeded,
|
||
BOOL bFontIDs,
|
||
PRAWBINARYDATA prbd) ;
|
||
|
||
|
||
|
||
#ifndef DBG
|
||
|
||
//
|
||
// Variable to control the amount of debug messages generated
|
||
//
|
||
|
||
INT giDebugLevel = DBG_WARNING;
|
||
|
||
PCSTR
|
||
StripDirPrefixA(
|
||
IN PCSTR pstrFilename
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Strip the directory prefix off a filename (ANSI version)
|
||
|
||
Arguments:
|
||
|
||
pstrFilename - Pointer to filename string
|
||
|
||
Return Value:
|
||
|
||
Pointer to the last component of a filename (without directory prefix)
|
||
|
||
--*/
|
||
|
||
{
|
||
PCSTR pstr;
|
||
|
||
if (pstr = strrchr(pstrFilename, PATH_SEPARATOR))
|
||
return pstr + 1;
|
||
|
||
return pstrFilename;
|
||
}
|
||
|
||
|
||
|
||
#endif
|
||
|
||
|
||
HINSTANCE ghInstance;
|
||
PSTR gstrProgName;
|
||
PINFOHEADER gpInfoHdr;
|
||
PUIINFO gpUIInfo;
|
||
DWORD gdwTotalSize, gdwNumFiles, gdwMaxFileSize;
|
||
FILE *stream ;
|
||
|
||
|
||
#define DumpInt(label, n) DbgPrint("%s: %d\n", label, n)
|
||
#define DumpHex(label, n) DbgPrint("%s: 0x%x\n", label, n)
|
||
#define DumpStrW(label, offset) DbgPrint("%s: %ws\n", label, OFFSET_TO_POINTER(gpRawData, offset))
|
||
#define DumpStrA(label, offset) DbgPrint("%s: %s\n", label, OFFSET_TO_POINTER(gpRawData, offset))
|
||
#define DumpFix(label, n) DbgPrint("%s: %f\n", label, (FLOAT) (n) / FIX_24_8_SCALE)
|
||
#define DumpInvo(label, p) DbgPrint("%s: %d bytes\n", label, (p)->dwCount)
|
||
#define DumpSize(label, p) DbgPrint("%s: %d x %d\n", label, (p)->cx, (p)->cy)
|
||
#define DumpRect(label, p) DbgPrint("%s: (%d, %d) - (%d, %d)\n", label, \
|
||
(p)->left, (p)->top, (p)->right, (p)->bottom)
|
||
|
||
|
||
|
||
|
||
|
||
ULONG _cdecl
|
||
DbgPrint(
|
||
PCSTR pstrFormat,
|
||
...
|
||
)
|
||
|
||
{
|
||
va_list ap;
|
||
|
||
va_start(ap, pstrFormat);
|
||
vfprintf(stream, pstrFormat, ap);
|
||
va_end(ap);
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
usage(
|
||
VOID
|
||
)
|
||
|
||
{
|
||
printf("usage: %s [-options] filenames ...\n", gstrProgName);
|
||
printf("where options are:\n");
|
||
printf(" -n delete existing log file, instead of appending to it\n");
|
||
printf(" -k keep the binary GPD data\n");
|
||
printf(" -x perform additional semantics check\n") ;
|
||
printf(" -s suppress all console output\n") ;
|
||
printf(" -v(0-4) set verbosity level -v0 lowest, -v4 highest\n") ;
|
||
printf(" -h display help information\n");
|
||
exit(-1);
|
||
}
|
||
|
||
|
||
INT _cdecl
|
||
main(
|
||
INT argc,
|
||
CHAR **argv
|
||
)
|
||
|
||
{
|
||
BOOL bDeleteLog, bKeepBUD, bFirstFile, bSuppress, bSemantics;
|
||
DWORD dwTime;
|
||
DWORD dwVerbosity = 0;
|
||
|
||
//
|
||
// Go through the command line arguments
|
||
//
|
||
|
||
ghInstance = GetModuleHandle(NULL);
|
||
bSuppress = bDeleteLog = bKeepBUD = bSemantics = FALSE;
|
||
bFirstFile = TRUE ;
|
||
giDebugLevel = DBG_TERSE;
|
||
gdwTotalSize = gdwNumFiles = gdwMaxFileSize = 0 ;
|
||
|
||
gstrProgName = *argv++;
|
||
argc--;
|
||
|
||
if (argc == 0)
|
||
usage();
|
||
|
||
dwTime = GetTickCount();
|
||
|
||
for ( ; argc--; argv++)
|
||
{
|
||
PSTR pArg = *argv;
|
||
|
||
if (*pArg == '-' || *pArg == '/')
|
||
{
|
||
//
|
||
// The argument is an option flag
|
||
//
|
||
|
||
switch (*++pArg) {
|
||
|
||
case 'n':
|
||
case 'N':
|
||
|
||
bDeleteLog = TRUE;
|
||
break;
|
||
|
||
case 'k':
|
||
case 'K':
|
||
|
||
bKeepBUD = TRUE;
|
||
break;
|
||
|
||
case 's':
|
||
case 'S':
|
||
|
||
bSuppress = TRUE;
|
||
break;
|
||
|
||
|
||
case 'x':
|
||
case 'X':
|
||
|
||
bSemantics = TRUE;
|
||
break;
|
||
|
||
|
||
case 'v':
|
||
case 'V':
|
||
|
||
if (*++pArg >= '0' && *pArg <= '4')
|
||
{
|
||
dwVerbosity = *pArg - '0';
|
||
}
|
||
break;
|
||
default:
|
||
|
||
if(!bSuppress)
|
||
usage();
|
||
break;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
WCHAR wstrFilename[MAX_PATH];
|
||
PTSTR ptstrBudFilename;
|
||
|
||
|
||
if(bFirstFile && bDeleteLog)
|
||
{ // truncate
|
||
stream = fopen("gpdparse.log", "w") ;
|
||
}
|
||
else
|
||
stream = fopen("gpdparse.log", "a+") ;
|
||
|
||
if(!stream)
|
||
{
|
||
printf("unable to open gpdparse.log for write access.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
bFirstFile = FALSE ;
|
||
|
||
|
||
//
|
||
// Convert ANSI filename to Unicode filename
|
||
//
|
||
|
||
MultiByteToWideChar(CP_ACP, 0, pArg, -1, wstrFilename, MAX_PATH);
|
||
|
||
fprintf(stream, "\n*** GPD parsing errors for %ws\n", wstrFilename);
|
||
|
||
|
||
if (BcreateGPDbinary(wstrFilename, dwVerbosity))
|
||
{
|
||
|
||
// gdwTotalSize += gpRawData->dwFileSize;
|
||
gdwNumFiles++;
|
||
|
||
// if (gpRawData->dwFileSize > gdwMaxFileSize)
|
||
// gdwMaxFileSize = gpRawData->dwFileSize;
|
||
|
||
// MemFree(gpRawData);
|
||
|
||
if(bSemantics)
|
||
{
|
||
PRAWBINARYDATA pRawData ;
|
||
PINFOHEADER pInfoHdr ;
|
||
|
||
fprintf(stream, "\n\tsnapshot and semantics errors: \n");
|
||
|
||
pRawData = LoadRawBinaryData(wstrFilename) ;
|
||
|
||
#if 0
|
||
// this part to test treewalk.c functions
|
||
{
|
||
BOOL bStatus ;
|
||
PDWORD pdwResArray = NULL;
|
||
DWORD dwArraySize = 0; // number of elements in array.
|
||
DWORD dwNeeded = 0;
|
||
BOOL bFontIDs ;
|
||
|
||
|
||
bStatus = GetGPDResourceIDs(
|
||
pdwResArray,
|
||
dwArraySize, // number of elements in array.
|
||
&dwNeeded,
|
||
bFontIDs = TRUE,
|
||
pRawData) ;
|
||
if(bStatus)
|
||
{
|
||
pdwResArray = (PDWORD) VirtualAlloc(
|
||
NULL, // address of region to reserve or commit
|
||
dwNeeded * sizeof(DWORD), // size of region
|
||
MEM_COMMIT,
|
||
// type of allocation
|
||
PAGE_READWRITE // type of access protection
|
||
);
|
||
|
||
}
|
||
if(pdwResArray)
|
||
{
|
||
dwArraySize = dwNeeded ;
|
||
bStatus = GetGPDResourceIDs(
|
||
pdwResArray,
|
||
dwArraySize, // number of elements in array.
|
||
&dwNeeded,
|
||
bFontIDs = TRUE,
|
||
pRawData) ;
|
||
}
|
||
VirtualFree(
|
||
pdwResArray, // address of region of committed pages
|
||
0, // size of region
|
||
MEM_RELEASE // type of free operation
|
||
);
|
||
pdwResArray = NULL ;
|
||
|
||
bStatus = GetGPDResourceIDs(
|
||
pdwResArray,
|
||
dwArraySize, // number of elements in array.
|
||
&dwNeeded,
|
||
bFontIDs = FALSE,
|
||
pRawData) ;
|
||
if(bStatus)
|
||
{
|
||
pdwResArray = (PDWORD) VirtualAlloc(
|
||
NULL, // address of region to reserve or commit
|
||
dwNeeded * sizeof(DWORD), // size of region
|
||
MEM_COMMIT,
|
||
// type of allocation
|
||
PAGE_READWRITE // type of access protection
|
||
);
|
||
|
||
}
|
||
if(pdwResArray)
|
||
{
|
||
dwArraySize = dwNeeded ;
|
||
bStatus = GetGPDResourceIDs(
|
||
pdwResArray,
|
||
dwArraySize, // number of elements in array.
|
||
&dwNeeded,
|
||
bFontIDs = FALSE,
|
||
pRawData) ;
|
||
}
|
||
VirtualFree(
|
||
pdwResArray, // address of region of committed pages
|
||
0, // size of region
|
||
MEM_RELEASE // type of free operation
|
||
);
|
||
pdwResArray = NULL ;
|
||
|
||
}
|
||
|
||
|
||
// end treewalk test
|
||
#endif
|
||
|
||
|
||
if(pRawData)
|
||
pInfoHdr = InitBinaryData(pRawData, NULL, NULL ) ;
|
||
if(pRawData && pInfoHdr)
|
||
FreeBinaryData(pInfoHdr) ;
|
||
if(pRawData)
|
||
UnloadRawBinaryData(pRawData) ;
|
||
}
|
||
|
||
//
|
||
// If -k option is not given, get rid of the Bud file after we're done
|
||
//
|
||
|
||
if (! bKeepBUD && (ptstrBudFilename = pwstrGenerateGPDfilename(wstrFilename)))
|
||
{
|
||
DeleteFile(ptstrBudFilename);
|
||
MemFree(ptstrBudFilename);
|
||
}
|
||
}
|
||
fclose(stream) ;
|
||
}
|
||
}
|
||
|
||
|
||
if ((gdwNumFiles > 0) && !bSuppress)
|
||
{
|
||
dwTime = GetTickCount() - dwTime;
|
||
|
||
printf("Number of files parsed: %d\n", gdwNumFiles);
|
||
printf("Average parsing time per file (ms): %d\n", dwTime / gdwNumFiles);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|