135 lines
3.6 KiB
C++
135 lines
3.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
};
|
|
|