Blame tools/smidiff.c

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
}