windows-nt/Source/XPSP1/NT/com/rpc/midl/inc/attrnode.hxx
2020-09-26 16:20:57 +08:00

826 lines
18 KiB
C++

/*****************************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1987-1999 **/
/*****************************************************************************/
/*****************************************************************************
File : attrnode.hxx
Title : attribute node definitions
History :
08-Aug-1991 VibhasC Created
*****************************************************************************/
#ifndef __attrnode_hxx__
#define __attrnode_hxx__
/**
** We classify attributes into these classes:
**
** A) IDL attributes and B) ACF attributes.
**
** IDL Attributes, are further divided into:
**
** . bit_attributes( whose presence is indicated by a bit in the summary
** vector and which requre no further info. ( BA )
** . non-bit attributes ( whic have some info conatained in them. (NBA)
**
** There is no such classification in acf attributes. All acf attributes
** have attribute class instances.
**
** BAs are further divided into:
**
** 1. size-based attributes (SA), size_is, length_is etc, except string
** 2. type-based attributes(TA) switch_type, transmit_as etc
** 3. acf attributes (AA)
** 4. miscellaneous attributes (MA) guid, endpoint, switch_is etc
**
** The classification is loosely based on the semantic checks needed. size_is
** length_is etc have almost similar semantic checks, so we group them
** together. The miscellaneous attributes are completely unrelated to each
** other and so such we just group them into one.
**/
#include "expr.hxx"
#include "midlnode.hxx"
#include "stream.hxx"
#include "nodeskl.hxx"
class node_e_attr : public node_base_attr
{
public:
node_e_attr() : node_base_attr( ATTR_NONE )
{
}
node_e_attr( node_e_attr * pOld ) : node_base_attr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr* pNew = new node_e_attr(this);
return pNew;
}
};
class nbattr : public node_base_attr
{
public:
nbattr( ATTR_T At ) : node_base_attr( At )
{
}
};
/****************************************************************************
size - related attributes
****************************************************************************/
class expr_node;
class size_attr : public nbattr
{
private:
class expr_node * pExpr;
public:
size_attr( expr_node * pE, ATTR_T A)
: nbattr( A )
{
pExpr = pE;
}
virtual
class node_base_attr * Clone()
{
size_attr * pNew = new size_attr( NULL, GetAttrID() );
*pNew = *this;
if ( pExpr )
{
pNew->pExpr = pExpr->Clone();
pExpr->CopyTo( pNew->pExpr );
}
return pNew;
}
void SetExpr( expr_node *pE )
{
pExpr = pE;
}
expr_node * GetExpr()
{
return pExpr;
}
};
/****************************************************************************
type - based attributes
****************************************************************************/
class ta : public nbattr
{
private:
node_skl * pType;
public:
ta( node_skl *pT, ATTR_T A)
: nbattr( A )
{
pType = pT;
}
node_skl * GetType()
{
return pType;
}
};
class node_transmit : public ta
{
public:
node_transmit( node_skl * pTransmitAs )
: ta( pTransmitAs, ATTR_TRANSMIT )
{
}
node_transmit( node_transmit * pOld ) : ta( pOld->GetType(), pOld->GetAttrID() )
{
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_transmit( this );
return pNew;
}
node_skl * GetTransmitAsType()
{
return GetType();
}
};
/*
Rkk left just in case
*/
class node_wire_marshal : public ta
{
public:
node_wire_marshal( node_skl * pN )
: ta( pN, ATTR_WIRE_MARSHAL )
{
}
node_wire_marshal( node_wire_marshal * pOld )
: ta( pOld->GetType(), pOld->GetAttrID() )
{
}
virtual
node_base_attr * Clone()
{
node_base_attr * pNew = new node_wire_marshal( this );
return pNew;
}
node_skl * GetWireMarshalType() // wire type, not local
{
return GetType();
}
};
class node_switch_type : public ta
{
public:
node_switch_type( class node_skl * pSwitchType)
: ta( pSwitchType, ATTR_SWITCH_TYPE )
{
}
node_switch_type( node_switch_type * pOld )
: ta( pOld->GetType(), pOld->GetAttrID() )
{
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_switch_type(this);
return pNew;
}
node_skl * GetSwitchType()
{
return GetType();
}
};
/****************************************************************************
other miscellaneous attributes
****************************************************************************/
class ma : public nbattr
{
public:
ma( ATTR_T At ) : nbattr( At )
{
}
};
typedef struct _INTERNAL_UUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} INTERNAL_UUID;
class GUID_STRS
{
public:
INTERNAL_UUID Value;
char * str1,
* str2,
* str3,
* str4,
* str5;
GUID_STRS()
{
}
GUID_STRS( char *p1, char *p2, char *p3, char *p4, char *p5 )
{
str1 = p1;
str2 = p2;
str3 = p3;
str4 = p4;
str5 = p5;
SetValue();
}
void SetStrs( char *p1, char *p2, char *p3, char *p4, char *p5 )
{
str1 = p1;
str2 = p2;
str3 = p3;
str4 = p4;
str5 = p5;
SetValue();
}
void GetStrs( char *&p1, char *&p2, char *&p3, char *&p4, char *&p5 )
{
p1 = str1;
p2 = str2;
p3 = str3;
p4 = str4;
p5 = str5;
}
void SetValue();
};
struct _GUID;
class node_guid : public ma
{
private:
char * guidstr;
GUID_STRS cStrs;
public:
node_guid( char*, char*, char*, char*, char*, ATTR_T At = ATTR_GUID );
node_guid( char*, ATTR_T At = ATTR_GUID );
node_guid(node_guid * pOld) : ma( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_guid(this);
return pNew;
}
char * GetGuidString()
{
return guidstr;
}
void CheckAndSetGuid( char *,char *,char *,char *, char * );
void GetStrs( char **, char **, char **, char **, char ** );
void GetGuid(_GUID &);
GUID_STRS & GetStrs()
{
return cStrs;
}
};
class node_version : public nbattr
{
private:
unsigned long major;
unsigned long minor;
public:
node_version( unsigned long, unsigned long );
node_version( char *p );
node_version(node_version * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_version(this);
return pNew;
}
STATUS_T GetVersion( unsigned short *, unsigned short * );
// we want to delete these two
STATUS_T GetVersion( short *, short * );
STATUS_T GetVersion( int *pma, int *pmi )
{
*pma = (int) major;
*pmi = (int) minor;
return STATUS_OK;
}
};
/////////////////////////////////////////////////////////////////////////////
// inherited pointer type.
/////////////////////////////////////////////////////////////////////////////
typedef unsigned short PTRTYPE;
//
// Initialized value (pointer type not yet determined).
//
#define PTR_UNKNOWN 0x0
// [REF] pointer.
#define PTR_REF 0x1
// [UNIQUE] pointer
#define PTR_UNIQUE 0x2
// [FULL] pointer
#define PTR_FULL 0x3
class node_ptr_attr : public nbattr
{
private:
PTRTYPE Kind;
public:
node_ptr_attr( PTRTYPE K )
: nbattr( ATTR_PTR_KIND )
{
Kind = K;
}
node_ptr_attr(node_ptr_attr * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_ptr_attr(this);
return pNew;
}
PTRTYPE GetPtrKind()
{
return Kind;
}
};
typedef struct _endptpair
{
char * pString1;
char * pString2;
} ENDPT_PAIR;
class node_endpoint : public nbattr
{
private:
gplistmgr EndPointStringList;
public:
node_endpoint( char * );
node_endpoint(node_endpoint * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_endpoint(this);
return pNew;
}
void SetEndPointString( char *p );
// don't destroy the iterator returned here; just use it in place
// it is an iterator of ENDPT_PAIR nodes defined above.
ITERATOR & GetEndPointPairs();
};
class node_switch_is : public nbattr
{
private:
class expr_node * pExpr;
public:
node_switch_is( class expr_node * pE )
: nbattr( ATTR_SWITCH_IS )
{
pExpr = pE;
}
node_switch_is(node_switch_is * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_switch_is(this);
((node_switch_is*)pNew)->pExpr = pExpr->Clone();
pExpr->CopyTo( ((node_switch_is*)pNew)->pExpr );
return pNew;
}
node_skl * GetSwitchIsType()
{
return pExpr->GetType();
}
expr_node * GetExpr()
{
return pExpr;
}
};
class node_case : public nbattr
{
private:
class expr_list * pExprList;
public:
node_case( expr_list * pL )
: nbattr( ATTR_CASE )
{
pExprList = pL;
}
node_case(node_case * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual
class node_base_attr * Clone()
{
node_base_attr * pNew = new node_case(this);
return pNew;
}
class expr_list * GetExprList()
{
return pExprList;
}
};
//+---------------------------------------------------------------------------
//
// Class: node_constant_attr
//
// Purpose: Used by attributes that are associated with constant data
// such as: id(x), helpcontext(x), lcid(x), fdescattr etc.
//
//----------------------------------------------------------------------------
class node_constant_attr : public nbattr
{
private:
class expr_node * _pExprNode;
public:
node_constant_attr(expr_node * pN, ATTR_T attr)
: nbattr(attr)
{
if (pN->AlwaysGetType()->NodeKind() == NODE_POINTER && attr != ATTR_DEFAULTVALUE )
ParseError( ILLEGAL_EXPRESSION_TYPE, (char *)0 );
_pExprNode = pN;
}
node_constant_attr(node_constant_attr * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual class node_base_attr * Clone()
{
node_base_attr * pNew = new node_constant_attr(this);
return pNew;
}
class expr_node * GetExpr(void)
{
return _pExprNode;
}
};
//+---------------------------------------------------------------------------
//
// Function: TranslateEscapeSequences
//
// Purpose: Replaces a string's escape sequences with the appropriate
// ASCII characters.
//
// NOTE: this can be done in place because the resulting string
// length will always be shorter than or equal to the input string
// length.
//
//----------------------------------------------------------------------------
void TranslateEscapeSequences(char * sz);
//+---------------------------------------------------------------------------
//
// Class: node_text_attr
//
// Purpose: Used by attributes that are associated with string data
// such as: helpstring("foo"), helpfile("foo"), dllname("foo"), etc.
//
//----------------------------------------------------------------------------
class node_text_attr : public nbattr
{
private:
char * _szText;
public:
node_text_attr(char * szText, ATTR_T attr)
: nbattr(attr)
{
_szText = szText;
}
node_text_attr(node_text_attr * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual class node_base_attr * Clone()
{
node_base_attr * pNew = new node_text_attr(this);
return pNew;
}
char * GetText(void)
{
return _szText;
}
};
//+---------------------------------------------------------------------------
//
// Class: node_custom_attr
//
// Purpose: extensible custom attribute support for new ODL syntax
//
//----------------------------------------------------------------------------
class node_custom_attr : public nbattr
{
private:
node_guid * pGuid;
expr_node * pExpr;
public:
node_custom_attr( node_guid * pg, expr_node * px)
: nbattr(ATTR_CUSTOM)
{
pGuid = pg;
pExpr = px;
}
node_guid * GetGuid(void)
{
return pGuid;
}
expr_node * GetVal(void)
{
return pExpr;
}
};
//+---------------------------------------------------------------------------
//
// Class: node_entry_attr
//
// Purpose: Used by the entry attribute who's parameter is either an
// index or a named library entry point.
//
//----------------------------------------------------------------------------
class node_entry_attr : public nbattr
{
private:
char * _szVal;
LONG_PTR _lVal;
BOOL _fNumeric;
public:
node_entry_attr(LONG_PTR lVal)
: nbattr(ATTR_ENTRY)
{
_lVal = lVal;
_fNumeric = TRUE;
}
node_entry_attr(char * sz)
: nbattr(ATTR_ENTRY)
{
_szVal = sz;
_fNumeric = FALSE;
}
node_entry_attr(node_entry_attr * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual class node_base_attr * Clone()
{
node_base_attr * pNew = new node_entry_attr(this);
return pNew;
}
BOOL IsNumeric(void)
{
return _fNumeric;
}
char * GetSz(void)
{
return _szVal;
}
LONG_PTR GetID(void)
{
return _lVal;
}
};
//+---------------------------------------------------------------------------
//
// Class: node_type_attr
//
// Purpose: Used whenever an ODL bit attribute is seen that only may be
// applied to TYPEATTRs.
//
//----------------------------------------------------------------------------
class node_type_attr : public nbattr
{
private:
TATTR_T _attr;
public:
node_type_attr(TATTR_T attr)
: nbattr(ATTR_TYPE)
{
_attr = attr;
}
node_type_attr(node_type_attr * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual class node_base_attr * Clone()
{
node_base_attr * pNew = new node_type_attr(this);
return pNew;
}
TATTR_T GetAttr(void)
{
return _attr;
}
};
//+---------------------------------------------------------------------------
//
// Class: node_member_attr
//
// Purpose: Used whenever an ODL bit attribute is seen that only may be
// applied to FUNCDESCs or VARDESCs.
//
//----------------------------------------------------------------------------
class node_member_attr : public nbattr
{
private:
MATTR_T _attr;
public:
node_member_attr(MATTR_T attr)
: nbattr(ATTR_MEMBER)
{
_attr = attr;
}
node_member_attr(node_member_attr * pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual class node_base_attr * Clone()
{
node_base_attr * pNew = new node_member_attr(this);
return pNew;
}
MATTR_T GetAttr(void)
{
return _attr;
}
};
//+---------------------------------------------------------------------------
//
// Class: node_range_attr
//
// Purpose: Used by attribute range(min, max).
//
//----------------------------------------------------------------------------
class node_range_attr : public nbattr
{
private:
class expr_node* _pMinExpr;
class expr_node* _pMaxExpr;
public:
node_range_attr(expr_node* pMinExpr, expr_node* pMaxExpr)
: nbattr(ATTR_RANGE), _pMinExpr(pMinExpr), _pMaxExpr(pMaxExpr)
{
}
node_range_attr(node_range_attr* pOld) : nbattr( pOld->GetAttrID() )
{
*this = *pOld;
}
virtual class node_base_attr * Clone()
{
return new node_range_attr(this);
}
class expr_node * GetMinExpr(void)
{
return _pMinExpr;
}
class expr_node * GetMaxExpr(void)
{
return _pMaxExpr;
}
};
#endif // __attrnode_hxx__