309 lines
4.3 KiB
C++
309 lines
4.3 KiB
C++
|
|
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
parse.hxx
|
|
|
|
Abstract:
|
|
|
|
Simple parser class for extrapolating HTTP headers information
|
|
|
|
Author:
|
|
John Ludeman (JohnL) 18-Jan-1995
|
|
|
|
Project:
|
|
HTTP server
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
# ifndef _PARSE_HXX_
|
|
# define _PARSE_HXX_
|
|
|
|
//
|
|
// Simple class for parsing all those lovely "Field: value\r\n"
|
|
// protocols Token and copy functions stop at the terminating
|
|
// '\n' and '\r' is considered white space. All methods except
|
|
// NextLine() stop at the end of the line.
|
|
//
|
|
|
|
class ODBC_PARSER
|
|
{
|
|
public:
|
|
|
|
ODBC_PARSER(
|
|
CHAR * pszStart
|
|
);
|
|
|
|
//
|
|
// Be careful about destruction. The Parser will attempt to
|
|
// restore any modifications to the string it is parsing
|
|
//
|
|
|
|
~ODBC_PARSER( VOID );
|
|
|
|
//
|
|
// Returns the current position in the buffer w/o any terminators
|
|
//
|
|
|
|
CHAR *
|
|
QueryPos(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Returns the current zero terminated token. If list mode is on,
|
|
// then ',' is considered a delimiter.
|
|
//
|
|
|
|
CHAR *
|
|
QueryToken(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Returns the current zero terminated line
|
|
//
|
|
|
|
CHAR *
|
|
QueryLine(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Skips to the first token after the next '\n'
|
|
//
|
|
|
|
CHAR *
|
|
NextLine(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Returns the next non-white string after the current string with a
|
|
// zero terminator. The end of the token is '\n' or white space
|
|
//
|
|
|
|
CHAR *
|
|
NextToken(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Returns the next non-white string after the current string with a
|
|
// zero terminator. The end of the token is '\n', white space or ch.
|
|
//
|
|
|
|
CHAR *
|
|
NextToken(
|
|
CHAR ch
|
|
);
|
|
|
|
//
|
|
// Move position cch characters into the current token. Automatically
|
|
// moves to next non-white space character
|
|
//
|
|
|
|
VOID
|
|
operator+=(
|
|
int cch
|
|
)
|
|
{
|
|
if ( cch )
|
|
{
|
|
while ( cch-- && *m_pszPos )
|
|
{
|
|
m_pszPos++;
|
|
}
|
|
}
|
|
|
|
EatWhite();
|
|
}
|
|
|
|
//
|
|
// Look for the character ch, stops at '\r' or '\n'
|
|
//
|
|
|
|
CHAR *
|
|
SkipTo(
|
|
CHAR ch
|
|
);
|
|
|
|
//
|
|
// If list mode is on, then commas and semi-colons are considered
|
|
// delimiters, otherwise only white space is considered
|
|
//
|
|
|
|
VOID
|
|
SetListMode(
|
|
BOOL fListMode
|
|
);
|
|
|
|
//
|
|
// Sets the current pointer to passed position
|
|
//
|
|
|
|
VOID
|
|
SetPtr(
|
|
CHAR * pch
|
|
);
|
|
|
|
//
|
|
// Returns the next semi-colon delimited parameter in the character
|
|
// stream as a zero terminated, white space trimmed string
|
|
//
|
|
|
|
CHAR *
|
|
NextParam(
|
|
VOID
|
|
)
|
|
{
|
|
return NextToken( ';' );
|
|
}
|
|
|
|
//
|
|
// Returns the next comma delmited item in the character stream as
|
|
// a zero terminated, white space trimmed string
|
|
//
|
|
|
|
CHAR *
|
|
NextItem(
|
|
VOID
|
|
)
|
|
{
|
|
return NextToken( ',' );
|
|
}
|
|
|
|
//
|
|
// Copies from the current position to the first white space character
|
|
// (or \r or \n). If fAdvance is TRUE, the position is automatically
|
|
// moved to the next token.
|
|
//
|
|
|
|
HRESULT
|
|
CopyToken(
|
|
STRA * pstr,
|
|
BOOL fAdvanceToken = FALSE
|
|
);
|
|
|
|
//
|
|
// Copies from the current parse position to the first of a \r or \n
|
|
// and trims any white space
|
|
//
|
|
|
|
HRESULT
|
|
CopyToEOL(
|
|
STRA * pstr,
|
|
BOOL fAdvanceLine = FALSE
|
|
);
|
|
|
|
//
|
|
// Same as CopyToEOL except the data is appended to pstr
|
|
//
|
|
|
|
HRESULT
|
|
AppendToEOL(
|
|
STRA * pstr,
|
|
BOOL fAdvanceLine = FALSE
|
|
);
|
|
|
|
//
|
|
// Moves the current parse position to the first white or non-white
|
|
// character after the current position
|
|
//
|
|
|
|
CHAR *
|
|
EatWhite(
|
|
VOID
|
|
)
|
|
{
|
|
return m_pszPos = AuxEatWhite();
|
|
}
|
|
|
|
CHAR *
|
|
EatNonWhite(
|
|
VOID
|
|
)
|
|
{
|
|
return m_pszPos = AuxEatNonWhite();
|
|
}
|
|
|
|
//
|
|
// Undoes any temporary terminators in the string
|
|
//
|
|
|
|
VOID
|
|
RestoreBuffer(
|
|
VOID
|
|
)
|
|
{
|
|
RestoreToken();
|
|
RestoreLine();
|
|
}
|
|
|
|
protected:
|
|
|
|
CHAR *
|
|
AuxEatWhite(
|
|
VOID
|
|
);
|
|
|
|
CHAR *
|
|
AuxEatNonWhite(
|
|
CHAR ch = '\0'
|
|
);
|
|
|
|
CHAR *
|
|
AuxSkipTo(
|
|
CHAR ch
|
|
);
|
|
|
|
VOID
|
|
TerminateToken(
|
|
CHAR ch = '\0'
|
|
);
|
|
|
|
VOID
|
|
RestoreToken(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateLine(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RestoreLine(
|
|
VOID
|
|
);
|
|
|
|
private:
|
|
|
|
//
|
|
// Current position in parse buffer
|
|
//
|
|
|
|
CHAR * m_pszPos;
|
|
|
|
//
|
|
// If we have to temporarily zero terminate a token or line these
|
|
// members contain the information
|
|
//
|
|
|
|
CHAR * m_pszTokenTerm;
|
|
CHAR m_chTokenTerm;
|
|
|
|
CHAR * m_pszLineTerm;
|
|
CHAR m_chLineTerm;
|
|
|
|
BOOL m_fListMode;
|
|
|
|
};
|
|
|
|
# endif // _PARSE_HXX_
|