Index: trunk/tools/dump-xml.c =================================================================== --- trunk/tools/dump-xml.c (revision 46800) +++ trunk/tools/dump-xml.c (working copy) @@ -94,6 +94,7 @@ (access == SMI_ACCESS_NOTIFY) ? "notifyonly" : (access == SMI_ACCESS_READ_ONLY) ? "readonly" : (access == SMI_ACCESS_READ_WRITE) ? "readwrite" : + (access == SMI_ACCESS_WRITE_ONLY) ? "writeonly" : ""; } @@ -626,12 +627,16 @@ for(i = 0, smiType = smiGetFirstType(smiModule); smiType; - i++, smiType = smiGetNextType(smiType)) { + smiType = smiGetNextType(smiType)) { + if (smiType->basetype==SMI_BASETYPE_CHOICE) { + continue; + } if (i == 0) { fprintSegment(f, INDENT, "\n", 0); } fprintTypedef(f, 2 * INDENT, smiType); + i++; } if (i) { Index: trunk/lib/smi.h.in =================================================================== --- trunk/lib/smi.h.in (revision 46800) +++ trunk/lib/smi.h.in (working copy) @@ -96,7 +96,8 @@ SMI_BASETYPE_FLOAT128 = 9, /* only SMIng */ SMI_BASETYPE_ENUM = 10, SMI_BASETYPE_BITS = 11, /* SMIv2, SMIng and SPPI */ - SMI_BASETYPE_POINTER = 12 /* only SMIng */ + SMI_BASETYPE_POINTER = 12, /* only SMIng */ + SMI_BASETYPE_CHOICE = 13 } SmiBasetype; extern char *smiBasetypeAsString(SmiBasetype basetype); @@ -145,7 +146,8 @@ SMI_ACCESS_INSTALL = 6, /* these three entries are only valid */ SMI_ACCESS_INSTALL_NOTIFY = 7, /* for SPPI */ SMI_ACCESS_REPORT_ONLY = 8, - SMI_ACCESS_EVENT_ONLY = 9 /* this entry is valid only for SMIng */ + SMI_ACCESS_EVENT_ONLY = 9, /* this entry is valid only for SMIng */ + SMI_ACCESS_WRITE_ONLY = 10 } SmiAccess; extern char *smiAccessAsString(SmiAccess access); Index: trunk/lib/parser-smi.y =================================================================== --- trunk/lib/parser-smi.y (revision 46800) +++ trunk/lib/parser-smi.y (working copy) @@ -1038,6 +1038,7 @@ List *bitsListPtr, *valueListPtr, *p, *pp, *nextPtr, *listPtr; Import *importPtr; int nBits, bit; + Type *parentPtr; if (valuePtr->basetype == SMI_BASETYPE_UNKNOWN) return; @@ -1102,7 +1103,10 @@ } else if (valuePtr->basetype == SMI_BASETYPE_ENUM) { /* a len of -1 indicates an unresolved enum label in ptr */ if (valuePtr->len == -1) { - for (listPtr = typePtr->listPtr; listPtr; + for (parentPtr=typePtr;parentPtr!=NULL;parentPtr=parentPtr->parentPtr) + if ((listPtr=parentPtr->listPtr)!=NULL) + break; + for (; listPtr; listPtr = listPtr->nextPtr) { if (!strcmp(((NamedNumber *)(listPtr->ptr))->export.name, (char *)valuePtr->value.ptr)) { @@ -2059,7 +2063,7 @@ /* the scanner skips until... */ '}' { - $$ = addType(NULL, SMI_BASETYPE_UNKNOWN, 0, + $$ = addType(NULL, SMI_BASETYPE_CHOICE, 0, thisParserPtr); } ; @@ -3818,6 +3822,9 @@ } integerSubType { + List *p; + Type *baseType=NULL; + Range *range; if ((thisModulePtr->export.language == SMI_LANGUAGE_SMIV2) && (strcmp(thisModulePtr->export.name, "SNMPv2-SMI") && @@ -3826,7 +3833,31 @@ smiPrintError(thisParserPtr, ERR_INTEGER_IN_SMIV2); - $$ = duplicateType(smiHandle->typeInteger32Ptr, 0, + for (p=$3;p!=NULL;p=p->nextPtr) + { + range=(Range *)p->ptr; + if (range->export.minValue.basetype==SMI_BASETYPE_INTEGER32 && + range->export.minValue.value.integer32<0) + { + baseType=smiHandle->typeInteger32Ptr; + break; + } + if (range->export.maxValue.basetype==SMI_BASETYPE_UNSIGNED64 && + range->export.maxValue.value.unsigned64>0xFFFFFFFFu) + { + baseType=smiHandle->typeUnsigned64Ptr; + break; + } + if (range->export.maxValue.basetype==SMI_BASETYPE_UNSIGNED32 && + range->export.maxValue.value.unsigned32>0x7FFFFFFFu) + { + baseType=smiHandle->typeUnsigned32Ptr; + break; + } + } + if (baseType==NULL) + baseType=smiHandle->typeInteger32Ptr; + $$ = duplicateType(baseType, 0, thisParserPtr); setTypeList($$, $3); smiCheckTypeRanges(thisParserPtr, $$); @@ -4224,7 +4255,7 @@ /* NOTE: Counter64 must not have a DEFVAL */ { $$ = smiMalloc(sizeof(SmiValue)); - $$->basetype = SMI_BASETYPE_UNSIGNED32; + $$->basetype = SMI_BASETYPE_INTEGER32; $$->value.unsigned32 = $1; } | NEGATIVENUMBER /* -2147483648..0 */ @@ -5433,8 +5464,24 @@ Status: LOWERCASE_IDENTIFIER { - if (thisModulePtr->export.language == SMI_LANGUAGE_SMIV2) + if (thisModulePtr->export.language == SMI_LANGUAGE_SMIV1) { + if (!strcmp($1, "mandatory")) { + $$ = SMI_STATUS_MANDATORY; + } else if (!strcmp($1, "deprecated")) { + $$ = SMI_STATUS_DEPRECATED; + } else if (!strcmp($1, "obsolete")) { + $$ = SMI_STATUS_OBSOLETE; + } else if (!strcmp($1, "optional")) { + $$ = SMI_STATUS_OPTIONAL; + } else { + smiPrintError(thisParserPtr, + ERR_INVALID_SMIV1_STATUS, + $1); + $$ = SMI_STATUS_UNKNOWN; + } + } else if (thisModulePtr->export.language == SMI_LANGUAGE_SMIV2) + { if (!strcmp($1, "current")) { $$ = SMI_STATUS_CURRENT; } else if (!strcmp($1, "deprecated")) { @@ -5573,7 +5620,7 @@ } else if (!strcmp($1, "write-only")) { smiPrintError(thisParserPtr, ERR_SMIV1_WRITE_ONLY); - $$ = SMI_ACCESS_READ_WRITE; + $$ = SMI_ACCESS_WRITE_ONLY; } else { smiPrintError(thisParserPtr, ERR_INVALID_SMIV1_ACCESS, Index: trunk/lib/smi-check.c =================================================================== --- trunk/lib/smi-check.c (revision 46800) +++ trunk/lib/smi-check.c (working copy) @@ -102,8 +102,7 @@ if ((a->basetype == SMI_BASETYPE_UNSIGNED32) && (b->basetype == SMI_BASETYPE_INTEGER32)) { if ((b->value.integer32 < -1) || - ((a->value.unsigned32 > 1) && - (a->value.unsigned32-1 > 2147483647))) { + (a->value.unsigned32 >= 0x80000000u)) { return 2; } return a->value.unsigned32 - b->value.integer32; @@ -111,11 +110,10 @@ if ((a->basetype == SMI_BASETYPE_INTEGER32) && (b->basetype == SMI_BASETYPE_UNSIGNED32)) { if ((a->value.integer32 < -1) || - ((b->value.unsigned32 > 1) && - (b->value.unsigned32-1 > 2147483647))) { + (b->value.unsigned32 >= 0x80000000u)) { return -2; } - return b->value.unsigned32 - a->value.integer32; + return a->value.integer32 - b->value.unsigned32; } return 0; } @@ -1290,6 +1288,7 @@ smiCheckValueType(Parser *parser, SmiValue *value, Type *type, int line) { List *p, *nextPtr; + Type *parentPtr; if (value && (value->basetype != SMI_BASETYPE_UNKNOWN) && type) { @@ -1351,7 +1350,10 @@ * check whether the defval matches the object's enumeration. */ if (value->basetype == SMI_BASETYPE_ENUM) { - for (p = type->listPtr; p; p = nextPtr) { + for (parentPtr=type;parentPtr!=NULL;parentPtr=parentPtr->parentPtr) + if ((p=parentPtr->listPtr)!=NULL) + break; + for (; p; p = nextPtr) { nextPtr = p->nextPtr; if (((NamedNumber *)(p->ptr))->export.value.value.integer32 == Index: trunk/lib/smi.c =================================================================== --- trunk/lib/smi.c (revision 46800) +++ trunk/lib/smi.c (working copy) @@ -1223,14 +1223,17 @@ typePtr = (Type *)smiTypePtr; - if ((!typePtr) || (!typePtr->listPtr) || - ((typePtr->export.basetype != SMI_BASETYPE_ENUM) && - (typePtr->export.basetype != SMI_BASETYPE_BITS) && - (typePtr->export.basetype != SMI_BASETYPE_POINTER))) { - return NULL; + while (typePtr) + { + if ((typePtr->listPtr) && + ((typePtr->export.basetype == SMI_BASETYPE_ENUM) || + (typePtr->export.basetype == SMI_BASETYPE_BITS) || + (typePtr->export.basetype == SMI_BASETYPE_POINTER))) { + return &((NamedNumber *)typePtr->listPtr->ptr)->export; + } + typePtr=typePtr->parentPtr; } - - return &((NamedNumber *)typePtr->listPtr->ptr)->export; + return NULL; }