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