Source code of Windows XP (NT5)
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.
|
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name: fldcls.hxx
Abstract:
Contains definitions for base type related code generation class definitions.
Notes:
History:
GregJen Sep-30-1993 Created. ----------------------------------------------------------------------------*/ #ifndef __FLDCLS_HXX__
#define __FLDCLS_HXX__
#pragma warning ( disable : 4238 4239 )
#include "nulldefs.h"
extern "C" { #include <stdio.h>
}
#include "ndrcls.hxx"
//
// This class corresponds to a structure field type.
//
class CG_FIELD : public CG_NDR, public CG_CLONEABLE { private:
unsigned long MemOffset; unsigned long WireOffset;
// These two are union specific.
expr_node * pSwitchExpr;
// Used to hold a union field's format string offset.
long UnionFormatStringOffset;
//
// All this is used to help fixed imbeded struct's with pointers.
//
BOOL fClonedField : 1; BOOL fSizeIsDone : 1; BOOL fIsRegionField : 1;
// more stuff for embedded unknown represent_as
BOOL fEmbeddedUnknownRepAs : 1;
char * PrintPrefix;
expr_node * pSizeExpression; CG_STRUCT * pRegionHint;
public: //
// The constructor.
//
CG_FIELD( node_skl * pBT, // base type
XLAT_SIZE_INFO & Info // memory offset etc
) : CG_NDR( pBT, Info ) { MemOffset = Info.GetMemOffset(); WireOffset = Info.GetWireOffset(); pSwitchExpr = NULL; UnionFormatStringOffset = -1; SetSizeIsDone( FALSE ); fIsRegionField = FALSE; fClonedField = FALSE; PrintPrefix = ""; fEmbeddedUnknownRepAs = FALSE; SetSizeExpression( NULL ); pRegionHint = NULL; }
CG_FIELD( const CG_FIELD & Field ) : CG_NDR( (CG_NDR &)Field ) { MemOffset = Field.MemOffset; WireOffset = Field.MemOffset; pSwitchExpr = Field.pSwitchExpr;
UnionFormatStringOffset = Field.UnionFormatStringOffset; fEmbeddedUnknownRepAs = Field.fEmbeddedUnknownRepAs; pSizeExpression = Field.pSizeExpression;
fClonedField = TRUE; fSizeIsDone = FALSE; fIsRegionField = Field.fIsRegionField;
// Make a new copy of the PrintPrefix field.
PrintPrefix = new char[ strlen( Field.GetPrintPrefix() ) + 1];
strcpy( PrintPrefix, Field.GetPrintPrefix() ); pRegionHint = Field.GetRegionHint(); }
CG_CLASS * Clone() { return new CG_FIELD( *this ); }
virtual ID_CG GetCGID() { return ID_CG_FIELD; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); }
//
// Generate typeinfo
//
virtual CG_STATUS GenTypeInfo( CCB * pCCB);
//
// Get and set methods.
//
// make sure the ZP gets set along the way
virtual void SetSizesAndAlignments( XLAT_SIZE_INFO & Info ) { CG_NDR::SetSizesAndAlignments( Info ); MemOffset = Info.GetMemOffset(); WireOffset = Info.GetWireOffset(); }
unsigned long GetMemOffset() { return MemOffset; }
void SetMemOffset( unsigned long offset ) { MemOffset = offset; }
unsigned long GetWireOffset() { return WireOffset; }
void SetWireOffset( unsigned long offset ) { WireOffset = offset; }
expr_node * SetSwitchExpr( expr_node * pE ) { return (pSwitchExpr = pE); }
expr_node * GetSwitchExpr() { return pSwitchExpr; }
BOOL IsClonedField() { return fClonedField; }
BOOL SetHasEmbeddedUnknownRepAs() { return (BOOL) (fEmbeddedUnknownRepAs = TRUE); }
BOOL HasEmbeddedUnknownRepAs() { return (BOOL) fEmbeddedUnknownRepAs; }
void SetSizeIsDone( BOOL b ) { fSizeIsDone = b; }
BOOL GetSizeIsDone() { //
// If this is a cloned field then we return
// the fSizeIsDone flag, otherwise we always
// return FALSE.
//
if ( IsClonedField() ) return fSizeIsDone; else return FALSE; }
void AddPrintPrefix( char * Prefix ) { char * OldPrefix;
OldPrefix = PrintPrefix;
PrintPrefix = new char[ strlen(PrintPrefix) + strlen(Prefix) + 2 ];
//
// We add the new print prefix to the
// BEGINNING of the prefix string and we insert
// a '.' in between.
//
strcpy( PrintPrefix, Prefix ); strcat( PrintPrefix, "." ); strcat( PrintPrefix, OldPrefix ); }
char * GetPrintPrefix() const { return PrintPrefix; }
void SetUnionFormatStringOffset( long offset ) { UnionFormatStringOffset = offset; }
long GetUnionFormatStringOffset() { return UnionFormatStringOffset; }
expr_node * SetSizeExpression( expr_node * pE ) { return (pSizeExpression = pE); }
expr_node * GetSizeExpression() { return pSizeExpression; }
virtual BOOL HasAFixedBufferSize() { return (GetChild()->HasAFixedBufferSize()); } BOOL IsRegionField() const { return fIsRegionField; }
void SetIsRegionField() { fIsRegionField = TRUE; }
CG_STRUCT * GetRegionHint() const { return pRegionHint; }
void SetRegionHint( CG_STRUCT *pHint ) { pRegionHint = pHint; } };
//
// This class corresponds to a union field type.
//
class CG_UNION_FIELD : public CG_FIELD { private: public: //
// The constructor.
//
CG_UNION_FIELD( node_skl * pBT, // base type
XLAT_SIZE_INFO & Info ) : CG_FIELD( pBT, Info ) { }
virtual ID_CG GetCGID() { return ID_CG_UNION_FIELD; }
virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } virtual CG_CLASS* Clone() { return new CG_UNION_FIELD( *this ); }
};
//
// This class corresponds to a union case
//
class CG_CASE : public CG_NDR, public CG_CLONEABLE { private:
expr_node * pExpr; BOOL fLastCase; // last case for this arm
public: //
// The constructor.
//
CG_CASE( node_skl * pBT, // expression type
expr_node * pE // expression
) : CG_NDR( pBT, XLAT_SIZE_INFO() ) { SetExpr( pE ); fLastCase = FALSE; } virtual CG_STATUS GenTypeInfo(CCB *pCCB);
virtual ID_CG GetCGID() { return ID_CG_CASE; } virtual CG_CLASS* Clone() { return new CG_CASE( *this ); } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); }
//
// Get and set methods.
//
expr_node * SetExpr( expr_node * pE ) { return (pExpr = pE); }
expr_node * GetExpr() { return pExpr; }
BOOL SetLastCase( BOOL Flag ) { return (fLastCase = Flag); }
BOOL FLastCase() { return fLastCase; }
};
//
// This class corresponds to a union default case
//
class CG_DEFAULT_CASE : public CG_CASE { private:
public: //
// The constructor.
//
CG_DEFAULT_CASE( node_skl * pBT // expression type
) : CG_CASE( pBT, NULL ) { }
virtual ID_CG GetCGID() { return ID_CG_DEFAULT_CASE; }
virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); }
virtual CG_CLASS* Clone() { return new CG_DEFAULT_CASE( *this ); }
//
// Get and set methods.
//
};
#endif // __FLDCLS_HXX__
|