You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
9.5 KiB
400 lines
9.5 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
|