windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/triplish/yybase.cxx
2020-09-26 16:20:57 +08:00

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();
}