207 lines
4.6 KiB
C++
207 lines
4.6 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 INET_PARSER
|
||
{
|
||
public:
|
||
|
||
dllexp INET_PARSER( CHAR * pszStart );
|
||
|
||
//
|
||
// Be careful about destruction. The Parser will attempt to restore any
|
||
// modifications to the string it is parsing
|
||
//
|
||
|
||
dllexp ~INET_PARSER( VOID );
|
||
|
||
//
|
||
// Returns the current position in the buffer w/o any terminators
|
||
//
|
||
|
||
dllexp CHAR * QueryPos( VOID );
|
||
|
||
//
|
||
// Returns the current zero terminated token. If list mode is on, then
|
||
// ',' is considered a delimiter.
|
||
//
|
||
|
||
dllexp CHAR * QueryToken( VOID );
|
||
|
||
//
|
||
// Returns the current zero terminated line
|
||
//
|
||
|
||
dllexp CHAR * QueryLine( VOID );
|
||
|
||
//
|
||
// Skips to the first token after the next '\n'
|
||
//
|
||
|
||
dllexp 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
|
||
//
|
||
|
||
dllexp 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.
|
||
//
|
||
|
||
dllexp CHAR * NextToken( CHAR ch );
|
||
|
||
//
|
||
// Move position cch characters into the current token. Automatically
|
||
// moves to next non-white space character
|
||
//
|
||
|
||
dllexp VOID operator+=( int cch )
|
||
{ if ( cch ) while ( cch-- && *m_pszPos ) m_pszPos++;
|
||
EatWhite();
|
||
}
|
||
|
||
//
|
||
// Look for the character ch, stops at '\r' or '\n'
|
||
//
|
||
|
||
dllexp CHAR * SkipTo( CHAR ch );
|
||
|
||
//
|
||
// If list mode is on, then commas and semi-colons are considered
|
||
// delimiters, otherwise only white space is considered
|
||
//
|
||
|
||
dllexp VOID SetListMode( BOOL fListMode );
|
||
|
||
//
|
||
// Sets the current pointer to passed position
|
||
//
|
||
|
||
dllexp VOID SetPtr( CHAR * pch );
|
||
|
||
//
|
||
// Returns the next semi-colon delimited parameter in the character
|
||
// stream as a zero terminated, white space trimmed string
|
||
//
|
||
|
||
dllexp CHAR * NextParam( VOID )
|
||
{ return NextToken( ';' ); }
|
||
|
||
//
|
||
// Returns the next comma delmited item in the character stream as
|
||
// a zero terminated, white space trimmed string
|
||
//
|
||
|
||
dllexp 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.
|
||
//
|
||
|
||
dllexp BOOL CopyToken( STR * pstr,
|
||
BOOL fAdvanceToken = FALSE );
|
||
|
||
//
|
||
// Copies from the current parse position to the first of a \r or \n and
|
||
// trims any white space
|
||
//
|
||
|
||
dllexp BOOL CopyToEOL( STR * pstr,
|
||
BOOL fAdvanceLine = FALSE );
|
||
|
||
//
|
||
// Same as CopyToEOL except the data is appended to pstr
|
||
//
|
||
|
||
dllexp BOOL AppendToEOL( STR * pstr,
|
||
BOOL fAdvanceLine = FALSE );
|
||
|
||
//
|
||
// Moves the current parse position to the first white or non-white
|
||
// character after the current position
|
||
//
|
||
|
||
dllexp CHAR * EatWhite( VOID )
|
||
{ return m_pszPos = AuxEatWhite(); }
|
||
|
||
dllexp CHAR * EatNonWhite( VOID )
|
||
{ return m_pszPos = AuxEatNonWhite(); }
|
||
|
||
//
|
||
// Undoes any temporary terminators in the string
|
||
//
|
||
|
||
dllexp VOID RestoreBuffer( VOID )
|
||
{ RestoreToken(); RestoreLine(); }
|
||
|
||
protected:
|
||
|
||
dllexp CHAR * AuxEatWhite( VOID );
|
||
dllexp CHAR * AuxEatNonWhite( CHAR ch = '\0' );
|
||
dllexp CHAR * AuxSkipTo( CHAR ch );
|
||
|
||
dllexp VOID TerminateToken( CHAR ch = '\0' );
|
||
dllexp VOID RestoreToken( VOID );
|
||
|
||
dllexp VOID TerminateLine( VOID );
|
||
dllexp 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_
|
||
|