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.
 
 
 
 
 
 

726 lines
19 KiB

/*++
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
ppdparse.h
Abstract:
Declarations for PPD parser
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.
--*/
#ifndef _PPDPARSE_H_
#define _PPDPARSE_H_
//
// PPD parser memory management functions
//
// NOTE: newly allocated memory is always zero initialized
// The parser allocates its working memory from the heap and
// everything is freed at the end when the heap is destroyed.
//
#define ALLOC_PARSER_MEM(pParserData, size) \
((PVOID) HeapAlloc((pParserData)->hHeap, HEAP_ZERO_MEMORY, (size)))
//
// Character constants
//
#define KEYWORD_CHAR '*'
#define COMMENT_CHAR '%'
#define SYMBOL_CHAR '^'
#define SEPARATOR_CHAR ':'
#define XLATION_CHAR '/'
#define QUERY_CHAR '?'
#define QUOTE_CHAR '"'
#define TAB '\t'
#define SPACE ' '
#define CR '\r'
#define LF '\n'
#define IS_SPACE(c) ((c) == SPACE || (c) == TAB)
#define IS_NEWLINE(c) ((c) == CR || (c) == LF)
//
// Masks to indicate which characters can appear in what fields
//
#define KEYWORD_MASK 0x01
#define XLATION_MASK 0x02
#define QUOTED_MASK 0x04
#define STRING_MASK 0x08
#define DIGIT_MASK 0x10
#define HEX_DIGIT_MASK 0x20
extern const BYTE gubCharMasks[256];
#define IS_VALID_CHAR(ch) (gubCharMasks[(BYTE) (ch)] != 0)
#define IS_MASKED_CHAR(ch, mask) (gubCharMasks[(BYTE) (ch)] & (mask))
#define IS_DIGIT(ch) (gubCharMasks[(BYTE) (ch)] & DIGIT_MASK)
#define IS_HEX_DIGIT(ch) (gubCharMasks[(BYTE) (ch)] & (DIGIT_MASK|HEX_DIGIT_MASK))
#define IS_KEYWORD_CHAR(ch) ((ch) == KEYWORD_CHAR)
//
// Tags to identify various data types
//
#define VALUETYPE_NONE 0x01
#define VALUETYPE_STRING 0x02
#define VALUETYPE_QUOTED 0x04
#define VALUETYPE_SYMBOL 0x08
#define VALUETYPE_MASK 0xff
//
// Error code constants
//
#define PPDERR_NONE 0
#define PPDERR_MEMORY (-1)
#define PPDERR_FILE (-2)
#define PPDERR_SYNTAX (-3)
#define PPDERR_EOF (-4)
typedef INT PPDERROR;
//
// Special length value to indicate that an invocation string is defined by a symbol.
// Normal invocation strings must be shorter than this length.
//
#define SYMBOL_INVOCATION_LENGTH 0x80000000
#define MARK_SYMBOL_INVOC(pInvoc) ((pInvoc)->dwLength |= SYMBOL_INVOCATION_LENGTH)
#define CLEAR_SYMBOL_INVOC(pInvoc) ((pInvoc)->dwLength &= ~SYMBOL_INVOCATION_LENGTH)
#define IS_SYMBOL_INVOC(pInvoc) ((pInvoc)->dwLength & SYMBOL_INVOCATION_LENGTH)
typedef struct _INVOCOBJ {
DWORD dwLength; // length of invocation string
PVOID pvData; // points to invocation string data
} INVOCOBJ, *PINVOCOBJ;
//
// Data structure for representing a data buffer
//
typedef struct _BUFOBJ {
DWORD dwMaxLen;
DWORD dwSize;
PBYTE pbuf;
} BUFOBJ, *PBUFOBJ;
//
// Always reserve one byte in a buffer so that we can append a zero byte at the end.
//
#define IS_BUFFER_FULL(pbo) ((pbo)->dwSize + 1 >= (pbo)->dwMaxLen)
#define IS_BUFFER_EMPTY(pbo) ((pbo)->dwSize == 0)
#define CLEAR_BUFFER(pbo) { (pbo)->dwSize = 0; (pbo)->pbuf[0] = 0; }
#define ADD_CHAR_TO_BUFFER(pbo, c) (pbo)->pbuf[(pbo)->dwSize++] = (BYTE)(c)
#define SET_BUFFER(pbo, buf) \
{ (pbo)->pbuf = (PBYTE) (buf); (pbo)->dwMaxLen = sizeof(buf); (pbo)->dwSize = 0; }
//
// Maximum length for keyword, option, and translation strings.
// NOTE: we are being very lenient here because these limits are arbitrary and
// there is nothing that prevents us from handling longer lengths.
//
#define MAX_KEYWORD_LEN 64
#define MAX_OPTION_LEN 64
#define MAX_XLATION_LEN 256
//
// Constants to indicate whether an input slot requires PageRegion invocation
//
#define REQRGN_UNKNOWN 0
#define REQRGN_TRUE 1
#define REQRGN_FALSE 2
//
// Data structure for representing a mapped file object
//
typedef struct _FILEOBJ {
HFILEMAP hFileMap;
PBYTE pubStart;
PBYTE pubEnd;
PBYTE pubNext;
DWORD dwFileSize;
PTSTR ptstrFileName;
INT iLineNumber;
BOOL bNewLine;
} FILEOBJ, *PFILEOBJ;
#define END_OF_FILE(pFile) ((pFile)->pubNext >= (pFile)->pubEnd)
#define END_OF_LINE(pFile) ((pFile)->bNewLine)
//
// Data structure for representing a singly-linked list
//
typedef struct _LISTOBJ {
PVOID pNext; // pointer to next node
PSTR pstrName; // item name
} LISTOBJ, *PLISTOBJ;
//
// Data structure for representing symbol information
//
typedef struct _SYMBOLOBJ {
PVOID pNext; // pointer to the next symbol
PSTR pstrName; // symbol name
INVOCOBJ Invocation; // symbol data
} SYMBOLOBJ, *PSYMBOLOBJ;
//
// Data structure for representing job patch file information
//
typedef struct _PATCHFILEOBJ {
PVOID pNext; // pointer to the next patch
PSTR pstrName; // string of the patch number
LONG lPatchNo; // number of the patch as set in the PPD file
INVOCOBJ Invocation; // symbol data
} JOBPATCHFILEOBJ, *PJOBPATCHFILEOBJ;
//
// Data structure for representing a default font substitution entry
//
typedef struct _TTFONTSUB {
PVOID pNext; // pointer to the next entry
PSTR pstrName; // TT font family name
INVOCOBJ Translation; // TT font family name translation
INVOCOBJ PSName; // PS font family name
} TTFONTSUB, *PTTFONTSUB;
//
// Data structure for representing printer feature option information
//
// Need to change translation string field to make it ready for Unicode encoding.
//
typedef struct _OPTIONOBJ {
PVOID pNext; // pointer to the next option
PSTR pstrName; // option name
INVOCOBJ Translation; // translation string
INVOCOBJ Invocation; // invocation string
DWORD dwConstraint; // list of UIConstraints associated with this option
} OPTIONOBJ, *POPTIONOBJ;
//
// Data structure for representing paper size information
//
typedef struct _PAPEROBJ {
OPTIONOBJ Option; // generic option information
SIZE szDimension; // paper dimension
RECT rcImageArea; // imageable area
} PAPEROBJ, *PPAPEROBJ;
//
// Default paper size when the information in the PPD file is invalid
//
#define DEFAULT_PAPER_WIDTH 215900 // 8.5 inch measured in microns
#define DEFAULT_PAPER_LENGTH 279400 // 11 inch measured in microns
//
// paper size values for Letter and A4
//
#define LETTER_PAPER_WIDTH 215900 // 8.5 inch measured in microns
#define LETTER_PAPER_LENGTH 279400 // 11 inch measured in microns
#define A4_PAPER_WIDTH 210058 // 8.27 inch measured in microns
#define A4_PAPER_LENGTH 296926 // 11.69 inch measured in microns
//
// Data structure for representing input slot information
//
typedef struct _TRAYOBJ {
OPTIONOBJ Option; // generic option information
DWORD dwReqPageRgn; // whether PageRegion invocation is required
DWORD dwTrayIndex; // index used for DEVMODE.dmDefaultSource field
} TRAYOBJ, *PTRAYOBJ;
//
// Data structure for representing output bin information
//
typedef struct _BINOBJ {
OPTIONOBJ Option; // generic option information
BOOL bReversePrint; // first page comes out at bottom?
} BINOBJ, *PBINOBJ;
//
// Data structure for representing memory configuration information
//
typedef struct _MEMOBJ {
OPTIONOBJ Option; // generic option information
DWORD dwFreeVM; // amount of free VM
DWORD dwFontMem; // size of font cache memory
} MEMOBJ, *PMEMOBJ;
//
// Data structure for representing memory configuration information
//
typedef struct _RESOBJ {
OPTIONOBJ Option; // generic option information
FIX_24_8 fxScreenAngle; // suggested screen angle
FIX_24_8 fxScreenFreq; // suggested screen frequency
} RESOBJ, *PRESOBJ;
//
// Data structure for representing printer feature information
//
typedef struct _FEATUREOBJ {
PVOID pNext; // pointer to next printer feature
PSTR pstrName; // feature name
INVOCOBJ Translation; // translation string
PSTR pstrDefault; // default option name
DWORD dwFeatureID; // predefined feature identifier
BOOL bInstallable; // whether the feature is an installble option
DWORD dwUIType; // type of feature option list
INVOCOBJ QueryInvoc; // query invocation string
DWORD dwConstraint; // list of UIConstraints associated with this feature
DWORD dwOptionSize; // size of each option item
POPTIONOBJ pOptions; // pointer to list of options
} FEATUREOBJ, *PFEATUREOBJ;
//
// Data structure for representing device font information
//
// NOTE: The first three fields of this structure must match the
// first three fields of OPTIONOBJ structure.
//
typedef struct {
PVOID pNext; // pointer to next device font
PSTR pstrName; // font name
INVOCOBJ Translation; // translation string
PSTR pstrEncoding; // font encoding information
PSTR pstrCharset; // charsets supported
PSTR pstrVersion; // version string
DWORD dwStatus; // status
} FONTREC, *PFONTREC;
//
// Data structure for maintain information used by the parser
//
typedef struct _PARSERDATA {
PVOID pvStartSig; // signature used for debugging
HANDLE hHeap; // memory heap used by the parser
PFILEOBJ pFile; // pointer to current file object
PDWORD pdwKeywordHashs; // precomputed hash values for built-in keywords
PBYTE pubKeywordCounts; // count the occurrence of built-in keywords
BOOL bErrorFlag; // semantic error flag
INT iIncludeLevel; // current include level
PFEATUREOBJ pOpenFeature; // pointer to the open feature
BOOL bJclFeature; // whether we're inside JCLOpenUI/JCLCloseUI
BOOL bInstallableGroup; // whether we're inside InstallableOptions group
PLISTOBJ pPpdFileNames; // list of source PPD filenames
INVOCOBJ NickName; // printer model name
DWORD dwChecksum32; // 32-bit CRC checksum of ASCII text PPD file
DWORD dwPpdFilever; // PPD file version
DWORD dwSpecVersion; // PPD spec version number
DWORD dwPSVersion; // PostScript interpreter version number
INVOCOBJ PSVersion; // PSVersion string
INVOCOBJ Product; // Product string
PFEATUREOBJ pFeatures; // List of printer features
PLISTOBJ pUIConstraints; // List of UIConstraints
PLISTOBJ pOrderDep; // List of OrderDependency
PLISTOBJ pQueryOrderDep; // List of QueryOrderPendency
PFONTREC pFonts; // List of device fonts
PJOBPATCHFILEOBJ pJobPatchFiles; // List of JobPatchFile invocation strings
PSYMBOLOBJ pSymbols; // List of symbol definitions
PTTFONTSUB pTTFontSubs; // List of TT font substitution entries
INVOCOBJ Password; // password invocation string
INVOCOBJ ExitServer; // exitserver invocation string
INVOCOBJ PatchFile; // PatchFile invocation string
INVOCOBJ JclBegin; // PJL job start invocation string
INVOCOBJ JclEnterPS; // PJL enter PS invocation string
INVOCOBJ JclEnd; // PJL job end invocation string
INVOCOBJ ManualFeedFalse; // ManualFeed False invocation string
DWORD dwLangEncoding; // language encoding
UINT uCodePage; // code page corresponding to language encoding
DWORD dwLangLevel; // PostScript language level
DWORD dwFreeMem; // default amount of free VM
DWORD dwThroughput; // throughput
DWORD dwJobTimeout; // suggested job timeout value
DWORD dwWaitTimeout; // suggested wait timeout value
DWORD dwColorDevice; // whether the device supports color
DWORD dwProtocols; // protocols supported by the device
DWORD dwTTRasterizer; // TrueType rasterizer option
DWORD dwLSOrientation; // default landscape orientation
FIX_24_8 fxScreenFreq; // default halftone screen frequency
FIX_24_8 fxScreenAngle; // default halftone screen angle
BOOL bDefReversePrint; // DefaultOutputOrder
BOOL bDefOutputOrderSet; // TRUE if bDefReversePrint is set through PPD
DWORD dwExtensions; // language extensions
DWORD dwSetResType; // how to set resolution
DWORD dwReqPageRgn; // RequiresPageRegion All: information
DWORD dwPpdFlags; // misc. PPD flags
PSTR pstrDefaultFont; // DefaultFont: information
DWORD dwCustomSizeFlags; // custom page size flags and parameters
CUSTOMSIZEPARAM CustomSizeParams[CUSTOMPARAM_MAX];
BOOL bEuroInformationSet;// the Euro keyword was found in the PPD
BOOL bHasEuro; // printer device fonts have the Euro
BOOL bTrueGray; // TrueGray shall be detected by default
//
// Use for mapping NT4 feature indices to NT5 feature indices
//
WORD wNt4Checksum;
INT iManualFeedIndex;
INT iDefInstallMemIndex;
INT iReqPageRgnIndex;
BYTE aubOpenUIFeature[MAX_GID];
//
// Buffers used to hold the content of various fields in the current entry
//
BUFOBJ Keyword;
BUFOBJ Option;
BUFOBJ Xlation;
BUFOBJ Value;
DWORD dwValueType;
CHAR achKeyword[MAX_KEYWORD_LEN];
CHAR achOption[MAX_OPTION_LEN];
CHAR achXlation[MAX_XLATION_LEN];
PSTR pstrValue;
//
// These are used for compacting parsed PPD information into
// binary printer description data.
//
PBYTE pubBufStart;
DWORD dwPageSize;
DWORD dwCommitSize;
DWORD dwBufSize;
PINFOHEADER pInfoHdr;
PUIINFO pUIInfo;
PPPDDATA pPpdData;
PVOID pvEndSig; // signature used for debugging
} PARSERDATA, *PPARSERDATA;
//
// Simple integrity check on the parser data structure
//
#define VALIDATE_PARSER_DATA(pParserData) \
ASSERT((pParserData) != NULL && \
(pParserData)->pvStartSig == pParserData && \
(pParserData)->pvEndSig == pParserData)
//
// Parse a PPD file
//
PPDERROR
IParseFile(
PPARSERDATA pParserData,
PTSTR ptstrFilename
);
//
// Grow a buffer object when it becomes full
//
PPDERROR
IGrowValueBuffer(
PBUFOBJ pBufObj
);
//
// Parse one entry from a PPD file
//
PPDERROR
IParseEntry(
PPARSERDATA pParserData
);
//
// Interpret an entry parsed from a PPD file
//
PPDERROR
IInterpretEntry(
PPARSERDATA pParserData
);
//
// Build up data structures to speed up keyword lookup
//
BOOL
BInitKeywordLookup(
PPARSERDATA pParserData
);
//
// Find a named item from a linked-list
//
PVOID
PvFindListItem(
PVOID pvList,
PCSTR pstrName,
PDWORD pdwIndex
);
//
// Convert embedded hexdecimal strings into binary data
//
BOOL
BConvertHexString(
PBUFOBJ pBufObj
);
//
// Search for a keyword from a string table
//
typedef struct _STRTABLE {
PCSTR pstrKeyword; // keyword name
DWORD dwValue; // corresponding value
} STRTABLE;
typedef const STRTABLE *PCSTRTABLE;
BOOL
BSearchStrTable(
PCSTRTABLE pTable,
PSTR pstrKeyword,
DWORD *pdwValue
);
//
// Parse an unsigned floating-point number from a character string
//
BOOL
BGetFloatFromString(
PSTR *ppstr,
PLONG plValue,
INT iType
);
#define FLTYPE_ERROR (-1)
#define FLTYPE_POINT 0
#define FLTYPE_INT 1
#define FLTYPE_FIX 2
#define FLTYPE_POINT_ROUNDUP 3
#define FLTYPE_POINT_ROUNDDOWN 4
//
// Parse an unsigned decimal integer value from a character string
//
BOOL
BGetIntegerFromString(
PSTR *ppstr,
LONG *plValue
);
//
// Strip off the keyword prefix character from the input string
//
PCSTR
PstrStripKeywordChar(
PCSTR pstrKeyword
);
//
// Find the next word in a character string (Words are separated by spaces)
//
BOOL
BFindNextWord(
PSTR *ppstr,
PSTR pstrWord
);
#define MAX_WORD_LEN MAX_KEYWORD_LEN
//
// Create an input file object
//
PFILEOBJ
PCreateFileObj(
PTSTR ptstrFilename
);
//
// Delete an input file object
//
VOID
VDeleteFileObj(
PFILEOBJ pFile
);
//
// Read the next character from the input file
// Special character to indicate end-of-file condition
//
INT
IGetNextChar(
PFILEOBJ pFile
);
#define EOF_CHAR (-1)
//
// Return the last character read to the input file
//
VOID
VUngetChar(
PFILEOBJ pFile
);
//
// Skip all characters until the next non-space character
//
VOID
VSkipSpace(
PFILEOBJ pFile
);
//
// Skip the remaining characters on the current input line
//
VOID
VSkipLine(
PFILEOBJ pFile
);
//
// Check if a character string only consists of printable 7-bit ASCII characters
//
BOOL
BIs7BitAscii(
PSTR pstr
);
//
// Display a syntax error message
//
PPDERROR
ISyntaxErrorMessage(
PFILEOBJ pFile,
PSTR pstrMsg
);
#if DBG
#define ISyntaxError(pFile, errmsg) ISyntaxErrorMessage(pFile, errmsg)
#else
#define ISyntaxError(pFile, errmsg) ISyntaxErrorMessage(pFile, NULL)
#endif
//
// Keyword string for various predefined features
//
extern const CHAR gstrDefault[];
extern const CHAR gstrPageSizeKwd[];
extern const CHAR gstrInputSlotKwd[];
extern const CHAR gstrManualFeedKwd[];
extern const CHAR gstrCustomSizeKwd[];
extern const CHAR gstrLetterSizeKwd[];
extern const CHAR gstrA4SizeKwd[];
extern const CHAR gstrLongKwd[];
extern const CHAR gstrShortKwd[];
extern const CHAR gstrTrueKwd[];
extern const CHAR gstrFalseKwd[];
extern const CHAR gstrOnKwd[];
extern const CHAR gstrOffKwd[];
extern const CHAR gstrNoneKwd[];
extern const CHAR gstrVMOptionKwd[];
extern const CHAR gstrInstallMemKwd[];
extern const CHAR gstrDuplexTumble[];
extern const CHAR gstrDuplexNoTumble[];
#endif // !_PPDPARSE_H_