windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/h/scanner.hxx

135 lines
3.6 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Copyright (C) 1992-1998, Microsoft Corporation.
//
// File: SCANNER.HXX
//
// Contents: Query scanner
//
// Classes: CQueryScanner
//
// History: 29-Apr-92 AmyA Created.
// 23-Jun-92 MikeHew Added weight tokens.
// 15-Jun-94 t-jeffc Added regex support & error info
//
//----------------------------------------------------------------------------
#pragma once
#include <ci64.hxx>
enum Token {
EQUAL_TOKEN = 0, // the order of these operators is important -
NOT_EQUAL_TOKEN, // they are used to index an array
GREATER_TOKEN,
GREATER_EQUAL_TOKEN,
LESS_TOKEN,
LESS_EQUAL_TOKEN,
ALLOF_TOKEN,
SOMEOF_TOKEN,
AND_TOKEN, // order doesn't matter from here on...
OR_TOKEN,
PROX_TOKEN,
NOT_TOKEN,
FUZZY_TOKEN,
FUZ2_TOKEN,
PROP_TOKEN,
PROP_REGEX_TOKEN,
PROP_NATLANG_TOKEN,
OPEN_TOKEN,
CLOSE_TOKEN,
W_OPEN_TOKEN,
W_CLOSE_TOKEN,
COMMA_TOKEN,
EOS_TOKEN,
TEXT_TOKEN,
QUOTES_TOKEN,
C_OPEN_TOKEN,
C_CLOSE_TOKEN,
PLUS_TOKEN,
CONTAINS_TOKEN,
ISEMPTY_TOKEN,
ISTYPEEQUAL_TOKEN
};
// chars that cannot appear in a phrase
#define PHRASE_STR L"{}!&|~*@#$()[],=<>\n\"^"
// chars that cannot appear in a command or path
#define CMND_STR L"{}!&|~*@#()[],=<> \t\n\""
// chars that cannot appear outside of the <> braces in a regex
#define REGEX_STR L"&|~()[], \n"
// chars that cannot appear in an unquoted column name
#define COLUMN_STR L"{}!&|~*@#()[],=<>+%$^{}:;'./?\\` \t\n\""
//+---------------------------------------------------------------------------
//
// Class: CQueryScanner
//
// Purpose: Scans the input from the property list file, the startup
// file and the console.
//
// History: 29-Apr-92 AmyA Created.
//
//----------------------------------------------------------------------------
class CQueryScanner
{
public:
CQueryScanner( WCHAR const * buffer,
BOOL fLookForTextualKeywords,
LCID lcid = GetUserDefaultLCID(),
BOOL fTreatPlusAsToken = FALSE );
Token LookAhead() { return _token; }
void Accept();
void AcceptWord();
void AcceptColumn();
void AcceptQuote() { Win4Assert( L'"' == *_text ); _text++; }
void AcceptCommand();
BOOL IsEmpty() { return ( _token == EOS_TOKEN ); }
WCHAR* AcqPath();
WCHAR* AcqWord();
WCHAR* AcqColumn();
WCHAR* AcqPhrase();
WCHAR* AcqLine( BOOL fParseQuotes = TRUE );
WCHAR* AcqRegEx();
WCHAR* AcqPhraseInQuotes();
BOOL GetNumber( ULONG & number, BOOL & fAtEndOfString );
BOOL GetNumber( LONG & number, BOOL & fAtEndOfString );
BOOL GetNumber( unsigned _int64 & number, BOOL & fAtEndOfString );
BOOL GetNumber( _int64 & number, BOOL & fAtEndOfString );
BOOL GetNumber( double & number );
WCHAR GetCommandChar();
void ResetBuffer( WCHAR const * buffer );
ULONG CurrentOffset()
{
return CiPtrToUlong( _text - _pBuf );
}
private:
WCHAR * AllocReturnString( int cch );
void EatWhiteSpace();
WCHAR * FindStringToken( WCHAR * pwcIn, Token & token, unsigned & cwc );
BOOL IsEndOfTextToken();
WCHAR const * _pBuf;
WCHAR const * _pLookAhead;
WCHAR const * _text;
Token _token;
BOOL _fLookForTextualKeywords;
BOOL _fTreatPlusAsToken;
LCID _lcid;
};