|
|
/*++
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
ppdchar.c
Abstract:
Functions for parsing the lexical elements of a PPD file
Environment:
PostScript driver, PPD parser
Revision History:
08/20/96 -davidx- Common coding style for NT 5.0 drivers.
03/26/96 -davidx- Created it.
--*/
#include "lib.h"
#include "ppd.h"
#include "ppdparse.h"
PFILEOBJ PCreateFileObj( PTSTR ptstrFilename )
/*++
Routine Description:
Create an input file object
Arguments:
ptstrFilename - Specifies the input file name
Return Value:
Pointer to the newly-created file object NULL if there is an error
--*/
{ PFILEOBJ pFile;
if (! (pFile = MemAllocZ(sizeof(FILEOBJ))) || ! (pFile->ptstrFileName = DuplicateString(ptstrFilename))) { ERR(("Memory allocation failed\n")); MemFree(pFile); return NULL; }
pFile->hFileMap = MapFileIntoMemory(ptstrFilename, (PVOID *) &pFile->pubStart, &pFile->dwFileSize);
if (pFile->hFileMap == NULL) { ERR(("Couldn't open file: %ws\n", ptstrFilename)); MemFree(pFile); pFile = NULL; } else { pFile->pubNext = pFile->pubStart; pFile->pubEnd = pFile->pubStart + pFile->dwFileSize; pFile->iLineNumber = 1; pFile->bNewLine = TRUE; }
return pFile; }
VOID VDeleteFileObj( PFILEOBJ pFile )
/*++
Routine Description:
Delete an input file object
Arguments:
pFile - Specifies the file object to be deleted
Return Value:
NONE
--*/
{ ASSERT(pFile && pFile->hFileMap);
UnmapFileFromMemory(pFile->hFileMap); MemFree(pFile->ptstrFileName); MemFree(pFile); }
INT IGetNextChar( PFILEOBJ pFile )
/*++
Routine Description:
Read the next character from the input file
Arguments:
pFile - Specifies the input file
Return Value:
Next character from the input file EOF_CHAR if end-of-file is encountered
--*/
{ INT iBadChars = 0;
//
// Skip non-printable control characters
//
while (!END_OF_FILE(pFile) && !IS_VALID_CHAR(*pFile->pubNext)) iBadChars++, pFile->pubNext++;
if (iBadChars) { TERSE(("%ws: Non-printable characters on line %d\n", pFile->ptstrFileName, pFile->iLineNumber)); }
if (END_OF_FILE(pFile)) return EOF_CHAR;
//
// A newline is a carriage-return, a line-feed, or CR-LF combination
//
if (*pFile->pubNext == LF || *pFile->pubNext == CR && (END_OF_FILE(pFile) || pFile->pubNext[1] != LF)) { pFile->bNewLine = TRUE; pFile->iLineNumber++;
} else { pFile->bNewLine = FALSE; }
return *(pFile->pubNext++); // return current character and advance pointer to next char
}
VOID VUngetChar( PFILEOBJ pFile )
/*++
Routine Description:
Return the last character read to the input file
Arguments:
pFile - Specifies the input file
Return Value:
NONE
--*/
{ ASSERT(pFile->pubNext > pFile->pubStart); pFile->pubNext--; if (pFile->bNewLine) { ASSERT(pFile->iLineNumber > 1); pFile->iLineNumber--; pFile->bNewLine = FALSE; } }
VOID VSkipSpace( PFILEOBJ pFile )
/*++
Routine Description:
Skip all characters until the next non-space character
Arguments:
pFile - Specifies the input file
Return Value:
NONE
--*/
{ while (!END_OF_FILE(pFile) && IS_SPACE(*pFile->pubNext)) pFile->pubNext++; }
VOID VSkipLine( PFILEOBJ pFile )
/*++
Routine Description:
Skip the remaining characters on the current input line
Arguments:
pFile - Specifies the input file
Return Value:
NONE
--*/
{ while (!END_OF_LINE(pFile) && IGetNextChar(pFile) != EOF_CHAR) NULL; }
BOOL BIs7BitAscii( PSTR pstr )
/*++
Routine Description:
Check if a character string consists only of printable 7-bit ASCII characters
Arguments:
pstr - Specifies the character string to be checked
Return Value:
TRUE if the specified string consists only of printable 7-bit ASCII characters FALSE otherwise
--*/
{ PBYTE pub = (PBYTE) pstr;
while (*pub && gubCharMasks[*pub] && *pub < 127) pub++;
return (*pub == 0); }
//
// Table to indicate which characters are allowed in what fields
//
#define DEFAULT_MASK (KEYWORD_MASK|XLATION_MASK|QUOTED_MASK|STRING_MASK)
#define BINARY_MASK (QUOTED_MASK|XLATION_MASK)
const BYTE gubCharMasks[256] = {
/* 00 : */ 0, /* 01 : */ 0, /* 02 : */ 0, /* 03 : */ 0, /* 04 : */ 0, /* 05 : */ 0, /* 06 : */ 0, /* 07 : */ 0, /* 08 : */ 0, /* 09 : */ DEFAULT_MASK ^ KEYWORD_MASK, /* 0A : */ QUOTED_MASK, /* 0B : */ 0, /* 0C : */ 0, /* 0D : */ QUOTED_MASK, /* 0E : */ 0, /* 0F : */ 0, /* 10 : */ 0, /* 11 : */ 0, /* 12 : */ 0, /* 13 : */ 0, /* 14 : */ 0, /* 15 : */ 0, /* 16 : */ 0, /* 17 : */ 0, /* 18 : */ 0, /* 19 : */ 0, /* 1A : */ 0, /* 1B : */ 0, /* 1C : */ 0, /* 1D : */ 0, /* 1E : */ 0, /* 1F : */ 0, /* 20 : */ DEFAULT_MASK ^ KEYWORD_MASK, /* 21 : ! */ DEFAULT_MASK, /* 22 : " */ DEFAULT_MASK ^ QUOTED_MASK, /* 23 : # */ DEFAULT_MASK, /* 24 : $ */ DEFAULT_MASK, /* 25 : % */ DEFAULT_MASK, /* 26 : & */ DEFAULT_MASK, /* 27 : ' */ DEFAULT_MASK, /* 28 : ( */ DEFAULT_MASK, /* 29 : ) */ DEFAULT_MASK, /* 2A : * */ DEFAULT_MASK, /* 2B : + */ DEFAULT_MASK, /* 2C : , */ DEFAULT_MASK, /* 2D : - */ DEFAULT_MASK, /* 2E : . */ DEFAULT_MASK, /* 2F : / */ DEFAULT_MASK ^ (KEYWORD_MASK|STRING_MASK), /* 30 : 0 */ DEFAULT_MASK | DIGIT_MASK, /* 31 : 1 */ DEFAULT_MASK | DIGIT_MASK, /* 32 : 2 */ DEFAULT_MASK | DIGIT_MASK, /* 33 : 3 */ DEFAULT_MASK | DIGIT_MASK, /* 34 : 4 */ DEFAULT_MASK | DIGIT_MASK, /* 35 : 5 */ DEFAULT_MASK | DIGIT_MASK, /* 36 : 6 */ DEFAULT_MASK | DIGIT_MASK, /* 37 : 7 */ DEFAULT_MASK | DIGIT_MASK, /* 38 : 8 */ DEFAULT_MASK | DIGIT_MASK, /* 39 : 9 */ DEFAULT_MASK | DIGIT_MASK, /* 3A : : */ DEFAULT_MASK ^ (KEYWORD_MASK|XLATION_MASK), /* 3B : ; */ DEFAULT_MASK, /* 3C : < */ DEFAULT_MASK, /* 3D : = */ DEFAULT_MASK, /* 3E : > */ DEFAULT_MASK, /* 3F : ? */ DEFAULT_MASK, /* 40 : @ */ DEFAULT_MASK, /* 41 : A */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 42 : B */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 43 : C */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 44 : D */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 45 : E */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 46 : F */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 47 : G */ DEFAULT_MASK, /* 48 : H */ DEFAULT_MASK, /* 49 : I */ DEFAULT_MASK, /* 4A : J */ DEFAULT_MASK, /* 4B : K */ DEFAULT_MASK, /* 4C : L */ DEFAULT_MASK, /* 4D : M */ DEFAULT_MASK, /* 4E : N */ DEFAULT_MASK, /* 4F : O */ DEFAULT_MASK, /* 50 : P */ DEFAULT_MASK, /* 51 : Q */ DEFAULT_MASK, /* 52 : R */ DEFAULT_MASK, /* 53 : S */ DEFAULT_MASK, /* 54 : T */ DEFAULT_MASK, /* 55 : U */ DEFAULT_MASK, /* 56 : V */ DEFAULT_MASK, /* 57 : W */ DEFAULT_MASK, /* 58 : X */ DEFAULT_MASK, /* 59 : Y */ DEFAULT_MASK, /* 5A : Z */ DEFAULT_MASK, /* 5B : [ */ DEFAULT_MASK, /* 5C : \ */ DEFAULT_MASK, /* 5D : ] */ DEFAULT_MASK, /* 5E : ^ */ DEFAULT_MASK, /* 5F : _ */ DEFAULT_MASK, /* 60 : ` */ DEFAULT_MASK, /* 61 : a */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 62 : b */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 63 : c */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 64 : d */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 65 : e */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 66 : f */ DEFAULT_MASK | HEX_DIGIT_MASK, /* 67 : g */ DEFAULT_MASK, /* 68 : h */ DEFAULT_MASK, /* 69 : i */ DEFAULT_MASK, /* 6A : j */ DEFAULT_MASK, /* 6B : k */ DEFAULT_MASK, /* 6C : l */ DEFAULT_MASK, /* 6D : m */ DEFAULT_MASK, /* 6E : n */ DEFAULT_MASK, /* 6F : o */ DEFAULT_MASK, /* 70 : p */ DEFAULT_MASK, /* 71 : q */ DEFAULT_MASK, /* 72 : r */ DEFAULT_MASK, /* 73 : s */ DEFAULT_MASK, /* 74 : t */ DEFAULT_MASK, /* 75 : u */ DEFAULT_MASK, /* 76 : v */ DEFAULT_MASK, /* 77 : w */ DEFAULT_MASK, /* 78 : x */ DEFAULT_MASK, /* 79 : y */ DEFAULT_MASK, /* 7A : z */ DEFAULT_MASK, /* 7B : { */ DEFAULT_MASK, /* 7C : | */ DEFAULT_MASK, /* 7D : } */ DEFAULT_MASK, /* 7E : ~ */ DEFAULT_MASK, /* 7F : */ BINARY_MASK, /* 80 : */ BINARY_MASK, /* 81 : */ BINARY_MASK, /* 82 : */ BINARY_MASK, /* 83 : */ BINARY_MASK, /* 84 : */ BINARY_MASK, /* 85 : */ BINARY_MASK, /* 86 : */ BINARY_MASK, /* 87 : */ BINARY_MASK, /* 88 : */ BINARY_MASK, /* 89 : */ BINARY_MASK, /* 8A : */ BINARY_MASK, /* 8B : */ BINARY_MASK, /* 8C : */ BINARY_MASK, /* 8D : */ BINARY_MASK, /* 8E : */ BINARY_MASK, /* 8F : */ BINARY_MASK, /* 90 : */ BINARY_MASK, /* 91 : */ BINARY_MASK, /* 92 : */ BINARY_MASK, /* 93 : */ BINARY_MASK, /* 94 : */ BINARY_MASK, /* 95 : */ BINARY_MASK, /* 96 : */ BINARY_MASK, /* 97 : */ BINARY_MASK, /* 98 : */ BINARY_MASK, /* 99 : */ BINARY_MASK, /* 9A : */ BINARY_MASK, /* 9B : */ BINARY_MASK, /* 9C : */ BINARY_MASK, /* 9D : */ BINARY_MASK, /* 9E : */ BINARY_MASK, /* 9F : */ BINARY_MASK, /* A0 : */ BINARY_MASK, /* A1 : */ BINARY_MASK, /* A2 : */ BINARY_MASK, /* A3 : */ BINARY_MASK, /* A4 : */ BINARY_MASK, /* A5 : */ BINARY_MASK, /* A6 : */ BINARY_MASK, /* A7 : */ BINARY_MASK, /* A8 : */ BINARY_MASK, /* A9 : */ BINARY_MASK, /* AA : */ BINARY_MASK, /* AB : */ BINARY_MASK, /* AC : */ BINARY_MASK, /* AD : */ BINARY_MASK, /* AE : */ BINARY_MASK, /* AF : */ BINARY_MASK, /* B0 : */ BINARY_MASK, /* B1 : */ BINARY_MASK, /* B2 : */ BINARY_MASK, /* B3 : */ BINARY_MASK, /* B4 : */ BINARY_MASK, /* B5 : */ BINARY_MASK, /* B6 : */ BINARY_MASK, /* B7 : */ BINARY_MASK, /* B8 : */ BINARY_MASK, /* B9 : */ BINARY_MASK, /* BA : */ BINARY_MASK, /* BB : */ BINARY_MASK, /* BC : */ BINARY_MASK, /* BD : */ BINARY_MASK, /* BE : */ BINARY_MASK, /* BF : */ BINARY_MASK, /* C0 : */ BINARY_MASK, /* C1 : */ BINARY_MASK, /* C2 : */ BINARY_MASK, /* C3 : */ BINARY_MASK, /* C4 : */ BINARY_MASK, /* C5 : */ BINARY_MASK, /* C6 : */ BINARY_MASK, /* C7 : */ BINARY_MASK, /* C8 : */ BINARY_MASK, /* C9 : */ BINARY_MASK, /* CA : */ BINARY_MASK, /* CB : */ BINARY_MASK, /* CC : */ BINARY_MASK, /* CD : */ BINARY_MASK, /* CE : */ BINARY_MASK, /* CF : */ BINARY_MASK, /* D0 : */ BINARY_MASK, /* D1 : */ BINARY_MASK, /* D2 : */ BINARY_MASK, /* D3 : */ BINARY_MASK, /* D4 : */ BINARY_MASK, /* D5 : */ BINARY_MASK, /* D6 : */ BINARY_MASK, /* D7 : */ BINARY_MASK, /* D8 : */ BINARY_MASK, /* D9 : */ BINARY_MASK, /* DA : */ BINARY_MASK, /* DB : */ BINARY_MASK, /* DC : */ BINARY_MASK, /* DD : */ BINARY_MASK, /* DE : */ BINARY_MASK, /* DF : */ BINARY_MASK, /* E0 : */ BINARY_MASK, /* E1 : */ BINARY_MASK, /* E2 : */ BINARY_MASK, /* E3 : */ BINARY_MASK, /* E4 : */ BINARY_MASK, /* E5 : */ BINARY_MASK, /* E6 : */ BINARY_MASK, /* E7 : */ BINARY_MASK, /* E8 : */ BINARY_MASK, /* E9 : */ BINARY_MASK, /* EA : */ BINARY_MASK, /* EB : */ BINARY_MASK, /* EC : */ BINARY_MASK, /* ED : */ BINARY_MASK, /* EE : */ BINARY_MASK, /* EF : */ BINARY_MASK, /* F0 : */ BINARY_MASK, /* F1 : */ BINARY_MASK, /* F2 : */ BINARY_MASK, /* F3 : */ BINARY_MASK, /* F4 : */ BINARY_MASK, /* F5 : */ BINARY_MASK, /* F6 : */ BINARY_MASK, /* F7 : */ BINARY_MASK, /* F8 : */ BINARY_MASK, /* F9 : */ BINARY_MASK, /* FA : */ BINARY_MASK, /* FB : */ BINARY_MASK, /* FC : */ BINARY_MASK, /* FD : */ BINARY_MASK, /* FE : */ BINARY_MASK, /* FF : */ BINARY_MASK, };
|