You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
5.2 KiB
202 lines
5.2 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: CXX.HXX
|
|
//
|
|
// Contents: C and C++ filter
|
|
//
|
|
// History: 26-Jun-92 BartoszM Created
|
|
//
|
|
//---------------------------------------------------------------------------/
|
|
|
|
#pragma once
|
|
|
|
#define cxxDebugOut( x )
|
|
|
|
#define MAXIDENTIFIER 80
|
|
|
|
//
|
|
// These are the tokens recognized by the scanner
|
|
//
|
|
enum CToken
|
|
{
|
|
tEnd, // EOF
|
|
tClass, // class
|
|
tStruct, // struct
|
|
tUnion, // union
|
|
tInterface, // interface
|
|
tEnum, // enum
|
|
tLBrace, // {
|
|
tRBrace, // }
|
|
tSemi, // ;
|
|
tDoubleColon, // ::
|
|
tLParen, // (
|
|
tRParen, // )
|
|
tDefine, // #define
|
|
tInclude, // #include
|
|
tTypedef, // typedef
|
|
tComma, // ,
|
|
tStar, // *
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CxxScanner
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 26-Jun-92 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CxxScanner
|
|
{
|
|
public:
|
|
CxxScanner();
|
|
|
|
void Init(CFilterTextStream* pStream);
|
|
|
|
CToken Accept()
|
|
{
|
|
return NextToken(_pStream->GetChar());
|
|
}
|
|
|
|
CToken Accept(int c)
|
|
{
|
|
return NextToken(c);
|
|
}
|
|
|
|
int EatComment();
|
|
int EatString();
|
|
int EatCharLiteral();
|
|
int EatPrepro();
|
|
|
|
CToken Token() { return(_token); }
|
|
int LoadName(int c);
|
|
int LoadIncludeFileName(int c);
|
|
int SkipName(int c);
|
|
void IgnorePreamble ( BOOL f ) { _fIgnorePreamble = f; }
|
|
void SetIdFound( BOOL f ) { _fIdFound = f; }
|
|
BOOL IdFound() { return _fIdFound; }
|
|
const WCHAR* GetLastIdent ( FILTERREGION& region) const
|
|
{
|
|
region = _region;
|
|
return(_buf);
|
|
}
|
|
|
|
ULONG Lines() { return _cLines; }
|
|
|
|
private:
|
|
|
|
CToken NextToken(int c);
|
|
|
|
CFilterTextStream* _pStream; // stream
|
|
WCHAR _buf[MAXIDENTIFIER+1]; // buffer for identifiers
|
|
FILTERREGION _region; // region where the identifier was found
|
|
CToken _token; // recognized token
|
|
BOOL _fIgnorePreamble; // state flag--scanning preamble
|
|
ULONG _cLines;
|
|
BOOL _fScanningPrepro; // state flag--parsing a prepro stmt
|
|
BOOL _fIdFound; // state flag--set to TRUE when
|
|
// an identifier is scanned
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CxxParser
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 26-Jun-92 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CxxParser
|
|
{
|
|
enum TokenType
|
|
{
|
|
ttClass, ttFunction, ttMethod, ttInlineMethod
|
|
};
|
|
|
|
public:
|
|
|
|
CxxParser();
|
|
|
|
~CxxParser();
|
|
|
|
void Init( CFilterTextStream * pStream );
|
|
|
|
BOOL Parse();
|
|
|
|
PROPSPEC GetAttribute() { return _attribute; }
|
|
|
|
BOOL GetTokens( ULONG * pcwcBuffer, WCHAR * awcBuffer);
|
|
|
|
void GetRegion ( FILTERREGION& region );
|
|
|
|
BOOL GetValueAttribute( PROPSPEC & ps );
|
|
|
|
PROPVARIANT * GetValue();
|
|
|
|
void SkipValue() { _iVal++; }
|
|
|
|
private:
|
|
|
|
void PutClass ();
|
|
void PutMethod ();
|
|
void PutInlineMethod();
|
|
void PutFunction ();
|
|
|
|
void SetClass()
|
|
{
|
|
const WCHAR* buf = _scan.GetLastIdent (_regionClass);
|
|
wcsncpy ( _strClass, buf, MAXIDENTIFIER );
|
|
_strClass[ MAXIDENTIFIER ] = 0;
|
|
}
|
|
|
|
void SetName()
|
|
{
|
|
const WCHAR* buf = _scan.GetLastIdent (_regionName);
|
|
wcsncpy ( _strName, buf, MAXIDENTIFIER );
|
|
_strName[ MAXIDENTIFIER ] = 0;
|
|
}
|
|
|
|
CxxScanner _scan; // the scanner
|
|
WCHAR _strClass[MAXIDENTIFIER+1]; // buffer for class name
|
|
FILTERREGION _regionClass;
|
|
WCHAR _strName [MAXIDENTIFIER+1]; // buffer for identifier
|
|
FILTERREGION _regionName;
|
|
TokenType _tokenType; // class, function, method?
|
|
|
|
int _scope; // depth of scope counter
|
|
int _inClass; // depth of class
|
|
|
|
PROPSPEC _attribute;
|
|
|
|
CToken _token;
|
|
ULONG _cwcCopiedClass;
|
|
ULONG _cwcCopiedName;
|
|
|
|
enum CxxVal
|
|
{
|
|
Function,
|
|
Class,
|
|
Lines
|
|
};
|
|
|
|
unsigned _iVal;
|
|
PROPSPEC _psVal[3];
|
|
CPropVar * _aVal[3];
|
|
|
|
#if CIDBG == 1
|
|
CToken _classToken;
|
|
#endif // CIDBG == 1
|
|
|
|
BOOL _fParsingTypedef; // state flag--parsing a typedef
|
|
BOOL _fParsingFnPtrTypedef; // state flag--parsing a typedef
|
|
// of a fn pointer
|
|
int _typedefScope;
|
|
};
|
|
|