// // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // #ifndef SIMC_MODULE_H #define SIMC_MODULE_H /* This file contains the SIMCModule class, which basically * represents the parse tree for a single module. */ // Return value for many of the symbol-table methods. #define NOT_FOUND 0 #define AMBIGUOUS 1 #define UNAMBIGUOUS 2 class SIMCSymbol; class SIMCType; class SIMCSubType; class SIMCEnumOrBitsType; class SIMCValue; class SIMCOidValue; class SIMCOctetStringValue; class SIMCDefinedTypeReference; class SIMCDefinedValueReference; class SIMCBuiltInTypeReference; class SIMCBuiltInValueReference; class SIMCObjectTypeType; class SIMCObjectTypeV1; class SIMCObjectTypeV2; class SIMCObjectIdentityType; class SIMCObjectGroup; class SIMCOidTree; class SIMCParseTree; // Some typedefs #ifndef SIMC_GROUP_LIST #define SIMC_GROUP_LIST typedef CList SIMCGroupList; ostream& operator << (ostream& outStream, const SIMCGroupList& obj); #endif typedef CList SIMCModuleList; typedef CList SIMCModuleNameList; typedef CMap SIMCSymbolTable; /* Each element in the list of revision clauses * in the MODULE-IDENTITY macro */ class SIMCRevisionElement { char *_revision, *_description; public: SIMCRevisionElement( const char * revision, const char * description) { if(revision) _revision = NewString(revision); else _revision = NULL; if(description) _description = NewString(description); else _description = NULL; } ~SIMCRevisionElement() { if(_revision) delete _revision; if(_description) delete _description; } const char * GetRevision() const { return _revision; } const char * GetDescription() const { return _description; } }; // A list of revision clauses typedef CList SIMCRevisionList; /* * This class represents the parse tree information that results from the * parsing of a single MIB module. It basically contains. * * 1. A symbol table, for all the symbols in the module * 2. The values of various MODULE-IDENTITY clauses. These are * fabricated, if the MODULE-IDENTITY clause is absent in the module * 3. A list of object groups that are fabricated for this module, as per * the rules in the "compiler requirements specification" */ class SIMCModule : public SIMCSymbol { // The version of this module // 1 - SNMPv2 SMI // 2 - SNMPv2 SMI // 0 - Union of V1 and V2 SMIs int _snmpVersion; // The items from the MODULE-IDENTITY macro char * _lastUpdated; char * _organization; char * _contactInfo; char * _moduleIdentityName; char * _description; SIMCRevisionList _revisionList; SIMCCleanOidValue * _moduleIdentityValue; // This is null if it is the main input module, otherwise it points // to the module that imported this module SIMCModule * _parentModule; // The names of the modules in the IMPORTS clause SIMCModuleNameList _namesOfImportModules; // The actual import modules SIMCModuleList *_listOfImportModules; // The Symbol table SIMCSymbolTable *_symbolTable; // A value for the hash table (CMap) object that optimizes // its working static const int SYMBOLS_PER_MODULE; // The fabricated list OBJECT-GROUPS SIMCGroupList *_listOfObjectGroups; // All the NOTIFICATION-TYPEs in the module SIMCNotificationList *_listOfNotificationTypes; // Name of the file from which this was constructed char *_inputFileName; public: // Used in RTTIing a SIMCSymbol pointer enum SymbolClass { SYMBOL_INVALID, SYMBOL_UNKNOWN, SYMBOL_IMPORT, SYMBOL_MODULE, SYMBOL_BUILTIN_TYPE_REF, SYMBOL_DEFINED_TYPE_REF, SYMBOL_TEXTUAL_CONVENTION, SYMBOL_BUILTIN_VALUE_REF, SYMBOL_DEFINED_VALUE_REF }; // Used in RTTIing a SIMCType pointer enum TypeClass { TYPE_INVALID, TYPE_PRIMITIVE, TYPE_RANGE, TYPE_SIZE, TYPE_ENUM_OR_BITS, TYPE_SEQUENCE_OF, TYPE_SEQUENCE, TYPE_TRAP_TYPE, TYPE_NOTIFICATION_TYPE, TYPE_OBJECT_TYPE_V1, TYPE_OBJECT_TYPE_V2, TYPE_OBJECT_IDENTITY }; // Used in RTTIing a SIMCValue pointer enum ValueClass { VALUE_INVALID, VALUE_INTEGER, VALUE_OID, VALUE_OCTET_STRING, VALUE_BOOLEAN, VALUE_BITS, VALUE_NULL }; enum PrimitiveType { PRIMITIVE_INVALID, PRIMITIVE_INTEGER, PRIMITIVE_OID, PRIMITIVE_OCTET_STRING, PRIMITIVE_BOOLEAN, PRIMITIVE_BITS, PRIMITIVE_NULL, PRIMITIVE_NETWORK_ADDRESS, PRIMITIVE_IP_ADDRESS, PRIMITIVE_COUNTER, PRIMITIVE_GAUGE, PRIMITIVE_TIME_TICKS, PRIMITIVE_OPAQUE, PRIMITIVE_DISPLAY_STRING, PRIMITIVE_PHYS_ADDRESS, PRIMITIVE_MAC_ADDRESS, PRIMITIVE_INTEGER_32, PRIMITIVE_COUNTER_32, PRIMITIVE_GAUGE_32, PRIMITIVE_COUNTER_64, PRIMITIVE_UNSIGNED_32, PRIMITIVE_DATE_AND_TIME, PRIMITIVE_SNMP_UDP_ADDRESS, PRIMITIVE_SNMP_OSI_ADDRESS, PRIMITIVE_SNMP_IPX_ADDRESS }; SIMCModule(const char *const moduleName = NULL, const char * const inputFileName = NULL, SIMCSymbolTable *symbolTable = NULL, SIMCModuleList *listOfImportModules = NULL, SIMCModule *parentModule = NULL, int snmpVersion = 0, long lineNumber = 0, long columnNumber = 0, long referenceCount = 0); virtual ~SIMCModule(); // Manipulate the SNMP version of the module int GetSnmpVersion() const { return _snmpVersion; } BOOL SetSnmpVersion( int x ) { switch(x) { case 0: // '0' means union of v1 and v2 SMIs case 1: case 2: _snmpVersion = x; return TRUE; default: _snmpVersion = 0; return FALSE; } } // Manipulate the name of this module const char * GetModuleName() const { return GetSymbolName(); } void SetModuleName(const char * const s) { SetSymbolName(s); } // Manipulate the input file name of this module const char * GetInputFileName() const { return _inputFileName; } void SetInputFileName(const char * const s) { if(_inputFileName) delete []_inputFileName; _inputFileName = NewString(s); } // Manipulate the MODULE-IDENTITY clauses const char * GetLastUpdated() const { return _lastUpdated; } void SetLastUpdated(const char * const s) { if(_lastUpdated) delete [] _lastUpdated; _lastUpdated = NewString(s); } const char * GetOrganization() const { return _organization; } void SetOrganization(const char * const s) { if(_organization) delete [] _organization; _organization = NewString(s); } const char * GetContactInfo() const { return _contactInfo; } void SetContactInfo(const char * const s) { if(_contactInfo) delete [] _contactInfo; _contactInfo = NewString(s); } const char * GetDescription() const { return _description; } void SetDescription(const char * const s) { if(_description) delete [] _description; _description = NewString(s); } void AddRevisionClause(SIMCRevisionElement *revisionElement) { _revisionList.AddTail(revisionElement); } const SIMCRevisionList * GetRevisionList() const { return &_revisionList; } const char * GetModuleIdentityName() const { return _moduleIdentityName; } void SetModuleIdentityName(const char * const s) { if(_moduleIdentityName) delete [] _moduleIdentityName; _moduleIdentityName = NewString(s); } void SetModuleIdentityValue(SIMCCleanOidValue * value) { if(_moduleIdentityValue) delete _moduleIdentityValue; _moduleIdentityValue = value; } BOOL GetModuleIdentityValue( SIMCCleanOidValue& retVal) const { if( _moduleIdentityValue ) { CleanOidValueCopy(retVal, *_moduleIdentityValue); return TRUE; } else return FALSE; } // Get the whole symbol table itself. Very rarely used SIMCSymbolTable* GetSymbolTable() const { return _symbolTable; } // Get the list of import modules SIMCModuleList *GetListOfImportModules() const { return _listOfImportModules; } // Get the names of the import modules const SIMCModuleNameList* GetImportModuleNameList() const { return &_namesOfImportModules; } // If this module is created just because it appears in the // IMPORT clause of a parent module, then a pointer to the parent // module is returned. This has to be set by the user, of course const SIMCModule* GetParentModule() const { return _parentModule; } void SetParentModule( SIMCModule *parentModule); // Manipulate the list of import modules of this module void AddImportModule( SIMCModule * newModule); BOOL RemoveImportModule(SIMCModule *module); // This just adds to _namesOfImportModules void AddImportModuleName(const SIMCModule *newModule) { _namesOfImportModules.AddTail(newModule->GetModuleName()); } SIMCModule *GetImportModule(const char * const name) const; // Manipulate the list of object groups of this module void AddObjectGroup(SIMCObjectGroup *group); // Gets the object group whose name is the speciified name SIMCObjectGroup *GetObjectGroup(const char * const name) const; SIMCGroupList *GetObjectGroupList() const { return _listOfObjectGroups; } // Returns the object group in which this symbol is present SIMCObjectGroup *GetObjectGroup(SIMCSymbol *symbol) const; // Manipulate the list of NOTIFICATION-TYPES in this module SIMCNotificationList *GetNotificationTypeList() const { return _listOfNotificationTypes; } // A debugging function virtual void WriteSymbol(ostream& outStream) const; //-------------SYMBOL TABLE RELATED METHODS ---------------------- SIMCSymbol ** GetSymbol( const char * const symbolName) const; int GetImportedSymbol( const char * const symbolName, SIMCSymbol ** &retVal1, SIMCSymbol ** &retVal2) const; BOOL AddSymbol(SIMCSymbol * ); BOOL RemoveSymbol(const char * const symbolName); BOOL RemoveSymbol(SIMCSymbol **); BOOL ReplaceSymbol(const char *const symbolName, SIMCSymbol *newSymbol); //------------ RTTI methods(static)------------------------------------ static SymbolClass GetSymbolClass(SIMCSymbol **spp); static TypeClass GetTypeClass(SIMCType *t); static ValueClass GetValueClass(SIMCValue *v); //-------------- Methods used in semantic checking and resolution ----- // These set the state of each symbol to one ofenum SIMCResolutionStatus // RESOLVE_UNSET, // Haven't resolved it yet // RESOLVE_UNDEFINED, // Could not resolve it // RESOLVE_IMPORT, // Resolved to IMPORTS // RESOLVE_CORRECT // Resolved properly // as defined in enum SIMCResolutionStatus, of SIMCSymbol BOOL SetResolutionStatus(); static SIMCResolutionStatus SetResolutionStatus(SIMCSymbol **symbol); static SIMCResolutionStatus SetResolutionStatus(SIMCDefinedTypeReference * orig); static SIMCResolutionStatus SetResolutionStatus(SIMCDefinedValueReference *orig); private: // These are the recursive routines called by the above 2 methods static SIMCResolutionStatus SetResolutionStatusRec(SIMCDefinedTypeReference * orig, SIMCDefinedTypeReferenceList& checkedList); static SIMCResolutionStatus SetResolutionStatusRec(SIMCDefinedValueReference *orig, SIMCDefinedValueReferenceList& checkedList); public: // This sets the type that is the root of a subtype (range and size // constructs) or an ENUM or BITS type, and also the root value of a symbol that results from // successive assignment statements BOOL SetRootAll(); static SIMCResolutionStatus SetRootSymbol(SIMCSymbol **symbol); static SIMCResolutionStatus SetRootSubType(SIMCSubType *s); private: static SIMCResolutionStatus SetRootSubTypeRec(SIMCSubType *s, SIMCSubTypeList& checkedList); static SIMCResolutionStatus SetRootEnumOrBitsRec(SIMCEnumOrBitsType *t, SIMCSubTypeList& checkedList); public: // This is a hack to take care of DEFVAL clauses BOOL SetDefVal(); SIMCResolutionStatus SetDefVal(SIMCObjectTypeType *objType); // Returs the PrimitiveType of a symbol static PrimitiveType GetPrimitiveType(const SIMCTypeReference *typeRef); static PrimitiveType GetPrimitiveType(const char * const name); // Value checking functions static SIMCResolutionStatus IsIntegerValue(SIMCSymbol **s, int& retValue); static SIMCResolutionStatus IsObjectIdentifierValue(SIMCSymbol **s, SIMCOidValue* &retValue); static SIMCResolutionStatus IsNullValue(SIMCSymbol **s); static SIMCResolutionStatus IsOctetStringValue(SIMCSymbol **s, SIMCOctetStringValue* &retValue); static SIMCResolutionStatus IsBitsValue(SIMCSymbol **s, SIMCBitsValue * &retValue); // Type checking functions static SIMCResolutionStatus IsObjectTypeV1(SIMCSymbol **value, SIMCObjectTypeV1 * &retValObjectType); static SIMCResolutionStatus IsObjectTypeV2(SIMCSymbol **value, SIMCObjectTypeV2 * &retValObjectType); static SIMCResolutionStatus IsObjectType(SIMCSymbol **value, SIMCObjectTypeType * &retValObjectType); static SIMCResolutionStatus IsTrapType(SIMCSymbol **value, SIMCTrapTypeType * &retValTrapType); static SIMCResolutionStatus IsNotificationType(SIMCSymbol **value, SIMCNotificationTypeType * &retValNotificationType); static SIMCResolutionStatus IsEnumType(SIMCSymbol **value, SIMCEnumOrBitsType * &retValEnumType); // Reference checking functions static SIMCResolutionStatus IsTypeReference(SIMCSymbol **symbol, SIMCTypeReference * &retVal); static SIMCResolutionStatus IsValueReference(SIMCSymbol **symbol, SIMCSymbol ** &retTypeRef, SIMCBuiltInValueReference *&retVal); static SIMCResolutionStatus IsSequenceTypeReference(SIMCSymbol **symbol, SIMCBuiltInTypeReference * &retVal1, SIMCSequenceType *&retVal2); static SIMCResolutionStatus IsSequenceOfTypeReference(SIMCSymbol **symbol, SIMCBuiltInTypeReference * &retVal1, SIMCSequenceOfType *&retVal2); // For fabrication of OBJECT-GROUPs static SIMCResolutionStatus IsNamedNode(SIMCSymbol **symbol); static SIMCResolutionStatus IsScalar(SIMCSymbol **symbol); static SIMCResolutionStatus IsTable(SIMCSymbol **symbol); static SIMCResolutionStatus IsRow(SIMCSymbol **symbol); // Other helpers static SIMCResolutionStatus IsNotZeroSizeObject(SIMCObjectTypeType *objectType); static SIMCResolutionStatus IsFixedSizeObject(SIMCObjectTypeType *objectType); // This fabricates NOTICFICATION-TYPEs from TRAP-TYPEs and then proceeds to // fabricate NOTIFICATION-GROUPs from them. BOOL FabricateNotificationGroups(SIMCParseTree& theParseTree, const SIMCOidTree& theOidTree); }; template<> UINT AFXAPI HashKey(LPCSTR key); #endif // SIMC_MODULE_H