337 lines
10 KiB
C++
337 lines
10 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2000.
|
||
|
//
|
||
|
// File: YYBase.cxx
|
||
|
//
|
||
|
// Contents: Custom base class for YYPARSER
|
||
|
//
|
||
|
// History: 18-Apr-2000 KitmanH Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "yybase.hxx"
|
||
|
#include "parser.h"
|
||
|
#include "flexcpp.h"
|
||
|
#include "parsepl.h"
|
||
|
|
||
|
void StripQuotes(WCHAR *wcsPhrase);
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::CTripYYBase, public
|
||
|
//
|
||
|
// Synopsis: Constructor
|
||
|
//
|
||
|
// Arguments: [ColumnMapper] -- Column Mapper
|
||
|
// [locale] -- locale
|
||
|
// [yylex] -- Lexer
|
||
|
//
|
||
|
// History: 18-Apr-2000 KitmanH Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
CTripYYBase::CTripYYBase( IColumnMapper & ColumnMapper,
|
||
|
LCID & locale,
|
||
|
YYLEXER & yylex )
|
||
|
: _yylex( yylex ),
|
||
|
_ColumnMapper(ColumnMapper),
|
||
|
_lcid(locale)
|
||
|
{
|
||
|
InitState();
|
||
|
fDeferredPop = FALSE;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::~CTripYYBase, public
|
||
|
//
|
||
|
// Synopsis: Destructor
|
||
|
//
|
||
|
// History: 18-Apr-2000 KitmanH Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
CTripYYBase::~CTripYYBase()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::yyprimebuffer, public
|
||
|
//
|
||
|
// Synopsis: Prime lexer with text (passthrough to lexer)
|
||
|
//
|
||
|
// Arguments: [pszBuffer] -- Buffer
|
||
|
//
|
||
|
// History: 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CTripYYBase::yyprimebuffer(const YY_CHAR *pszBuffer)
|
||
|
{
|
||
|
_yylex.yyprimebuffer(pszBuffer);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::triperror, protected
|
||
|
//
|
||
|
// Synopsis: Report parsing errors
|
||
|
//
|
||
|
// Arguments: [szError] -- Error string
|
||
|
//
|
||
|
// History: 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CTripYYBase::triperror( char const * szError )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::InitState, public
|
||
|
//
|
||
|
// Synopsis: Initialize property and generate method
|
||
|
//
|
||
|
// History: 01-Oct-1997 emilyb created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CTripYYBase::InitState(void)
|
||
|
{
|
||
|
// Push makes a copy of what is passed in.
|
||
|
PushProperty(L"contents");
|
||
|
_currentState.iGenerateMethod = GENERATE_METHOD_EXACT;
|
||
|
// We don't use xwszPropName field of _currentState. Instead,
|
||
|
// we use the prop name stack to get the appropriate propname.
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::GetCurrentProperty, public
|
||
|
//
|
||
|
// Synopsis: Return info on current prop
|
||
|
//
|
||
|
// Arguments: [pp_ps] -- filled with CDbColId * for current prop
|
||
|
// [dbType] -- set to DBTYPE for current prop
|
||
|
//
|
||
|
// History: 01-Oct-1997 emilyb created
|
||
|
// 10-Apr-1999 KrishnaN Modified to use stack
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
void CTripYYBase::GetCurrentProperty(CDbColId ** pp_ps, DBTYPE *dbType)
|
||
|
{
|
||
|
// Get the top most property off of the stack and use it
|
||
|
|
||
|
if ( S_OK != _ColumnMapper.GetPropInfoFromName(
|
||
|
_propNameStack.Get(_propNameStack.Count() - 1),
|
||
|
(DBID **) pp_ps,
|
||
|
dbType,
|
||
|
0 ) )
|
||
|
THROW( CParserException( QPARSE_E_NO_SUCH_PROPERTY ) );
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::PushProperty, public
|
||
|
//
|
||
|
// Synopsis: Pushes current property onto stack.
|
||
|
//
|
||
|
// Arguments: [pwszProperty] - property
|
||
|
//
|
||
|
// History: 01-Apr-1998 KrishnaN created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
void CTripYYBase::PushProperty( WCHAR const * wszProperty)
|
||
|
{
|
||
|
// Make a copy and save it. The copy will be automatically deleted
|
||
|
// when the stack self destructs.
|
||
|
|
||
|
int iLen = wcslen(wszProperty) + 1;
|
||
|
XPtrST<WCHAR> xwszPropertyCopy(new WCHAR[iLen]);
|
||
|
RtlCopyMemory(xwszPropertyCopy.GetPointer(), wszProperty, sizeof(WCHAR) * iLen);
|
||
|
_propNameStack.Push(xwszPropertyCopy.GetPointer());
|
||
|
xwszPropertyCopy.Acquire();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::PopProperty, public
|
||
|
//
|
||
|
// Synopsis: Pops the current property off the stack
|
||
|
//
|
||
|
// History: 10-Apr-1998 KrishnaN created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
void CTripYYBase::PopProperty(void)
|
||
|
{
|
||
|
// pop the property name off of the stack and delete it
|
||
|
|
||
|
delete _propNameStack.Pop();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::SetCurrentGenerate, public
|
||
|
//
|
||
|
// Synopsis: Sets current generate method
|
||
|
//
|
||
|
// Arguments: [iGenerateMethod] - generate method
|
||
|
//
|
||
|
// History: 01-Oct-1997 emilyb created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
void CTripYYBase::SetCurrentGenerate(int iGenerateMethod)
|
||
|
{
|
||
|
_currentState.iGenerateMethod = iGenerateMethod;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::GetCurrentGenerate, public
|
||
|
//
|
||
|
// Synopsis: Return info on current generate method
|
||
|
//
|
||
|
// Arguments: [iGenerateMethod] -- set to current generate method
|
||
|
//
|
||
|
// History: 01-Oct-1997 emilyb created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
void CTripYYBase::GetCurrentGenerate(int *iGenerateMethod)
|
||
|
{
|
||
|
*iGenerateMethod = _currentState.iGenerateMethod;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::SaveState, public
|
||
|
//
|
||
|
// Synopsis: Saves current state on state stack, and inits new state
|
||
|
//
|
||
|
// History: 01-Oct-1997 emilyb created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
void CTripYYBase::SaveState(void)
|
||
|
{
|
||
|
XPtr <STATE> xState( new STATE );
|
||
|
|
||
|
xState.GetPointer()->iGenerateMethod = _currentState.iGenerateMethod;
|
||
|
|
||
|
// When you save the state, pop the propname off of the
|
||
|
// stack and save the ptr.
|
||
|
xState.GetPointer()->xwszPropName.Set( _propNameStack.Pop() );
|
||
|
|
||
|
_savedStates.Push( xState.GetPointer() );
|
||
|
xState.Acquire();
|
||
|
InitState();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::RestoreState, public
|
||
|
//
|
||
|
// Synopsis: Restores state from state stack
|
||
|
//
|
||
|
// History: 01-Oct-1997 emilyb created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
void CTripYYBase::RestoreState(void)
|
||
|
{
|
||
|
XPtr <STATE> xState (_savedStates.Pop());
|
||
|
|
||
|
_currentState.iGenerateMethod = xState.GetPointer()->iGenerateMethod;
|
||
|
|
||
|
Win4Assert(xState.GetPointer()->xwszPropName.GetPointer());
|
||
|
|
||
|
// Push the saved state onto the stack
|
||
|
_propNameStack.Push(xState.GetPointer()->xwszPropName.GetPointer());
|
||
|
xState.GetPointer()->xwszPropName.Acquire();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CTripYYBase::BuildPhrase
|
||
|
//
|
||
|
// Synopsis: Builds a phrase node.
|
||
|
//
|
||
|
// Arguments: [wcsPhrase] - The phrase
|
||
|
// [iGenMethod] - The generation method
|
||
|
//
|
||
|
// History: 01-Apr-1998 KrishnaN created
|
||
|
// 18-Apr-2000 KitmanH Moved from YYPARSER
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
CDbContentRestriction * CTripYYBase::BuildPhrase(WCHAR *wcsPhrase, int iGenMethod)
|
||
|
{
|
||
|
Win4Assert(wcsPhrase);
|
||
|
|
||
|
if (0 == *wcsPhrase)
|
||
|
THROW( CException( QPARSE_E_EXPECTING_PHRASE ) );
|
||
|
|
||
|
CDbColId *pps;
|
||
|
DBTYPE dbType;
|
||
|
GetCurrentProperty(&pps, &dbType);
|
||
|
|
||
|
// We used the property. Now pop it off if need be
|
||
|
if (fDeferredPop)
|
||
|
PopProperty();
|
||
|
|
||
|
// generation method stripped in some cases, but not all.
|
||
|
// if it's there, use it
|
||
|
|
||
|
LPWSTR pLast = wcsPhrase + wcslen(wcsPhrase) - 1;
|
||
|
|
||
|
if (L'"' == *wcsPhrase && L'"' == *pLast)
|
||
|
{
|
||
|
StripQuotes(wcsPhrase);
|
||
|
if (0 == *wcsPhrase)
|
||
|
THROW( CException( QPARSE_E_EXPECTING_PHRASE ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( L'*' == *pLast) // prefix
|
||
|
{
|
||
|
*pLast-- = L'\0';
|
||
|
SetCurrentGenerate(GENERATE_METHOD_PREFIX);
|
||
|
}
|
||
|
if ( L'*' == *pLast) // inflect
|
||
|
{
|
||
|
*pLast-- = L'\0';
|
||
|
SetCurrentGenerate(GENERATE_METHOD_INFLECT);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int fuzzy;
|
||
|
GetCurrentGenerate(&fuzzy);
|
||
|
if (0 != iGenMethod)
|
||
|
fuzzy = iGenMethod;
|
||
|
|
||
|
// Clear generation method so it won't rub off on the following phrase
|
||
|
SetCurrentGenerate(GENERATE_METHOD_EXACT);
|
||
|
|
||
|
XDbContentRestriction pRest( new CDbContentRestriction (wcsPhrase, *pps, fuzzy, _lcid));
|
||
|
if( pRest.IsNull() || !pRest->IsValid() )
|
||
|
THROW( CException( E_OUTOFMEMORY ) );
|
||
|
|
||
|
return pRest.Acquire();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|