mirror of https://github.com/lianthony/NT4.0
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.
691 lines
14 KiB
691 lines
14 KiB
/*****************************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1987-1990 **/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************
|
|
File : compnode.hxx
|
|
Title : definitions for struct/union/enum
|
|
History :
|
|
08-Jun-1991 VibhasC Created
|
|
|
|
*****************************************************************************/
|
|
#ifndef __COMPNODE_HXX__
|
|
#define __COMPNODE_HXX__
|
|
|
|
#include "baduse.hxx"
|
|
#include "tlnmgr.hxx"
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// field node
|
|
/////////////////////////////////////////////////////////////////////////
|
|
class node_field : public node_skl
|
|
{
|
|
private:
|
|
public:
|
|
node_field();
|
|
node_field( char *);
|
|
|
|
~node_field( void );
|
|
|
|
virtual
|
|
BOOL IsBitField();
|
|
|
|
virtual
|
|
node_state PostSCheck( class BadUseInfo * );
|
|
|
|
virtual
|
|
void SetAttribute( type_node_list * );
|
|
|
|
virtual
|
|
node_skl * StaticSize(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundNode(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundTree(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
STATUS_T EmitProc(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T WalkTree(ACTION_T, SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T CalcSize(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T SendNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T RecvNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PeekNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T InitNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T FreeNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintType(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
BOOL IsEmptyArm();
|
|
|
|
virtual
|
|
unsigned short GetFieldSize();
|
|
|
|
expr_list * GetCaseExprList();
|
|
|
|
virtual
|
|
void CheckBadConstructs( class BadUseInfo * );
|
|
|
|
virtual
|
|
node_state PreSCheck( class BadUseInfo * );
|
|
|
|
virtual
|
|
short GetTopLevelNames( TLNDICT * , BOOL );
|
|
|
|
virtual
|
|
BOOL DerivesFromTransmitAs()
|
|
{
|
|
return GetChild()->DerivesFromTransmitAs();
|
|
}
|
|
|
|
char * SpecialActionUnnamedFields( BufferManager *, char ** );
|
|
|
|
STATUS_T MopCodeGen(
|
|
MopStream * pStream,
|
|
node_skl * pParent,
|
|
BOOL fMemory );
|
|
|
|
unsigned long MopGetBufferSize( unsigned long CurrentSize );
|
|
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// bit field
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
class node_bitfield : public node_field
|
|
{
|
|
private:
|
|
short FieldSize;
|
|
public:
|
|
node_bitfield( short s ) : node_field()
|
|
{
|
|
FieldSize = s;
|
|
// SetNodeState( NODE_STATE_BIT_FIELD );
|
|
};
|
|
|
|
node_bitfield( short s, char * p ) : node_field( p )
|
|
{
|
|
FieldSize = s;
|
|
};
|
|
|
|
~node_bitfield( void );
|
|
|
|
virtual
|
|
unsigned short GetFieldSize() { return FieldSize; };
|
|
|
|
void SetBitField( short size )
|
|
{
|
|
FieldSize = size;
|
|
};
|
|
|
|
BOOL IsBitField()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
virtual
|
|
node_state PostSCheck( class BadUseInfo * );
|
|
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// su nodes : struct / union derives from here
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
class su : public node_skl
|
|
{
|
|
private:
|
|
struct _baduseortempname
|
|
{
|
|
class BadUseInfo * pBadUseInfo;
|
|
char * pOriginalTypedefName;
|
|
} SUInfo;
|
|
unsigned short fHasOriginalTypedefName : 1;
|
|
unsigned short fLastMemberIsEncapUnion : 1;
|
|
unsigned short ForcedAlignment : 3;
|
|
unsigned short fUsageAsCtxtHdl : 1;
|
|
unsigned short fUsageAsNonCtxtHdl : 1;
|
|
unsigned short fDerivesFromTransmitAs : 1;
|
|
unsigned short fDontGenerateAuxRoutines : 1;
|
|
unsigned short fHasOnlyEmptyArm : 1;
|
|
unsigned short fAuxRoutineRequired : 1;
|
|
|
|
public:
|
|
su( NODE_T Nt );
|
|
|
|
void SetAuxRoutineRequired()
|
|
{
|
|
fAuxRoutineRequired = 1;
|
|
}
|
|
BOOL IsAuxRoutineRequired()
|
|
{
|
|
return (BOOL) fAuxRoutineRequired;
|
|
}
|
|
void ResetAuxRoutineRequired()
|
|
{
|
|
fAuxRoutineRequired = 0;
|
|
}
|
|
|
|
void SetHasOnlyEmptyArm()
|
|
{
|
|
fHasOnlyEmptyArm = 1;
|
|
}
|
|
|
|
void ResetHasOnlyEmptyArm()
|
|
{
|
|
fHasOnlyEmptyArm = 0;
|
|
}
|
|
|
|
BOOL HasOnlyEmptyArm()
|
|
{
|
|
return (BOOL) fHasOnlyEmptyArm;
|
|
}
|
|
|
|
void DontGenerateAuxRoutines()
|
|
{
|
|
fDontGenerateAuxRoutines = 1;
|
|
}
|
|
|
|
BOOL ShouldAuxRoutineNotBeGenerated()
|
|
{
|
|
return (BOOL) fDontGenerateAuxRoutines;
|
|
}
|
|
|
|
void SetDerivesFromTransmitAs()
|
|
{
|
|
fDerivesFromTransmitAs = 1;
|
|
}
|
|
|
|
BOOL DerivesFromTransmitAs()
|
|
{
|
|
return (BOOL) fDerivesFromTransmitAs;
|
|
}
|
|
|
|
virtual
|
|
void MarkUsage();
|
|
|
|
void SetUsageAsCtxtHdl( BOOL f )
|
|
{
|
|
if( f == TRUE )
|
|
fUsageAsCtxtHdl = 1;
|
|
else
|
|
fUsageAsNonCtxtHdl = 1;
|
|
}
|
|
|
|
BOOL IsUsageOnlyAsCtxtHdl()
|
|
{
|
|
return( (fUsageAsCtxtHdl == 1) &&
|
|
(fUsageAsNonCtxtHdl == 0 ) );
|
|
}
|
|
|
|
virtual
|
|
void SetLastMemberIsEncapUnion()
|
|
{
|
|
fLastMemberIsEncapUnion = 1;
|
|
}
|
|
|
|
virtual
|
|
BOOL IsLastMemberEncapUnion()
|
|
{
|
|
return (BOOL)( fLastMemberIsEncapUnion == 1);
|
|
}
|
|
|
|
virtual
|
|
void SetForcedAlignment( unsigned short A)
|
|
{
|
|
if( A != 0 )
|
|
ForcedAlignment = A;
|
|
}
|
|
|
|
virtual
|
|
unsigned short GetForcedAlignment()
|
|
{
|
|
return ForcedAlignment;
|
|
}
|
|
|
|
void SetOriginalTypedefName( char *p )
|
|
{
|
|
SUInfo.pOriginalTypedefName = p;
|
|
fHasOriginalTypedefName = 1;
|
|
}
|
|
|
|
char * GetOriginalTypedefName()
|
|
{
|
|
return SUInfo.pOriginalTypedefName;
|
|
}
|
|
|
|
BOOL HasOriginalTypedefName()
|
|
{
|
|
return fHasOriginalTypedefName;
|
|
}
|
|
|
|
void ResetOriginalTypedefName()
|
|
{
|
|
fHasOriginalTypedefName = 0;
|
|
}
|
|
|
|
void GetPtrTypeCastOfOriginalName( char *p );
|
|
|
|
void SetAllBadConstructReasons( class BadUseInfo *p)
|
|
{
|
|
CopyAllBadConstructReasons( SUInfo.pBadUseInfo, p );
|
|
}
|
|
|
|
void SetAllNonRPCAbleReasons( class BadUseInfo *p )
|
|
{
|
|
CopyAllNonRPCAbleReasons( SUInfo.pBadUseInfo, p );
|
|
}
|
|
void SetNonRPCAbleReason( NON_RPCABLE Reason )
|
|
{
|
|
SUInfo.pBadUseInfo->SetNonRPCAbleBecause( Reason );
|
|
}
|
|
virtual
|
|
void UpdateBadUseInfo( class BadUseInfo *p );
|
|
|
|
virtual
|
|
void RegFDAndSetE();
|
|
|
|
virtual
|
|
BOOL HasOnlyFirstLevelRefPtr();
|
|
|
|
virtual
|
|
BOOL HasAnyNETransmitAsType()
|
|
{
|
|
return CheckNodeStateInMembers(
|
|
NODE_STATE_TRANSMIT_AS );
|
|
}
|
|
|
|
virtual
|
|
BOOL HasPtrToAnyNEArray()
|
|
{
|
|
return CheckNodeStateInMembers(
|
|
NODE_STATE_PTR_TO_ANY_ARRAY );
|
|
}
|
|
|
|
virtual
|
|
BOOL HasPtrToCompWEmbeddedPtr()
|
|
{
|
|
return CheckNodeStateInMembers(
|
|
NODE_STATE_PTR_TO_EMBEDDED_PTR );
|
|
}
|
|
|
|
BOOL HasAnyEmbeddedUnion()
|
|
{
|
|
return (BOOL)
|
|
((GetNodeState() & NODE_STATE_EMBEDDED_UNION)
|
|
== NODE_STATE_EMBEDDED_UNION);
|
|
}
|
|
|
|
virtual
|
|
BOOL HasSizedComponent();
|
|
|
|
virtual
|
|
BOOL HasLengthedComponent();
|
|
|
|
virtual
|
|
short GetTopLevelNames( TLNDICT *, BOOL );
|
|
|
|
class SymTable * GetSymScopeOfTopLevelName( char * );
|
|
|
|
virtual
|
|
void PropogateOriginalName( char *p )
|
|
{
|
|
SetOriginalTypedefName( p );
|
|
}
|
|
virtual
|
|
unsigned short AllocWRTOtherAttrs();
|
|
|
|
virtual
|
|
BOOL HasEmbeddedFixedArrayOfStrings();
|
|
|
|
node_skl * GetFirstNamedFieldInNesting();
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// structure node
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
class node_struct : public su
|
|
{
|
|
public:
|
|
node_struct( char *pName ) : su(NODE_STRUCT)
|
|
{
|
|
SetSymName( pName );
|
|
};
|
|
|
|
~node_struct() { };
|
|
virtual
|
|
node_skl * GetLargestElement();
|
|
|
|
virtual
|
|
node_skl * GetLargestNdr();
|
|
|
|
virtual
|
|
unsigned long GetSize(unsigned long);
|
|
|
|
virtual
|
|
node_state PostSCheck( class BadUseInfo * );
|
|
|
|
virtual
|
|
void SetAttribute( type_node_list * );
|
|
|
|
virtual
|
|
node_skl * StaticSize(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundNode(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundTree(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
STATUS_T EmitProc(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T WalkTree(ACTION_T, SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T CalcSize(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T SendNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T RecvNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PeekNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T InitNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T FreeNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintType(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintDecl(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
node_skl * SkipBlock(type_node_list *, node_skl **, unsigned long *);
|
|
|
|
|
|
virtual
|
|
node_skl * GetOneNEUnionSwitchType()
|
|
{
|
|
return (node_skl *)0;
|
|
}
|
|
virtual
|
|
BOOL IsEncapsulatedStruct()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL IsStringableStruct();
|
|
|
|
STATUS_T MopCodeGen(
|
|
MopStream * pStream,
|
|
node_skl * pParent,
|
|
BOOL fMemory );
|
|
|
|
STATUS_T MopCodeGenConfSizes(
|
|
MopStream * pStream,
|
|
unsigned long TopSize );
|
|
|
|
unsigned long MopGetBufferSize( unsigned long CurrentSize );
|
|
unsigned long MopGetStackSize ( unsigned long CurrentSize );
|
|
|
|
|
|
};
|
|
|
|
class node_en_struct : public node_struct
|
|
{
|
|
public:
|
|
node_en_struct( char *p ) : node_struct(p)
|
|
{
|
|
};
|
|
|
|
~node_en_struct()
|
|
{
|
|
}
|
|
virtual
|
|
BOOL IsEncapsulatedStruct()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
node_skl * GetSwitchField()
|
|
{
|
|
return GetFirstMember();
|
|
}
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// union node
|
|
/////////////////////////////////////////////////////////////////////////
|
|
class node_union : public su
|
|
{
|
|
private:
|
|
union
|
|
{
|
|
class BufferManager * pSwStringBuffer;
|
|
Dictionary * pCaseValueDict;
|
|
} Info;
|
|
|
|
int fCaseChecked : 1;
|
|
int fCaseValueDictReleased : 1;
|
|
|
|
public:
|
|
node_union( char * );
|
|
~node_union( void );
|
|
|
|
virtual
|
|
void UseProcessingAction();
|
|
|
|
virtual
|
|
node_skl * GetLargestElement();
|
|
|
|
virtual
|
|
node_skl * GetLargestNdr();
|
|
|
|
void SetCaseExpr( class expr_list * );
|
|
|
|
virtual
|
|
unsigned long GetSize( unsigned long );
|
|
|
|
virtual
|
|
node_state PreSCheck( class BadUseInfo * );
|
|
|
|
virtual
|
|
node_state PostSCheck( class BadUseInfo * );
|
|
|
|
virtual
|
|
void SetAttribute( type_node_list * );
|
|
|
|
node_skl * GetSwitchType();
|
|
|
|
virtual
|
|
node_skl * StaticSize(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundNode(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundTree(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
STATUS_T EmitProc(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T WalkTree(ACTION_T, SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T CalcSize(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T SendNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T RecvNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PeekNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T InitNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T FreeNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintType(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintDecl(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
void SetUpUnionSwitch( class BufferManager * pB );
|
|
|
|
node_skl * SkipBlock(type_node_list *, node_skl **, unsigned long *);
|
|
|
|
node_skl * CopyBlock(type_node_list *, node_skl **, unsigned long *);
|
|
|
|
|
|
virtual
|
|
node_skl * GetOneNEUnionSwitchType()
|
|
{
|
|
return GetSwitchType();
|
|
}
|
|
|
|
virtual
|
|
BOOL IsEncapsulatedUnion()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
void CheckCaseValuesInRange();
|
|
|
|
STATUS_T MopCodeGen(
|
|
MopStream * pStream,
|
|
node_skl * pParent,
|
|
BOOL fMemory );
|
|
|
|
unsigned long MopGetBufferSize( unsigned long CurrentSize );
|
|
unsigned long MopGetStackSize ( unsigned long CurrentSize );
|
|
|
|
|
|
};
|
|
|
|
class node_en_union : public node_union
|
|
{
|
|
public:
|
|
node_en_union( char * p ) : node_union(p)
|
|
{
|
|
};
|
|
|
|
~node_en_union( void );
|
|
|
|
virtual
|
|
BOOL IsEncapsulatedUnion()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
};
|
|
|
|
class node_enum : public node_skl
|
|
{
|
|
public:
|
|
node_enum( char * pName ) : node_skl( NODE_ENUM )
|
|
{
|
|
SetSymName( pName );
|
|
}
|
|
|
|
virtual
|
|
node_state SCheck( class BadUseInfo * );
|
|
|
|
virtual
|
|
node_skl * StaticSize(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundNode(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
node_skl * UpperBoundTree(SIDE_T, NODE_T, unsigned long *);
|
|
|
|
virtual
|
|
STATUS_T EmitProc(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T WalkTree(ACTION_T, SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T CalcSize(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T SendNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T RecvNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PeekNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T InitNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T FreeNode(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintType(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
virtual
|
|
STATUS_T PrintDecl(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
STATUS_T MopCodeGen(
|
|
MopStream * pStream,
|
|
node_skl * pParent,
|
|
BOOL fMemory );
|
|
};
|
|
|
|
class node_label : public node_skl
|
|
{
|
|
private:
|
|
class expr_node * pExpr;
|
|
public:
|
|
node_label( char *, class expr_node * );
|
|
|
|
void SetExpr( class expr_node * );
|
|
|
|
class expr_node * GetExpr()
|
|
{
|
|
return pExpr;
|
|
}
|
|
long GetValue();
|
|
|
|
virtual
|
|
STATUS_T PrintType(SIDE_T, NODE_T, BufferManager *);
|
|
|
|
};
|
|
|
|
#endif // __COMPNODE_HXX__
|