Leaked source code of windows server 2003
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

/*++
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;
}