|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* smidiff.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Compute and check differences between MIB modules.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 2001 T. Klie, Technical University of Braunschweig.
|
|
Packit |
022b05 |
* Copyright (c) 2001 J. Schoenwaelder, Technical University of Braunschweig.
|
|
Packit |
022b05 |
* Copyright (c) 2001 F. Strauss, Technical University of Braunschweig.
|
|
Packit |
022b05 |
* Copyright (c) 2006 J. Schoenwaelder, International University Bremen.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* See the file "COPYING" for information on usage and redistribution
|
|
Packit |
022b05 |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* @(#) $Id: smidiff.c 8090 2008-04-18 12:56:29Z strauss $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* TODO:
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* - replacing an implicit type with a named type should cause a real
|
|
Packit |
022b05 |
* error if the new type is formally not identical (Mike Heard)
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdlib.h>
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
#include <stdarg.h>
|
|
Packit |
022b05 |
#include <ctype.h>
|
|
Packit |
022b05 |
#ifdef HAVE_WIN_H
|
|
Packit |
022b05 |
#include "win.h"
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "smi.h"
|
|
Packit |
022b05 |
#include "shhopt.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int errorLevel = 6; /* smidiff/libsmi error level (inclusive) */
|
|
Packit |
022b05 |
static int mFlag = 0; /* show the name for error messages */
|
|
Packit |
022b05 |
static int sFlag = 0; /* show the severity for error messages */
|
|
Packit |
022b05 |
static char *oldCompl = NULL; /* name of old compliance statement */
|
|
Packit |
022b05 |
static char *newCompl = NULL; /* name of new compliance statement */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* the `:' separates the view identifier */
|
|
Packit |
022b05 |
static const char *oldTag = "smidiff:old";
|
|
Packit |
022b05 |
static const char *newTag = "smidiff:new";
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#define CODE_SHOW_PREVIOUS 0x01
|
|
Packit |
022b05 |
#define CODE_SHOW_PREVIOUS_IMPLICIT 0x02
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typedef struct Error {
|
|
Packit |
022b05 |
int level; /* error level - roughly the same as smilint */
|
|
Packit |
022b05 |
int id; /* error id used in the error() invocation */
|
|
Packit |
022b05 |
char *tag; /* tag for error identification on cmd line */
|
|
Packit |
022b05 |
char *fmt; /* the complete error format string */
|
|
Packit |
022b05 |
char *description; /* description of the error message */
|
|
Packit |
022b05 |
} Error;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#define ERR_INTERNAL 0
|
|
Packit |
022b05 |
#define ERR_TYPE_REMOVED 1
|
|
Packit |
022b05 |
#define ERR_TYPE_ADDED 2
|
|
Packit |
022b05 |
#define ERR_NODE_REMOVED 3
|
|
Packit |
022b05 |
#define ERR_NODE_ADDED 4
|
|
Packit |
022b05 |
#define ERR_BASETYPE_CHANGED 5
|
|
Packit |
022b05 |
#define ERR_DECL_CHANGED 6
|
|
Packit |
022b05 |
#define ERR_LEGAL_STATUS_CHANGED 8
|
|
Packit |
022b05 |
#define ERR_PREVIOUS_DEFINITION 9
|
|
Packit |
022b05 |
#define ERR_STATUS_CHANGED 10
|
|
Packit |
022b05 |
#define ERR_DESCR_ADDED 11
|
|
Packit |
022b05 |
#define ERR_DESCR_REMOVED 12
|
|
Packit |
022b05 |
#define ERR_DESCR_CHANGED 13
|
|
Packit |
022b05 |
#define ERR_REF_ADDED 14
|
|
Packit |
022b05 |
#define ERR_REF_REMOVED 15
|
|
Packit |
022b05 |
#define ERR_REF_CHANGED 16
|
|
Packit |
022b05 |
#define ERR_FORMAT_ADDED 17
|
|
Packit |
022b05 |
#define ERR_FORMAT_REMOVED 18
|
|
Packit |
022b05 |
#define ERR_FORMAT_CHANGED 19
|
|
Packit |
022b05 |
#define ERR_UNITS_ADDED 20
|
|
Packit |
022b05 |
#define ERR_UNITS_REMOVED 21
|
|
Packit |
022b05 |
#define ERR_UNITS_CHANGED 22
|
|
Packit |
022b05 |
#define ERR_ACCESS_ADDED 23
|
|
Packit |
022b05 |
#define ERR_ACCESS_REMOVED 24
|
|
Packit |
022b05 |
#define ERR_ACCESS_CHANGED 25
|
|
Packit |
022b05 |
#define ERR_NAME_ADDED 26
|
|
Packit |
022b05 |
#define ERR_NAME_REMOVED 27
|
|
Packit |
022b05 |
#define ERR_NAME_CHANGED 28
|
|
Packit |
022b05 |
#define ERR_TO_IMPLICIT 29
|
|
Packit |
022b05 |
#define ERR_FROM_IMPLICIT 30
|
|
Packit |
022b05 |
#define ERR_RANGE_ADDED 31
|
|
Packit |
022b05 |
#define ERR_RANGE_REMOVED 32
|
|
Packit |
022b05 |
#define ERR_RANGE_CHANGED 33
|
|
Packit |
022b05 |
#define ERR_DEFVAL_ADDED 34
|
|
Packit |
022b05 |
#define ERR_DEFVAL_REMOVED 35
|
|
Packit |
022b05 |
#define ERR_DEFVAL_CHANGED 36
|
|
Packit |
022b05 |
#define ERR_ORGA_ADDED 37
|
|
Packit |
022b05 |
#define ERR_ORGA_REMOVED 38
|
|
Packit |
022b05 |
#define ERR_ORGA_CHANGED 39
|
|
Packit |
022b05 |
#define ERR_CONTACT_ADDED 40
|
|
Packit |
022b05 |
#define ERR_CONTACT_REMOVED 41
|
|
Packit |
022b05 |
#define ERR_CONTACT_CHANGED 42
|
|
Packit |
022b05 |
#define ERR_SMIVERSION_CHANGED 43
|
|
Packit |
022b05 |
#define ERR_REVISION_ADDED 44
|
|
Packit |
022b05 |
#define ERR_REVISION_REMOVED 45
|
|
Packit |
022b05 |
#define ERR_REVISION_CHANGED 46
|
|
Packit |
022b05 |
#define ERR_LENGTH_CHANGED 47
|
|
Packit |
022b05 |
#define ERR_LENGTH_OF_TYPE_CHANGED 48
|
|
Packit |
022b05 |
#define ERR_LENGTH_ADDED 49
|
|
Packit |
022b05 |
#define ERR_MEMBER_ADDED 50
|
|
Packit |
022b05 |
#define ERR_MEMBER_REMOVED 51
|
|
Packit |
022b05 |
#define ERR_MEMBER_CHANGED 52
|
|
Packit |
022b05 |
#define ERR_OBJECT_ADDED 53
|
|
Packit |
022b05 |
#define ERR_OBJECT_REMOVED 54
|
|
Packit |
022b05 |
#define ERR_OBJECT_CHANGED 55
|
|
Packit |
022b05 |
#define ERR_NAMED_NUMBER_ADDED 56
|
|
Packit |
022b05 |
#define ERR_NAMED_NUMBER_REMOVED 57
|
|
Packit |
022b05 |
#define ERR_NAMED_NUMBER_CHANGED 58
|
|
Packit |
022b05 |
#define ERR_NAMED_BIT_ADDED_OLD_BYTE 59
|
|
Packit |
022b05 |
#define ERR_NODEKIND_CHANGED 60
|
|
Packit |
022b05 |
#define ERR_INDEXKIND_CHANGED 61
|
|
Packit |
022b05 |
#define ERR_INDEX_CHANGED 62
|
|
Packit |
022b05 |
#define ERR_TYPE_IS_AND_WAS 63
|
|
Packit |
022b05 |
#define ERR_RANGE_OF_TYPE_CHANGED 64
|
|
Packit |
022b05 |
#define ERR_RANGE_OF_TYPE_ADDED 65
|
|
Packit |
022b05 |
#define ERR_RANGE_OF_TYPE_REMOVED 66
|
|
Packit |
022b05 |
#define ERR_TYPE_BASED_ON 67
|
|
Packit |
022b05 |
#define ERR_INDEX_AUGMENT_CHANGED 68
|
|
Packit |
022b05 |
#define ERR_NAMED_NUMBER_OF_TYPE_REMOVED 69
|
|
Packit |
022b05 |
#define ERR_NAMED_NUMBER_TO_TYPE_ADDED 70
|
|
Packit |
022b05 |
#define ERR_NAMED_NUMBER_OF_TYPE_CHANGED 71
|
|
Packit |
022b05 |
#define ERR_NAMED_BIT_OF_TYPE_ADDED_OLD_BYTE 72
|
|
Packit |
022b05 |
#define ERR_LENGTH_REMOVED 73
|
|
Packit |
022b05 |
#define ERR_PREVIOUS_IMPLICIT_DEFINITION 74
|
|
Packit |
022b05 |
#define ERR_STATUS_CHANGED_IMPLICIT 75
|
|
Packit |
022b05 |
#define ERR_LEGAL_STATUS_CHANGED_IMPLICIT 76
|
|
Packit |
022b05 |
#define ERR_LENGTH_OF_TYPE_ADDED 77
|
|
Packit |
022b05 |
#define ERR_LENGTH_OF_TYPE_REMOVED 78
|
|
Packit |
022b05 |
#define ERR_STATUS_ADDED 79
|
|
Packit |
022b05 |
#define ERR_STATUS_REMOVED 80
|
|
Packit |
022b05 |
#define ERR_MANDATORY_GROUP_ADDED 81
|
|
Packit |
022b05 |
#define ERR_MANDATORY_GROUP_REMOVED 82
|
|
Packit |
022b05 |
#define ERR_MANDATORY_EXT_GROUP_ADDED 83
|
|
Packit |
022b05 |
#define ERR_MANDATORY_EXT_GROUP_REMOVED 84
|
|
Packit |
022b05 |
#define ERR_OPTION_ADDED 85
|
|
Packit |
022b05 |
#define ERR_OPTION_REMOVED 86
|
|
Packit |
022b05 |
#define ERR_EXT_OPTION_ADDED 87
|
|
Packit |
022b05 |
#define ERR_EXT_OPTION_REMOVED 88
|
|
Packit |
022b05 |
#define ERR_REFINEMENT_ADDED 89
|
|
Packit |
022b05 |
#define ERR_REFINEMENT_REMOVED 90
|
|
Packit |
022b05 |
#define ERR_EXT_REFINEMENT_ADDED 91
|
|
Packit |
022b05 |
#define ERR_EXT_REFINEMENT_REMOVED 92
|
|
Packit |
022b05 |
#define ERR_MANDATORY_REMOVED 93
|
|
Packit |
022b05 |
#define ERR_MANDATORY_ADDED 94
|
|
Packit |
022b05 |
#define ERR_OPTIONAL_REMOVED 95
|
|
Packit |
022b05 |
#define ERR_OPTIONAL_ADDED 96
|
|
Packit |
022b05 |
#define ERR_MANDATORY_EXT_REMOVED 97
|
|
Packit |
022b05 |
#define ERR_MANDATORY_EXT_ADDED 98
|
|
Packit |
022b05 |
#define ERR_OPTIONAL_EXT_REMOVED 99
|
|
Packit |
022b05 |
#define ERR_OPTIONAL_EXT_ADDED 100
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Error errors[] = {
|
|
Packit |
022b05 |
{ 0, ERR_INTERNAL, "internal",
|
|
Packit |
022b05 |
"internal error!!!", NULL },
|
|
Packit |
022b05 |
{ 1, ERR_TYPE_REMOVED, "type-removed",
|
|
Packit |
022b05 |
"type `%s' has been deleted", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_TYPE_ADDED, "type-added",
|
|
Packit |
022b05 |
"type `%s' has been added", NULL },
|
|
Packit |
022b05 |
{ 1, ERR_NODE_REMOVED, "node-removed",
|
|
Packit |
022b05 |
"%s `%s' has been deleted", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NODE_ADDED, "node-added",
|
|
Packit |
022b05 |
"%s `%s' has been added", NULL },
|
|
Packit |
022b05 |
{ 1, ERR_BASETYPE_CHANGED, "basetype-changed",
|
|
Packit |
022b05 |
"base type of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_DECL_CHANGED, "decl-changed",
|
|
Packit |
022b05 |
"declaration changed for `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_LEGAL_STATUS_CHANGED, "status-change",
|
|
Packit |
022b05 |
"legal status change from `%s' to `%s' for `%s'", NULL },
|
|
Packit |
022b05 |
{ 6, ERR_PREVIOUS_DEFINITION, "previous-definition",
|
|
Packit |
022b05 |
"previous definition of `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_STATUS_CHANGED, "status-change",
|
|
Packit |
022b05 |
"status change from `%s' to `%s' for `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_DESCR_ADDED, "description-added",
|
|
Packit |
022b05 |
"description added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_DESCR_REMOVED, "description-removed",
|
|
Packit |
022b05 |
"description removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_DESCR_CHANGED, "description-changed",
|
|
Packit |
022b05 |
"description of %s `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_REF_ADDED, "ref-added",
|
|
Packit |
022b05 |
"reference added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_REF_REMOVED, "ref-removed",
|
|
Packit |
022b05 |
"reference removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_REF_CHANGED, "ref-changed",
|
|
Packit |
022b05 |
"reference of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_FORMAT_ADDED, "format-added",
|
|
Packit |
022b05 |
"format added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_FORMAT_REMOVED, "format-removed",
|
|
Packit |
022b05 |
"format removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_FORMAT_CHANGED, "format-changed",
|
|
Packit |
022b05 |
"format of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_UNITS_ADDED, "units-added",
|
|
Packit |
022b05 |
"units added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_UNITS_REMOVED, "units-removed",
|
|
Packit |
022b05 |
"units removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_UNITS_CHANGED, "units-changed",
|
|
Packit |
022b05 |
"units of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_ACCESS_ADDED, "access-added",
|
|
Packit |
022b05 |
"access added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_ACCESS_REMOVED, "access-removed",
|
|
Packit |
022b05 |
"access removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_ACCESS_CHANGED, "access-changed",
|
|
Packit |
022b05 |
"access of `%s' changed from `%s' to `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NAME_ADDED, "name-added",
|
|
Packit |
022b05 |
"name added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_NAME_REMOVED, "name-removed",
|
|
Packit |
022b05 |
"name removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NAME_CHANGED, "name-changed",
|
|
Packit |
022b05 |
"name changed from `%s' to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_TO_IMPLICIT, "to-implicit",
|
|
Packit |
022b05 |
"implicit type for `%s' replaces type `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_FROM_IMPLICIT, "from-implicit",
|
|
Packit |
022b05 |
"type `%s' replaces implicit type for `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_RANGE_ADDED, "range-added",
|
|
Packit |
022b05 |
"range `%s' added to type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_RANGE_REMOVED, "range-removed",
|
|
Packit |
022b05 |
"range `%s' removed from type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_RANGE_CHANGED, "range-changed",
|
|
Packit |
022b05 |
"range of type used in `%s' changed from `%s' to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_DEFVAL_ADDED, "defval-added",
|
|
Packit |
022b05 |
"default value added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_DEFVAL_REMOVED, "defval-removed",
|
|
Packit |
022b05 |
"default value removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_DEFVAL_CHANGED, "defval-changed",
|
|
Packit |
022b05 |
"default value of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_ORGA_ADDED, "organization-added",
|
|
Packit |
022b05 |
"organization added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_ORGA_REMOVED, "organization-removed",
|
|
Packit |
022b05 |
"organization removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_ORGA_CHANGED, "organization-changed",
|
|
Packit |
022b05 |
"organization of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_CONTACT_ADDED, "contact-added",
|
|
Packit |
022b05 |
"contact added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_CONTACT_REMOVED, "contact-removed",
|
|
Packit |
022b05 |
"contact removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_CONTACT_CHANGED, "contact-changed",
|
|
Packit |
022b05 |
"contact of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_SMIVERSION_CHANGED, "smi-version-changed",
|
|
Packit |
022b05 |
"SMI version changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_REVISION_ADDED, "revision-added",
|
|
Packit |
022b05 |
"revision `%s' added", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_REVISION_REMOVED, "revision-removed",
|
|
Packit |
022b05 |
"revision `%s' removed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_REVISION_CHANGED, "revision-changed",
|
|
Packit |
022b05 |
"revision `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_LENGTH_CHANGED, "range-changed",
|
|
Packit |
022b05 |
"size of type used in `%s' changed from `%s' to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_LENGTH_OF_TYPE_CHANGED, "range-changed",
|
|
Packit |
022b05 |
"size of type `%s' changed from `%s' to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_LENGTH_ADDED, "range-added",
|
|
Packit |
022b05 |
"size `%s' added to type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_MEMBER_ADDED, "member-added",
|
|
Packit |
022b05 |
"member `%s' added to group `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_MEMBER_REMOVED, "member-removed",
|
|
Packit |
022b05 |
"member `%s' removed from group `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_MEMBER_CHANGED, "member-changed",
|
|
Packit |
022b05 |
"member `%s' changed in group `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_OBJECT_ADDED, "object-added",
|
|
Packit |
022b05 |
"object `%s' added", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_OBJECT_REMOVED, "object-removed",
|
|
Packit |
022b05 |
"object `%s' removed", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_OBJECT_CHANGED, "object-changed",
|
|
Packit |
022b05 |
"object `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NAMED_NUMBER_ADDED, "named-number-added",
|
|
Packit |
022b05 |
"named number `%s' added to type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_NAMED_NUMBER_REMOVED, "named-number-removed",
|
|
Packit |
022b05 |
"named number `%s' removed from type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NAMED_NUMBER_CHANGED, "named-number-changed",
|
|
Packit |
022b05 |
"named number `%s' changed to `%s' at type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_NAMED_BIT_ADDED_OLD_BYTE, "named-bit-added-old-byte",
|
|
Packit |
022b05 |
"named bit `%s' added without starting in a new byte in type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_LENGTH_REMOVED, "range-removed",
|
|
Packit |
022b05 |
"size `%s' removed from type used in `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_NODEKIND_CHANGED, "nodekind-changed",
|
|
Packit |
022b05 |
"node kind of `%s' changed", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_INDEXKIND_CHANGED, "indexkind-changed",
|
|
Packit |
022b05 |
"changed kind of index from `%s' to `%s' in node `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_INDEX_CHANGED, "index-changed",
|
|
Packit |
022b05 |
"index of `%s' changed from %s to %s", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_TYPE_IS_AND_WAS, "type-is-and-was",
|
|
Packit |
022b05 |
"type changed from %s to %s", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_RANGE_OF_TYPE_CHANGED, "range-changed",
|
|
Packit |
022b05 |
"range of type `%s' changed from `%s' to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_RANGE_OF_TYPE_ADDED, "range-added",
|
|
Packit |
022b05 |
"range `%s' added to type `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_RANGE_OF_TYPE_REMOVED, "range-removed",
|
|
Packit |
022b05 |
"range `%s' removed from type `%s'", NULL },
|
|
Packit |
022b05 |
{ 6, ERR_TYPE_BASED_ON, "type-based-on",
|
|
Packit |
022b05 |
"type `%s' based on `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_INDEX_AUGMENT_CHANGED, "index-changed",
|
|
Packit |
022b05 |
"index of `%s' changed from augmenting `%s' to augmenting `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_NAMED_NUMBER_OF_TYPE_REMOVED, "named-number-removed",
|
|
Packit |
022b05 |
"named number `%s' removed from type `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NAMED_NUMBER_TO_TYPE_ADDED, "named-number-added",
|
|
Packit |
022b05 |
"named number `%s' added to type `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_NAMED_NUMBER_OF_TYPE_CHANGED, "named-number-changed",
|
|
Packit |
022b05 |
"named number `%s' changed to `%s' in type `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_NAMED_BIT_OF_TYPE_ADDED_OLD_BYTE, "named-bit-added-old-byte",
|
|
Packit |
022b05 |
"named bit `%s' added without starting in a new byte in type `%s'", NULL },
|
|
Packit |
022b05 |
{ 6, ERR_PREVIOUS_IMPLICIT_DEFINITION, "previous-definition",
|
|
Packit |
022b05 |
"previous implicit definition", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_STATUS_CHANGED_IMPLICIT, "status-change",
|
|
Packit |
022b05 |
"status change from `%s' to `%s' for implicit type", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_LEGAL_STATUS_CHANGED_IMPLICIT, "status-change",
|
|
Packit |
022b05 |
"legal status change from `%s' to `%s' for implicit type", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_LENGTH_OF_TYPE_ADDED, "range-added",
|
|
Packit |
022b05 |
"size `%s' added to type `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_LENGTH_OF_TYPE_REMOVED, "range-removed",
|
|
Packit |
022b05 |
"size `%s' removed from type `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_STATUS_ADDED, "status-added",
|
|
Packit |
022b05 |
"status added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_STATUS_REMOVED, "status-removed",
|
|
Packit |
022b05 |
"status removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_MANDATORY_GROUP_ADDED, "mandatory-added",
|
|
Packit |
022b05 |
"mandatory group `%s' added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_MANDATORY_GROUP_REMOVED, "mandatory-removed",
|
|
Packit |
022b05 |
"mandatory group `%s' removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_MANDATORY_EXT_GROUP_ADDED, "mandatory-added",
|
|
Packit |
022b05 |
"mandatory group `%s::%s' added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_MANDATORY_EXT_GROUP_REMOVED, "mandatory-removed",
|
|
Packit |
022b05 |
"mandatory group `%s::%s' removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_OPTION_ADDED, "option-added",
|
|
Packit |
022b05 |
"optional group `%s' added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_OPTION_REMOVED, "option-removed",
|
|
Packit |
022b05 |
"optional group `%s' removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_EXT_OPTION_ADDED, "option-added",
|
|
Packit |
022b05 |
"optional group `%s::%s' added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_EXT_OPTION_REMOVED, "option-removed",
|
|
Packit |
022b05 |
"optional group `%s::%s' removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_REFINEMENT_ADDED, "refinement-added",
|
|
Packit |
022b05 |
"object refinement for `%s' added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_REFINEMENT_REMOVED, "refinement-removed",
|
|
Packit |
022b05 |
"object refinement for `%s' removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 5, ERR_EXT_REFINEMENT_ADDED, "refinement-added",
|
|
Packit |
022b05 |
"object refinement for `%s::%s' added to `%s'", NULL },
|
|
Packit |
022b05 |
{ 2, ERR_EXT_REFINEMENT_REMOVED, "refinement-removed",
|
|
Packit |
022b05 |
"object refinement for `%s::%s' removed from `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_MANDATORY_REMOVED, "mandatory-removed",
|
|
Packit |
022b05 |
"%s `%s' is mandatory under `%s' but not mandatory under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_MANDATORY_ADDED, "mandatory-added",
|
|
Packit |
022b05 |
"%s `%s' is not mandatory under `%s' but mandatory under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_OPTIONAL_REMOVED, "optional-removed",
|
|
Packit |
022b05 |
"%s `%s' is conditionally optional under `%s' but not under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_OPTIONAL_ADDED, "optional-added",
|
|
Packit |
022b05 |
"%s `%s' is not conditionally optional under `%s' but under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_MANDATORY_EXT_REMOVED, "mandatory-removed",
|
|
Packit |
022b05 |
"%s `%s::%s' is mandatory under `%s' but not mandatory under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_MANDATORY_EXT_ADDED, "mandatory-added",
|
|
Packit |
022b05 |
"%s `%s::%s' is not mandatory under `%s' but mandatory under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_OPTIONAL_EXT_REMOVED, "optional-removed",
|
|
Packit |
022b05 |
"%s `%s::%s' is conditionally optional under `%s' but not under `%s'", NULL },
|
|
Packit |
022b05 |
{ 3, ERR_OPTIONAL_EXT_ADDED, "optional-added",
|
|
Packit |
022b05 |
"%s `%s::%s' is not conditionally optional under `%s' but under `%s'", NULL },
|
|
Packit |
022b05 |
{ 0, 0, NULL, NULL }
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *smiStringDecl(SmiDecl macro)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return
|
|
Packit |
022b05 |
(macro == SMI_DECL_UNKNOWN) ? "unknown construct" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_IMPLICIT_TYPE) ? "implicit construct" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_TYPEASSIGNMENT) ? "type assignment" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_IMPL_SEQUENCEOF) ? "implicit sequence-of construct" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_VALUEASSIGNMENT) ? "value assignment" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_OBJECTTYPE) ? "object definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_OBJECTIDENTITY) ? "object identity definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_MODULEIDENTITY) ? "module identity definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_NOTIFICATIONTYPE) ? "notification definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_TRAPTYPE) ? "trap definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_OBJECTGROUP) ? "object group definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_NOTIFICATIONGROUP) ? "notification group definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_MODULECOMPLIANCE) ? "module compliance definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_AGENTCAPABILITIES) ? "agent capabilities definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_TEXTUALCONVENTION) ? "textual convention definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_MACRO) ? "macro definition" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_COMPL_GROUP) ? "optional group" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_COMPL_OBJECT) ? "object refinement" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_MODULE) ? "module" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_TYPEDEF) ? "typedef" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_NODE) ? "node" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_SCALAR) ? "scalar" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_TABLE) ? "table" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_ROW) ? "row" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_COLUMN) ? "column" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_NOTIFICATION) ? "notification" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_GROUP) ? "group" :
|
|
Packit |
022b05 |
(macro == SMI_DECL_COMPLIANCE) ? "compliance" :
|
|
Packit |
022b05 |
"<UNDEFINED>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
setErrorSeverity(char *pattern, int severity)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; errors[i].fmt; i++) {
|
|
Packit |
022b05 |
if (strstr(errors[i].tag, pattern) == errors[i].tag) {
|
|
Packit |
022b05 |
errors[i].level = severity;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
printError(SmiModule *smiModule, int id, int line, va_list ap)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Search for the tag instead of just using the id as an index so
|
|
Packit |
022b05 |
* that we do not run into trouble if the id is bogus.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; errors[i].fmt; i++) {
|
|
Packit |
022b05 |
if (errors[i].id == id) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! errors[i].fmt) {
|
|
Packit |
022b05 |
i = 0; /* assumes that 0 is the internal error */
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (errors[i].level <= errorLevel) {
|
|
Packit |
022b05 |
fprintf(stdout, "%s", smiModule->path);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (line >= 0) {
|
|
Packit |
022b05 |
fprintf(stdout, ":%d", line);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(stdout, " ");
|
|
Packit |
022b05 |
if (sFlag) {
|
|
Packit |
022b05 |
fprintf(stdout, "[%d] ", errors[i].level);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (mFlag) {
|
|
Packit |
022b05 |
fprintf(stdout, "{%s} ", errors[i].tag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
switch (errors[i].level) {
|
|
Packit |
022b05 |
case 4:
|
|
Packit |
022b05 |
case 5:
|
|
Packit |
022b05 |
fprintf(stdout, "warning: ");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case 6:
|
|
Packit |
022b05 |
fprintf(stdout, "info: ");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
vfprintf(stdout, errors[i].fmt, ap);
|
|
Packit |
022b05 |
fprintf(stdout, "\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
printErrorAtLine(SmiModule *smiModule, int id, int line, ...)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
va_list ap;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
va_start(ap, line);
|
|
Packit |
022b05 |
printError(smiModule, id, line, ap);
|
|
Packit |
022b05 |
va_end(ap);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringTime(time_t t)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char s[27];
|
|
Packit |
022b05 |
struct tm *tm;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tm = gmtime(&t);
|
|
Packit |
022b05 |
sprintf(s, "%04d-%02d-%02d %02d:%02d",
|
|
Packit |
022b05 |
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
|
Packit |
022b05 |
tm->tm_hour, tm->tm_min);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringNodekind(SmiNodekind nodekind)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_UNKNOWN) ? "unknown" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_NODE) ? "node" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_SCALAR) ? "scalar" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_TABLE) ? "table" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_ROW) ? "row" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_COLUMN) ? "column" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_NOTIFICATION) ? "notification" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_GROUP) ? "group" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_COMPLIANCE) ? "compliance" :
|
|
Packit |
022b05 |
(nodekind == SMI_NODEKIND_CAPABILITIES) ? "capabilities" :
|
|
Packit |
022b05 |
"<unknown>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
diffStrings(const char *s1, const char *s2)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, j;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0, j = 0; s1[i] && s2[j]; i++, j++) {
|
|
Packit |
022b05 |
while (s1[i] && isspace((int) s1[i])) i++;
|
|
Packit |
022b05 |
while (s2[j] && isspace((int) s2[j])) j++;
|
|
Packit |
022b05 |
if (! s1[i] || ! s2[j]) break;
|
|
Packit |
022b05 |
if (s1[i] != s2[j]) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return (s1[i] != s2[j]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkName(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *oldName, char *newName)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldName && newName) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAME_ADDED,
|
|
Packit |
022b05 |
newLine, newName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldName && !newName) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_NAME_REMOVED,
|
|
Packit |
022b05 |
oldLine, oldName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldName && newName && strcmp(oldName, newName) != 0) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAME_CHANGED,
|
|
Packit |
022b05 |
newLine, oldName, newName);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkDecl(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, SmiDecl oldDecl, SmiDecl newDecl)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldDecl != newDecl) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DECL_CHANGED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringStatus(SmiStatus status)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *statStr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch( status ) {
|
|
Packit |
022b05 |
case SMI_STATUS_CURRENT:
|
|
Packit |
022b05 |
statStr = "current";
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_STATUS_DEPRECATED:
|
|
Packit |
022b05 |
statStr = "deprecated";
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_STATUS_OBSOLETE:
|
|
Packit |
022b05 |
statStr = "obsolete";
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_STATUS_MANDATORY:
|
|
Packit |
022b05 |
statStr = "mandatory";
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_STATUS_OPTIONAL:
|
|
Packit |
022b05 |
statStr = "optional";
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_STATUS_UNKNOWN:
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
statStr = "unknown";
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return statStr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkStatus(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, SmiStatus oldStatus, SmiStatus newStatus)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldStatus == newStatus) {
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldStatus == SMI_STATUS_UNKNOWN) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_STATUS_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
} else if (newStatus == SMI_STATUS_UNKNOWN) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_STATUS_REMOVED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
} else if (((oldStatus == SMI_STATUS_CURRENT
|
|
Packit |
022b05 |
&& (newStatus == SMI_STATUS_DEPRECATED
|
|
Packit |
022b05 |
|| newStatus == SMI_STATUS_OBSOLETE)))
|
|
Packit |
022b05 |
|| ((oldStatus == SMI_STATUS_DEPRECATED
|
|
Packit |
022b05 |
&& newStatus == SMI_STATUS_OBSOLETE))) {
|
|
Packit |
022b05 |
if (name) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_LEGAL_STATUS_CHANGED, newLine,
|
|
Packit |
022b05 |
getStringStatus(oldStatus),
|
|
Packit |
022b05 |
getStringStatus(newStatus),
|
|
Packit |
022b05 |
name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_LEGAL_STATUS_CHANGED_IMPLICIT, newLine,
|
|
Packit |
022b05 |
getStringStatus(oldStatus),
|
|
Packit |
022b05 |
getStringStatus(newStatus));
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS_IMPLICIT;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
if (name) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_STATUS_CHANGED, newLine,
|
|
Packit |
022b05 |
getStringStatus(oldStatus),
|
|
Packit |
022b05 |
getStringStatus(newStatus),
|
|
Packit |
022b05 |
name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_STATUS_CHANGED_IMPLICIT,
|
|
Packit |
022b05 |
newLine,
|
|
Packit |
022b05 |
getStringStatus(oldStatus),
|
|
Packit |
022b05 |
getStringStatus(newStatus));
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS_IMPLICIT;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringAccess( SmiAccess smiAccess )
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
switch( smiAccess ) {
|
|
Packit |
022b05 |
case SMI_ACCESS_NOT_IMPLEMENTED: return "not-implemented";
|
|
Packit |
022b05 |
case SMI_ACCESS_NOT_ACCESSIBLE : return "not-accessible";
|
|
Packit |
022b05 |
case SMI_ACCESS_NOTIFY : return "notify";
|
|
Packit |
022b05 |
case SMI_ACCESS_READ_ONLY : return "read-only";
|
|
Packit |
022b05 |
case SMI_ACCESS_READ_WRITE : return "read-write";
|
|
Packit |
022b05 |
case SMI_ACCESS_UNKNOWN:
|
|
Packit |
022b05 |
default: return "unknown";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkAccess(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, SmiAccess oldAccess, SmiAccess newAccess)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldAccess == newAccess) {
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldAccess == SMI_ACCESS_UNKNOWN) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_ACCESS_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
} else if (newAccess == SMI_ACCESS_UNKNOWN) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_ACCESS_REMOVED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_ACCESS_CHANGED,
|
|
Packit |
022b05 |
newLine, name,
|
|
Packit |
022b05 |
getStringAccess( oldAccess ),
|
|
Packit |
022b05 |
getStringAccess( newAccess ));
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkDescription(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, SmiDecl decl, char *oldDescr, char *newDescr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldDescr && newDescr) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DESCR_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldDescr && !newDescr) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DESCR_REMOVED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldDescr && newDescr && diffStrings(oldDescr, newDescr)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DESCR_CHANGED,
|
|
Packit |
022b05 |
newLine, smiStringDecl(decl), name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkReference(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, char *oldRef, char *newRef)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldRef && newRef) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_REF_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldRef && !newRef) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_REF_REMOVED,
|
|
Packit |
022b05 |
oldLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldRef && newRef && diffStrings(oldRef, newRef) != 0) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_REF_CHANGED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkFormat(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, char *oldFormat, char *newFormat)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldFormat && newFormat) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_FORMAT_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldFormat && !newFormat) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_FORMAT_REMOVED,
|
|
Packit |
022b05 |
oldLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldFormat && newFormat && strcmp(oldFormat, newFormat) != 0) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_FORMAT_CHANGED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkUnits(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, char *oldUnits, char *newUnits)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldUnits && newUnits) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_UNITS_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldUnits && !newUnits) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_UNITS_REMOVED,
|
|
Packit |
022b05 |
oldLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldUnits && newUnits && strcmp(oldUnits, newUnits) != 0) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_UNITS_CHANGED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static SmiType*
|
|
Packit |
022b05 |
findTypeWithRange(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiType *iterType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (iterType = smiType; iterType; iterType = smiGetParentType(iterType)) {
|
|
Packit |
022b05 |
if (smiGetFirstRange(iterType)) {
|
|
Packit |
022b05 |
return iterType;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* This function assumes that the compared values have the same basetype.
|
|
Packit |
022b05 |
* If the basetype is different, no comparison is done
|
|
Packit |
022b05 |
* and '0' will be returned. Same for SMI_BASETYPE_UNKNOWN.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
cmpSmiValues( SmiValue a, SmiValue b )
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
int changed = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (a.basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM :
|
|
Packit |
022b05 |
changed = (a.value.integer32 != b.value.integer32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
changed = (a.value.unsigned32 != b.value.unsigned32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
changed = (a.value.integer64 != b.value.integer64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
changed = (a.value.unsigned64 != b.value.unsigned64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT32:
|
|
Packit |
022b05 |
changed = (a.value.float32 != b.value.float32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT64:
|
|
Packit |
022b05 |
changed = (a.value.float64 != b.value.float64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT128:
|
|
Packit |
022b05 |
changed = (a.value.float128 != b.value.float128);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
changed = (a.len != b.len)
|
|
Packit |
022b05 |
|| (memcmp(a.value.ptr, b.value.ptr, a.len) != 0);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
changed = (a.len != b.len);
|
|
Packit |
022b05 |
for (i = 0; !changed && i < a.len; i++) {
|
|
Packit |
022b05 |
changed = (a.value.oid[i] - b.value.oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit |
022b05 |
case SMI_BASETYPE_POINTER:
|
|
Packit |
022b05 |
/* this should not occur */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return changed;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#if 0
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getTypeName(SmiType *smiType, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char* name;
|
|
Packit |
022b05 |
SmiModule * tm;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( ! smiType ) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( smiType->name ) {
|
|
Packit |
022b05 |
tm = smiGetTypeModule( smiType );
|
|
Packit |
022b05 |
if( smiModule != tm ) {
|
|
Packit |
022b05 |
if( smiModule->name ) {
|
|
Packit |
022b05 |
name = (char *)malloc( strlen( smiType->name ) +
|
|
Packit |
022b05 |
strlen( tm->name ) + 5 );
|
|
Packit |
022b05 |
sprintf( name, "%s::%s",
|
|
Packit |
022b05 |
tm->name, smiType->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
name = strdup( smiType->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
name = strdup( smiType->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
name = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return name;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
iterateTypeImports(char *typeName,
|
|
Packit |
022b05 |
SmiType *smiType, SmiType *smiTwR,
|
|
Packit |
022b05 |
int line,
|
|
Packit |
022b05 |
SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiType *iterType, *oldIterType;
|
|
Packit |
022b05 |
char *iterTypeName, *oldIterTypeName = strdup( typeName );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
iterType = smiType;
|
|
Packit |
022b05 |
while( 1 ) {
|
|
Packit |
022b05 |
iterType = smiGetParentType( iterType );
|
|
Packit |
022b05 |
iterTypeName = getTypeName( iterType, smiModule );
|
|
Packit |
022b05 |
if( (!iterType) || !iterTypeName ) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
printErrorAtLine( smiGetTypeModule( smiType ),
|
|
Packit |
022b05 |
ERR_TYPE_BASED_ON,
|
|
Packit |
022b05 |
line,
|
|
Packit |
022b05 |
oldIterTypeName,
|
|
Packit |
022b05 |
iterTypeName );
|
|
Packit |
022b05 |
free( oldIterTypeName );
|
|
Packit |
022b05 |
oldIterTypeName = iterTypeName;
|
|
Packit |
022b05 |
oldIterType = iterType;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getValueString(SmiValue *valuePtr, SmiType *typePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char s[1024];
|
|
Packit |
022b05 |
char ss[9];
|
|
Packit |
022b05 |
int n;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
SmiNode *nodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s[0] = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (valuePtr->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
sprintf(s, "%lu", valuePtr->value.unsigned32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
sprintf(s, "%ld", valuePtr->value.integer32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
sprintf(s, UINT64_FORMAT, valuePtr->value.unsigned64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
sprintf(s, INT64_FORMAT, valuePtr->value.integer64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT32:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT64:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT128:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(typePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.unsigned32 == valuePtr->value.unsigned32)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "%ld", valuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
for (i = 0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (!isprint((int)valuePtr->value.ptr[i])) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i == valuePtr->len) {
|
|
Packit |
022b05 |
sprintf(s, "\"%s\"", valuePtr->value.ptr);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "'%*s'H", 2 * valuePtr->len, " ");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
sprintf(ss, "%02x", valuePtr->value.ptr[i]);
|
|
Packit |
022b05 |
strncpy(&s[1+2*i], ss, 2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
sprintf(s, "{");
|
|
Packit |
022b05 |
for (i = 0, n = 0; i < valuePtr->len * 8; i++) {
|
|
Packit |
022b05 |
if (valuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(typePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.unsigned32 == i)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
if (n)
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], ", ");
|
|
Packit |
022b05 |
n++;
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%s", nn->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "}");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit |
022b05 |
case SMI_BASETYPE_POINTER:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
|
|
Packit |
022b05 |
if (nodePtr) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nodePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcpy(s, "{");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (i) strcat(s, " ");
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
strcat(s, "}");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringSubrange(SmiRange *range, SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *minStr, *maxStr, *str;
|
|
Packit |
022b05 |
minStr = strdup( getValueString(&range->minValue, smiType) );
|
|
Packit |
022b05 |
maxStr = strdup( getValueString(&range->maxValue, smiType) );
|
|
Packit |
022b05 |
if (memcmp(&range->minValue, &range->maxValue,
|
|
Packit |
022b05 |
sizeof(SmiValue))) {
|
|
Packit |
022b05 |
str = malloc( strlen( minStr ) + strlen( maxStr ) + 3 );
|
|
Packit |
022b05 |
if( !str ) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf(str, "%s..%s", minStr, maxStr);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
str = strdup( minStr );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return str;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringRange(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRange *range;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
char *str, *subRange;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
str = NULL;
|
|
Packit |
022b05 |
for(i = 0, range = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
range; i++, range = smiGetNextRange(range)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
str = realloc( str, strlen( str ) +2 );
|
|
Packit |
022b05 |
if( str ) {
|
|
Packit |
022b05 |
sprintf(str, "%s|", str);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
str = strdup("(");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
subRange = getStringSubrange( range, smiType );
|
|
Packit |
022b05 |
if( !subRange ) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
str = realloc( str, strlen( str ) + strlen( subRange ) + 1 );
|
|
Packit |
022b05 |
if( !str ) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf( str, "%s%s", str, subRange );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
str = realloc( str, strlen( str ) + 2 );
|
|
Packit |
022b05 |
if( str ) {
|
|
Packit |
022b05 |
sprintf(str, "%s)", str);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return str;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
printRangeChangeError( SmiType *oldTwR, SmiType *newTwR,
|
|
Packit |
022b05 |
SmiModule *newModule, char *name )
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *strOldRange, *strNewRange;
|
|
Packit |
022b05 |
int error, errorOT;
|
|
Packit |
022b05 |
if( newTwR->basetype == SMI_BASETYPE_OCTETSTRING ) {
|
|
Packit |
022b05 |
error = ERR_LENGTH_CHANGED;
|
|
Packit |
022b05 |
errorOT = ERR_LENGTH_OF_TYPE_CHANGED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
error = ERR_RANGE_CHANGED;
|
|
Packit |
022b05 |
errorOT = ERR_RANGE_OF_TYPE_CHANGED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
strOldRange = getStringRange( oldTwR );
|
|
Packit |
022b05 |
strNewRange = getStringRange( newTwR );
|
|
Packit |
022b05 |
if( name ) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule,
|
|
Packit |
022b05 |
error,
|
|
Packit |
022b05 |
smiGetTypeLine( newTwR ),
|
|
Packit |
022b05 |
name, strOldRange, strNewRange );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule,
|
|
Packit |
022b05 |
errorOT,
|
|
Packit |
022b05 |
smiGetTypeLine( newTwR ),
|
|
Packit |
022b05 |
oldTwR->name, strOldRange, strNewRange );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
free( strOldRange );
|
|
Packit |
022b05 |
free( strNewRange );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkRanges(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name,
|
|
Packit |
022b05 |
SmiType *oldType, SmiType *newType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiType *oldTwR, *newTwR; /* parent types with ranges */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldTwR = findTypeWithRange(oldType);
|
|
Packit |
022b05 |
newTwR = findTypeWithRange(newType);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldTwR && newTwR) {
|
|
Packit |
022b05 |
char *strRange;
|
|
Packit |
022b05 |
int error, errorOT;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
strRange = getStringRange( newTwR );
|
|
Packit |
022b05 |
if( newTwR->basetype == SMI_BASETYPE_OCTETSTRING ) {
|
|
Packit |
022b05 |
error = ERR_LENGTH_ADDED;
|
|
Packit |
022b05 |
errorOT = ERR_LENGTH_OF_TYPE_ADDED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
error = ERR_RANGE_ADDED;
|
|
Packit |
022b05 |
errorOT = ERR_RANGE_OF_TYPE_ADDED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if( name ) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, error,
|
|
Packit |
022b05 |
newLine, strRange, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, errorOT,
|
|
Packit |
022b05 |
newLine, strRange, newTwR->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
free( strRange );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldTwR && !newTwR) {
|
|
Packit |
022b05 |
char *strRange;
|
|
Packit |
022b05 |
int error, errorOT;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
strRange = getStringRange( oldTwR );
|
|
Packit |
022b05 |
if( oldTwR->basetype == SMI_BASETYPE_OCTETSTRING ) {
|
|
Packit |
022b05 |
error = ERR_LENGTH_REMOVED;
|
|
Packit |
022b05 |
errorOT = ERR_LENGTH_OF_TYPE_REMOVED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
error = ERR_RANGE_REMOVED;
|
|
Packit |
022b05 |
errorOT = ERR_RANGE_OF_TYPE_REMOVED;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if( name ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, error,
|
|
Packit |
022b05 |
newLine, strRange, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, errorOT,
|
|
Packit |
022b05 |
newLine, strRange, oldTwR->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
free( strRange );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( oldTwR == oldType ) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
oldLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
SmiModule *modTwR;
|
|
Packit |
022b05 |
int line;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modTwR = smiGetTypeModule( oldTwR );
|
|
Packit |
022b05 |
line = smiGetTypeLine( oldTwR );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
printErrorAtLine( modTwR, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
line, name );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldTwR && newTwR) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRange *oldRange, *newRange;
|
|
Packit |
022b05 |
oldRange = smiGetFirstRange(oldTwR);
|
|
Packit |
022b05 |
newRange = smiGetFirstRange(newTwR);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
while( oldRange || newRange ) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( oldRange && newRange ) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if(cmpSmiValues(oldRange->minValue, newRange->minValue) ||
|
|
Packit |
022b05 |
cmpSmiValues(oldRange->maxValue, newRange->maxValue)) {
|
|
Packit |
022b05 |
printRangeChangeError( oldTwR, newTwR, newModule, name );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
else if (oldRange){
|
|
Packit |
022b05 |
printRangeChangeError( oldTwR, newTwR, newModule, name );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
else if( newRange ) {
|
|
Packit |
022b05 |
printRangeChangeError( oldTwR, newTwR, newModule, name );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldRange = smiGetNextRange( oldRange );
|
|
Packit |
022b05 |
newRange = smiGetNextRange( newRange );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkDefVal(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name,
|
|
Packit |
022b05 |
SmiValue oldVal, SmiValue newVal)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if ((oldVal.basetype != SMI_BASETYPE_UNKNOWN) &&
|
|
Packit |
022b05 |
(newVal.basetype == SMI_BASETYPE_UNKNOWN)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DEFVAL_REMOVED, newLine, name);
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION, oldLine, name);
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((oldVal.basetype == SMI_BASETYPE_UNKNOWN) &&
|
|
Packit |
022b05 |
(newVal.basetype != SMI_BASETYPE_UNKNOWN)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DEFVAL_ADDED, newLine, name);
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#if 0 /* changed base type is reported, anyway. */
|
|
Packit |
022b05 |
if (oldVal.basetype != newVal.basetype) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DEFVAL_CHANGED, newLine, name);
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION, oldLine, name);
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cmpSmiValues(oldVal, newVal)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_DEFVAL_CHANGED, newLine,name);
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION, oldLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkNamedNumbers(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, SmiNode *smiNode,
|
|
Packit |
022b05 |
SmiType *oldType, SmiType *newType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNamedNumber *oldNN, *newNN;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldNN = smiGetFirstNamedNumber( oldType );
|
|
Packit |
022b05 |
newNN = smiGetFirstNamedNumber( newType );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
while( oldNN || newNN ) {
|
|
Packit |
022b05 |
if( oldNN && !newNN ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAMED_NUMBER_REMOVED, newLine,
|
|
Packit |
022b05 |
oldNN->name, smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAMED_NUMBER_OF_TYPE_REMOVED,
|
|
Packit |
022b05 |
newLine, oldNN->name, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
oldNN = smiGetNextNamedNumber( oldNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else if( !oldNN && newNN ) {
|
|
Packit |
022b05 |
/* check if new byte has been started (bits only) */
|
|
Packit |
022b05 |
if( newType->basetype == SMI_BASETYPE_BITS ) {
|
|
Packit |
022b05 |
SmiNamedNumber *veryOldNN = NULL, *iterNN;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* find largest old named number */
|
|
Packit |
022b05 |
for( iterNN = smiGetFirstNamedNumber( oldType );
|
|
Packit |
022b05 |
iterNN; iterNN = smiGetNextNamedNumber( iterNN ) ) {
|
|
Packit |
022b05 |
veryOldNN = iterNN;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( veryOldNN ) {
|
|
Packit |
022b05 |
/* we assume that we have bits, and the named numbers
|
|
Packit |
022b05 |
of bits are stored in NN->value.value.unsigned32 */
|
|
Packit |
022b05 |
if( newNN->value.value.unsigned32 / 8 <=
|
|
Packit |
022b05 |
veryOldNN->value.value.unsigned32 / 8 ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_BIT_ADDED_OLD_BYTE,
|
|
Packit |
022b05 |
newLine, newNN->name,
|
|
Packit |
022b05 |
smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_BIT_OF_TYPE_ADDED_OLD_BYTE,
|
|
Packit |
022b05 |
newLine, newNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
if( smiNode ){
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAMED_NUMBER_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name,
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_TO_TYPE_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAMED_NUMBER_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_TO_TYPE_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAMED_NUMBER_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NAMED_NUMBER_TO_TYPE_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
newNN = smiGetNextNamedNumber( newNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else if( oldNN && newNN ) {
|
|
Packit |
022b05 |
switch( oldType->basetype ) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
/* we assume that we have bits, and the named numbers
|
|
Packit |
022b05 |
of bits are stored in NN->value.value.unsigned32 */
|
|
Packit |
022b05 |
if( oldNN->value.value.unsigned32 <
|
|
Packit |
022b05 |
newNN->value.value.unsigned32 ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_NAMED_NUMBER_REMOVED,
|
|
Packit |
022b05 |
newLine,
|
|
Packit |
022b05 |
oldNN->name,
|
|
Packit |
022b05 |
smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_OF_TYPE_REMOVED,
|
|
Packit |
022b05 |
newLine,
|
|
Packit |
022b05 |
oldNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
oldNN = smiGetNextNamedNumber( oldNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else if( oldNN->value.value.unsigned32 >
|
|
Packit |
022b05 |
newNN->value.value.unsigned32 ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_NAMED_NUMBER_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name,
|
|
Packit |
022b05 |
smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_TO_TYPE_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
newNN = smiGetNextNamedNumber( newNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
if( strcmp( oldNN->name, newNN->name ) ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_CHANGED,
|
|
Packit |
022b05 |
newLine,
|
|
Packit |
022b05 |
oldNN->name, newNN->name,
|
|
Packit |
022b05 |
smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_OF_TYPE_CHANGED,
|
|
Packit |
022b05 |
newLine,
|
|
Packit |
022b05 |
oldNN->name, newNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
oldNN = smiGetNextNamedNumber( oldNN );
|
|
Packit |
022b05 |
newNN = smiGetNextNamedNumber( newNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
/* we assume that we have an enumeration, and the named numbers
|
|
Packit |
022b05 |
of an enumeration are stored in NN->value.value.integer32 */
|
|
Packit |
022b05 |
if( oldNN->value.value.integer32 <
|
|
Packit |
022b05 |
newNN->value.value.integer32 ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_NAMED_NUMBER_REMOVED,
|
|
Packit |
022b05 |
newLine,oldNN->name,
|
|
Packit |
022b05 |
smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_OF_TYPE_REMOVED,
|
|
Packit |
022b05 |
newLine, oldNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
oldNN = smiGetNextNamedNumber( oldNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else if( oldNN->value.value.integer32 >
|
|
Packit |
022b05 |
newNN->value.value.integer32 ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_NAMED_NUMBER_ADDED,
|
|
Packit |
022b05 |
newLine ,newNN->name,
|
|
Packit |
022b05 |
smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_TO_TYPE_ADDED,
|
|
Packit |
022b05 |
newLine, newNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
newNN = smiGetNextNamedNumber( newNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
if( strcmp( oldNN->name, newNN->name ) ) {
|
|
Packit |
022b05 |
if( smiNode ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_CHANGED,
|
|
Packit |
022b05 |
newLine, oldNN->name,
|
|
Packit |
022b05 |
newNN->name, smiNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine( newModule,
|
|
Packit |
022b05 |
ERR_NAMED_NUMBER_OF_TYPE_CHANGED,
|
|
Packit |
022b05 |
newLine, oldNN->name,
|
|
Packit |
022b05 |
newNN->name, name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
oldNN = smiGetNextNamedNumber( oldNN );
|
|
Packit |
022b05 |
newNN = smiGetNextNamedNumber( newNN );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkTypeCompatibility(SmiModule *oldModule, SmiNode *oldNode,
|
|
Packit |
022b05 |
SmiType *oldType,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
SmiType *newType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int oldLine;
|
|
Packit |
022b05 |
char *oldName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!oldType) && (!newType)) return;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldType) {
|
|
Packit |
022b05 |
if (newType->name) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_TYPE_ADDED,
|
|
Packit |
022b05 |
smiGetTypeLine(newType));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!newType) {
|
|
Packit |
022b05 |
if (oldType->name) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_TYPE_REMOVED,
|
|
Packit |
022b05 |
smiGetTypeLine(oldType));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldType->basetype != newType->basetype) {
|
|
Packit |
022b05 |
if( newType->name ) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_BASETYPE_CHANGED,
|
|
Packit |
022b05 |
smiGetTypeLine(newType), newType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_BASETYPE_CHANGED,
|
|
Packit |
022b05 |
smiGetTypeLine(newType), "implicit type");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if( oldType->name ) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetTypeLine(oldType), oldType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetTypeLine(oldType), "implicit type" );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldLine = oldNode ? smiGetNodeLine( oldNode ) : smiGetTypeLine( oldType );
|
|
Packit |
022b05 |
checkNamedNumbers(oldModule,
|
|
Packit |
022b05 |
oldLine,
|
|
Packit |
022b05 |
newModule,
|
|
Packit |
022b05 |
newLine > 0 ? newLine : smiGetTypeLine( newType ),
|
|
Packit |
022b05 |
oldType->name,
|
|
Packit |
022b05 |
oldNode,
|
|
Packit |
022b05 |
oldType,
|
|
Packit |
022b05 |
newType);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldName = oldNode ? oldNode->name : NULL;
|
|
Packit |
022b05 |
checkRanges(oldModule,
|
|
Packit |
022b05 |
oldLine,
|
|
Packit |
022b05 |
newModule,
|
|
Packit |
022b05 |
newLine > 0 ? newLine : smiGetTypeLine( newType ),
|
|
Packit |
022b05 |
oldName,
|
|
Packit |
022b05 |
oldType,
|
|
Packit |
022b05 |
newType);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkNodeTypeCompatibility(SmiModule *oldModule, SmiNode *oldNode,
|
|
Packit |
022b05 |
SmiModule *newModule, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiType *oldType, *newType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
const int oldLine = smiGetNodeLine(oldNode);
|
|
Packit |
022b05 |
const int newLine = smiGetNodeLine(newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldType = smiGetNodeType(oldNode);
|
|
Packit |
022b05 |
newType = smiGetNodeType(newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!oldType) && (!newType)) return;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldType && newType && oldType->basetype != newType->basetype) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_BASETYPE_CHANGED,
|
|
Packit |
022b05 |
newLine, newNode->name);
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
oldLine, oldNode->name);
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkNamedNumbers(oldModule,
|
|
Packit |
022b05 |
oldLine,
|
|
Packit |
022b05 |
newModule,
|
|
Packit |
022b05 |
newLine > 0 ? newLine : smiGetTypeLine(newType),
|
|
Packit |
022b05 |
oldType->name,
|
|
Packit |
022b05 |
oldNode,
|
|
Packit |
022b05 |
oldType,
|
|
Packit |
022b05 |
newType);
|
|
Packit |
022b05 |
checkRanges(oldModule,
|
|
Packit |
022b05 |
oldLine,
|
|
Packit |
022b05 |
newModule,
|
|
Packit |
022b05 |
newLine > 0 ? newLine : smiGetTypeLine(newType),
|
|
Packit |
022b05 |
oldNode->name,
|
|
Packit |
022b05 |
oldType,
|
|
Packit |
022b05 |
newType);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkTypes(SmiModule *oldModule, SmiNode *oldNode, SmiType *oldType,
|
|
Packit |
022b05 |
SmiModule *newModule, SmiNode *newNode, SmiType *newType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkName(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
oldType->name, newType->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkTypeCompatibility(oldModule, oldNode, oldType,
|
|
Packit |
022b05 |
newModule,
|
|
Packit |
022b05 |
newNode ? smiGetNodeLine(newNode) : smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkDefVal(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
oldType->name,
|
|
Packit |
022b05 |
oldType->value, newType->value);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDecl(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType->name,
|
|
Packit |
022b05 |
oldType->decl, newType->decl);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (newType->name) {
|
|
Packit |
022b05 |
code |= checkStatus(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType->name, oldType->status, newType->status);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkFormat(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType->name,
|
|
Packit |
022b05 |
oldType->format, newType->format);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkUnits(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType->name,
|
|
Packit |
022b05 |
oldType->units, newType->units);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType->name, oldType->decl,
|
|
Packit |
022b05 |
oldType->description, newType->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkReference(oldModule, smiGetTypeLine(oldType),
|
|
Packit |
022b05 |
newModule, smiGetTypeLine(newType),
|
|
Packit |
022b05 |
newType->name,
|
|
Packit |
022b05 |
oldType->reference, newType->reference);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetTypeLine(oldType), oldType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS_IMPLICIT) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_IMPLICIT_DEFINITION,
|
|
Packit |
022b05 |
smiGetTypeLine(oldType));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffTypes(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiType *oldType, *newType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First check whether the old type definitions still exist and
|
|
Packit |
022b05 |
* whether the updates (if any) are consistent with the SMI rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldType = smiGetFirstType(oldModule);
|
|
Packit |
022b05 |
oldType;
|
|
Packit |
022b05 |
oldType = smiGetNextType(oldType)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newType = smiGetType(newModule, oldType->name);
|
|
Packit |
022b05 |
if (newType) {
|
|
Packit |
022b05 |
checkTypes(oldModule, NULL, oldType,
|
|
Packit |
022b05 |
newModule, NULL, newType);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_TYPE_REMOVED,
|
|
Packit |
022b05 |
smiGetTypeLine(oldType), oldType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Let's see if there are any new definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newType = smiGetFirstType(newModule);
|
|
Packit |
022b05 |
newType;
|
|
Packit |
022b05 |
newType = smiGetNextType(newType)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldType = smiGetType(oldModule, newType->name);
|
|
Packit |
022b05 |
if (! oldType) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_TYPE_ADDED,
|
|
Packit |
022b05 |
smiGetTypeLine(newType), newType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkNodekind(SmiModule *oldModule, SmiNode *oldNode,
|
|
Packit |
022b05 |
SmiModule *newModule, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldNode->nodekind != newNode->nodekind) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NODEKIND_CHANGED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode), newNode->name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringIndexkind( SmiIndexkind indexkind )
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
switch( indexkind ) {
|
|
Packit |
022b05 |
case SMI_INDEX_INDEX : return "index";
|
|
Packit |
022b05 |
case SMI_INDEX_AUGMENT: return "augment";
|
|
Packit |
022b05 |
case SMI_INDEX_REORDER: return "reorder";
|
|
Packit |
022b05 |
case SMI_INDEX_SPARSE : return "sparse";
|
|
Packit |
022b05 |
case SMI_INDEX_EXPAND : return "expand";
|
|
Packit |
022b05 |
case SMI_INDEX_UNKNOWN:
|
|
Packit |
022b05 |
default: return "unknown";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char*
|
|
Packit |
022b05 |
getStringIndexList( SmiNode *smiNode )
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *indexNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
char *strIdxLst;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiElement = smiGetFirstElement( smiNode );
|
|
Packit |
022b05 |
indexNode = smiGetElementNode( smiElement );
|
|
Packit |
022b05 |
strIdxLst = (char *)malloc( strlen( indexNode->name ) + 3);
|
|
Packit |
022b05 |
if( strIdxLst ) {
|
|
Packit |
022b05 |
sprintf( strIdxLst, "`%s'", indexNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiElement = smiGetNextElement( smiElement );
|
|
Packit |
022b05 |
while ( smiElement ) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode( smiElement );
|
|
Packit |
022b05 |
strIdxLst = (char *)realloc( strIdxLst,
|
|
Packit |
022b05 |
strlen( strIdxLst ) +
|
|
Packit |
022b05 |
strlen( indexNode->name ) + 4 );
|
|
Packit |
022b05 |
sprintf( strIdxLst, "%s, `%s'", strIdxLst, indexNode->name );
|
|
Packit |
022b05 |
smiElement = smiGetNextElement( smiElement );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return strIdxLst;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkIndex(SmiModule *oldModule, SmiNode *oldNode,
|
|
Packit |
022b05 |
SmiModule *newModule, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (newNode->indexkind == SMI_INDEX_UNKNOWN
|
|
Packit |
022b05 |
&& oldNode->indexkind == SMI_INDEX_UNKNOWN) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( newNode->indexkind != oldNode->indexkind) {
|
|
Packit |
022b05 |
printf( "%s\n", newModule->name );
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_INDEXKIND_CHANGED,
|
|
Packit |
022b05 |
smiGetNodeLine( oldNode ),
|
|
Packit |
022b05 |
getStringIndexkind( oldNode->indexkind ),
|
|
Packit |
022b05 |
getStringIndexkind( newNode->indexkind ),
|
|
Packit |
022b05 |
newNode->name );
|
|
Packit |
022b05 |
printErrorAtLine( oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine( newNode ), oldNode->name );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (newNode->indexkind) {
|
|
Packit |
022b05 |
SmiElement *oldElement, *newElement;
|
|
Packit |
022b05 |
SmiNode *oldRelNode, *newRelNode;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
case SMI_INDEX_INDEX:
|
|
Packit |
022b05 |
/* compare OIDs of all index elements */
|
|
Packit |
022b05 |
oldElement = smiGetFirstElement( oldNode );
|
|
Packit |
022b05 |
newElement = smiGetFirstElement( newNode );
|
|
Packit |
022b05 |
while( oldElement && newElement ) {
|
|
Packit |
022b05 |
SmiNode *oldIndexNode, *newIndexNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldIndexNode = smiGetElementNode( oldElement );
|
|
Packit |
022b05 |
newIndexNode = smiGetElementNode( newElement );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( oldIndexNode->oidlen != newIndexNode->oidlen ) {
|
|
Packit |
022b05 |
char *oldIdxLst, *newIdxLst;
|
|
Packit |
022b05 |
oldIdxLst = getStringIndexList( oldNode );
|
|
Packit |
022b05 |
newIdxLst = getStringIndexList( newNode );
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_INDEX_CHANGED,
|
|
Packit |
022b05 |
smiGetNodeLine( newNode ), oldNode->name,
|
|
Packit |
022b05 |
oldIdxLst, newIdxLst);
|
|
Packit |
022b05 |
free( oldIdxLst );
|
|
Packit |
022b05 |
free( newIdxLst );
|
|
Packit |
022b05 |
printErrorAtLine( oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine( oldNode ), oldNode->name );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for( i = 0; i < oldIndexNode->oidlen; i++ ) {
|
|
Packit |
022b05 |
if( oldIndexNode->oid[i] != newIndexNode->oid[i] ) {
|
|
Packit |
022b05 |
char *oldIdxLst, *newIdxLst;
|
|
Packit |
022b05 |
oldIdxLst = getStringIndexList( oldNode );
|
|
Packit |
022b05 |
newIdxLst = getStringIndexList( newNode );
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_INDEX_CHANGED,
|
|
Packit |
022b05 |
smiGetNodeLine( newNode ),
|
|
Packit |
022b05 |
oldNode->name,
|
|
Packit |
022b05 |
oldIdxLst, newIdxLst);
|
|
Packit |
022b05 |
free( oldIdxLst );
|
|
Packit |
022b05 |
free( newIdxLst );
|
|
Packit |
022b05 |
printErrorAtLine( oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine( oldNode ),
|
|
Packit |
022b05 |
oldNode->name );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
oldElement = smiGetNextElement( oldElement );
|
|
Packit |
022b05 |
newElement = smiGetNextElement( newElement );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
case SMI_INDEX_AUGMENT:
|
|
Packit |
022b05 |
/* compare OIDs of related nodes */
|
|
Packit |
022b05 |
oldRelNode = smiGetRelatedNode( oldNode );
|
|
Packit |
022b05 |
newRelNode = smiGetRelatedNode( newNode );
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if( !oldRelNode || !newRelNode ) {
|
|
Packit |
022b05 |
/* should not occur */
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if( oldRelNode->oidlen != newRelNode->oidlen ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_INDEX_AUGMENT_CHANGED,
|
|
Packit |
022b05 |
smiGetNodeLine( newNode ), oldNode->name,
|
|
Packit |
022b05 |
oldRelNode->name, newRelNode->name);
|
|
Packit |
022b05 |
printErrorAtLine( oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine( oldNode ), oldNode->name );
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for( i = 0; i < oldRelNode->oidlen; i++ ) {
|
|
Packit |
022b05 |
if( oldRelNode->oid[i] != newRelNode->oid[i] ) {
|
|
Packit |
022b05 |
printErrorAtLine( newModule, ERR_INDEX_AUGMENT_CHANGED,
|
|
Packit |
022b05 |
smiGetNodeLine( newNode ),
|
|
Packit |
022b05 |
oldNode->name,
|
|
Packit |
022b05 |
oldRelNode->name, newRelNode->name);
|
|
Packit |
022b05 |
printErrorAtLine( oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine( oldNode ), oldNode->name );
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
case SMI_INDEX_UNKNOWN:
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
case SMI_INDEX_REORDER:
|
|
Packit |
022b05 |
case SMI_INDEX_SPARSE:
|
|
Packit |
022b05 |
case SMI_INDEX_EXPAND:
|
|
Packit |
022b05 |
/* xxx do things for SMI-NG */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkObject(SmiModule *oldModule, SmiNode *oldNode,
|
|
Packit |
022b05 |
SmiModule *newModule, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
SmiType *oldType, *newType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
const int oldLine = smiGetNodeLine(oldNode);
|
|
Packit |
022b05 |
const int newLine = smiGetNodeLine(newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldType = smiGetNodeType(oldNode);
|
|
Packit |
022b05 |
newType = smiGetNodeType(newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkName(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
oldNode->name, newNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldType && newType) {
|
|
Packit |
022b05 |
if (oldType->name && !newType->name) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_TO_IMPLICIT,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldType->name);
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
} else if (!oldType->name && newType->name) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_FROM_IMPLICIT,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newType->name, oldNode->name);
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkNodeTypeCompatibility(oldModule, oldNode,
|
|
Packit |
022b05 |
newModule, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDecl(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->decl, newNode->decl);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkStatus(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->status, newNode->status);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkAccess(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->access, newNode->access);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkNodekind(oldModule, oldNode, newModule, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkIndex(oldModule, oldNode, newModule, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkDefVal(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->value, newNode->value);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkFormat(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->format, newNode->format);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkUnits(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->units, newNode->units);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name, oldNode->decl,
|
|
Packit |
022b05 |
oldNode->description, newNode->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkReference(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newNode->name,
|
|
Packit |
022b05 |
oldNode->reference, newNode->reference);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS_IMPLICIT) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_IMPLICIT_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffObjects(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *oldNode, *newNode;
|
|
Packit |
022b05 |
SmiNodekind nodekinds;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
nodekinds = SMI_NODEKIND_NODE | SMI_NODEKIND_TABLE |
|
|
Packit |
022b05 |
SMI_NODEKIND_ROW | SMI_NODEKIND_COLUMN | SMI_NODEKIND_SCALAR;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First check whether the old node definitions still exist and
|
|
Packit |
022b05 |
* whether the updates (if any) are consistent with the SMI rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for(oldNode = smiGetFirstNode(oldModule, nodekinds);
|
|
Packit |
022b05 |
oldNode;
|
|
Packit |
022b05 |
oldNode = smiGetNextNode(oldNode, nodekinds)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newNode = smiGetNodeByOID(oldNode->oidlen, oldNode->oid);
|
|
Packit |
022b05 |
if (newNode
|
|
Packit |
022b05 |
&& newNode->oidlen == oldNode->oidlen
|
|
Packit |
022b05 |
&& smiGetNodeModule(newNode) == newModule) {
|
|
Packit |
022b05 |
checkObject(oldModule, oldNode, newModule, newNode);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
switch (oldNode->nodekind) {
|
|
Packit |
022b05 |
case SMI_NODEKIND_NODE:
|
|
Packit |
022b05 |
case SMI_NODEKIND_TABLE:
|
|
Packit |
022b05 |
case SMI_NODEKIND_ROW:
|
|
Packit |
022b05 |
case SMI_NODEKIND_COLUMN:
|
|
Packit |
022b05 |
case SMI_NODEKIND_SCALAR:
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_NODE_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Let's see if there are any new definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newNode = smiGetFirstNode(newModule, nodekinds);
|
|
Packit |
022b05 |
newNode;
|
|
Packit |
022b05 |
newNode = smiGetNextNode(newNode, nodekinds)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldNode = smiGetNodeByOID(newNode->oidlen, newNode->oid);
|
|
Packit |
022b05 |
if (! oldNode
|
|
Packit |
022b05 |
|| newNode->oidlen != oldNode->oidlen
|
|
Packit |
022b05 |
|| smiGetNodeModule(oldNode) != oldModule) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NODE_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkObjects(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *oldElem, *newElem;
|
|
Packit |
022b05 |
SmiNode *oldElemNode, *newElemNode;
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldElem = smiGetFirstElement(oldNode);
|
|
Packit |
022b05 |
oldElem; oldElem = smiGetNextElement(oldElem)) {
|
|
Packit |
022b05 |
oldElemNode = smiGetElementNode(oldElem);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newElem = smiGetFirstElement(newNode);
|
|
Packit |
022b05 |
newElem; newElem = smiGetNextElement(newElem)) {
|
|
Packit |
022b05 |
newElemNode = smiGetElementNode(newElem);
|
|
Packit |
022b05 |
if (strcmp(oldElemNode->name, newElemNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! newElem) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_OBJECT_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newElem = smiGetFirstElement(newNode);
|
|
Packit |
022b05 |
newElem; newElem = smiGetNextElement(newElem)) {
|
|
Packit |
022b05 |
newElemNode = smiGetElementNode(newElem);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldElem = smiGetFirstElement(oldNode);
|
|
Packit |
022b05 |
oldElem; oldElem = smiGetNextElement(oldElem)) {
|
|
Packit |
022b05 |
oldElemNode = smiGetElementNode(oldElem);
|
|
Packit |
022b05 |
if (strcmp(oldElemNode->name, newElemNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! oldElem) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_OBJECT_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode), newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkNotification(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDecl(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->decl, newNode->decl);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkStatus(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->status, newNode->status);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkObjects(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldNode, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->decl,
|
|
Packit |
022b05 |
oldNode->description, newNode->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkReference(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name,
|
|
Packit |
022b05 |
oldNode->reference, newNode->reference);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS_IMPLICIT) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_IMPLICIT_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffNotifications(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *oldNode, *newNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First check whether the old node definitions still exist and
|
|
Packit |
022b05 |
* whether the updates (if any) are consistent with the SMI rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for(oldNode = smiGetFirstNode(oldModule, SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
oldNode;
|
|
Packit |
022b05 |
oldNode = smiGetNextNode(oldNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newNode = smiGetNodeByOID(oldNode->oidlen, oldNode->oid);
|
|
Packit |
022b05 |
if (newNode
|
|
Packit |
022b05 |
&& newNode->oidlen == oldNode->oidlen
|
|
Packit |
022b05 |
&& smiGetNodeModule(newNode) == newModule) {
|
|
Packit |
022b05 |
checkNotification(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldNode, newNode);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_NODE_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Let's see if there are any new definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newNode = smiGetFirstNode(newModule, SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
newNode;
|
|
Packit |
022b05 |
newNode = smiGetNextNode(newNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldNode = smiGetNodeByOID(newNode->oidlen, newNode->oid);
|
|
Packit |
022b05 |
if (! oldNode
|
|
Packit |
022b05 |
|| newNode->oidlen != oldNode->oidlen
|
|
Packit |
022b05 |
|| smiGetNodeModule(oldNode) != oldModule) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NODE_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkOrganization(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, char *oldOrga, char *newOrga)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! oldOrga && newOrga) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_ORGA_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldOrga && !newOrga) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_ORGA_REMOVED,
|
|
Packit |
022b05 |
oldLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldOrga && newOrga && diffStrings(oldOrga, newOrga)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_ORGA_CHANGED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int
|
|
Packit |
022b05 |
checkContact(SmiModule *oldModule, int oldLine,
|
|
Packit |
022b05 |
SmiModule *newModule, int newLine,
|
|
Packit |
022b05 |
char *name, char *oldContact, char *newContact)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! oldContact && newContact) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_CONTACT_ADDED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldContact && !newContact) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_CONTACT_REMOVED,
|
|
Packit |
022b05 |
oldLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldContact && newContact && diffStrings(oldContact, newContact)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_CONTACT_CHANGED,
|
|
Packit |
022b05 |
newLine, name);
|
|
Packit |
022b05 |
code |= CODE_SHOW_PREVIOUS;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return code;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffModules(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *oldIdentityNode, *newIdentityNode;
|
|
Packit |
022b05 |
SmiRevision *oldRev, *newRev;
|
|
Packit |
022b05 |
int oldLine = -1, newLine = -1;
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldModule->language != newModule->language) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_SMIVERSION_CHANGED, -1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
oldIdentityNode = smiGetModuleIdentityNode(oldModule);
|
|
Packit |
022b05 |
if (oldIdentityNode) {
|
|
Packit |
022b05 |
oldLine = smiGetNodeLine(oldIdentityNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
newIdentityNode = smiGetModuleIdentityNode(newModule);
|
|
Packit |
022b05 |
if (newIdentityNode) {
|
|
Packit |
022b05 |
newLine = smiGetNodeLine(newIdentityNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkOrganization(oldModule, oldLine,
|
|
Packit |
022b05 |
newModule, newLine,
|
|
Packit |
022b05 |
newModule->name,
|
|
Packit |
022b05 |
oldModule->organization, newModule->organization);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkContact(oldModule, oldLine, newModule, newLine,
|
|
Packit |
022b05 |
newModule->name,
|
|
Packit |
022b05 |
oldModule->contactinfo, newModule->contactinfo);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, oldLine,
|
|
Packit |
022b05 |
newModule, newLine,
|
|
Packit |
022b05 |
newModule->name, SMI_DECL_MODULEIDENTITY,
|
|
Packit |
022b05 |
oldModule->description, newModule->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkReference(oldModule, oldLine, newModule, newLine, newModule->name,
|
|
Packit |
022b05 |
oldModule->reference, newModule->reference);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First check whether the old revisions still exist and
|
|
Packit |
022b05 |
* whether there are any updates.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldRev = smiGetFirstRevision(oldModule);
|
|
Packit |
022b05 |
oldRev; oldRev = smiGetNextRevision(oldRev)) {
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newRev = smiGetFirstRevision(newModule);
|
|
Packit |
022b05 |
newRev; newRev = smiGetNextRevision(newRev)) {
|
|
Packit |
022b05 |
if (oldRev->date == newRev->date) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (newRev) {
|
|
Packit |
022b05 |
if ((diffStrings(oldRev->description, newRev->description)) &&
|
|
Packit |
022b05 |
diffStrings(
|
|
Packit |
022b05 |
"[Revision added by libsmi due to a LAST-UPDATED clause.]",
|
|
Packit |
022b05 |
oldRev->description)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_REVISION_CHANGED,
|
|
Packit |
022b05 |
smiGetRevisionLine(newRev),
|
|
Packit |
022b05 |
getStringTime(newRev->date));
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetRevisionLine(oldRev),
|
|
Packit |
022b05 |
getStringTime(oldRev->date));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_REVISION_REMOVED,
|
|
Packit |
022b05 |
smiGetRevisionLine(oldRev),
|
|
Packit |
022b05 |
getStringTime(oldRev->date));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Let's see if there are any new revisions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newRev = smiGetFirstRevision(newModule);
|
|
Packit |
022b05 |
newRev; newRev = smiGetNextRevision(newRev)) {
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldRev = smiGetFirstRevision(oldModule);
|
|
Packit |
022b05 |
oldRev; oldRev = smiGetNextRevision(oldRev)) {
|
|
Packit |
022b05 |
if (oldRev->date == newRev->date) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (!oldRev) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_REVISION_ADDED,
|
|
Packit |
022b05 |
smiGetRevisionLine(newRev),
|
|
Packit |
022b05 |
getStringTime(newRev->date));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS && oldLine >= 0) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
oldLine, oldModule->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS_IMPLICIT) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_IMPLICIT_DEFINITION,
|
|
Packit |
022b05 |
oldLine);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkMember(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *oldElem, *newElem;
|
|
Packit |
022b05 |
SmiNode *oldElemNode, *newElemNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldElem = smiGetFirstElement(oldNode);
|
|
Packit |
022b05 |
oldElem; oldElem = smiGetNextElement(oldElem)) {
|
|
Packit |
022b05 |
oldElemNode = smiGetElementNode(oldElem);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newElem = smiGetFirstElement(newNode);
|
|
Packit |
022b05 |
newElem; newElem = smiGetNextElement(newElem)) {
|
|
Packit |
022b05 |
newElemNode = smiGetElementNode(newElem);
|
|
Packit |
022b05 |
if (strcmp(oldElemNode->name, newElemNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! newElem) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_MEMBER_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
oldElemNode->name, oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newElem = smiGetFirstElement(newNode);
|
|
Packit |
022b05 |
newElem; newElem = smiGetNextElement(newElem)) {
|
|
Packit |
022b05 |
newElemNode = smiGetElementNode(newElem);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldElem = smiGetFirstElement(oldNode);
|
|
Packit |
022b05 |
oldElem; oldElem = smiGetNextElement(oldElem)) {
|
|
Packit |
022b05 |
oldElemNode = smiGetElementNode(oldElem);
|
|
Packit |
022b05 |
if (strcmp(oldElemNode->name, newElemNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! oldElem) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_MEMBER_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newElemNode->name, newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkGroup(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code = checkName(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
oldNode->name, newNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDecl(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->decl, newNode->decl);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkStatus(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->status, newNode->status);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->decl,
|
|
Packit |
022b05 |
oldNode->description, newNode->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkReference(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name,
|
|
Packit |
022b05 |
oldNode->reference, newNode->reference);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkMember(oldModule, oldTag, newModule, newTag, oldNode, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS_IMPLICIT) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_IMPLICIT_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffGroups(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *oldNode, *newNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First check whether the old node definitions still exist and
|
|
Packit |
022b05 |
* whether the updates (if any) are consistent with the SMI rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for(oldNode = smiGetFirstNode(oldModule, SMI_NODEKIND_GROUP);
|
|
Packit |
022b05 |
oldNode;
|
|
Packit |
022b05 |
oldNode = smiGetNextNode(oldNode, SMI_NODEKIND_GROUP)) {
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newNode = smiGetNodeByOID(oldNode->oidlen, oldNode->oid);
|
|
Packit |
022b05 |
if (newNode
|
|
Packit |
022b05 |
&& newNode->oidlen == oldNode->oidlen
|
|
Packit |
022b05 |
&& smiGetNodeModule(newNode) == newModule) {
|
|
Packit |
022b05 |
checkGroup(oldModule, oldTag, newModule, newTag, oldNode, newNode);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_NODE_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Let's see if there are any new definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newNode = smiGetFirstNode(newModule, SMI_NODEKIND_GROUP);
|
|
Packit |
022b05 |
newNode;
|
|
Packit |
022b05 |
newNode = smiGetNextNode(newNode, SMI_NODEKIND_GROUP)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldNode = smiGetNodeByOID(newNode->oidlen, newNode->oid);
|
|
Packit |
022b05 |
if (! oldNode
|
|
Packit |
022b05 |
|| newNode->oidlen != oldNode->oidlen
|
|
Packit |
022b05 |
|| smiGetNodeModule(oldNode) != oldModule) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NODE_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkComplMandatory(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *oldElem, *newElem;
|
|
Packit |
022b05 |
SmiNode *oldElemNode, *newElemNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldElem = smiGetFirstElement(oldNode);
|
|
Packit |
022b05 |
oldElem; oldElem = smiGetNextElement(oldElem)) {
|
|
Packit |
022b05 |
oldElemNode = smiGetElementNode(oldElem);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newElem = smiGetFirstElement(newNode);
|
|
Packit |
022b05 |
newElem; newElem = smiGetNextElement(newElem)) {
|
|
Packit |
022b05 |
newElemNode = smiGetElementNode(newElem);
|
|
Packit |
022b05 |
if (strcmp(oldElemNode->name, newElemNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! newElem) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(oldElemNode)->name, oldModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_MANDATORY_EXT_GROUP_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
oldModule->name, oldElemNode->name,
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_MANDATORY_GROUP_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
oldElemNode->name,
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newElem = smiGetFirstElement(newNode);
|
|
Packit |
022b05 |
newElem; newElem = smiGetNextElement(newElem)) {
|
|
Packit |
022b05 |
newElemNode = smiGetElementNode(newElem);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldElem = smiGetFirstElement(oldNode);
|
|
Packit |
022b05 |
oldElem; oldElem = smiGetNextElement(oldElem)) {
|
|
Packit |
022b05 |
oldElemNode = smiGetElementNode(oldElem);
|
|
Packit |
022b05 |
if (strcmp(oldElemNode->name, newElemNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! oldElem) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(newElemNode)->name, newModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_MANDATORY_EXT_GROUP_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newModule->name, newElemNode->name,
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_MANDATORY_GROUP_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newElemNode->name, newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkComplOptions(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code;
|
|
Packit |
022b05 |
SmiOption *oldOption, *newOption;
|
|
Packit |
022b05 |
SmiNode *oldOptionNode, *newOptionNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldOption = smiGetFirstOption(oldNode);
|
|
Packit |
022b05 |
oldOption; oldOption = smiGetNextOption(oldOption)) {
|
|
Packit |
022b05 |
oldOptionNode = smiGetOptionNode(oldOption);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newOption = smiGetFirstOption(newNode);
|
|
Packit |
022b05 |
newOption; newOption = smiGetNextOption(newOption)) {
|
|
Packit |
022b05 |
newOptionNode = smiGetOptionNode(newOption);
|
|
Packit |
022b05 |
if (strcmp(oldOptionNode->name, newOptionNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! newOption) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(oldOptionNode)->name,
|
|
Packit |
022b05 |
oldModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_EXT_OPTION_REMOVED,
|
|
Packit |
022b05 |
smiGetOptionLine(oldOption),
|
|
Packit |
022b05 |
oldModule->name, oldOptionNode->name,
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_OPTION_REMOVED,
|
|
Packit |
022b05 |
smiGetOptionLine(oldOption),
|
|
Packit |
022b05 |
oldOptionNode->name,
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
code = 0;
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, smiGetOptionLine(oldOption),
|
|
Packit |
022b05 |
newModule, smiGetOptionLine(newOption),
|
|
Packit |
022b05 |
newOptionNode->name, SMI_DECL_COMPL_GROUP,
|
|
Packit |
022b05 |
oldOption->description,
|
|
Packit |
022b05 |
newOption->description);
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetOptionLine(oldOption),
|
|
Packit |
022b05 |
oldOptionNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newOption = smiGetFirstOption(newNode);
|
|
Packit |
022b05 |
newOption; newOption = smiGetNextOption(newOption)) {
|
|
Packit |
022b05 |
newOptionNode = smiGetOptionNode(newOption);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldOption = smiGetFirstOption(oldNode);
|
|
Packit |
022b05 |
oldOption; oldOption = smiGetNextOption(oldOption)) {
|
|
Packit |
022b05 |
oldOptionNode = smiGetOptionNode(oldOption);
|
|
Packit |
022b05 |
if (strcmp(oldOptionNode->name, newOptionNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! oldOption) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(newOptionNode)->name,
|
|
Packit |
022b05 |
newModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_EXT_OPTION_ADDED,
|
|
Packit |
022b05 |
smiGetOptionLine(newOption),
|
|
Packit |
022b05 |
newModule->name, newOptionNode->name,
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_OPTION_ADDED,
|
|
Packit |
022b05 |
smiGetOptionLine(newOption),
|
|
Packit |
022b05 |
newOptionNode->name,
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkComplRefinements(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code;
|
|
Packit |
022b05 |
SmiRefinement *oldRefinement, *newRefinement;
|
|
Packit |
022b05 |
SmiNode *oldRefinementNode, *newRefinementNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldRefinement = smiGetFirstRefinement(oldNode);
|
|
Packit |
022b05 |
oldRefinement; oldRefinement = smiGetNextRefinement(oldRefinement)) {
|
|
Packit |
022b05 |
oldRefinementNode = smiGetRefinementNode(oldRefinement);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newRefinement = smiGetFirstRefinement(newNode);
|
|
Packit |
022b05 |
newRefinement; newRefinement = smiGetNextRefinement(newRefinement)) {
|
|
Packit |
022b05 |
newRefinementNode = smiGetRefinementNode(newRefinement);
|
|
Packit |
022b05 |
if (strcmp(oldRefinementNode->name, newRefinementNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! newRefinement) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(oldRefinementNode)->name,
|
|
Packit |
022b05 |
oldModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_EXT_REFINEMENT_REMOVED,
|
|
Packit |
022b05 |
smiGetRefinementLine(oldRefinement),
|
|
Packit |
022b05 |
oldModule->name, oldRefinementNode->name,
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_REFINEMENT_REMOVED,
|
|
Packit |
022b05 |
smiGetRefinementLine(oldRefinement),
|
|
Packit |
022b05 |
oldRefinementNode->name,
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
code = 0;
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, smiGetRefinementLine(oldRefinement),
|
|
Packit |
022b05 |
newModule, smiGetRefinementLine(newRefinement),
|
|
Packit |
022b05 |
newRefinementNode->name,
|
|
Packit |
022b05 |
SMI_DECL_COMPL_OBJECT,
|
|
Packit |
022b05 |
oldRefinement->description,
|
|
Packit |
022b05 |
newRefinement->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkAccess(oldModule,
|
|
Packit |
022b05 |
smiGetRefinementLine(oldRefinement),
|
|
Packit |
022b05 |
newModule,
|
|
Packit |
022b05 |
smiGetRefinementLine(newRefinement),
|
|
Packit |
022b05 |
newRefinementNode->name,
|
|
Packit |
022b05 |
oldRefinement->access, newRefinement->access);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkTypeCompatibility(oldModule, oldRefinementNode,
|
|
Packit |
022b05 |
smiGetRefinementType(oldRefinement),
|
|
Packit |
022b05 |
newModule, smiGetRefinementLine(newRefinement),
|
|
Packit |
022b05 |
smiGetRefinementType(newRefinement));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkTypeCompatibility(oldModule, oldRefinementNode,
|
|
Packit |
022b05 |
smiGetRefinementWriteType(oldRefinement),
|
|
Packit |
022b05 |
newModule, smiGetRefinementLine(newRefinement),
|
|
Packit |
022b05 |
smiGetRefinementWriteType(newRefinement));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetRefinementLine(oldRefinement),
|
|
Packit |
022b05 |
oldRefinementNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newRefinement = smiGetFirstRefinement(newNode);
|
|
Packit |
022b05 |
newRefinement; newRefinement = smiGetNextRefinement(newRefinement)) {
|
|
Packit |
022b05 |
newRefinementNode = smiGetRefinementNode(newRefinement);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldRefinement = smiGetFirstRefinement(oldNode);
|
|
Packit |
022b05 |
oldRefinement; oldRefinement = smiGetNextRefinement(oldRefinement)) {
|
|
Packit |
022b05 |
oldRefinementNode = smiGetRefinementNode(oldRefinement);
|
|
Packit |
022b05 |
if (strcmp(oldRefinementNode->name, newRefinementNode->name) == 0) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! oldRefinement) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(newRefinementNode)->name,
|
|
Packit |
022b05 |
newModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_EXT_REFINEMENT_ADDED,
|
|
Packit |
022b05 |
smiGetRefinementLine(newRefinement),
|
|
Packit |
022b05 |
newModule->name, newRefinementNode->name,
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_REFINEMENT_ADDED,
|
|
Packit |
022b05 |
smiGetRefinementLine(newRefinement),
|
|
Packit |
022b05 |
newRefinementNode->name,
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
checkCompliance(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldNode, SmiNode *newNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int code = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code = checkName(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
oldNode->name, newNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDecl(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->decl, newNode->decl);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkStatus(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->status, newNode->status);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkDescription(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name, oldNode->decl,
|
|
Packit |
022b05 |
oldNode->description, newNode->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
code |= checkReference(oldModule, smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
newModule, smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
newNode->name,
|
|
Packit |
022b05 |
oldNode->reference, newNode->reference);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode), oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (code & CODE_SHOW_PREVIOUS_IMPLICIT) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_PREVIOUS_IMPLICIT_DEFINITION,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkComplMandatory(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldNode, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkComplOptions(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldNode, newNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
checkComplRefinements(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldNode, newNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffCompliances(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *oldNode, *newNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First check whether the old node definitions still exist and
|
|
Packit |
022b05 |
* whether the updates (if any) are consistent with the SMI rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for(oldNode = smiGetFirstNode(oldModule, SMI_NODEKIND_COMPLIANCE);
|
|
Packit |
022b05 |
oldNode;
|
|
Packit |
022b05 |
oldNode = smiGetNextNode(oldNode, SMI_NODEKIND_COMPLIANCE)) {
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newNode = smiGetNodeByOID(oldNode->oidlen, oldNode->oid);
|
|
Packit |
022b05 |
if (newNode
|
|
Packit |
022b05 |
&& newNode->oidlen == oldNode->oidlen
|
|
Packit |
022b05 |
&& smiGetNodeModule(newNode) == newModule) {
|
|
Packit |
022b05 |
checkCompliance(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldNode, newNode);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_NODE_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Let's see if there are any new definitions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newNode = smiGetFirstNode(newModule, SMI_NODEKIND_COMPLIANCE);
|
|
Packit |
022b05 |
newNode;
|
|
Packit |
022b05 |
newNode = smiGetNextNode(newNode, SMI_NODEKIND_COMPLIANCE)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldNode = smiGetNodeByOID(newNode->oidlen, newNode->oid);
|
|
Packit |
022b05 |
if (! oldNode
|
|
Packit |
022b05 |
|| newNode->oidlen != oldNode->oidlen
|
|
Packit |
022b05 |
|| smiGetNodeModule(oldNode) != oldModule) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_NODE_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static SmiNode*
|
|
Packit |
022b05 |
findGroupElement(SmiNode *groupNode, const char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *smiElement = NULL;
|
|
Packit |
022b05 |
SmiNode *smiNode = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(groupNode);
|
|
Packit |
022b05 |
smiElement;
|
|
Packit |
022b05 |
smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
smiNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
if (strcmp(smiNode->name, name) == 0) {
|
|
Packit |
022b05 |
return smiNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static SmiNode*
|
|
Packit |
022b05 |
findGroupsElement(SmiNode *groupNode, const char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *smiElement = NULL;
|
|
Packit |
022b05 |
SmiNode *smiNode = NULL, *foundNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(groupNode);
|
|
Packit |
022b05 |
smiElement;
|
|
Packit |
022b05 |
smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
smiNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
foundNode = findGroupElement(smiNode, name);
|
|
Packit |
022b05 |
if (foundNode) {
|
|
Packit |
022b05 |
return foundNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffOldNewComplianceMandatory(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldComplNode, SmiNode *newComplNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *oldGroupElement, *newGroupElement, *oldElement, *newElement;
|
|
Packit |
022b05 |
SmiNode *oldGroupNode, *newGroupNode, *oldNode, *newNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldGroupElement = smiGetFirstElement(oldComplNode);
|
|
Packit |
022b05 |
oldGroupElement;
|
|
Packit |
022b05 |
oldGroupElement = smiGetNextElement(oldGroupElement)) {
|
|
Packit |
022b05 |
oldGroupNode = smiGetElementNode(oldGroupElement);
|
|
Packit |
022b05 |
for (oldElement = smiGetFirstElement(oldGroupNode);
|
|
Packit |
022b05 |
oldElement;
|
|
Packit |
022b05 |
oldElement = smiGetNextElement(oldElement)) {
|
|
Packit |
022b05 |
oldNode = smiGetElementNode(oldElement);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newNode = findGroupsElement(newComplNode, oldNode->name);
|
|
Packit |
022b05 |
if (! newNode) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(oldNode)->name, oldModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_MANDATORY_EXT_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldModule->name, oldNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_MANDATORY_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newGroupElement = smiGetFirstElement(newComplNode);
|
|
Packit |
022b05 |
newGroupElement;
|
|
Packit |
022b05 |
newGroupElement = smiGetNextElement(newGroupElement)) {
|
|
Packit |
022b05 |
newGroupNode = smiGetElementNode(newGroupElement);
|
|
Packit |
022b05 |
for (newElement = smiGetFirstElement(newGroupNode);
|
|
Packit |
022b05 |
newElement;
|
|
Packit |
022b05 |
newElement = smiGetNextElement(newElement)) {
|
|
Packit |
022b05 |
newNode = smiGetElementNode(newElement);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldNode = findGroupsElement(oldComplNode, newNode->name);
|
|
Packit |
022b05 |
if (! oldNode) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(newNode)->name, newModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_MANDATORY_EXT_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newModule->name, newNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_MANDATORY_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffOldNewComplianceOptional(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
SmiNode *oldComplNode, SmiNode *newComplNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *oldElement, *newElement;
|
|
Packit |
022b05 |
SmiOption *oldOption, *newOption;
|
|
Packit |
022b05 |
SmiNode *oldGroupNode, *newGroupNode, *oldNode, *newNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
for (oldOption = smiGetFirstOption(oldComplNode);
|
|
Packit |
022b05 |
oldOption;
|
|
Packit |
022b05 |
oldOption = smiGetNextOption(oldOption)) {
|
|
Packit |
022b05 |
oldGroupNode = smiGetOptionNode(oldOption);
|
|
Packit |
022b05 |
for (oldElement = smiGetFirstElement(oldGroupNode);
|
|
Packit |
022b05 |
oldElement;
|
|
Packit |
022b05 |
oldElement = smiGetNextElement(oldElement)) {
|
|
Packit |
022b05 |
oldNode = smiGetElementNode(oldElement);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
newNode = findGroupsElement(newComplNode, oldNode->name);
|
|
Packit |
022b05 |
if (! newNode) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(oldNode)->name, oldModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_OPTIONAL_EXT_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldModule->name, oldNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(oldModule, ERR_OPTIONAL_REMOVED,
|
|
Packit |
022b05 |
smiGetNodeLine(oldNode),
|
|
Packit |
022b05 |
getStringNodekind(oldNode->nodekind),
|
|
Packit |
022b05 |
oldNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
/* xxx compare group condition description here? xxx */
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
for (newOption = smiGetFirstOption(newComplNode);
|
|
Packit |
022b05 |
newOption;
|
|
Packit |
022b05 |
newOption = smiGetNextOption(newOption)) {
|
|
Packit |
022b05 |
newGroupNode = smiGetOptionNode(newOption);
|
|
Packit |
022b05 |
for (newElement = smiGetFirstElement(newGroupNode);
|
|
Packit |
022b05 |
newElement;
|
|
Packit |
022b05 |
newElement = smiGetNextElement(newElement)) {
|
|
Packit |
022b05 |
newNode = smiGetElementNode(newElement);
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
oldNode = findGroupsElement(oldComplNode, newNode->name);
|
|
Packit |
022b05 |
if (! oldNode) {
|
|
Packit |
022b05 |
if (strcmp(smiGetNodeModule(newNode)->name, newModule->name)) {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_OPTIONAL_EXT_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newModule->name, newNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
printErrorAtLine(newModule, ERR_OPTIONAL_ADDED,
|
|
Packit |
022b05 |
smiGetNodeLine(newNode),
|
|
Packit |
022b05 |
getStringNodekind(newNode->nodekind),
|
|
Packit |
022b05 |
newNode->name,
|
|
Packit |
022b05 |
oldComplNode->name,
|
|
Packit |
022b05 |
newComplNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
diffOldNewCompliance(SmiModule *oldModule, const char *oldTag,
|
|
Packit |
022b05 |
SmiModule *newModule, const char *newTag,
|
|
Packit |
022b05 |
const char *oldCompl, const char *newCompl)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiNode *oldComplNode = NULL, *newComplNode = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(oldModule, SMI_NODEKIND_COMPLIANCE);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
|
|
Packit |
022b05 |
if (strcmp(smiNode->name, oldCompl) == 0) {
|
|
Packit |
022b05 |
oldComplNode = smiNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! oldComplNode) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidiff: unable to find old compliance `%s'\n",
|
|
Packit |
022b05 |
oldCompl);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(newModule, SMI_NODEKIND_COMPLIANCE);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
|
|
Packit |
022b05 |
if (strcmp(smiNode->name, newCompl) == 0) {
|
|
Packit |
022b05 |
newComplNode = smiNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! newComplNode) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidiff: unable to find new compliance `%s'\n",
|
|
Packit |
022b05 |
newCompl);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldComplNode || !newComplNode) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
diffOldNewComplianceMandatory(oldModule, oldTag,
|
|
Packit |
022b05 |
newModule, newTag,
|
|
Packit |
022b05 |
oldComplNode, newComplNode);
|
|
Packit |
022b05 |
diffOldNewComplianceOptional(oldModule, oldTag,
|
|
Packit |
022b05 |
newModule, newTag,
|
|
Packit |
022b05 |
oldComplNode, newComplNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
usage()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
fprintf(stderr,
|
|
Packit |
022b05 |
"Usage: smidiff [options] oldmodule newmodule\n"
|
|
Packit |
022b05 |
" -V, --version show version and license information\n"
|
|
Packit |
022b05 |
" -c, --config=file load a specific configuration file\n"
|
|
Packit |
022b05 |
" -h, --help show usage information\n"
|
|
Packit |
022b05 |
" -i, --ignore=prefix ignore errors matching prefix pattern\n"
|
|
Packit |
022b05 |
" -l, --level=level set maximum level of errors and warnings\n"
|
|
Packit |
022b05 |
" -m, --error-names print the name of errors in braces\n"
|
|
Packit |
022b05 |
" -p, --preload=module preload <module>\n"
|
|
Packit |
022b05 |
" -s, --severity print the severity of errors in brackets\n"
|
|
Packit |
022b05 |
" --old-compliance=name name of the old compliance statement\n"
|
|
Packit |
022b05 |
" --new-compliance=name name of the new compliance statement\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void help() { usage(); exit(0); }
|
|
Packit |
022b05 |
static void version() { printf("smidiff " SMI_VERSION_STRING "\n"); exit(0); }
|
|
Packit |
022b05 |
static void config(char *filename) { smiReadConfig(filename, "smidiff"); }
|
|
Packit |
022b05 |
static void level(int lev) { errorLevel = lev; }
|
|
Packit |
022b05 |
static void ignore(char *ign)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
smiSetSeverity(ign, 9999); /* libsmi error messages */
|
|
Packit |
022b05 |
setErrorSeverity(ign, 9999); /* smidiff error messages */
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void preload(char *module) {
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
smiLoadModule(module);
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
smiLoadModule(module);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int
|
|
Packit |
022b05 |
main(int argc, char *argv[])
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiModule *oldModule, *newModule;
|
|
Packit |
022b05 |
int flags;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static optStruct opt[] = {
|
|
Packit |
022b05 |
/* short long type var/func special */
|
|
Packit |
022b05 |
{ 'h', "help", OPT_FLAG, help, OPT_CALLFUNC },
|
|
Packit |
022b05 |
{ 'V', "version", OPT_FLAG, version, OPT_CALLFUNC },
|
|
Packit |
022b05 |
{ 'c', "config", OPT_STRING, config, OPT_CALLFUNC },
|
|
Packit |
022b05 |
{ 'l', "level", OPT_INT, level, OPT_CALLFUNC },
|
|
Packit |
022b05 |
{ 'p', "preload", OPT_STRING, preload, OPT_CALLFUNC },
|
|
Packit |
022b05 |
{ 'm', "error-names", OPT_FLAG, &mFlag, 0 },
|
|
Packit |
022b05 |
{ 's', "severity", OPT_FLAG, &sFlag, 0 },
|
|
Packit |
022b05 |
{ 'i', "ignore", OPT_STRING, ignore, OPT_CALLFUNC },
|
|
Packit |
022b05 |
{ 0, "old-compliance", OPT_STRING, &oldCompl, 0 },
|
|
Packit |
022b05 |
{ 0, "new-compliance", OPT_STRING, &newCompl, 0 },
|
|
Packit |
022b05 |
{ 0, 0, OPT_END, 0, 0 } /* no more options */
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
flags = smiGetFlags();
|
|
Packit |
022b05 |
flags |= SMI_FLAG_ERRORS;
|
|
Packit |
022b05 |
smiSetFlags(flags);
|
|
Packit |
022b05 |
smiSetErrorLevel(errorLevel);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
flags = smiGetFlags();
|
|
Packit |
022b05 |
flags |= SMI_FLAG_ERRORS;
|
|
Packit |
022b05 |
smiSetFlags(flags);
|
|
Packit |
022b05 |
smiSetErrorLevel(errorLevel);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
optParseOptions(&argc, argv, opt, 0);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (argc != 3) {
|
|
Packit |
022b05 |
usage();
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldCompl && !newCompl) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidiff: missing new compliance statement name\n");
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oldCompl && newCompl) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidiff: missing old compliance statement name\n");
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
smiSetErrorLevel(errorLevel);
|
|
Packit |
022b05 |
oldModule = smiGetModule(smiLoadModule(argv[1]));
|
|
Packit |
022b05 |
if (! oldModule) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidiff: cannot locate module `%s'\n", argv[1]);
|
|
Packit |
022b05 |
smiExit();
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
smiSetErrorLevel(errorLevel);
|
|
Packit |
022b05 |
newModule = smiGetModule(smiLoadModule(argv[2]));
|
|
Packit |
022b05 |
if (! newModule) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidiff: cannot locate module `%s'\n", argv[2]);
|
|
Packit |
022b05 |
smiExit();
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
smiExit();
|
|
Packit |
022b05 |
exit(2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (oldCompl && newCompl) {
|
|
Packit |
022b05 |
diffOldNewCompliance(oldModule, oldTag, newModule, newTag,
|
|
Packit |
022b05 |
oldCompl, newCompl);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
diffModules(oldModule, oldTag, newModule, newTag);
|
|
Packit |
022b05 |
diffTypes(oldModule, oldTag, newModule, newTag);
|
|
Packit |
022b05 |
diffObjects(oldModule, oldTag, newModule, newTag);
|
|
Packit |
022b05 |
diffNotifications(oldModule, oldTag, newModule, newTag);
|
|
Packit |
022b05 |
diffGroups(oldModule, oldTag, newModule, newTag);
|
|
Packit |
022b05 |
diffCompliances(oldModule, oldTag, newModule, newTag);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(oldTag);
|
|
Packit |
022b05 |
smiExit();
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiInit(newTag);
|
|
Packit |
022b05 |
smiExit();
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (fflush(stdout) || ferror(stdout)) {
|
|
Packit |
022b05 |
perror("smidiff: write error");
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|