1 /* 2 * data.h -- 3 * 4 * Definitions for the main data structures. 5 * 6 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig. 7 * 8 * See the file "COPYING" for information on usage and redistribution 9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES. 10 * 11 * @(#) $Id: data.h 7966 2008-03-27 21:25:52Z schoenw $ 12 */ 13 14 #ifndef _DATA_H 15 #define _DATA_H 16 17 18 #include <stdio.h> 19 20 #include "smi.h" 21 22 23 24 typedef struct List { 25 SmiElement export; 26 void *ptr; 27 struct List *nextPtr; 28 } List; 29 30 typedef enum Kind { 31 KIND_UNKNOWN = 0 , /* */ 32 KIND_MODULE = 1 , /* */ 33 KIND_MACRO = 2 , /* */ 34 KIND_TYPE = 3 , /* */ 35 KIND_OBJECT = 4 , /* */ 36 KIND_IMPORT = 5 , /* descriptors to be imported. */ 37 KIND_IMPORTED = 6 , /* imported descriptor. syntax `mod.descr'. */ 38 KIND_NOTFOUND = 7 /* to be imported, but not found */ 39 } Kind; 40 #define NUM_KINDS 7 41 42 43 44 typedef unsigned short ParserFlags; 45 typedef unsigned short ModuleFlags; 46 typedef unsigned short ImportFlags; 47 typedef unsigned short ObjectFlags; 48 typedef unsigned short NodeFlags; 49 typedef unsigned short TypeFlags; 50 typedef unsigned short MacroFlags; 51 52 #define NODE_FLAG_ROOT 0x0001 /* mark node tree's root */ 53 54 #define FLAG_SEQTYPE 0x0002 /* type is set from SMIv1/2 SEQUENCE. */ 55 #define FLAG_REGISTERED 0x0004 /* On an Object: this is registered. */ 56 #define FLAG_INCOMPLETE 0x0008 /* Just defined by a forward */ 57 /* referenced type or object. */ 58 #define FLAG_CREATABLE 0x0040 /* On a Row: New rows can be created. */ 59 #define FLAG_INGROUP 0x0080 /* Node is contained in a group. */ 60 #define FLAG_INCOMPLIANCE 0x0100 /* Group is mentioned in a compliance 61 statement. 62 In case of ImportFlags: the import 63 is done through a compliance 64 MODULE phrase. */ 65 #define FLAG_INSYNTAX 0x0200 /* Type is mentioned in a syntax 66 statement. */ 67 68 69 typedef struct View { 70 char *name; 71 struct View *nextPtr; 72 struct View *prevPtr; 73 } View; 74 75 76 77 typedef struct Module { 78 SmiModule export; 79 time_t lastUpdated; /* only for SMIv2 modules */ 80 struct Object *objectPtr; 81 struct Object *firstObjectPtr; 82 struct Object *lastObjectPtr; 83 struct Type *firstTypePtr; 84 struct Type *lastTypePtr; 85 struct Class *firstClassPtr; 86 struct Class *lastClassPtr; 87 struct Macro *firstMacroPtr; 88 struct Macro *lastMacroPtr; 89 struct Identity *firstIdentityPtr; 90 struct Identity *lastIdentityPtr; 91 struct Import *firstImportPtr; 92 struct Import *lastImportPtr; 93 struct Revision *firstRevisionPtr; 94 struct Revision *lastRevisionPtr; 95 ModuleFlags flags; 96 int numImportedIdentifiers; 97 int numStatements; 98 int numModuleIdentities; 99 struct Module *nextPtr; 100 struct Module *prevPtr; 101 struct Node *prefixNodePtr; 102 } Module; 103 104 105 106 typedef struct Revision { 107 SmiRevision export; 108 Module *modulePtr; 109 struct Revision *nextPtr; 110 struct Revision *prevPtr; 111 int line; 112 } Revision; 113 114 115 116 typedef struct Import { 117 SmiImport export; 118 Module *modulePtr; 119 ImportFlags flags; 120 struct Import *nextPtr; 121 struct Import *prevPtr; 122 Kind kind; 123 int use; 124 int line; 125 } Import; 126 127 128 129 typedef struct NamedNumber { 130 SmiNamedNumber export; 131 struct Type *typePtr; 132 } NamedNumber; 133 134 135 136 typedef struct Range { 137 SmiRange export; 138 struct Type *typePtr; 139 } Range; 140 141 142 143 typedef struct Type { 144 SmiType export; 145 Module *modulePtr; 146 struct Type *parentPtr; 147 struct List *listPtr; 148 TypeFlags flags; 149 struct Type *nextPtr; 150 struct Type *prevPtr; 151 int line; 152 } Type; 153 154 155 156 typedef struct Option { 157 SmiOption export; 158 struct Object *compliancePtr; 159 struct Object *objectPtr; 160 int line; 161 } Option; 162 163 164 165 typedef struct Refinement { 166 SmiRefinement export; 167 struct Object *compliancePtr; /* the compl. Object this Ref belongs to */ 168 struct Object *objectPtr; /* the Object refined by this Refinement */ 169 Type *typePtr; /* the refined Type (or NULL) */ 170 Type *writetypePtr; /* the refined WriteType (or NULL) */ 171 int line; 172 } Refinement; 173 174 175 176 typedef struct Compl { 177 List *mandatorylistPtr; 178 List *optionlistPtr; 179 List *refinementlistPtr; 180 } Compl; 181 182 183 184 typedef struct Index { 185 int implied; 186 SmiIndexkind indexkind; 187 struct List *listPtr; /* list of index columns (Object *) */ 188 struct Object *rowPtr; /* a referenced row (e.g. SMIv2 AUGMENTS) */ 189 } Index; 190 191 192 typedef struct SubjectCategories { 193 struct List *categories; 194 int allCategories; 195 } SubjectCategories; 196 197 198 typedef struct Object { 199 SmiNode export; 200 Module *modulePtr; 201 ObjectFlags flags; 202 Type *typePtr; 203 struct Object *relatedPtr; /* a related Object (augmented row) */ 204 struct List *listPtr; /* OG, NT, NG, MC */ 205 struct List *optionlistPtr; 206 struct List *refinementlistPtr; 207 struct Node *nodePtr; 208 struct Object *prevPtr; /* chain of Objects in this Module */ 209 struct Object *nextPtr; 210 struct Object *prevSameNodePtr; /* chain of Objects for this Node */ 211 struct Object *nextSameNodePtr; 212 struct List *uniquenessPtr; /* UNIQUENESS */ 213 int line; 214 } Object; 215 216 217 218 typedef struct Node { 219 SmiSubid subid; 220 NodeFlags flags; 221 int oidlen; 222 SmiSubid *oid; 223 struct Node *parentPtr; 224 struct Node *nextPtr; 225 struct Node *prevPtr; 226 struct Node *firstChildPtr; 227 struct Node *lastChildPtr; 228 Object *firstObjectPtr; 229 Object *lastObjectPtr; 230 } Node; 231 232 233 234 typedef struct Macro { 235 SmiMacro export; 236 Module *modulePtr; 237 MacroFlags flags; 238 struct Macro *nextPtr; 239 struct Macro *prevPtr; 240 int line; 241 } Macro; 242 243 typedef struct Identity { 244 SmiIdentity export; 245 Module *modulePtr; 246 struct Identity *parentPtr; 247 struct Identity *nextPtr; 248 struct Identity *prevPtr; 249 int line; 250 } Identity; 251 252 typedef struct Class { 253 SmiClass export; 254 Module *modulePtr; 255 struct Attribute *firstAttributePtr; 256 struct Attribute *lastAttributePtr; 257 struct List *uniqueList; 258 struct Event *firstEventPtr; 259 struct Event *lastEventPtr; 260 struct Class *parentPtr; 261 struct Class *nextPtr; 262 struct Class *prevPtr; 263 int line; 264 } Class; 265 /*NOTE: if first element of uniqueList points 266 to current class that is class->uniqueList-> = class; 267 the class is scalar. If uniqueList = NULL; it is not 268 meant to be instatiated directly. Otherwise it contains 269 list of pointers to the class unique attributes. 270 */ 271 272 273 typedef struct Attribute { 274 SmiAttribute export; 275 Class *classPtr; 276 struct Type *parentTypePtr; 277 struct List *listPtr; 278 struct Attribute *nextPtr; 279 struct Attribute *prevPtr; 280 int line; 281 struct Class *parentClassPtr; 282 } Attribute; 283 284 typedef struct Event { 285 SmiEvent export; 286 Class *classPtr; 287 struct Event *nextPtr; 288 struct Event *prevPtr; 289 int line; 290 } Event; 291 292 293 294 295 typedef struct Parser { 296 char *path; 297 FILE *file; 298 int line; 299 int lcline; /* for SMI comment warning */ 300 Module *modulePtr; 301 ParserFlags flags; 302 List *firstIndexlabelPtr; /* only for the SMIng parser */ 303 char *identityObjectName; /* only for the SMIng parser */ 304 Module *complianceModulePtr; 305 Module *capabilitiesModulePtr; 306 Node *parentNodePtr; 307 int currentDecl; 308 int firstStatementLine; 309 int firstNestedStatementLine; 310 int firstRevisionLine; 311 Node *pendingNodePtr; 312 } Parser; 313 314 315 316 typedef struct Handle { 317 char *name; 318 struct Handle *prevPtr; 319 struct Handle *nextPtr; 320 View *firstViewPtr; 321 View *lastViewPtr; 322 Module *firstModulePtr; 323 Module *lastModulePtr; 324 Node *rootNodePtr; 325 Type *typeOctetStringPtr; 326 Type *typeObjectIdentifierPtr; 327 Type *typeInteger32Ptr; 328 Type *typeUnsigned32Ptr; 329 Type *typeInteger64Ptr; 330 Type *typeUnsigned64Ptr; 331 Type *typeFloat32Ptr; 332 Type *typeFloat64Ptr; 333 Type *typeFloat128Ptr; 334 Type *typeEnumPtr; 335 Type *typeBitsPtr; 336 Type *typePointerPtr; 337 int flags; 338 char *path; 339 char *cache; 340 char *cacheProg; 341 int errorLevel; 342 SmiErrorHandler *errorHandler; 343 Parser *parserPtr; 344 } Handle; 345 346 347 348 extern int smiDepth; /* SMI parser recursion depth */ 349 350 extern Handle *smiHandle; /* The current handle */ 351 352 353 354 extern Handle *addHandle(const char *name); 355 356 extern void removeHandle(Handle *handlePtr); 357 358 extern Handle *findHandleByName(const char *name); 359 360 361 362 extern View *addView(const char *modulename); 363 364 extern int isInView(const char *modulename); 365 366 367 368 extern Module *addModule(char *modulename, 369 char *path, 370 ModuleFlags flags, 371 Parser *parserPtr); 372 373 extern void setModuleIdentityObject(Module *modulePtr, 374 Object *objectPtr); 375 376 extern void setModuleLastUpdated(Module *modulePtr, 377 time_t lastUpdated); 378 379 extern void setModuleOrganization(Module *modulePtr, 380 char *organization); 381 382 extern void setModuleContactInfo(Module *modulePtr, 383 char *contactinfo); 384 385 extern void setModuleDescription(Module *modulePtr, 386 char *description, 387 Parser *parserPtr); 388 389 extern void setModuleReference(Module *modulePtr, 390 char *reference, 391 Parser *parserPtr); 392 393 extern Module *findModuleByName(const char *modulename); 394 395 396 397 extern Revision *addRevision(time_t date, 398 char *description, 399 Parser *parserPtr); 400 401 extern void setRevisionLine(Revision *revisionPtr, 402 int line, 403 Parser *parserPtr); 404 405 406 407 extern Import *addImport(char *name, 408 Parser *parserPtr); 409 410 extern void addImportFlags(Import *importPtr, ImportFlags flags); 411 412 extern void setImportModulename(Import *importPtr, 413 char *modulename); 414 415 extern int checkImports(Module *modulePtr, 416 Parser *parserPtr); 417 418 extern Import *findImportByName(const char *name, 419 Module *modulePtr); 420 421 extern Import *findImportByModulenameAndName(const char *modulename, 422 const char *name, 423 Module *modulePtr); 424 425 extern Object *addObject(char *objectname, 426 Node *parentNodePtr, 427 SmiSubid subid, 428 ObjectFlags flags, 429 Parser *parserPtr); 430 431 extern Object *duplicateObject(Object *templatePtr, 432 ObjectFlags flags, 433 Parser *parserPtr); 434 435 extern Node *addNode(Node *parentNodePtr, 436 SmiSubid subid, 437 NodeFlags flags, 438 Parser *parserPtr); 439 440 extern Node *createNodes(unsigned int oidlen, SmiSubid *oid); 441 442 extern Node *createNodesByOidString(const char *oid); 443 444 extern Node *getParentNode(Node *nodePtr); 445 446 /* 447 * setObjectName() might relink MIB tree object structures. If the 448 * current objectPtr is to be used after the call, it should look like 449 * objectPtr = setObjectName(objectPtr, name); 450 */ 451 extern Object *setObjectName(Object *objectPtr, 452 char *name, Parser *parserPtr); 453 454 extern void setObjectType(Object *objectPtr, 455 Type *typePtr); 456 457 extern void setObjectAccess(Object *objectPtr, 458 SmiAccess access); 459 460 extern void setObjectStatus(Object *objectPtr, 461 SmiStatus status); 462 463 extern void setObjectDescription(Object *objectPtr, 464 char *description, 465 Parser *parserPtr); 466 467 extern void setObjectReference(Object *objectPtr, 468 char *reference, 469 Parser *parserPtr); 470 471 extern void setObjectDecl(Object *objectPtr, 472 SmiDecl decl); 473 474 extern void setObjectUniqueness(Object *objectPtr, List *listPtr); 475 476 extern void setObjectInstallErrors(Object *objectPtr, List *listPtr); 477 478 extern void setObjectLine(Object *objectPtr, 479 int line, 480 Parser *parserPtr); 481 482 extern void setObjectNodekind(Object *objectPtr, 483 SmiNodekind nodekind); 484 485 extern void addObjectFlags(Object *objectPtr, 486 ObjectFlags flags); 487 488 extern void deleteObjectFlags(Object *objectPtr, 489 ObjectFlags flags); 490 491 extern int checkObjectFlags(Object *objectPtr, ObjectFlags flags); 492 493 extern void setObjectList(Object *objectPtr, 494 struct List *listPtr); 495 496 extern void setObjectRelated(Object *objectPtr, 497 Object *relatedPtr); 498 499 extern void setObjectImplied(Object *objectPtr, 500 int implied); 501 502 extern void setObjectCreate(Object *objectPtr, 503 int create); 504 505 extern void setObjectIndexkind(Object *objectPtr, 506 SmiIndexkind indexkind); 507 508 extern void setObjectIndex(Object *objectPtr, 509 Index *indexPtr); 510 511 extern void setObjectFormat(Object *objectPtr, 512 char *format); 513 514 extern void setObjectUnits(Object *objectPtr, 515 char *units); 516 517 extern void setObjectValue(Object *objectPtr, 518 SmiValue *valuePtr); 519 520 extern Node *findNodeByParentAndSubid(Node *parentNodePtr, 521 SmiSubid subid); 522 523 extern Node *findNodeByOid(unsigned int oidlen, SmiSubid *oid); 524 525 extern Node *findNodeByOidString(char *oid); 526 527 extern Object *findObjectByNode(Node *nodePtr); 528 529 extern Object *findObjectByModuleAndNode(Module *modulePtr, 530 Node *nodePtr); 531 532 extern Object *findObjectByModulenameAndNode(const char *modulename, 533 Node *nodePtr); 534 535 extern Object *findObjectByName(const char *objectname); 536 537 extern Object *findNextObjectByName(const char *objectname, 538 Object *prevObjectPtr); 539 540 extern Object *findObjectByModuleAndName(Module *modulePtr, 541 const char *objectname); 542 543 extern Object *findObjectByModulenameAndName(const char *modulename, 544 const char *objectname); 545 546 547 548 extern Type *addType(char *type_name, 549 SmiBasetype basetype, 550 TypeFlags flags, 551 Parser *parserPtr); 552 553 extern Type *duplicateType(Type *templatePtr, 554 TypeFlags flags, 555 Parser *parserPtr); 556 557 extern Type *setTypeName(Type *typePtr, 558 char *name); 559 560 extern void setTypeStatus(Type *typePtr, 561 SmiStatus status); 562 563 extern void setTypeBasetype(Type *typePtr, 564 SmiBasetype basetype); 565 566 extern void setTypeParent(Type *typePtr, 567 Type *parentPtr); 568 569 extern void setTypeList(Type *typePtr, 570 struct List *listPtr); 571 572 extern void setTypeDescription(Type *typePtr, 573 char *description, 574 Parser *parserPtr); 575 576 extern void setTypeReference(Type *typePtr, 577 char *reference, 578 Parser *parserPtr); 579 580 extern void setTypeDecl(Type *typePtr, 581 SmiDecl decl); 582 583 extern void setTypeLine(Type *typePtr, 584 int line, 585 Parser *parserPtr); 586 587 extern void addTypeFlags(Type *typePtr, 588 TypeFlags flags); 589 590 extern void deleteTypeFlags(Type *typePtr, 591 TypeFlags flags); 592 593 extern void setTypeFormat(Type *typePtr, 594 char *format); 595 596 extern void setTypeUnits(Type *typePtr, 597 char *units); 598 599 extern void setTypeValue(Type *typePtr, 600 SmiValue *valuePtr); 601 602 603 604 extern Type *findTypeByName(const char *type_name); 605 606 extern Type *findNextTypeByName(const char *type_name, 607 Type *prevTypePtr); 608 609 extern Type *findTypeByModuleAndName(Module *modulePtr, 610 const char *type_name); 611 612 extern Type *findTypeByModulenameAndName(const char *modulename, 613 const char *type_name); 614 615 extern NamedNumber *findTypeNamedNumber(Type *typePtr, 616 SmiInteger32 number); 617 618 619 620 extern Identity *addIdentity(char *identityname, 621 Parser *parserPtr); 622 623 extern void setIdentityDecl(Identity *identityPtr, 624 SmiDecl decl); 625 626 extern void setIdentityStatus(Identity *identityPtr, 627 SmiStatus status); 628 629 extern void setIdentityDescription(Identity *identityPtr, 630 char *description, 631 Parser *parserPtr); 632 633 extern void setIdentityReference(Identity *identityPtr, 634 char *reference, 635 Parser *parserPtr); 636 637 extern void setIdentityParent(Identity *identityPtr, 638 Identity *parentPtr); 639 640 extern Identity *findIdentityByName(const char *identityname); 641 642 extern Identity *findIdentityByModuleAndName(Module *modulePtr, 643 const char *identityname); 644 645 extern Identity *findIdentityByModulenameAndName(const char *modulename, 646 const char *identity_name); 647 648 649 650 651 extern Class *addClass(char *classname, 652 Parser *parserPtr); 653 654 extern void setClassDecl(Class *classPtr, 655 SmiDecl decl); 656 657 extern void setClassStatus(Class *classPtr, 658 SmiStatus status); 659 660 extern void setClassDescription(Class *classPtr, 661 char *description, 662 Parser *parserPtr); 663 664 extern void setClassReference(Class *classPtr, 665 char *reference, 666 Parser *parserPtr); 667 668 extern Class *findClassByModuleAndName(Module *modulePtr, char *name); 669 670 extern Class *findClassByModulenameAndName(const char *modulename, 671 const char *class_name); 672 673 674 675 extern Attribute *duplicateTypeToAttribute(Type *templatePtr, 676 Class *classPtr, Parser *parserPtr); 677 678 extern Attribute *addAttribute(char *attribute_name, 679 Class *classPtr, Parser *parserPtr); 680 681 extern void setAttributeName(Attribute *attributePtr, char *name); 682 683 extern void setAttributeDecl(Attribute *attributePtr, 684 SmiDecl decl); 685 686 extern void setAttributeStatus(Attribute *attributePtr, 687 SmiStatus status); 688 689 extern void setAttributeDescription(Attribute *attributePtr, 690 char *description); 691 692 extern void setAttributeReference(Attribute *attributePtr, 693 char *reference); 694 695 extern void setAttributeAccess(Attribute *attributePtr,SmiAccess access); 696 697 extern void setAttributeParentType(Attribute *attributePtr, 698 Type *parentPtr); 699 700 extern void setAttributeParentClass(Attribute *attributePtr, 701 Class *parentPtr); 702 703 extern void setAttributeList(Attribute *attributePtr, List *listPtr); 704 705 706 extern Event *addEvent(char *eventname, Class *classPtr, 707 Parser *parserPtr); 708 709 710 extern Macro *addMacro(char *macroname, 711 MacroFlags flags, 712 Parser *parserPtr); 713 714 extern void setMacroStatus(Macro *macroPtr, 715 SmiStatus status); 716 717 extern void setMacroDescription(Macro *macroPtr, 718 char *description, 719 Parser *parserPtr); 720 721 extern void setMacroReference(Macro *macroPtr, 722 char *reference, 723 Parser *parserPtr); 724 725 extern void setMacroDecl(Macro *macroPtr, 726 SmiDecl decl); 727 728 extern void setMacroAbnf(Macro *macroPtr, 729 char *abnf, 730 Parser *parserPtr); 731 732 extern void setMacroLine(Macro *macroPtr, 733 int line, 734 Parser *parserPtr); 735 736 extern Macro *findMacroByName(const char *macroname); 737 738 extern Macro *findMacroByModuleAndName(Module *modulePtr, 739 const char *macroname); 740 741 extern Macro *findMacroByModulenameAndName(const char *modulename, 742 const char *macroname); 743 744 745 extern NamedNumber *findNamedNumberByName(Type *typePtr, 746 const char *name); 747 748 749 750 extern int smiInitData(void); 751 752 extern void smiFreeData(void); 753 754 extern Module *loadModule(const char *modulename, Parser *parserPtr); 755 756 757 #endif /* _DATA_H */ 758