/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    ppdparse.h

Abstract:

    PostScript driver PPD parser - PARSEROBJ header file

[Notes:]


Revision History:

    4/18/95 -davidx-
        Created it.

    dd-mm-yy -author-
        description

--*/


#ifndef _PPDPARSE_
#define _PPDPARSE_


// Maximum length of various components of a PPD entry

#define MaxKeywordLen   40
#define MaxXlationLen   40
#define DefaultValueLen 1024


// Types of values for a PPD entry

typedef enum {
    NO_VALUE,
    INVOCATION_VALUE,
    QUOTED_VALUE,
    SYMBOL_VALUE,
    STRING_VALUE
} PPDVALUE;


// BUFOBJ object - used to parse a field from a PPD entry.
//  
//  maximum length
//  current length
//  pointer to character buffer where the info is stored

typedef struct _BUFOBJ {
    DWORD   maxlen;
    DWORD   curlen;
    PSTR    pBuffer;
} BUFOBJ, *PBUFOBJ;

// Check if a buffer object is empty.

#define BUFOBJ_IsEmpty(pBufObj) (((pBufObj)->curlen) == 0)

// Return the number of characters in a buffer object.

#define BUFOBJ_Length(pBufObj)  ((pBufObj)->curlen)

// Return the character buffer of a buffer object.

#define BUFOBJ_Buffer(pBufObj)  ((pBufObj)->pBuffer)

// PARSEROBJ object - used to parse a PPD entry.
//
//  main keyword
//  option keyword
//  translation string
//  value
//  value type

typedef struct _PARSEROBJ {

    BUFOBJ      keyword;
    BUFOBJ      option;
    BUFOBJ      xlation;
    BUFOBJ      value;
    PPDVALUE    valueType;

    // These buffers are short and not expandable.
    // So we allocate space for them statically here.

    char        mainKeyword[MaxKeywordLen+1];
    char        optionKeyword[MaxKeywordLen+1];
    char        translation[MaxXlationLen+1];

} PARSEROBJ, *PPARSEROBJ;


// Create a parser object.

PPARSEROBJ
PARSEROBJ_Create(
    VOID
    );

// Delete a parser object.

VOID
PARSEROBJ_Delete(
    PPARSEROBJ  pParserObj
    );

// Parse one entry out of a PPD file.

PPDERROR
PARSEROBJ_ParseEntry(
    PPARSEROBJ  pParserObj,
    PFILEOBJ    pFileObj
    );

// Parse the main keyword.

PPDERROR
PARSEROBJ_ParseKeyword(
    PPARSEROBJ  pParserObj,
    PFILEOBJ    pFileObj,
    PSTR        pCh
    );

// Parse the option keyword.

PPDERROR
PARSEROBJ_ParseOption(
    PPARSEROBJ  pParserObj,
    PFILEOBJ    pFileObj,
    PSTR        pCh
    );

// Parse the translation string.

PPDERROR
PARSEROBJ_ParseXlation(
    PPARSEROBJ  pParserObj,
    PFILEOBJ    pFileObj,
    PSTR        pCh
    );

// Parse the entry value.

PPDERROR
PARSEROBJ_ParseValue(
    PPARSEROBJ  pParserObj,
    PFILEOBJ    pFileObj,
    PSTR        pCh
    );

// Skip to the end of line.

PPDERROR
PARSEROBJ_SkipLine(
    PPARSEROBJ  pParserObj,
    PFILEOBJ    pFileObj
    );

// Initialize a buffer object.

VOID
BUFOBJ_Initialize(
    PBUFOBJ     pBufObj,
    PSTR        pBuffer,
    DWORD       maxlen
    );

// Reset a buffer object to its initial state.

VOID
BUFOBJ_Reset(
    PBUFOBJ     pBufObj
    );

// Add a character to a buffer object.

PPDERROR
BUFOBJ_AddChar(
    PBUFOBJ     pBufObj,
    char        ch
    );

// Collect character string into a buffer object.

PPDERROR
BUFOBJ_GetString(
    PBUFOBJ     pBufObj,
    PFILEOBJ    pFileObj,
    PSTR        pCh,
    BYTE        charMask
    );

// Copy string out of a buffer object and treat its contents
// as a mix of normal characters and hex-decimal digits.

PPDERROR
BUFOBJ_CopyStringHex(
    PBUFOBJ     pBufObj,
    PSTR        pTo
    );

// Strip off trailing spaces from a buffer object.

VOID
BUFOBJ_StripTrailingSpaces(
    PBUFOBJ     pBufObj
    );

#if DBG

// Dump the contents of of a parsed PPD entry

VOID
PARSEROBJ_Dump(
    PPARSEROBJ  pParserObj
    );

#endif // DBG


#endif // !_PPDPARSE_