4 * Operations on the main data structures.
6 * Copyright (c) 1999-2002 Frank Strauss, Technical University of Braunschweig.
8 * See the file "COPYING" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11 * @(#) $Id: data.c 7822 2008-03-01 13:22:42Z schoenw $
19 #include <sys/types.h>
20 #if !defined(_MSC_VER) && !defined(__MINGW32__)
42 #include "scanner-smi.h"
43 extern int smiparse();
47 #include "scanner-sming.h"
48 extern int smingparse();
51 #define stringKind(kind) ( \
52 (kind == KIND_ANY) ? "ANY" : \
53 (kind == KIND_MODULE) ? "MODULE" : \
54 (kind == KIND_MACRO) ? "MACRO" : \
55 (kind == KIND_TYPE) ? "TYPE" : \
56 (kind == KIND_OBJECT) ? "OBJECT" : \
57 (kind == KIND_IMPORT) ? "IMPORT" : \
62 static Handle *firstHandlePtr = NULL;
63 static Handle *lastHandlePtr = NULL;
67 *----------------------------------------------------------------------
71 * Adds a libsmi handle with a given name.
74 * 0 on success or -1 on an error.
79 *----------------------------------------------------------------------
82 Handle *addHandle(const char *name)
86 handlePtr = (Handle *) smiMalloc(sizeof(Handle));
88 handlePtr->name = smiStrdup(name);
90 handlePtr->nextPtr = NULL;
91 handlePtr->prevPtr = lastHandlePtr;
92 if (!firstHandlePtr) firstHandlePtr = handlePtr;
93 if (lastHandlePtr) lastHandlePtr->nextPtr = handlePtr;
94 lastHandlePtr = handlePtr;
102 *----------------------------------------------------------------------
106 * Removes a given libsmi handle.
114 *----------------------------------------------------------------------
117 void removeHandle(Handle *handlePtr)
119 if (handlePtr->prevPtr) {
120 handlePtr->prevPtr->nextPtr = handlePtr->nextPtr;
122 firstHandlePtr = handlePtr->nextPtr;
124 if (handlePtr->nextPtr) {
125 handlePtr->nextPtr->prevPtr = handlePtr->prevPtr;
127 lastHandlePtr = handlePtr->prevPtr;
130 smiFree(handlePtr->name);
137 *----------------------------------------------------------------------
139 * findHandleByName --
141 * Lookup an libsmi handle by its name.
144 * A pointer to the Handle structure or
145 * NULL if it is not found.
150 *----------------------------------------------------------------------
153 Handle *findHandleByName(const char *name)
160 for (handlePtr = firstHandlePtr; handlePtr;
161 handlePtr = handlePtr->nextPtr) {
162 if (!strcmp(handlePtr->name, name)) {
174 *----------------------------------------------------------------------
178 * Add a module to the `view' (the list of modules, seen by the user).
181 * A pointer to the new View structure or
182 * NULL if terminated due to an error.
187 *----------------------------------------------------------------------
190 View *addView(const char *modulename)
194 viewPtr = (View *) smiMalloc(sizeof(View));
196 viewPtr->name = smiStrdup(modulename);
197 viewPtr->nextPtr = NULL;
198 viewPtr->prevPtr = smiHandle->lastViewPtr;
199 if (!smiHandle->firstViewPtr) smiHandle->firstViewPtr = viewPtr;
200 if (smiHandle->lastViewPtr) smiHandle->lastViewPtr->nextPtr = viewPtr;
201 smiHandle->lastViewPtr = viewPtr;
209 *----------------------------------------------------------------------
213 * Check, whether a given module is in the current view.
216 * != 0 if in view, 0 otherwise.
221 *----------------------------------------------------------------------
224 int isInView(const char *modulename)
229 if (smiHandle->flags & SMI_FLAG_VIEWALL) {
234 for (viewPtr = smiHandle->firstViewPtr; viewPtr; viewPtr = viewPtr->nextPtr) {
235 if (!strcmp(modulename, viewPtr->name)) {
244 *----------------------------------------------------------------------
248 * Create a new MIB module.
251 * A pointer to the new Module structure or
252 * NULL if terminated due to an error.
257 *----------------------------------------------------------------------
260 Module *addModule(char *modulename, char *path, ModuleFlags flags,
265 modulePtr = (Module *) smiMalloc(sizeof(Module));
267 modulePtr->export.name = modulename;
268 modulePtr->export.path = path;
269 modulePtr->export.language = SMI_LANGUAGE_UNKNOWN;
270 modulePtr->export.organization = NULL;
271 modulePtr->export.contactinfo = NULL;
272 modulePtr->export.description = NULL;
273 modulePtr->export.reference = NULL;
274 modulePtr->export.conformance = 0;
276 modulePtr->lastUpdated = 0;
277 modulePtr->flags = flags;
278 modulePtr->objectPtr = NULL;
280 modulePtr->prefixNodePtr = NULL;
281 modulePtr->firstObjectPtr = NULL;
282 modulePtr->lastObjectPtr = NULL;
283 modulePtr->firstTypePtr = NULL;
284 modulePtr->lastTypePtr = NULL;
285 modulePtr->firstMacroPtr = NULL;
286 modulePtr->lastMacroPtr = NULL;
287 modulePtr->firstImportPtr = NULL;
288 modulePtr->lastImportPtr = NULL;
289 modulePtr->firstRevisionPtr = NULL;
290 modulePtr->lastRevisionPtr = NULL;
292 modulePtr->numImportedIdentifiers = 0;
293 modulePtr->numStatements = 0;
294 modulePtr->numModuleIdentities = 0;
296 modulePtr->nextPtr = NULL;
297 modulePtr->prevPtr = smiHandle->lastModulePtr;
298 if (!smiHandle->firstModulePtr) smiHandle->firstModulePtr = modulePtr;
299 if (smiHandle->lastModulePtr) smiHandle->lastModulePtr->nextPtr = modulePtr;
300 smiHandle->lastModulePtr = modulePtr;
308 *----------------------------------------------------------------------
310 * setModuleIdentityObject --
312 * Set the objectPtr of a given Module to the OBJECT-IDENTITY object.
320 *----------------------------------------------------------------------
323 void setModuleIdentityObject(Module *modulePtr, Object *objectPtr)
325 modulePtr->objectPtr = objectPtr;
331 *----------------------------------------------------------------------
333 * setModuleLastUpdated --
335 * Set the lastUpdated time_t value of a given Module.
343 *----------------------------------------------------------------------
346 void setModuleLastUpdated(Module *modulePtr, time_t lastUpdated)
348 modulePtr->lastUpdated = lastUpdated;
354 *----------------------------------------------------------------------
356 * setModuleOrganization --
358 * Set the organization string of a given Module.
366 *----------------------------------------------------------------------
369 void setModuleOrganization(Module *modulePtr, char *organization)
371 modulePtr->export.organization = organization;
372 while (strlen(organization) && organization[strlen(organization)-1] == '\n') {
373 organization[strlen(organization) - 1] = 0;
380 *----------------------------------------------------------------------
382 * setModuleContactInfo --
384 * Set the contactInfo string of a given Module.
392 *----------------------------------------------------------------------
395 void setModuleContactInfo(Module *modulePtr, char *contactinfo)
397 modulePtr->export.contactinfo = contactinfo;
403 *----------------------------------------------------------------------
405 * setModuleDescription --
407 * Set the description string of a given Module.
415 *----------------------------------------------------------------------
418 void setModuleDescription(Module *modulePtr, char *description,
421 if (modulePtr->export.description)
422 smiFree(modulePtr->export.description);
423 if (parserPtr->flags & SMI_FLAG_NODESCR) {
424 smiFree(description);
425 modulePtr->export.description = NULL;
427 modulePtr->export.description = description;
434 *----------------------------------------------------------------------
436 * setModuleReference --
438 * Set the reference string of a given Module.
446 *----------------------------------------------------------------------
449 void setModuleReference(Module *modulePtr, char *reference, Parser *parserPtr)
451 if (modulePtr->export.reference)
452 smiFree(modulePtr->export.reference);
453 if (parserPtr->flags & SMI_FLAG_NODESCR) {
455 modulePtr->export.reference = NULL;
457 modulePtr->export.reference = reference;
464 *----------------------------------------------------------------------
466 * findModuleByName --
468 * Lookup a Module by a given name.
471 * A pointer to the Module structure or
472 * NULL if it is not found.
477 *----------------------------------------------------------------------
480 Module *findModuleByName(const char *modulename)
484 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
485 modulePtr = modulePtr->nextPtr) {
486 if ((modulePtr->export.name) &&
487 !strcmp(modulePtr->export.name, modulename)) {
498 *----------------------------------------------------------------------
502 * Adds a revision entry for the given module.
505 * 0 on success or -1 on an error.
510 *----------------------------------------------------------------------
513 Revision *addRevision(time_t date, char *description, Parser *parserPtr)
515 Revision *revisionPtr, *r;
518 revisionPtr = (Revision *) smiMalloc(sizeof(Revision));
520 modulePtr = parserPtr->modulePtr;
522 revisionPtr->modulePtr = modulePtr;
523 revisionPtr->export.date = date;
524 if (parserPtr->flags & SMI_FLAG_NODESCR) {
525 smiFree(description);
526 revisionPtr->export.description = NULL;
528 revisionPtr->export.description = description;
530 revisionPtr->line = parserPtr ? parserPtr->line : -1;
532 for (r = modulePtr->lastRevisionPtr; r; r = r->prevPtr) {
533 if (r->export.date > date) break;
536 revisionPtr->nextPtr = r->nextPtr;
537 revisionPtr->prevPtr = r;
539 r->nextPtr->prevPtr = revisionPtr;
541 modulePtr->lastRevisionPtr = revisionPtr;
543 r->nextPtr = revisionPtr;
545 revisionPtr->prevPtr = NULL;
546 if (modulePtr->firstRevisionPtr) {
547 modulePtr->firstRevisionPtr->prevPtr = revisionPtr;
548 revisionPtr->nextPtr = modulePtr->firstRevisionPtr;
550 modulePtr->lastRevisionPtr = revisionPtr;
551 revisionPtr->nextPtr = NULL;
553 modulePtr->firstRevisionPtr = revisionPtr;
556 return (revisionPtr);
562 *----------------------------------------------------------------------
566 * Set the line of definition of a given Revision.
574 *----------------------------------------------------------------------
577 void setRevisionLine(Revision *revisionPtr, int line, Parser *parserPtr)
580 revisionPtr->line = line;
582 revisionPtr->line = parserPtr ? parserPtr->line : -1;
589 *----------------------------------------------------------------------
593 * Adds a descriptor to the actual module's list of imported
594 * descriptors. This list may be checked by checkImports()
598 * 0 on success or -1 on an error.
603 *----------------------------------------------------------------------
606 Import *addImport(char *name, Parser *parserPtr)
611 importPtr = (Import *) smiMalloc(sizeof(Import));
613 modulePtr = parserPtr->modulePtr;
615 importPtr->modulePtr = modulePtr;
616 importPtr->export.name = name;
617 importPtr->export.module = NULL; /* not yet known */
618 importPtr->kind = KIND_UNKNOWN; /* not yet known */
620 importPtr->flags = 0;
621 importPtr->line = parserPtr ? parserPtr->line : -1;
623 importPtr->nextPtr = NULL;
624 importPtr->prevPtr = modulePtr->lastImportPtr;
625 if (!modulePtr->firstImportPtr)
626 modulePtr->firstImportPtr = importPtr;
627 if (modulePtr->lastImportPtr)
628 modulePtr->lastImportPtr->nextPtr = importPtr;
629 modulePtr->lastImportPtr = importPtr;
637 *----------------------------------------------------------------------
641 * Add flags to the flags of a given Import struct.
649 *----------------------------------------------------------------------
652 void addImportFlags(Import *importPtr, ImportFlags flags)
654 importPtr->flags |= flags;
660 *----------------------------------------------------------------------
662 * setImportModulename --
664 * Set the modulename part of a given Import struct.
672 *----------------------------------------------------------------------
675 void setImportModulename(Import *importPtr, char *modulename)
677 if (importPtr->export.module) {
678 smiFree(importPtr->export.module);
680 importPtr->export.module = modulename;
686 *----------------------------------------------------------------------
690 * Check wheather all descriptors in the actual module's list
691 * are imported by a given Module. Implicitly set all Imports'
695 * 0 on success or -1 on an error or number of descriptors not found.
700 *----------------------------------------------------------------------
703 int checkImports(Module *modulePtr, Parser *parserPtr)
711 for (importPtr = parserPtr->modulePtr->firstImportPtr;
712 importPtr; importPtr = importPtr->nextPtr) {
714 if (importPtr->kind == KIND_UNKNOWN) {
716 if ((smiNode = smiGetNode(&modulePtr->export,
717 importPtr->export.name))) {
718 importPtr->export.module =
719 smiStrdup(modulePtr->export.name);
720 importPtr->kind = KIND_OBJECT;
721 } else if ((smiType = smiGetType(&modulePtr->export,
722 importPtr->export.name))) {
723 importPtr->export.module =
724 smiStrdup(modulePtr->export.name);
725 importPtr->kind = KIND_TYPE;
726 } else if ((smiMacro = smiGetMacro(&modulePtr->export,
727 importPtr->export.name))) {
728 importPtr->export.module =
729 smiStrdup(modulePtr->export.name);
730 importPtr->kind = KIND_MACRO;
733 importPtr->export.module =
734 smiStrdup(modulePtr->export.name);
735 smiPrintError(parserPtr, ERR_IDENTIFIER_NOT_IN_MODULE,
736 importPtr->export.name,
737 modulePtr->export.name);
738 importPtr->kind = KIND_NOTFOUND;
742 importPtr->export.module = smiStrdup("");
743 importPtr->kind = KIND_NOTFOUND;
754 *----------------------------------------------------------------------
756 * findImportByName --
758 * Lookup an import descriptor by its name and the module to look in.
761 * A pointer to the Import structure or
762 * NULL if it is not found.
767 *----------------------------------------------------------------------
770 Import *findImportByName(const char *name, Module *modulePtr)
777 for (importPtr = modulePtr->firstImportPtr; importPtr;
778 importPtr = importPtr->nextPtr) {
779 if ((!strcmp(importPtr->export.name, name)) &&
780 (!(importPtr->flags & FLAG_INCOMPLIANCE))) {
792 *----------------------------------------------------------------------
794 * findImportByModulenameAndName --
796 * Lookup an import descriptor by its name and the modulename
797 * it is imported from and the module to look in.
800 * A pointer to the Import structure or
801 * NULL if it is not found.
806 *----------------------------------------------------------------------
809 Import *findImportByModulenameAndName(const char *modulename,
810 const char *name, Module *modulePtr)
814 for (importPtr = modulePtr->firstImportPtr; importPtr;
815 importPtr = importPtr->nextPtr) {
816 if ((!strcmp(importPtr->export.name, name)) &&
817 (!strcmp(importPtr->export.module, modulename))) {
828 *----------------------------------------------------------------------
832 * Create a new Object and Node or update an existing one.
833 * Also updates other Objects and Nodes according
834 * to the PendingNode information.
837 * A pointer to the new Object structure or
838 * NULL if terminated due to an error.
843 *----------------------------------------------------------------------
846 Object *addObject(char *objectname, Node *parentNodePtr, SmiSubid subid,
847 ObjectFlags flags, Parser *parserPtr)
854 objectPtr = (Object *) smiMalloc(sizeof(Object));
856 modulePtr = parserPtr ? parserPtr->modulePtr : NULL;
858 objectPtr->export.name = objectname;
859 objectPtr->export.decl = SMI_DECL_UNKNOWN;
860 objectPtr->export.access = SMI_ACCESS_UNKNOWN;
861 objectPtr->export.status = SMI_STATUS_UNKNOWN;
862 objectPtr->export.format = NULL;
863 objectPtr->export.value.basetype = SMI_BASETYPE_UNKNOWN;
864 objectPtr->export.units = NULL;
865 objectPtr->export.description = NULL;
866 objectPtr->export.reference = NULL;
867 objectPtr->export.indexkind = SMI_INDEX_UNKNOWN;
868 objectPtr->export.implied = 0;
869 objectPtr->export.create = 0;
870 objectPtr->export.nodekind = SMI_NODEKIND_UNKNOWN;
872 objectPtr->modulePtr = modulePtr;
873 objectPtr->nodePtr = NULL;
874 objectPtr->prevSameNodePtr = NULL;
875 objectPtr->nextSameNodePtr = NULL;
876 objectPtr->typePtr = NULL;
877 objectPtr->listPtr = NULL;
878 objectPtr->flags = flags;
879 objectPtr->line = parserPtr ? parserPtr->line : -1;
881 objectPtr->uniquenessPtr = NULL;
883 objectPtr->export.oidlen = 0; /* filled in by */
884 objectPtr->export.oid = NULL; /* second pass. */
886 objectPtr->nextPtr = NULL;
888 objectPtr->prevPtr = modulePtr->lastObjectPtr;
889 if (!modulePtr->firstObjectPtr)
890 modulePtr->firstObjectPtr = objectPtr;
891 if (modulePtr->lastObjectPtr)
892 modulePtr->lastObjectPtr->nextPtr = objectPtr;
893 modulePtr->lastObjectPtr = objectPtr;
895 objectPtr->prevPtr = NULL;
899 * Link it into the tree.
901 nodePtr = findNodeByParentAndSubid(parentNodePtr, subid);
902 if ((parentNodePtr == parserPtr->pendingNodePtr) || (!nodePtr)) {
904 /* a new Node has to be created for this Object */
905 nodePtr = addNode(parentNodePtr, subid, flags, parserPtr);
906 nodePtr->firstObjectPtr = objectPtr;
907 nodePtr->lastObjectPtr = objectPtr;
910 objectPtr->prevSameNodePtr = nodePtr->lastObjectPtr;
911 if (!nodePtr->firstObjectPtr)
912 nodePtr->firstObjectPtr = objectPtr;
913 if (nodePtr->lastObjectPtr)
914 nodePtr->lastObjectPtr->nextSameNodePtr = objectPtr;
915 nodePtr->lastObjectPtr = objectPtr;
917 objectPtr->nodePtr = nodePtr;
925 *----------------------------------------------------------------------
929 * Create a new Object as a duplicate of a given one but with
930 * an affiliation to another module with new flags and with
931 * uninitialzied values.
934 * A pointer to the new Object structure or
935 * NULL if terminated due to an error.
940 *----------------------------------------------------------------------
943 Object *duplicateObject(Object *templatePtr, ObjectFlags flags,
950 objectPtr = (Object *) smiMalloc(sizeof(Object));
952 modulePtr = parserPtr->modulePtr;
953 nodePtr = templatePtr->nodePtr;
955 objectPtr->export.name = NULL;
956 objectPtr->export.decl = SMI_DECL_UNKNOWN;
957 objectPtr->export.access = SMI_ACCESS_UNKNOWN;
958 objectPtr->export.status = SMI_STATUS_UNKNOWN;
959 objectPtr->export.format = NULL;
960 objectPtr->export.value.basetype = SMI_BASETYPE_UNKNOWN;
961 objectPtr->export.units = NULL;
962 objectPtr->export.description = NULL;
963 objectPtr->export.reference = NULL;
964 objectPtr->export.indexkind = SMI_INDEX_UNKNOWN;
965 objectPtr->export.implied = 0;
966 objectPtr->export.create = 0;
967 objectPtr->export.nodekind = SMI_NODEKIND_UNKNOWN;
969 objectPtr->modulePtr = modulePtr;
970 objectPtr->nodePtr = nodePtr;
971 objectPtr->prevSameNodePtr = NULL;
972 objectPtr->nextSameNodePtr = NULL;
973 objectPtr->typePtr = NULL;
974 objectPtr->listPtr = NULL;
975 objectPtr->flags = flags;
976 objectPtr->line = parserPtr ? parserPtr->line : -1;
978 objectPtr->export.oidlen = 0; /* filled in by */
979 objectPtr->export.oid = NULL; /* second pass. */
981 objectPtr->nextPtr = NULL;
983 objectPtr->prevPtr = modulePtr->lastObjectPtr;
984 if (!modulePtr->firstObjectPtr)
985 modulePtr->firstObjectPtr = objectPtr;
986 if (modulePtr->lastObjectPtr)
987 modulePtr->lastObjectPtr->nextPtr = objectPtr;
988 modulePtr->lastObjectPtr = objectPtr;
990 objectPtr->prevPtr = NULL;
993 objectPtr->prevSameNodePtr = nodePtr->lastObjectPtr;
994 if (!nodePtr->firstObjectPtr)
995 nodePtr->firstObjectPtr = objectPtr;
996 if (nodePtr->lastObjectPtr)
997 nodePtr->lastObjectPtr->nextSameNodePtr = objectPtr;
998 nodePtr->lastObjectPtr = objectPtr;
999 objectPtr->nodePtr = nodePtr;
1007 *----------------------------------------------------------------------
1011 * Create a new Node by a given parent Node and subid.
1014 * A pointer to the new Node structure or
1015 * NULL if terminated due to an error.
1020 *----------------------------------------------------------------------
1023 Node *addNode (Node *parentNodePtr, SmiSubid subid, NodeFlags flags,
1029 nodePtr = (Node *) smiMalloc(sizeof(Node));
1031 nodePtr->flags = flags;
1032 nodePtr->subid = subid;
1033 nodePtr->parentPtr = parentNodePtr;
1034 nodePtr->firstChildPtr = NULL;
1035 nodePtr->lastChildPtr = NULL;
1036 nodePtr->firstObjectPtr = NULL;
1037 nodePtr->lastObjectPtr = NULL;
1040 * this cannot be set in all situations (pending sub trees).
1041 * we delay it to the second pass.
1043 nodePtr->oidlen = 0;
1044 nodePtr->oid = NULL;
1046 if (parentNodePtr) {
1047 if (parentNodePtr->firstChildPtr) {
1048 for (c = parentNodePtr->firstChildPtr;
1049 c && (c->subid < subid);
1052 if (c != parentNodePtr->firstChildPtr) {
1053 c->prevPtr->nextPtr = nodePtr;
1054 nodePtr->prevPtr = c->prevPtr;
1055 c->prevPtr = nodePtr;
1056 nodePtr->nextPtr = c;
1058 c->prevPtr = nodePtr;
1059 nodePtr->nextPtr = c;
1060 nodePtr->prevPtr = NULL;
1061 parentNodePtr->firstChildPtr = nodePtr;
1064 nodePtr->nextPtr = NULL;
1065 nodePtr->prevPtr = parentNodePtr->lastChildPtr;
1066 parentNodePtr->lastChildPtr->nextPtr = nodePtr;
1067 parentNodePtr->lastChildPtr = nodePtr;
1070 parentNodePtr->firstChildPtr = nodePtr;
1071 parentNodePtr->lastChildPtr = nodePtr;
1072 nodePtr->nextPtr = NULL;
1073 nodePtr->prevPtr = NULL;
1083 *----------------------------------------------------------------------
1087 * Create all missing Nodes down the tree along all subids of
1091 * A pointer to the leaf Node structure or
1092 * NULL if terminated due to an error.
1097 *----------------------------------------------------------------------
1100 Node *createNodes(unsigned int oidlen, SmiSubid *oid)
1102 Node *parentNodePtr, *nodePtr;
1105 parentNodePtr = smiHandle->rootNodePtr;
1107 for(i = 0; i < oidlen; i++) {
1108 if (!(nodePtr = findNodeByParentAndSubid(parentNodePtr, oid[i]))) {
1109 nodePtr = addNode(parentNodePtr, oid[i], 0, NULL);
1111 parentNodePtr = nodePtr;
1114 return parentNodePtr;
1120 *----------------------------------------------------------------------
1122 * createNodesByOidString --
1124 * Create all missing Nodes down the tree along all subids of
1128 * A pointer to the leaf Node structure or
1129 * NULL if terminated due to an error.
1134 *----------------------------------------------------------------------
1137 Node *createNodesByOidString(const char *oid)
1140 Node *parentNodePtr, *nodePtr;
1143 parentNodePtr = smiHandle->rootNodePtr;
1144 elements = smiStrdup(oid);
1146 p = strtok(elements, ".");
1148 subid = (unsigned int)strtoul(p, NULL, 0);
1149 if (!(nodePtr = findNodeByParentAndSubid(parentNodePtr,
1151 nodePtr = addNode(parentNodePtr, subid, 0, NULL);
1153 parentNodePtr = nodePtr;
1154 } while ((p = strtok(NULL, ".")));
1158 return parentNodePtr;
1164 *----------------------------------------------------------------------
1168 * Return the parent of a given Node.
1171 * A pointer to the parent Node structure.
1176 *----------------------------------------------------------------------
1179 Node *getParentNode(Node *nodePtr)
1181 return nodePtr->parentPtr;
1187 *----------------------------------------------------------------------
1191 * Merge the subtree rooted at `from' into the `to' tree recursively
1192 * and release the `from' tree.
1200 *----------------------------------------------------------------------
1203 static void mergeNodeTrees(Node *toNodePtr, Node *fromNodePtr,
1206 Node *nodePtr, *toChildPtr, *nextPtr;
1209 /* (1) merge lists of Objects for this node */
1210 if (fromNodePtr->firstObjectPtr) {
1211 if (!toNodePtr->firstObjectPtr) {
1212 toNodePtr->firstObjectPtr = fromNodePtr->firstObjectPtr;
1213 toNodePtr->lastObjectPtr = fromNodePtr->lastObjectPtr;
1215 fromNodePtr->firstObjectPtr->prevSameNodePtr =
1216 toNodePtr->lastObjectPtr;
1217 toNodePtr->lastObjectPtr->nextSameNodePtr =
1218 fromNodePtr->firstObjectPtr;
1219 toNodePtr->lastObjectPtr = fromNodePtr->lastObjectPtr;
1222 for (objectPtr = fromNodePtr->firstObjectPtr;
1223 objectPtr; objectPtr = objectPtr->nextSameNodePtr) {
1224 objectPtr->nodePtr = toNodePtr;
1228 /* (2) loop: merge all first-level `from' sub-trees to `to' */
1229 /* adjust all `from' sub-nodes' parentPtrs */
1230 for (nodePtr = fromNodePtr->firstChildPtr; nodePtr;
1231 nodePtr = nodePtr->nextPtr) {
1232 nodePtr->parentPtr = toNodePtr;
1234 if (!toNodePtr->firstChildPtr) {
1236 * if `to' has no sub-nodes, just move the `from' sub-nodes.
1238 toNodePtr->firstChildPtr = fromNodePtr->firstChildPtr;
1239 toNodePtr->lastChildPtr = fromNodePtr->lastChildPtr;
1242 * otherwise, we really have to merge both trees...
1244 for (nodePtr = fromNodePtr->firstChildPtr; nodePtr; ) {
1245 nextPtr = nodePtr->nextPtr;
1246 if ((toChildPtr = findNodeByParentAndSubid(toNodePtr,
1249 * if a sub-node with the same subid is already present
1250 * in `to', merge them recursively.
1252 mergeNodeTrees(toChildPtr, nodePtr, parserPtr);
1255 * otherwise, move the sub-tree from `from' to `to'.
1257 if (nodePtr->subid < toNodePtr->firstChildPtr->subid) {
1258 /* move to the head. */
1259 nodePtr->nextPtr = toNodePtr->firstChildPtr;
1260 toNodePtr->firstChildPtr = nodePtr;
1261 } else if (nodePtr->subid > toNodePtr->lastChildPtr->subid) {
1262 /* move to the end. */
1263 nodePtr->prevPtr = toNodePtr->lastChildPtr;
1264 toNodePtr->lastChildPtr->nextPtr = nodePtr;
1265 toNodePtr->lastChildPtr = nodePtr;
1267 /* move to the appropriate place in the `to' list. */
1268 for (toChildPtr = toNodePtr->firstChildPtr;
1269 toChildPtr->nextPtr->subid < nodePtr->subid;
1270 toChildPtr = toChildPtr->nextPtr);
1271 toChildPtr->nextPtr->prevPtr = nodePtr;
1272 nodePtr->nextPtr = toChildPtr->nextPtr;
1273 nodePtr->prevPtr = toChildPtr;
1274 toChildPtr->nextPtr = nodePtr;
1281 smiFree(fromNodePtr);
1287 *----------------------------------------------------------------------
1291 * Set the name of a given Object. Combine two Objects if the name
1295 * (Object *) of the potentially combined object.
1300 *----------------------------------------------------------------------
1303 Object *setObjectName(Object *objectPtr, char *name, Parser *parserPtr)
1305 Node *nodePtr, *nextPtr;
1307 Object *newObjectPtr;
1309 if (objectPtr->export.name) {
1310 smiFree(objectPtr->export.name);
1312 objectPtr->export.name = name;
1314 * If this name is found on the pending list (at depth==1 in
1315 * pendingRootNode), we have to move the corresponding subtree to
1318 for (nodePtr = parserPtr->pendingNodePtr->firstChildPtr; nodePtr;
1319 nodePtr = nextPtr) {
1322 * probably we change the contents of `pending', so remember
1325 nextPtr = nodePtr->nextPtr;
1327 if (!strcmp(nodePtr->firstObjectPtr->export.name, name)) {
1330 * remove nodePtr from the pendingRootNode tree.
1332 if (nodePtr->prevPtr) {
1333 nodePtr->prevPtr->nextPtr = nodePtr->nextPtr;
1335 parserPtr->pendingNodePtr->firstChildPtr = nodePtr->nextPtr;
1337 if (nodePtr->nextPtr) {
1338 nodePtr->nextPtr->prevPtr = nodePtr->prevPtr;
1340 parserPtr->pendingNodePtr->lastChildPtr = nodePtr->prevPtr;
1344 objectPtr->nodePtr->firstObjectPtr = NULL;
1345 objectPtr->nodePtr->lastObjectPtr = NULL;
1347 if (objectPtr->nodePtr->lastObjectPtr != NULL) {
1348 if (objectPtr->nodePtr->lastObjectPtr->export.oid == NULL) {
1349 objectPtr->nodePtr->lastObjectPtr =
1350 objectPtr->nodePtr->lastObjectPtr->prevSameNodePtr;
1351 if (objectPtr->nodePtr->lastObjectPtr == NULL) {
1352 objectPtr->nodePtr->firstObjectPtr = NULL;
1358 newObjectPtr = nodePtr->firstObjectPtr;
1360 modulePtr = newObjectPtr->modulePtr;
1361 if (modulePtr->objectPtr == objectPtr) {
1362 modulePtr->objectPtr = newObjectPtr;
1364 if (modulePtr->firstObjectPtr == objectPtr) {
1365 modulePtr->firstObjectPtr = objectPtr->nextPtr;
1366 modulePtr->firstObjectPtr->prevPtr = NULL;
1368 if (modulePtr->lastObjectPtr == objectPtr) {
1369 modulePtr->lastObjectPtr = objectPtr->prevPtr;
1370 modulePtr->lastObjectPtr->nextPtr = NULL;
1373 mergeNodeTrees(objectPtr->nodePtr, nodePtr, parserPtr);
1374 smiFree(objectPtr->export.name);
1376 return newObjectPtr;
1388 *----------------------------------------------------------------------
1392 * Set the type (pointer to a Type struct) of a given Object.
1400 *----------------------------------------------------------------------
1403 void setObjectType(Object *objectPtr, Type *typePtr)
1405 objectPtr->typePtr = typePtr;
1411 *----------------------------------------------------------------------
1413 * setObjectAccess --
1415 * Set the access of a given Object.
1423 *----------------------------------------------------------------------
1426 void setObjectAccess(Object *objectPtr, SmiAccess access)
1428 objectPtr->export.access = access;
1434 *----------------------------------------------------------------------
1436 * setObjectStatus --
1438 * Set the status of a given Object.
1446 *----------------------------------------------------------------------
1449 void setObjectStatus(Object *objectPtr, SmiStatus status)
1451 objectPtr->export.status = status;
1457 *----------------------------------------------------------------------
1459 * setObjectDescription --
1461 * Set the description of a given Object.
1469 *----------------------------------------------------------------------
1472 void setObjectDescription(Object *objectPtr, char *description,
1475 if (objectPtr->export.description)
1476 smiFree(objectPtr->export.description);
1477 if (parserPtr->flags & SMI_FLAG_NODESCR) {
1478 smiFree(description);
1479 objectPtr->export.description = NULL;
1481 objectPtr->export.description = description;
1488 *----------------------------------------------------------------------
1490 * setObjectReference --
1492 * Set the reference of a given Object.
1500 *----------------------------------------------------------------------
1503 void setObjectReference(Object *objectPtr, char *reference, Parser *parserPtr)
1505 if (objectPtr->export.reference)
1506 smiFree(objectPtr->export.reference);
1507 if (parserPtr->flags & SMI_FLAG_NODESCR) {
1509 objectPtr->export.reference = NULL;
1511 objectPtr->export.reference = reference;
1517 *----------------------------------------------------------------------
1519 * setObjectFormat --
1521 * Set the format of a given Object.
1529 *----------------------------------------------------------------------
1532 void setObjectFormat(Object *objectPtr, char *format)
1534 if (objectPtr->export.format) smiFree(objectPtr->export.format);
1535 objectPtr->export.format = format;
1541 *----------------------------------------------------------------------
1545 * Set the units of a given Object.
1553 *----------------------------------------------------------------------
1556 void setObjectUnits(Object *objectPtr, char *units)
1558 if (objectPtr->export.units) smiFree(objectPtr->export.units);
1559 objectPtr->export.units = units;
1565 *----------------------------------------------------------------------
1569 * Set the declaring macro of a given Object.
1577 *----------------------------------------------------------------------
1580 void setObjectDecl(Object *objectPtr, SmiDecl decl)
1582 objectPtr->export.decl = decl;
1588 *----------------------------------------------------------------------
1592 * Set the line of definition of a given Object.
1600 *----------------------------------------------------------------------
1603 void setObjectLine(Object *objectPtr, int line, Parser *parserPtr)
1606 objectPtr->line = line;
1608 objectPtr->line = parserPtr ? parserPtr->line : -1;
1615 *----------------------------------------------------------------------
1617 * setObjectNodekind --
1619 * Set the language independant SmiNodekind of a given Object.
1627 *----------------------------------------------------------------------
1630 void setObjectNodekind(Object *objectPtr, SmiNodekind nodekind)
1632 objectPtr->export.nodekind = nodekind;
1638 *----------------------------------------------------------------------
1642 * Add flags to the flags of a given Object.
1650 *----------------------------------------------------------------------
1653 void addObjectFlags(Object *objectPtr, ObjectFlags flags)
1655 objectPtr->flags |= flags;
1661 *----------------------------------------------------------------------
1663 * deleteObjectFlags --
1665 * Delete flags from the flags of a given Object.
1673 *----------------------------------------------------------------------
1676 void deleteObjectFlags(Object *objectPtr, ObjectFlags flags)
1678 objectPtr->flags &= ~flags;
1684 *----------------------------------------------------------------------
1686 * checkObjectFlag --
1688 * Check whether a given set of flags of a given Object are all set.
1691 * true if all named flags are set.
1696 *----------------------------------------------------------------------
1699 int checkObjectFlags(Object *objectPtr, ObjectFlags flags)
1701 return ((objectPtr->flags & flags) == flags);
1707 *----------------------------------------------------------------------
1711 * Set the list of INDEX elements of a given Object.
1719 *----------------------------------------------------------------------
1723 void setObjectIndex(Object *objectPtr, Index *indexPtr)
1727 objectPtr->indexPtr = indexPtr;
1733 *----------------------------------------------------------------------
1737 * Set the list of objects of a notification type or object group
1738 * or the list of notifications of a notification group.
1746 *----------------------------------------------------------------------
1749 void setObjectList(Object *objectPtr, List *listPtr)
1751 objectPtr->listPtr = listPtr;
1757 *----------------------------------------------------------------------
1759 * setObjectRelated --
1761 * Set the related object of a given object (e.g. SMIv2 AUGMENTS)
1769 *----------------------------------------------------------------------
1772 void setObjectRelated(Object *objectPtr, Object *relatedPtr)
1774 objectPtr->relatedPtr = relatedPtr;
1780 *----------------------------------------------------------------------
1782 * setObjectImplied --
1784 * Set the implied flag of a given object
1792 *----------------------------------------------------------------------
1795 void setObjectImplied(Object *objectPtr, int implied)
1797 objectPtr->export.implied = implied;
1803 *----------------------------------------------------------------------
1805 * setObjectCreate --
1807 * Set the create flag of a given (table entry) object
1815 *----------------------------------------------------------------------
1818 void setObjectCreate(Object *objectPtr, int create)
1820 objectPtr->export.create = create;
1826 *----------------------------------------------------------------------
1828 * setObjectIndexkind --
1830 * Set the indexkind of a given (table entry) object
1838 *----------------------------------------------------------------------
1841 void setObjectIndexkind(Object *objectPtr, SmiIndexkind indexkind)
1843 objectPtr->export.indexkind = indexkind;
1849 *----------------------------------------------------------------------
1853 * Set the default value pointer of a given Object.
1861 *----------------------------------------------------------------------
1864 void setObjectValue(Object *objectPtr, SmiValue *valuePtr)
1866 objectPtr->export.value = *valuePtr;
1873 *----------------------------------------------------------------------
1875 * setObjectUniqueness --
1877 * Set the uniqueness entry of an object
1885 *----------------------------------------------------------------------
1888 void setObjectUniqueness(Object *objectPtr, List *listPtr)
1890 objectPtr->uniquenessPtr = listPtr;
1896 *----------------------------------------------------------------------
1898 * setObjectInstallErrors --
1900 * Set the install errors entry of an object
1908 *----------------------------------------------------------------------
1911 /*void setObjectInstallErrors(Object *objectPtr, List *listPtr)
1913 objectPtr->installErrorsPtr = listPtr;
1919 *----------------------------------------------------------------------
1921 * findNodeByParentAndSubid --
1923 * Lookup a Node by a given parent and subid value.
1926 * A pointer to the Node structure or
1927 * NULL if it is not found.
1932 *----------------------------------------------------------------------
1935 Node *findNodeByParentAndSubid(Node *parentNodePtr, SmiSubid subid)
1939 if (parentNodePtr &&
1940 (parentNodePtr != smiHandle->parserPtr->pendingNodePtr)) {
1941 for (nodePtr = parentNodePtr->firstChildPtr; nodePtr;
1942 nodePtr = nodePtr->nextPtr) {
1943 if (nodePtr->subid == subid) {
1955 *----------------------------------------------------------------------
1959 * Lookup a Node by a given array of numerical subids.
1962 * A pointer to the Node structure or
1963 * NULL if it is not found.
1968 *----------------------------------------------------------------------
1971 Node *findNodeByOid(unsigned int oidlen, SmiSubid *oid)
1976 nodePtr = smiHandle->rootNodePtr;
1977 for(i = 0; i < oidlen && nodePtr; i++) {
1978 nodePtr = findNodeByParentAndSubid(nodePtr, oid[i]);
1987 *----------------------------------------------------------------------
1989 * findNodeByOidString --
1991 * Lookup a Node by a given string of concatinated numerical subids.
1994 * A pointer to the Node structure or
1995 * NULL if it is not found.
2000 *----------------------------------------------------------------------
2003 Node *findNodeByOidString(char *oid)
2010 nodePtr = smiHandle->rootNodePtr;
2011 for(p = strtok(s, ". "); p && nodePtr; p = strtok(NULL, ". ")) {
2012 nodePtr = findNodeByParentAndSubid(nodePtr, atoi(p));
2022 *----------------------------------------------------------------------
2024 * findObjectByNode --
2026 * Lookup an Object by a given Node. Note, that there might be
2027 * multiple definitions for one node.
2030 * A pointer to the first Object structure in the current View or
2031 * a pointer to the first Object if none is in the current View or
2032 * NULL if it is not found.
2037 *----------------------------------------------------------------------
2040 Object *findObjectByNode(Node *nodePtr)
2043 Object *goodObjectPtr = NULL;
2045 /* first, try to find an object in the current view. */
2046 for (objectPtr = nodePtr->firstObjectPtr; objectPtr;
2047 objectPtr = objectPtr->nextSameNodePtr) {
2048 if (isInView(objectPtr->modulePtr->export.name)) {
2049 if (! goodObjectPtr) {
2050 goodObjectPtr = objectPtr;
2051 } else if (objectPtr->modulePtr->export.language
2052 > goodObjectPtr->modulePtr->export.language) {
2053 goodObjectPtr = objectPtr;
2058 return goodObjectPtr ? goodObjectPtr : nodePtr->firstObjectPtr;
2064 *----------------------------------------------------------------------
2066 * findObjectByModuleAndNode --
2068 * Lookup an Object by a given Node and Module. This is necessary
2069 * since there might be different declarations in different modules
2073 * A pointer to the Object structure or
2074 * NULL if it is not found.
2079 *----------------------------------------------------------------------
2082 Object *findObjectByModuleAndNode(Module *modulePtr, Node *nodePtr)
2086 for (objectPtr = nodePtr->firstObjectPtr; objectPtr;
2087 objectPtr = objectPtr->nextSameNodePtr) {
2088 if (objectPtr->modulePtr == modulePtr) {
2099 *----------------------------------------------------------------------
2101 * findObjectByModulenameAndNode --
2103 * Lookup an Object by a given Node and Modulename. This is necessary
2104 * since there might be different declarations in different modules
2108 * A pointer to the Object structure or
2109 * NULL if it is not found.
2114 *----------------------------------------------------------------------
2117 Object *findObjectByModulenameAndNode(const char *modulename, Node *nodePtr)
2121 for (objectPtr = nodePtr->firstObjectPtr; objectPtr;
2122 objectPtr = objectPtr->nextSameNodePtr) {
2123 if (!strcmp(objectPtr->modulePtr->export.name, modulename)) {
2134 *----------------------------------------------------------------------
2136 * findObjectByName --
2138 * Lookup an Object by a given name. Note, that
2139 * there might be more than one Object with the same name.
2140 * In this case, it is undefined which Object is returned.
2143 * A pointer to the Object structure or
2144 * NULL if it is not found.
2149 *----------------------------------------------------------------------
2152 Object *findObjectByName(const char *objectname)
2157 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
2158 modulePtr = modulePtr->nextPtr) {
2159 for (objectPtr = modulePtr->firstObjectPtr; objectPtr;
2160 objectPtr = objectPtr->nextPtr) {
2161 if ((objectPtr->export.name) &&
2162 !strcmp(objectPtr->export.name, objectname)) {
2164 * We return the first matching object.
2165 * TODO: probably we should check if there are more matching
2166 * objects, and give a warning if there's another one.
2179 *----------------------------------------------------------------------
2181 * findNextObjectByName --
2183 * Lookup the next Object by a given name. Note, that
2184 * there might be more than one Object with the same name.
2187 * A pointer to the Object structure or
2188 * NULL if it is not found.
2193 *----------------------------------------------------------------------
2196 Object *findNextObjectByName(const char *objectname, Object *prevObjectPtr)
2201 for (modulePtr = prevObjectPtr->modulePtr->nextPtr; modulePtr;
2202 modulePtr = modulePtr->nextPtr) {
2203 for (objectPtr = modulePtr->firstObjectPtr; objectPtr;
2204 objectPtr = objectPtr->nextPtr) {
2205 if ((objectPtr->export.name)
2206 && !strcmp(objectPtr->export.name, objectname)) {
2208 * We return the first matching object.
2209 * TODO: probably we should check if there are more matching
2210 * objects, and give a warning if there's another one.
2223 *----------------------------------------------------------------------
2225 * findObjectByModulenameAndName --
2227 * Lookup a Object by a given Module and name.
2230 * A pointer to the Object structure or
2231 * NULL if it is not found.
2236 *----------------------------------------------------------------------
2239 Object *findObjectByModulenameAndName(const char *modulename,
2240 const char *objectname)
2245 modulePtr = findModuleByName(modulename);
2248 for (objectPtr = modulePtr->firstObjectPtr; objectPtr;
2249 objectPtr = objectPtr->nextPtr) {
2250 if ((objectPtr->export.name) &&
2251 !strcmp(objectPtr->export.name, objectname)) {
2258 * Some toplevel Objects seem to be always known.
2260 if ((!strcmp(objectname, "iso")) ||
2261 (!strcmp(objectname, "ccitt")) ||
2262 (!strcmp(objectname, "joint-iso-ccitt"))) {
2263 return findObjectByName(objectname);
2272 *----------------------------------------------------------------------
2274 * findObjectByModuleAndName --
2276 * Lookup a Object by a given Module and name.
2279 * A pointer to the Object structure or
2280 * NULL if it is not found.
2285 *----------------------------------------------------------------------
2288 Object *findObjectByModuleAndName(Module *modulePtr, const char *objectname)
2297 for (objectPtr = modulePtr->firstObjectPtr; objectPtr;
2298 objectPtr = objectPtr->nextPtr) {
2299 if ((objectPtr->export.name) &&
2300 !strcmp(objectPtr->export.name, objectname)) {
2307 * Some toplevel Objects seem to be always known.
2309 if ((!strcmp(objectname, "iso")) ||
2310 (!strcmp(objectname, "ccitt")) ||
2311 (!strcmp(objectname, "joint-iso-ccitt"))) {
2312 return findObjectByName(objectname);
2321 *----------------------------------------------------------------------
2325 * Create a new Type structure.
2328 * A pointer to the new Type structure or
2329 * NULL if terminated due to an error.
2334 *----------------------------------------------------------------------
2337 Type *addType(char *type_name, SmiBasetype basetype, TypeFlags flags,
2343 modulePtr = parserPtr ? parserPtr->modulePtr : NULL;
2345 typePtr = smiMalloc(sizeof(Type));
2347 typePtr->export.name = type_name;
2348 typePtr->export.basetype = basetype;
2349 typePtr->export.decl = SMI_DECL_UNKNOWN;
2350 typePtr->export.format = NULL;
2351 typePtr->export.value.basetype = SMI_BASETYPE_UNKNOWN;
2352 typePtr->export.units = NULL;
2353 typePtr->export.status = SMI_STATUS_UNKNOWN;
2354 typePtr->export.description = NULL;
2355 typePtr->export.reference = NULL;
2357 typePtr->modulePtr = modulePtr;
2358 typePtr->listPtr = NULL;
2359 typePtr->flags = flags;
2360 typePtr->parentPtr = NULL;
2361 typePtr->line = parserPtr ? parserPtr->line : -1;
2363 typePtr->nextPtr = NULL;
2365 typePtr->prevPtr = modulePtr->lastTypePtr;
2366 if (!modulePtr->firstTypePtr)
2367 modulePtr->firstTypePtr = typePtr;
2368 if (modulePtr->lastTypePtr)
2369 modulePtr->lastTypePtr->nextPtr = typePtr;
2370 modulePtr->lastTypePtr = typePtr;
2372 typePtr->prevPtr = NULL;
2381 *----------------------------------------------------------------------
2385 * Create a new Type as a duplicate of a given one but with
2386 * an affiliation to the current module.
2389 * A pointer to the new Type structure or
2390 * NULL if terminated due to an error.
2395 *----------------------------------------------------------------------
2398 Type *duplicateType(Type *templatePtr, TypeFlags flags, Parser *parserPtr)
2403 typePtr = (Type *) smiMalloc(sizeof(Type));
2405 modulePtr = parserPtr->modulePtr;
2407 typePtr->export.name = NULL;
2408 typePtr->export.basetype = templatePtr->export.basetype;
2409 typePtr->export.decl = SMI_DECL_IMPLICIT_TYPE;
2410 typePtr->export.format = NULL;
2411 typePtr->export.value.basetype = SMI_BASETYPE_UNKNOWN;
2412 typePtr->export.units = NULL;
2413 typePtr->export.status = templatePtr->export.status;
2414 typePtr->export.description = NULL;
2415 typePtr->export.reference = NULL;
2417 typePtr->modulePtr = modulePtr;
2418 typePtr->listPtr = NULL;
2419 typePtr->flags = templatePtr->flags;
2420 typePtr->line = parserPtr ? parserPtr->line : -1;
2422 typePtr->nextPtr = NULL;
2423 typePtr->prevPtr = modulePtr->lastTypePtr;
2424 if (!modulePtr->firstTypePtr)
2425 modulePtr->firstTypePtr = typePtr;
2426 if (modulePtr->lastTypePtr)
2427 modulePtr->lastTypePtr->nextPtr = typePtr;
2428 modulePtr->lastTypePtr = typePtr;
2430 setTypeParent(typePtr, templatePtr);
2438 *----------------------------------------------------------------------
2442 * Set the name of a given Type. If it already exists, merge the
2451 *----------------------------------------------------------------------
2454 Type *setTypeName(Type *typePtr, char *name)
2459 if (typePtr->export.name) {
2460 smiFree(typePtr->export.name);
2462 typePtr->export.name = smiStrdup(name);
2464 if (! typePtr->export.name) {
2469 * If a type with this name already exists, it must be a forward
2470 * reference and both types have to be merged.
2472 for (type2Ptr = typePtr->modulePtr->firstTypePtr; type2Ptr;
2473 type2Ptr = type2Ptr->nextPtr) {
2475 if (type2Ptr->export.name &&
2476 (!strcmp(type2Ptr->export.name, name)) &&
2477 (type2Ptr != typePtr)) {
2480 * remove typePtr from the type list.
2482 if (typePtr->prevPtr) {
2483 typePtr->prevPtr->nextPtr = typePtr->nextPtr;
2485 typePtr->modulePtr->firstTypePtr = typePtr->nextPtr;
2487 if (typePtr->nextPtr) {
2488 typePtr->nextPtr->prevPtr = typePtr->prevPtr;
2490 typePtr->modulePtr->lastTypePtr = typePtr->prevPtr;
2493 type2Ptr->export.basetype = typePtr->export.basetype;
2494 type2Ptr->export.decl = typePtr->export.decl;
2495 type2Ptr->export.format = typePtr->export.format;
2496 type2Ptr->export.value = typePtr->export.value;
2497 type2Ptr->export.units = typePtr->export.units;
2498 type2Ptr->export.status = typePtr->export.status;
2499 type2Ptr->export.description = typePtr->export.description;
2500 type2Ptr->export.reference = typePtr->export.reference;
2502 type2Ptr->parentPtr = typePtr->parentPtr;
2503 type2Ptr->listPtr = typePtr->listPtr;
2504 type2Ptr->flags = typePtr->flags;
2505 type2Ptr->line = typePtr->line;
2508 * if it's an enum or bits type, we also have to adjust
2509 * the references from the named numbers back to the type.
2511 if ((type2Ptr->export.basetype == SMI_BASETYPE_ENUM) ||
2512 (type2Ptr->export.basetype == SMI_BASETYPE_BITS)) {
2513 for (listPtr = type2Ptr->listPtr; listPtr;
2514 listPtr = listPtr->nextPtr) {
2515 ((NamedNumber *)(listPtr->ptr))->typePtr = type2Ptr;
2519 smiFree(typePtr->export.name);
2531 *----------------------------------------------------------------------
2535 * Set the parent of a given Type.
2543 *----------------------------------------------------------------------
2546 void setTypeParent(Type *typePtr, Type *parentPtr)
2548 typePtr->parentPtr = parentPtr;
2554 *----------------------------------------------------------------------
2558 * Set the status of a given Type.
2566 *----------------------------------------------------------------------
2569 void setTypeStatus(Type *typePtr, SmiStatus status)
2571 typePtr->export.status = status;
2577 *----------------------------------------------------------------------
2579 * setTypeBasetype --
2581 * Set the basetype of a given Type.
2589 *----------------------------------------------------------------------
2592 void setTypeBasetype(Type *typePtr, SmiBasetype basetype)
2594 typePtr->export.basetype = basetype;
2600 *----------------------------------------------------------------------
2602 * setTypeDescription --
2604 * Set the description of a given Type.
2612 *----------------------------------------------------------------------
2615 void setTypeDescription(Type *typePtr, char *description, Parser *parserPtr)
2617 if (typePtr->export.description)
2618 smiFree(typePtr->export.description);
2619 if (parserPtr->flags & SMI_FLAG_NODESCR) {
2620 smiFree(description);
2621 typePtr->export.description = NULL;
2623 typePtr->export.description = description;
2630 *----------------------------------------------------------------------
2632 * setTypeReference --
2634 * Set the reference of a given Type.
2642 *----------------------------------------------------------------------
2645 void setTypeReference(Type *typePtr, char *reference, Parser *parserPtr)
2647 if (typePtr->export.reference)
2648 smiFree(typePtr->export.reference);
2649 if (parserPtr->flags & SMI_FLAG_NODESCR) {
2651 typePtr->export.reference = NULL;
2653 typePtr->export.reference = reference;
2660 *----------------------------------------------------------------------
2664 * Set the pointer to a struct list. This used for
2665 * - columns of a SEQUENCE type,
2666 * - enumeration items of an enumeration integer type,
2667 * - min-max pair items of a range restricted type,
2668 * - min-max pars items of a size restricted type.
2676 *----------------------------------------------------------------------
2679 void setTypeList(Type *typePtr, List *listPtr)
2681 if (!typePtr->listPtr) {
2682 typePtr->listPtr = listPtr;
2689 *----------------------------------------------------------------------
2693 * Set the format (displayHint) of a given Type.
2701 *----------------------------------------------------------------------
2704 void setTypeFormat(Type *typePtr, char *format)
2706 if (typePtr->export.format) smiFree(typePtr->export.format);
2707 typePtr->export.format = format;
2713 *----------------------------------------------------------------------
2717 * Set the units of a given Type. Note: units of types are only
2718 * present in SMIng, not in SMIv2.
2726 *----------------------------------------------------------------------
2729 void setTypeUnits(Type *typePtr, char *units)
2731 if (typePtr->export.units) smiFree(typePtr->export.units);
2732 typePtr->export.units = units;
2738 *----------------------------------------------------------------------
2742 * Set the declaring macro of a given Type.
2750 *----------------------------------------------------------------------
2753 void setTypeDecl(Type *typePtr, SmiDecl decl)
2755 typePtr->export.decl = decl;
2761 *----------------------------------------------------------------------
2765 * Set the line of definition of a given Type.
2773 *----------------------------------------------------------------------
2776 void setTypeLine(Type *typePtr, int line, Parser *parserPtr)
2779 typePtr->line = line;
2781 typePtr->line = parserPtr ? parserPtr->line : -1;
2788 *----------------------------------------------------------------------
2792 * Set the default value pointer of a given Type.
2800 *----------------------------------------------------------------------
2803 void setTypeValue(Type *typePtr, SmiValue *valuePtr)
2805 typePtr->export.value = *valuePtr;
2811 *----------------------------------------------------------------------
2815 * Add flags to the flags of a given Type.
2823 *----------------------------------------------------------------------
2826 void addTypeFlags(Type *typePtr, TypeFlags flags)
2828 typePtr->flags |= flags;
2834 *----------------------------------------------------------------------
2836 * deleteTypeFlags --
2838 * Delete flags from the flags of a given Type.
2846 *----------------------------------------------------------------------
2849 void deleteTypeFlags(Type *typePtr, TypeFlags flags)
2851 typePtr->flags &= ~flags;
2857 *----------------------------------------------------------------------
2861 * Lookup a Type by a given name.
2864 * A pointer to the Type structure or
2865 * NULL if it is not found.
2870 *----------------------------------------------------------------------
2873 Type * findTypeByName(const char *type_name)
2878 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
2879 modulePtr = modulePtr->nextPtr) {
2880 for (typePtr = modulePtr->firstTypePtr; typePtr;
2881 typePtr = typePtr->nextPtr) {
2882 if ((typePtr->export.name) &&
2883 !strcmp(typePtr->export.name, type_name)) {
2895 *----------------------------------------------------------------------
2897 * findNextTypeByName --
2899 * Lookup the next Type by a given name.
2902 * A pointer to the Type structure or
2903 * NULL if it is not found.
2908 *----------------------------------------------------------------------
2911 Type *findNextTypeByName(const char *type_name, Type *prevTypePtr)
2916 for (modulePtr = prevTypePtr->modulePtr->nextPtr; modulePtr;
2917 modulePtr = modulePtr->nextPtr) {
2918 for (typePtr = modulePtr->firstTypePtr; typePtr;
2919 typePtr = typePtr->nextPtr) {
2920 if ((typePtr->export.name) &&
2921 !strcmp(typePtr->export.name, type_name)) {
2933 *----------------------------------------------------------------------
2935 * findTypeByModulenameAndName --
2937 * Lookup a Type by a given Module and name.
2940 * A pointer to the Type structure or
2941 * NULL if it is not found.
2946 *----------------------------------------------------------------------
2949 Type *findTypeByModulenameAndName(const char *modulename,
2950 const char *type_name)
2955 modulePtr = findModuleByName(modulename);
2958 for (typePtr = modulePtr->firstTypePtr; typePtr;
2959 typePtr = typePtr->nextPtr) {
2960 if ((typePtr->export.name) && !strcmp(typePtr->export.name, type_name)) {
2972 *----------------------------------------------------------------------
2974 * findTypeByModuleAndName --
2976 * Lookup a Type by a given Module and name.
2979 * A pointer to the Type structure or
2980 * NULL if it is not found.
2985 *----------------------------------------------------------------------
2988 Type *findTypeByModuleAndName(Module *modulePtr, const char *type_name)
2993 for (typePtr = modulePtr->firstTypePtr; typePtr;
2994 typePtr = typePtr->nextPtr) {
2995 if ((typePtr->export.name) &&
2996 !strcmp(typePtr->export.name, type_name)) {
3008 *----------------------------------------------------------------------
3010 * findTypeNamedNumber --
3018 *---------------------------------------------------------------------- */
3020 NamedNumber *findTypeNamedNumber(Type *typePtr,
3021 SmiInteger32 number)
3025 for (listPtr = typePtr->listPtr;
3026 listPtr; listPtr = listPtr->nextPtr) {
3027 if (((NamedNumber *)(listPtr->ptr))->export.value.value.integer32 ==
3032 return (NamedNumber *)(listPtr->ptr);
3038 *----------------------------------------------------------------------
3042 * Create a new Identity structure.
3045 * A pointer to the new Identity structure or
3046 * NULL if terminated due to an error.
3051 *---------------------------------------------------------------------- */
3053 Identity *addIdentity(char *identityname, Parser *parserPtr)
3055 Identity *identityPtr;
3058 modulePtr = parserPtr->modulePtr;
3060 identityPtr = (Identity*) smiMalloc(sizeof(Identity));
3062 identityPtr->export.name = identityname;
3063 identityPtr->export.status = SMI_STATUS_UNKNOWN;
3064 identityPtr->export.description = NULL;
3065 identityPtr->export.reference = NULL;
3066 identityPtr->parentPtr = NULL;
3068 identityPtr->modulePtr = parserPtr->modulePtr;
3069 identityPtr->line = parserPtr ? parserPtr->line : -1;
3071 identityPtr->nextPtr = NULL;
3072 identityPtr->prevPtr = modulePtr->lastIdentityPtr;
3073 if (!modulePtr->firstIdentityPtr)
3074 modulePtr->firstIdentityPtr = identityPtr;
3075 if (modulePtr->lastIdentityPtr)
3076 modulePtr->lastIdentityPtr->nextPtr = identityPtr;
3077 modulePtr->lastIdentityPtr = identityPtr;
3079 return (identityPtr);
3084 *----------------------------------------------------------------------
3086 * setIdentityDecl --
3088 * Set the declaring macro of a given Identity.
3096 *----------------------------------------------------------------------
3099 void setIdentityDecl(Identity *identityPtr, SmiDecl decl)
3101 identityPtr->export.decl = decl;
3105 *----------------------------------------------------------------------
3107 * setIdentityStatus --
3109 * Set the status of a given Identity.
3117 *----------------------------------------------------------------------
3120 void setIdentityStatus(Identity *identityPtr, SmiStatus status)
3122 identityPtr->export.status = status;
3128 *----------------------------------------------------------------------
3130 * setIdentityDescription --
3132 * Set the description of a given Identity.
3140 *----------------------------------------------------------------------
3143 void setIdentityDescription(Identity *identityPtr, char *description, Parser *parserPtr)
3145 if (identityPtr->export.description) smiFree(identityPtr->export.description);
3146 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3147 smiFree(description);
3148 identityPtr->export.description = NULL;
3150 identityPtr->export.description = description;
3157 *----------------------------------------------------------------------
3159 * setIdentityReference --
3161 * Set the reference of a given Identity.
3169 *----------------------------------------------------------------------
3172 void setIdentityReference(Identity *identityPtr, char *reference, Parser *parserPtr)
3174 if (identityPtr->export.reference)
3175 smiFree(identityPtr->export.reference);
3176 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3178 identityPtr->export.reference = NULL;
3180 identityPtr->export.reference = reference;
3185 *----------------------------------------------------------------------
3187 * setIdentityParent --
3189 * Set the parent of a given Identity to given Identity pointer.
3197 *----------------------------------------------------------------------
3200 void setIdentityParent(Identity *identityPtr, Identity *parentPtr)
3202 if(identityPtr) identityPtr->parentPtr = parentPtr;
3207 *----------------------------------------------------------------------
3209 * findIdentityByName --
3211 * Lookup a Identity by a given name.
3214 * A pointer to the Identity structure or
3215 * NULL if it is not found.
3220 *----------------------------------------------------------------------
3223 Identity *findIdentityByName(const char *identityname)
3226 Identity *identityPtr;
3228 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
3229 modulePtr = modulePtr->nextPtr) {
3230 for (identityPtr = modulePtr->firstIdentityPtr; identityPtr;
3231 identityPtr = identityPtr->nextPtr) {
3232 if ((identityPtr->export.name) &&
3233 !strcmp(identityPtr->export.name, identityname)) {
3234 return (identityPtr);
3243 *----------------------------------------------------------------------
3245 * findIdentityByModuleAndName --
3247 * Lookup a Identity by a given name and Module.
3250 * A pointer to the Identity structure or
3251 * NULL if it is not found.
3256 *----------------------------------------------------------------------
3259 Identity *findIdentityByModuleAndName(Module *modulePtr,
3260 const char *identityname)
3262 Identity *identityPtr;
3265 for (identityPtr = modulePtr->firstIdentityPtr; identityPtr;
3266 identityPtr = identityPtr->nextPtr) {
3267 if ((identityPtr->export.name) &&
3268 !strcmp(identityPtr->export.name, identityname)) {
3269 return (identityPtr);
3278 *----------------------------------------------------------------------
3280 * findIdentityByModulenameAndName --
3282 * Lookup a Identity by a given Module and name.
3285 * A pointer to the Identity structure or
3286 * NULL if it is not found.
3291 *----------------------------------------------------------------------
3294 Identity *findIdentityByModulenameAndName(const char *modulename,
3295 const char *identity_name)
3297 Identity *identityPtr;
3300 modulePtr = findModuleByName(modulename);
3303 for (identityPtr = modulePtr->firstIdentityPtr; identityPtr;
3304 identityPtr = identityPtr->nextPtr) {
3305 if ((identityPtr->export.name) && !strcmp(identityPtr->export.name, identity_name)) {
3306 return (identityPtr);
3317 *----------------------------------------------------------------------
3321 * Create a new Class structure.
3324 * A pointer to the new Class structure or
3325 * NULL if terminated due to an error.
3330 *---------------------------------------------------------------------- */
3332 Class *addClass(char *classname, Parser *parserPtr)
3337 modulePtr = parserPtr->modulePtr;
3339 classPtr = (Class*) smiMalloc(sizeof(Class));
3341 classPtr->export.name = classname;
3342 classPtr->export.status = SMI_STATUS_UNKNOWN;
3343 classPtr->export.description = NULL;
3344 classPtr->export.reference = NULL;
3346 classPtr->modulePtr = parserPtr->modulePtr;
3347 classPtr->line = parserPtr ? parserPtr->line : -1;
3349 classPtr->parentPtr = NULL;
3350 classPtr->firstAttributePtr = NULL;
3351 classPtr->lastAttributePtr = NULL;
3352 classPtr->firstEventPtr = NULL;
3353 classPtr->lastEventPtr = NULL;
3355 classPtr->nextPtr = NULL;
3356 classPtr->prevPtr = modulePtr->lastClassPtr;
3357 if (!modulePtr->firstClassPtr)
3358 modulePtr->firstClassPtr = classPtr;
3359 if (modulePtr->lastClassPtr)
3360 modulePtr->lastClassPtr->nextPtr = classPtr;
3361 modulePtr->lastClassPtr = classPtr;
3368 *----------------------------------------------------------------------
3372 * Set the declaring macro of a given Class.
3380 *----------------------------------------------------------------------
3383 void setClassDecl(Class *classPtr, SmiDecl decl)
3385 classPtr->export.decl = decl;
3389 *----------------------------------------------------------------------
3393 * Set the status of a given Class.
3401 *----------------------------------------------------------------------
3404 void setClassStatus(Class *classPtr, SmiStatus status)
3406 classPtr->export.status = status;
3412 *----------------------------------------------------------------------
3414 * setClassDescription --
3416 * Set the description of a given Class.
3424 *----------------------------------------------------------------------
3427 void setClassDescription(Class *classPtr, char *description, Parser *parserPtr)
3429 if (classPtr->export.description) smiFree(classPtr->export.description);
3430 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3431 smiFree(description);
3432 classPtr->export.description = NULL;
3434 classPtr->export.description = description;
3441 *----------------------------------------------------------------------
3443 * setClassReference --
3445 * Set the reference of a given Class.
3453 *----------------------------------------------------------------------
3456 void setClassReference(Class *classPtr, char *reference, Parser *parserPtr)
3458 if (classPtr->export.reference)
3459 smiFree(classPtr->export.reference);
3460 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3462 classPtr->export.reference = NULL;
3464 classPtr->export.reference = reference;
3469 *----------------------------------------------------------------------
3473 * Set the parent of a given Class to given Class pointer.
3481 *----------------------------------------------------------------------
3484 void setClassParent(Class *classPtr, Class *parentPtr)
3486 if(classPtr) classPtr->parentPtr = parentPtr;
3490 *----------------------------------------------------------------------
3492 * findClassByModuleAndName --
3494 * Lookup a Class by a given name.
3497 * A pointer to the Class structure or
3498 * NULL if it is not found.
3503 *----------------------------------------------------------------------
3505 Class *findClassByModuleAndName(Module *modulePtr,char *name)
3509 for (classPtr = modulePtr->firstClassPtr; classPtr;
3510 classPtr = classPtr->nextPtr) {
3511 if ((classPtr->export.name) &&
3512 !strcmp(classPtr->export.name, name)) {
3521 *----------------------------------------------------------------------
3523 * findClassByModulenameAndName --
3525 * Lookup a Class by a given Module and name.
3528 * A pointer to the Class structure or
3529 * NULL if it is not found.
3534 *----------------------------------------------------------------------
3537 Class *findClassByModulenameAndName(const char *modulename,
3538 const char *class_name)
3543 modulePtr = findModuleByName(modulename);
3546 for (classPtr = modulePtr->firstClassPtr; classPtr;
3547 classPtr = classPtr->nextPtr) {
3548 if ((classPtr->export.name) && !strcmp(classPtr->export.name, class_name)) {
3558 *----------------------------------------------------------------------
3560 * duplicateTypeToAttribute --
3562 * Create a new Attribute as a duplicate of a given type but with
3563 * an affiliation to the given Class.
3566 * A pointer to the new Attribute structure or
3567 * NULL if terminated due to an error.
3572 *----------------------------------------------------------------------
3575 Attribute *duplicateTypeToAttribute(Type *templatePtr, Class *classPtr, Parser *parserPtr)
3577 Attribute *attributePtr;
3579 if(!classPtr) return NULL;
3581 attributePtr = (Attribute *) smiMalloc(sizeof(Attribute));
3584 attributePtr->export.name = NULL;
3585 attributePtr->export.basetype = templatePtr->export.basetype;
3586 attributePtr->export.decl = SMI_DECL_ATTRIBUTE;
3587 attributePtr->export.format = NULL;
3588 attributePtr->export.value.basetype = templatePtr->export.basetype;
3589 attributePtr->export.units = NULL;
3590 attributePtr->export.status = templatePtr->export.status;
3591 attributePtr->export.description = NULL;
3592 attributePtr->export.reference = NULL;
3594 attributePtr->classPtr = classPtr;
3595 attributePtr->listPtr = NULL;
3596 attributePtr->line = parserPtr ? parserPtr->line : -1;
3598 attributePtr->nextPtr = NULL;
3599 attributePtr->prevPtr = classPtr->lastAttributePtr;
3600 if (!classPtr->firstAttributePtr)
3601 classPtr->firstAttributePtr = attributePtr;
3602 if (classPtr->lastAttributePtr)
3603 classPtr->lastAttributePtr->nextPtr = attributePtr;
3604 classPtr->lastAttributePtr = attributePtr;
3606 setAttributeParentType(attributePtr, templatePtr);
3608 return (attributePtr);
3613 *----------------------------------------------------------------------
3617 * Create a new Attribute structure and tie it to the given Class.
3620 * A pointer to the new Attribute structure or
3621 * NULL if terminated due to an error.
3626 *----------------------------------------------------------------------
3629 Attribute *addAttribute(char *attribute_name,
3630 Class *classPtr, Parser *parserPtr)
3632 Attribute *attributePtr;
3634 attributePtr = smiMalloc(sizeof(Attribute));
3636 attributePtr->export.name = attribute_name;
3637 attributePtr->export.basetype = SMI_BASETYPE_UNKNOWN;
3638 attributePtr->export.decl = SMI_DECL_UNKNOWN;
3639 attributePtr->export.format = NULL;
3640 attributePtr->export.value.basetype = SMI_BASETYPE_UNKNOWN;
3641 attributePtr->export.units = NULL;
3642 attributePtr->export.status = SMI_STATUS_UNKNOWN;
3643 attributePtr->export.description = NULL;
3644 attributePtr->export.reference = NULL;
3646 attributePtr->classPtr = classPtr;
3647 attributePtr->listPtr = NULL;
3648 attributePtr->parentTypePtr = NULL;
3649 attributePtr->parentClassPtr = NULL;
3650 attributePtr->line = parserPtr ? parserPtr->line : -1;
3652 attributePtr->nextPtr = NULL;
3654 attributePtr->prevPtr = classPtr->lastAttributePtr;
3655 if (!classPtr->firstAttributePtr)
3656 classPtr->firstAttributePtr = attributePtr;
3657 if (classPtr->lastAttributePtr)
3658 classPtr->lastAttributePtr->nextPtr = attributePtr;
3659 classPtr->lastAttributePtr = attributePtr;
3661 attributePtr->prevPtr = NULL;
3664 return (attributePtr);
3668 *----------------------------------------------------------------------
3670 * setAttributeDecl --
3672 * Set the declaring macro of a given Attribute.
3680 *----------------------------------------------------------------------
3683 void setAttributeDecl(Attribute *attributePtr, SmiDecl decl)
3685 attributePtr->export.decl = decl;
3689 *----------------------------------------------------------------------
3691 * setAttributeParentType --
3693 * Set the parent of a given attribute.
3701 *----------------------------------------------------------------------
3704 void setAttributeParentType(Attribute *attributePtr, Type *parentPtr)
3706 attributePtr->parentTypePtr = parentPtr;
3710 *----------------------------------------------------------------------
3712 * setAttributeParentClass --
3714 * Set the parent Class of a given attribute.
3722 *----------------------------------------------------------------------
3725 void setAttributeParentClass(Attribute *attributePtr, Class *parentPtr)
3727 attributePtr->parentClassPtr = parentPtr;
3731 *----------------------------------------------------------------------
3733 * setAttributeList --
3735 * Set the pointer to a struct list. This used for
3736 * - enumeration items of an enumeration integer type,
3737 * - min-max pair items of a range restricted type,
3738 * - min-max pars items of a size restricted type.
3746 *----------------------------------------------------------------------
3749 void setAttributeList(Attribute *attributePtr, List *listPtr)
3751 if (!attributePtr->listPtr) {
3752 attributePtr->listPtr = listPtr;
3757 *----------------------------------------------------------------------
3759 * setAttributeName --
3761 * Set the name of a given Attribute.
3769 *----------------------------------------------------------------------
3772 void setAttributeName(Attribute *attributePtr, char *name)
3775 attributePtr->export.name = smiStrdup(name);
3779 *----------------------------------------------------------------------
3781 * setAttributeAccess --
3783 * Set the access of a given Attribute.
3791 *----------------------------------------------------------------------
3793 void setAttributeAccess(Attribute *attributePtr,SmiAccess access)
3795 attributePtr->export.access = access;
3800 *----------------------------------------------------------------------
3804 * Create a new Event structure and tie it to the given Class.
3807 * A pointer to the new Event structure or
3808 * NULL if terminated due to an error.
3813 *----------------------------------------------------------------------
3815 Event *addEvent(char *eventname, Class *classPtr,
3820 eventPtr = smiMalloc(sizeof(Event));
3822 eventPtr->export.name = eventname;
3823 eventPtr->export.decl = SMI_DECL_EVENT;
3824 eventPtr->export.status = SMI_STATUS_UNKNOWN;
3825 eventPtr->export.description = NULL;
3826 eventPtr->export.reference = NULL;
3828 eventPtr->classPtr = classPtr;
3829 eventPtr->line = parserPtr ? parserPtr->line : -1;
3831 eventPtr->nextPtr = NULL;
3833 eventPtr->prevPtr = classPtr->lastEventPtr;
3834 if (!classPtr->firstEventPtr)
3835 classPtr->firstEventPtr = eventPtr;
3836 if (classPtr->lastEventPtr)
3837 classPtr->lastEventPtr->nextPtr = eventPtr;
3838 classPtr->lastEventPtr = eventPtr;
3840 eventPtr->prevPtr = NULL;
3849 *----------------------------------------------------------------------
3853 * Create a new Macro structure.
3856 * A pointer to the new Macro structure or
3857 * NULL if terminated due to an error.
3862 *---------------------------------------------------------------------- */
3864 Macro *addMacro(char *macroname, MacroFlags flags, Parser *parserPtr)
3869 modulePtr = parserPtr->modulePtr;
3871 /* TODO: Check wheather this macro already exists?? */
3873 macroPtr = (Macro *) smiMalloc(sizeof(Macro));
3875 macroPtr->export.name = macroname;
3876 macroPtr->export.status = SMI_STATUS_UNKNOWN;
3877 macroPtr->export.description = NULL;
3878 macroPtr->export.reference = NULL;
3880 macroPtr->modulePtr = parserPtr->modulePtr;
3881 macroPtr->flags = flags;
3882 macroPtr->line = parserPtr ? parserPtr->line : -1;
3884 macroPtr->nextPtr = NULL;
3885 macroPtr->prevPtr = modulePtr->lastMacroPtr;
3886 if (!modulePtr->firstMacroPtr)
3887 modulePtr->firstMacroPtr = macroPtr;
3888 if (modulePtr->lastMacroPtr)
3889 modulePtr->lastMacroPtr->nextPtr = macroPtr;
3890 modulePtr->lastMacroPtr = macroPtr;
3898 *----------------------------------------------------------------------
3902 * Set the status of a given Macro.
3910 *----------------------------------------------------------------------
3913 void setMacroStatus(Macro *macroPtr, SmiStatus status)
3915 macroPtr->export.status = status;
3921 *----------------------------------------------------------------------
3923 * setMacroDescription --
3925 * Set the description of a given Macro.
3933 *----------------------------------------------------------------------
3936 void setMacroDescription(Macro *macroPtr, char *description, Parser *parserPtr)
3938 if (macroPtr->export.description) smiFree(macroPtr->export.description);
3939 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3940 smiFree(description);
3941 macroPtr->export.description = NULL;
3943 macroPtr->export.description = description;
3950 *----------------------------------------------------------------------
3952 * setMacroReference --
3954 * Set the reference of a given Macro.
3962 *----------------------------------------------------------------------
3965 void setMacroReference(Macro *macroPtr, char *reference, Parser *parserPtr)
3967 if (macroPtr->export.reference)
3968 smiFree(macroPtr->export.reference);
3969 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3971 macroPtr->export.reference = NULL;
3973 macroPtr->export.reference = reference;
3978 *----------------------------------------------------------------------
3982 * Set the abnf string of a given extension(SMIng only).
3990 *----------------------------------------------------------------------
3993 void setMacroAbnf(Macro *macroPtr, char *abnf, Parser *parserPtr)
3995 if (macroPtr->export.abnf)
3996 smiFree(macroPtr->export.abnf);
3997 if (parserPtr->flags & SMI_FLAG_NODESCR) {
3999 macroPtr->export.abnf = NULL;
4001 macroPtr->export.abnf = abnf;
4008 *----------------------------------------------------------------------
4012 * Set the declaring macro of a given Macro.
4020 *----------------------------------------------------------------------
4023 void setMacroDecl(Macro *macroPtr, SmiDecl decl)
4025 macroPtr->export.decl = decl;
4031 *----------------------------------------------------------------------
4035 * Set the line of definition of a given Macro.
4043 *----------------------------------------------------------------------
4046 void setMacroLine(Macro *macroPtr, int line, Parser *parserPtr)
4049 macroPtr->line = line;
4051 macroPtr->line = parserPtr ? parserPtr->line : -1;
4058 *----------------------------------------------------------------------
4060 * findMacroByName --
4062 * Lookup a Macro by a given name.
4065 * A pointer to the Macro structure or
4066 * NULL if it is not found.
4071 *----------------------------------------------------------------------
4074 Macro *findMacroByName(const char *macroname)
4079 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
4080 modulePtr = modulePtr->nextPtr) {
4081 for (macroPtr = modulePtr->firstMacroPtr; macroPtr;
4082 macroPtr = macroPtr->nextPtr) {
4083 if ((macroPtr->export.name) &&
4084 !strcmp(macroPtr->export.name, macroname)) {
4096 *----------------------------------------------------------------------
4098 * findMacroByModuleAndName --
4100 * Lookup a Macro by a given Module and name.
4103 * A pointer to the Macro structure or
4104 * NULL if it is not found.
4109 *----------------------------------------------------------------------
4112 Macro *findMacroByModuleAndName(Module *modulePtr, const char *macroname)
4117 for (macroPtr = modulePtr->firstMacroPtr; macroPtr;
4118 macroPtr = macroPtr->nextPtr) {
4119 if (!strcmp(macroPtr->export.name, macroname)) {
4131 *----------------------------------------------------------------------
4133 * findNamedNumberByName --
4135 * Lookup the value of a namev nuber in a given typ.
4138 * A pointer to the NamedNumber structure or
4139 * NULL if it is not found.
4144 *----------------------------------------------------------------------
4147 NamedNumber *findNamedNumberByName(Type *typePtr,const char *name)
4151 if(typePtr->export.basetype != SMI_BASETYPE_ENUM &&
4152 typePtr->export.basetype != SMI_BASETYPE_BITS) return NULL;
4154 for (listPtr = typePtr->listPtr;
4155 listPtr; listPtr = listPtr->nextPtr) {
4156 if (!strcmp(((NamedNumber *)(listPtr->ptr))->export.name
4158 return (NamedNumber *)(listPtr->ptr);
4169 *----------------------------------------------------------------------
4173 * Initialize all need data structures at program start.
4176 * 0 on success or -1 on an error.
4181 *----------------------------------------------------------------------
4189 smiHandle->flags = 0;
4191 smiHandle->firstModulePtr = NULL;
4192 smiHandle->lastModulePtr = NULL;
4193 smiHandle->firstViewPtr = NULL;
4194 smiHandle->lastViewPtr = NULL;
4197 * Initialize a root Node for the main MIB tree.
4199 smiHandle->rootNodePtr = addNode(NULL, 0, NODE_FLAG_ROOT, NULL);
4202 * Initialize a root Node for pending (forward referenced) nodes.
4204 smiHandle->parserPtr = &parser;
4205 parser.pendingNodePtr = addNode(NULL, 0, NODE_FLAG_ROOT, NULL);
4208 * Initialize the top level well-known nodes, ccitt, iso, joint-iso-ccitt
4209 * belonging to a dummy module "". This is needed for SMIv1/v2. SMIng
4210 * defines it in a special SMIng module.
4213 parser.flags = smiHandle->flags;
4216 parser.modulePtr = addModule(smiStrdup(""), smiStrdup(""), 0, NULL);
4220 objectPtr = addObject(smiStrdup("ccitt"), smiHandle->rootNodePtr, 0, 0, &parser);
4221 objectPtr->export.oid = objectPtr->nodePtr->oid =
4222 smiMalloc(sizeof(int));
4223 objectPtr->export.oidlen = objectPtr->nodePtr->oidlen = 1;
4224 objectPtr->nodePtr->oid[0] = 0;
4225 objectPtr->export.nodekind = SMI_NODEKIND_NODE;
4226 objectPtr = addObject(smiStrdup("iso"), smiHandle->rootNodePtr, 1, 0, &parser);
4227 objectPtr->export.oid = objectPtr->nodePtr->oid =
4228 smiMalloc(sizeof(int));
4229 objectPtr->export.oidlen = objectPtr->nodePtr->oidlen = 1;
4230 objectPtr->nodePtr->oid[0] = 1;
4231 objectPtr->export.nodekind = SMI_NODEKIND_NODE;
4232 objectPtr = addObject(smiStrdup("joint-iso-ccitt"), smiHandle->rootNodePtr, 2, 0, &parser);
4233 objectPtr->export.oid = objectPtr->nodePtr->oid =
4234 smiMalloc(sizeof(int));
4235 objectPtr->export.oidlen = objectPtr->nodePtr->oidlen = 1;
4236 objectPtr->nodePtr->oid[0] = 2;
4237 objectPtr->export.nodekind = SMI_NODEKIND_NODE;
4240 smiHandle->typeOctetStringPtr =
4241 addType(smiStrdup("OctetString"),
4242 SMI_BASETYPE_OCTETSTRING, 0, &parser);
4243 smiHandle->typeObjectIdentifierPtr =
4244 addType(smiStrdup("ObjectIdentifier"),
4245 SMI_BASETYPE_OBJECTIDENTIFIER, 0, &parser);
4246 smiHandle->typeInteger32Ptr =
4247 addType(smiStrdup("Integer32"),
4248 SMI_BASETYPE_INTEGER32, 0, &parser);
4249 smiHandle->typeUnsigned32Ptr =
4250 addType(smiStrdup("Unsigned32"),
4251 SMI_BASETYPE_UNSIGNED32, 0, &parser);
4252 smiHandle->typeInteger64Ptr =
4253 addType(smiStrdup("Integer64"),
4254 SMI_BASETYPE_INTEGER64, 0, &parser);
4255 smiHandle->typeUnsigned64Ptr =
4256 addType(smiStrdup("Unsigned64"),
4257 SMI_BASETYPE_UNSIGNED64, 0, &parser);
4258 smiHandle->typeFloat32Ptr =
4259 addType(smiStrdup("Float32"),
4260 SMI_BASETYPE_FLOAT32, 0, &parser);
4261 smiHandle->typeFloat64Ptr =
4262 addType(smiStrdup("Float64"),
4263 SMI_BASETYPE_FLOAT64, 0, &parser);
4264 smiHandle->typeFloat128Ptr =
4265 addType(smiStrdup("Float128"),
4266 SMI_BASETYPE_FLOAT128, 0, &parser);
4267 smiHandle->typeEnumPtr =
4268 addType(smiStrdup("Enumeration"),
4269 SMI_BASETYPE_ENUM, 0, &parser);
4270 smiHandle->typeBitsPtr =
4271 addType(smiStrdup("Bits"),
4272 SMI_BASETYPE_BITS, 0, &parser);
4273 smiHandle->typePointerPtr =
4274 addType(smiStrdup("Pointer"),
4275 SMI_BASETYPE_POINTER, 0, &parser);
4283 *----------------------------------------------------------------------
4287 * Free all node of a node (sub)tree.
4290 * 0 on success or -1 on an error.
4295 *----------------------------------------------------------------------
4298 static void freeNodeTree(Node *rootPtr)
4300 Node *nodePtr, *nextPtr;
4302 for (nodePtr = rootPtr->firstChildPtr; nodePtr; nodePtr = nextPtr) {
4303 nextPtr = nodePtr->nextPtr;
4304 freeNodeTree(nodePtr);
4305 smiFree(nodePtr->oid);
4308 rootPtr->firstChildPtr = NULL;
4309 rootPtr->lastChildPtr = NULL;
4310 rootPtr->firstObjectPtr = NULL;
4311 rootPtr->lastObjectPtr = NULL;
4312 rootPtr->nextPtr = NULL;
4313 rootPtr->prevPtr = NULL;
4314 rootPtr->parentPtr = NULL;
4320 *----------------------------------------------------------------------
4324 * Free all data structures.
4327 * 0 on success or -1 on an error.
4332 *----------------------------------------------------------------------
4337 View *viewPtr, *nextViewPtr;
4338 Macro *macroPtr, *nextMacroPtr;
4339 Module *modulePtr, *nextModulePtr;
4340 Import *importPtr, *nextImportPtr;
4341 Identity *identityPtr, *nextIdentityPtr;
4342 Revision *revisionPtr, *nextRevisionPtr;
4343 List *listPtr, *nextListPtr;
4344 Type *typePtr, *nextTypePtr;
4345 Class *classPtr, *nextClassPtr;
4346 Attribute *attributePtr, *nextAttributePtr;
4347 Event *eventPtr, *nextEventPtr;
4348 Object *objectPtr, *nextObjectPtr;
4350 for (viewPtr = smiHandle->firstViewPtr; viewPtr; viewPtr = nextViewPtr) {
4351 nextViewPtr = viewPtr->nextPtr;
4352 smiFree(viewPtr->name);
4357 * In this first module loop we remove each module's imports,
4358 * revisions, macros, and objects.
4360 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
4361 modulePtr = nextModulePtr) {
4362 nextModulePtr = modulePtr->nextPtr;
4364 for (importPtr = modulePtr->firstImportPtr; importPtr;
4365 importPtr = nextImportPtr) {
4366 nextImportPtr = importPtr->nextPtr;
4367 smiFree(importPtr->export.module);
4368 smiFree(importPtr->export.name);
4372 for (revisionPtr = modulePtr->firstRevisionPtr; revisionPtr;
4373 revisionPtr = nextRevisionPtr) {
4374 nextRevisionPtr = revisionPtr->nextPtr;
4375 smiFree(revisionPtr->export.description);
4376 smiFree(revisionPtr);
4379 for (macroPtr = modulePtr->firstMacroPtr; macroPtr;
4380 macroPtr = nextMacroPtr) {
4381 nextMacroPtr = macroPtr->nextPtr;
4382 smiFree(macroPtr->export.name);
4383 smiFree(macroPtr->export.abnf);
4384 smiFree(macroPtr->export.reference);
4385 smiFree(macroPtr->export.description);
4389 for (identityPtr = modulePtr->firstIdentityPtr; identityPtr;
4390 identityPtr = nextIdentityPtr) {
4391 nextIdentityPtr = identityPtr->nextPtr;
4392 smiFree(identityPtr->export.name);
4393 smiFree(identityPtr->export.reference);
4394 smiFree(identityPtr->export.description);
4395 smiFree(identityPtr);
4398 for (objectPtr = modulePtr->firstObjectPtr; objectPtr;
4399 objectPtr = nextObjectPtr) {
4401 nextObjectPtr = objectPtr->nextPtr;
4402 smiFree(objectPtr->export.name);
4403 smiFree(objectPtr->export.description);
4404 smiFree(objectPtr->export.reference);
4405 smiFree(objectPtr->export.format);
4406 smiFree(objectPtr->export.units);
4407 for (listPtr = objectPtr->listPtr; listPtr;
4408 listPtr = nextListPtr) {
4409 nextListPtr = listPtr->nextPtr;
4412 for (listPtr = objectPtr->optionlistPtr; listPtr;
4413 listPtr = nextListPtr) {
4414 nextListPtr = listPtr->nextPtr;
4415 smiFree(((Option *)(listPtr->ptr))->export.description);
4416 smiFree((Option *)(listPtr->ptr));
4419 for (listPtr = objectPtr->refinementlistPtr; listPtr;
4420 listPtr = nextListPtr) {
4421 nextListPtr = listPtr->nextPtr;
4422 smiFree(((Refinement *)(listPtr->ptr))->export.description);
4423 smiFree((Refinement *)(listPtr->ptr));
4426 if (objectPtr->typePtr) {
4427 if ((objectPtr->typePtr->export.basetype ==
4428 SMI_BASETYPE_OCTETSTRING ||
4429 objectPtr->typePtr->export.basetype ==
4430 SMI_BASETYPE_BITS)) {
4431 smiFree(objectPtr->export.value.value.ptr);
4432 } else if ((objectPtr->typePtr->export.basetype ==
4433 SMI_BASETYPE_OBJECTIDENTIFIER) &&
4434 (objectPtr->export.value.basetype ==
4435 objectPtr->typePtr->export.basetype)) {
4436 smiFree(objectPtr->export.value.value.oid);
4448 for (classPtr = modulePtr->firstClassPtr; classPtr;
4449 classPtr = nextClassPtr) {
4451 nextClassPtr = classPtr->nextPtr;
4452 for (attributePtr = classPtr->firstAttributePtr; attributePtr;
4453 attributePtr = nextAttributePtr) {
4455 nextAttributePtr = attributePtr->nextPtr;
4457 for (listPtr = attributePtr->listPtr; listPtr;
4458 listPtr = nextListPtr) {
4459 nextListPtr = listPtr->nextPtr;
4460 if ((attributePtr->export.basetype == SMI_BASETYPE_BITS) ||
4461 (attributePtr->export.basetype == SMI_BASETYPE_ENUM)) {
4462 smiFree(((NamedNumber *)(listPtr->ptr))->export.name);
4463 smiFree((NamedNumber *)(listPtr->ptr));
4464 } else if ((attributePtr->export.basetype == SMI_BASETYPE_INTEGER32) ||
4465 (attributePtr->export.basetype == SMI_BASETYPE_INTEGER64) ||
4466 (attributePtr->export.basetype == SMI_BASETYPE_UNSIGNED32) ||
4467 (attributePtr->export.basetype == SMI_BASETYPE_UNSIGNED64) ||
4468 (attributePtr->export.basetype == SMI_BASETYPE_FLOAT32) ||
4469 (attributePtr->export.basetype == SMI_BASETYPE_FLOAT64) ||
4470 (attributePtr->export.basetype == SMI_BASETYPE_FLOAT128) ||
4471 (attributePtr->export.basetype == SMI_BASETYPE_OCTETSTRING)) {
4472 smiFree((Range *)(listPtr->ptr));
4476 smiFree(attributePtr->export.name);
4477 smiFree(attributePtr->export.format);
4478 smiFree(attributePtr->export.units);
4479 smiFree(attributePtr->export.description);
4480 smiFree(attributePtr->export.reference);
4481 smiFree(attributePtr);
4485 for (eventPtr = classPtr->firstEventPtr; eventPtr;
4486 eventPtr = nextEventPtr) {
4488 nextEventPtr = eventPtr->nextPtr;
4489 smiFree(eventPtr->export.name);
4490 smiFree(eventPtr->export.reference);
4491 smiFree(eventPtr->export.description);
4495 for (listPtr = classPtr->uniqueList; listPtr;
4496 listPtr = nextListPtr) {
4497 nextListPtr = listPtr->nextPtr;
4501 smiFree(classPtr->export.name);
4502 smiFree(classPtr->export.description);
4503 smiFree(classPtr->export.reference);
4510 * In this second module loop we remove each module's types
4511 * and the modules themselves. This separation is required, because
4512 * we reference some types of foreign modules in the first loop.
4514 for (modulePtr = smiHandle->firstModulePtr; modulePtr;
4515 modulePtr = nextModulePtr) {
4516 nextModulePtr = modulePtr->nextPtr;
4518 for (typePtr = modulePtr->firstTypePtr; typePtr;
4519 typePtr = nextTypePtr) {
4520 nextTypePtr = typePtr->nextPtr;
4521 for (listPtr = typePtr->listPtr; listPtr;
4522 listPtr = nextListPtr) {
4523 nextListPtr = listPtr->nextPtr;
4524 if ((typePtr->export.basetype == SMI_BASETYPE_BITS) ||
4525 (typePtr->export.basetype == SMI_BASETYPE_ENUM)) {
4526 smiFree(((NamedNumber *)(listPtr->ptr))->export.name);
4527 smiFree((NamedNumber *)(listPtr->ptr));
4528 } else if ((typePtr->export.basetype == SMI_BASETYPE_INTEGER32) ||
4529 (typePtr->export.basetype == SMI_BASETYPE_INTEGER64) ||
4530 (typePtr->export.basetype == SMI_BASETYPE_UNSIGNED32) ||
4531 (typePtr->export.basetype == SMI_BASETYPE_UNSIGNED64) ||
4532 (typePtr->export.basetype == SMI_BASETYPE_FLOAT32) ||
4533 (typePtr->export.basetype == SMI_BASETYPE_FLOAT64) ||
4534 (typePtr->export.basetype == SMI_BASETYPE_FLOAT128) ||
4535 (typePtr->export.basetype == SMI_BASETYPE_OCTETSTRING)) {
4536 smiFree((Range *)(listPtr->ptr));
4540 smiFree(typePtr->export.name);
4541 smiFree(typePtr->export.format);
4542 smiFree(typePtr->export.units);
4543 smiFree(typePtr->export.description);
4544 smiFree(typePtr->export.reference);
4548 smiFree(modulePtr->export.name);
4549 smiFree(modulePtr->export.path);
4550 smiFree(modulePtr->export.organization);
4551 smiFree(modulePtr->export.contactinfo);
4552 smiFree(modulePtr->export.description);
4553 smiFree(modulePtr->export.reference);
4557 freeNodeTree(smiHandle->rootNodePtr);
4558 smiFree(smiHandle->rootNodePtr);
4566 *----------------------------------------------------------------------
4570 * Load a MIB module. If modulename is a plain name, the file is
4571 * search along the SMIPATH environment variable. If modulename
4572 * contains a `.' or DIR_SEPARATOR it is assumed to be the path.
4575 * 0 on success or -1 on an error.
4580 *----------------------------------------------------------------------
4583 Module *loadModule(const char *modulename, Parser *parserPtr)
4586 Parser *parentParserPtr;
4587 char *path = NULL, *dir, *smipath;
4593 static const char *ext[] = {
4594 "", ".my", ".smiv1", ".smiv2", ".sming", ".mib", ".txt", NULL
4597 if ((!modulename) || !strlen(modulename)) {
4601 if (!smiIsPath(modulename)) {
4603 * A plain modulename. Lookup the path along SMIPATH...
4605 if (!smiHandle->path) {
4609 smipath = smiStrdup(smiHandle->path);
4610 sep[0] = PATH_SEPARATOR; sep[1] = 0;
4611 for (dir = strtok(smipath, sep);
4612 dir; dir = strtok(NULL, sep)) {
4613 for (i = 0; ext[i]; i++) {
4614 smiAsprintf(&path, "%s%c%s%s", dir, DIR_SEPARATOR,
4615 modulename, ext[i]);
4616 if (! access(path, R_OK)) {
4623 char *newmodulename = smiStrdup(modulename);
4624 for (i = 0; newmodulename[i]; i++) {
4625 newmodulename[i] = tolower(newmodulename[i]);
4627 for (i = 0; ext[i]; i++) {
4628 smiAsprintf(&path, "%s%c%s%s", dir, DIR_SEPARATOR,
4629 newmodulename, ext[i]);
4630 if (! access(path, R_OK)) {
4635 smiFree(newmodulename);
4644 * A full path. Take it.
4646 path = smiStrdup(modulename);
4649 #if !defined(_MSC_VER) && !defined(__MINGW32__)
4650 if (!path && smiHandle->cache && smiHandle->cacheProg) {
4651 /* Not found in the path; now try to fetch & cache the module. */
4656 smiAsprintf(&path, "%s%c%s",
4657 smiHandle->cache, DIR_SEPARATOR, modulename);
4658 if (access(path, R_OK)) {
4659 smiAsprintf(&cmd, "%s %s", smiHandle->cacheProg, modulename);
4663 argv[0] = "sh"; argv[1] = "-c"; argv[2] = cmd; argv[3] = 0;
4664 execv("/bin/sh", argv);
4667 waitpid(pid, &status, 0);
4670 if (access(path, R_OK)) {
4679 smiPrintError(parserPtr, ERR_MODULE_NOT_FOUND, modulename);
4686 * Look into the file to determine whether it contains
4687 * SMIv1/SMIv2 or SMIng definitions.
4690 file = fopen(path, "r");
4692 smiPrintError(parserPtr, ERR_OPENING_INPUTFILE, path, strerror(errno));
4696 while ((c = fgetc(file))) {
4697 if (c == '-' || isupper(c)) {
4700 } else if (c == '/' || c == 'm') {
4703 } else if (c == EOF || ! isspace(c)) {
4704 smiPrintError(parserPtr, ERR_ILLEGAL_INPUTFILE, path);
4715 parentParserPtr = smiHandle->parserPtr;
4716 smiHandle->parserPtr = &parser;
4718 parser.flags = smiHandle->flags;
4719 parser.modulePtr = NULL;
4720 parser.complianceModulePtr = NULL;
4721 parser.capabilitiesModulePtr = NULL;
4722 parser.currentDecl = SMI_DECL_UNKNOWN;
4723 parser.firstStatementLine = 0;
4724 parser.firstNestedStatementLine = 0;
4725 parser.firstRevisionLine = 0;
4729 * Initialize a root Node for pending (forward referenced) nodes.
4731 parser.pendingNodePtr = addNode(NULL, 0, NODE_FLAG_ROOT, NULL);
4733 if (smiEnterLexRecursion(parser.file) < 0) {
4734 smiPrintError(&parser, ERR_MAX_LEX_DEPTH);
4735 fclose(parser.file);
4739 smiparse((void *)&parser);
4740 freeNodeTree(parser.pendingNodePtr);
4741 smiFree(parser.pendingNodePtr);
4742 smiLeaveLexRecursion();
4744 fclose(parser.file);
4746 smiHandle->parserPtr = parentParserPtr;
4747 return parser.modulePtr;
4749 smiPrintError(parserPtr, ERR_SMI_NOT_SUPPORTED, path);
4757 #ifdef BACKEND_SMING
4758 parentParserPtr = smiHandle->parserPtr;
4759 smiHandle->parserPtr = &parser;
4761 parser.flags = smiHandle->flags;
4762 parser.modulePtr = NULL;
4763 parser.complianceModulePtr = NULL;
4764 parser.capabilitiesModulePtr = NULL;
4765 parser.currentDecl = SMI_DECL_UNKNOWN;
4766 parser.firstStatementLine = 0;
4767 parser.firstNestedStatementLine = 0;
4768 parser.firstRevisionLine = 0;
4772 * Initialize a root Node for pending (forward referenced) nodes.
4774 parser.pendingNodePtr = addNode(NULL, 0, NODE_FLAG_ROOT, NULL);
4776 if (smingEnterLexRecursion(parser.file) < 0) {
4777 smiPrintError(&parser, ERR_MAX_LEX_DEPTH);
4778 fclose(parser.file);
4782 smingparse((void *)&parser);
4783 freeNodeTree(parser.pendingNodePtr);
4784 smiFree(parser.pendingNodePtr);
4785 smingLeaveLexRecursion();
4787 fclose(parser.file);
4789 smiHandle->parserPtr = parentParserPtr;
4790 return parser.modulePtr;
4792 smiPrintError(parserPtr, ERR_SMING_NOT_SUPPORTED, path);