mirror of https://github.com/tongzx/nt5src
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.
825 lines
18 KiB
825 lines
18 KiB
/*****************************************************************************/
|
|
/** 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__
|