Blame tools/dump-sming.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-sming.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump SMIng module information.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: dump-sming.c 8090 2008-04-18 12:56:29Z strauss $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdlib.h>
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <stdarg.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
#include <ctype.h>
Packit Service 9ccfef
#include <time.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
#define  INDENT		2    /* indent factor */
Packit Service 9ccfef
#define  INDENTVALUE	20   /* column to start values, except multiline */
Packit Service 9ccfef
#define  INDENTTEXTS	4    /* column to start multiline texts */
Packit Service 9ccfef
#define  INDENTMAX	64   /* max column to fill, break lines otherwise */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *excludeType[] = {
Packit Service 9ccfef
    "ObjectSyntax",
Packit Service 9ccfef
    "SimpleSyntax",
Packit Service 9ccfef
    "ApplicationSyntax",
Packit Service 9ccfef
    NULL };
Packit Service 9ccfef
    
Packit Service 9ccfef
static char *convertType[] = {
Packit Service 9ccfef
    "INTEGER",             "Integer32",
Packit Service 9ccfef
    "OCTET STRING",        "OctetString",
Packit Service 9ccfef
    "OBJECT IDENTIFIER",   "Pointer",
Packit Service 9ccfef
    
Packit Service 9ccfef
    "Gauge",               "Gauge32",
Packit Service 9ccfef
    "Counter",             "Counter32",
Packit Service 9ccfef
    "NetworkAddress",      "IpAddress", /* ??? */
Packit Service 9ccfef
    
Packit Service 9ccfef
    NULL, NULL };
Packit Service 9ccfef
Packit Service 9ccfef
static char *convertImport[] = {
Packit Service 9ccfef
    "SNMPv2-SMI",   "MODULE-IDENTITY",    NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "OBJECT-IDENTITY",    NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "OBJECT-TYPE",        NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "NOTIFICATION-TYPE",  NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "ObjectName",         NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "NotificationName",   NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "ObjectSyntax",       NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "SimpleSyntax",       NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "Integer32",          NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "Unsigned32",         NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "ApplicationSyntax",  NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-SMI",   "IpAddress",          "IRTF-NMRG-SMING", "IpAddress",
Packit Service 9ccfef
    "SNMPv2-SMI",   "Counter32",          "IRTF-NMRG-SMING", "Counter32",
Packit Service 9ccfef
    "SNMPv2-SMI",   "TimeTicks",          "IRTF-NMRG-SMING", "TimeTicks",
Packit Service 9ccfef
    "SNMPv2-SMI",   "Opaque",             "IRTF-NMRG-SMING", "Opaque",
Packit Service 9ccfef
    "SNMPv2-SMI",   "Counter64",          "IRTF-NMRG-SMING", "Counter64",
Packit Service 9ccfef
    "SNMPv2-SMI",   "Gauge32",            "IRTF-NMRG-SMING", "Gauge32",
Packit Service 9ccfef
    "SNMPv2-SMI",   "mib-2",              "IRTF-NMRG-SMING-SNMP", "mib-2",
Packit Service 9ccfef
Packit Service 9ccfef
    "SNMPv2-TC",   "TimeStamp",           "IRTF-NMRG-SMING", "TimeStamp",
Packit Service 9ccfef
    "SNMPv2-TC",   "TimeInterval",        "IRTF-NMRG-SMING", "TimeInterval",
Packit Service 9ccfef
    "SNMPv2-TC",   "DateAndTime",         "IRTF-NMRG-SMING", "DateAndTime",
Packit Service 9ccfef
    "SNMPv2-TC",   "TruthValue",          "IRTF-NMRG-SMING", "TruthValue",
Packit Service 9ccfef
    "SNMPv2-TC",   "PhysAddress",         "IRTF-NMRG-SMING", "PhysAddress",
Packit Service 9ccfef
    "SNMPv2-TC",   "MacAddress",          "IRTF-NMRG-SMING", "MacAddress",
Packit Service 9ccfef
    "SNMPv2-TC",   "DisplayString",       "IRTF-NMRG-SMING", "DisplayString255",
Packit Service 9ccfef
    "SNMPv2-TC",   "TestAndIncr",         "IRTF-NMRG-SMING-SNMP", "TestAndIncr",
Packit Service 9ccfef
    "SNMPv2-TC",   "AutonomousType",      "IRTF-NMRG-SMING-SNMP", "AutonomousType",
Packit Service 9ccfef
    "SNMPv2-TC",   "VariablePointer",     "IRTF-NMRG-SMING-SNMP", "VariablePointer",
Packit Service 9ccfef
    "SNMPv2-TC",   "RowPointer",          "IRTF-NMRG-SMING-SNMP", "RowPointer",
Packit Service 9ccfef
    "SNMPv2-TC",   "RowStatus",           "IRTF-NMRG-SMING-SNMP", "RowStatus",
Packit Service 9ccfef
    "SNMPv2-TC",   "StorageType",         "IRTF-NMRG-SMING-SNMP", "StorageType",
Packit Service 9ccfef
    "SNMPv2-TC",   "TDomain",             "IRTF-NMRG-SMING-SNMP", "TDomain",
Packit Service 9ccfef
    "SNMPv2-TC",   "TAddress",            "IRTF-NMRG-SMING-SNMP", "TAddress",
Packit Service 9ccfef
    "SNMPv2-SMI",   NULL,                 "IRTF-NMRG-SMING", NULL,
Packit Service 9ccfef
    "SNMPv2-TC",    "TEXTUAL-CONVENTION", NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-TC",    NULL,                 "IRTF-NMRG-SMING-TYPES", NULL,
Packit Service 9ccfef
    "SNMPv2-CONF",  "OBJECT-GROUP",       NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-CONF",  "NOTIFICATION-GROUP", NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-CONF",  "MODULE-COMPLIANCE",  NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-CONF",  "AGENT-CAPABILITIES", NULL, NULL,
Packit Service 9ccfef
 
Packit Service 9ccfef
    "RFC1155-SMI",  "OBJECT-TYPE",        NULL, NULL,
Packit Service 9ccfef
    "RFC1155-SMI",  "ObjectName",         NULL, NULL,
Packit Service 9ccfef
    "RFC1155-SMI",  "ObjectSyntax",       NULL, NULL,
Packit Service 9ccfef
    "RFC1155-SMI",  "SimpleSyntax",       NULL, NULL,
Packit Service 9ccfef
    "RFC1155-SMI",  "ApplicationSyntax",  NULL, NULL,
Packit Service 9ccfef
    "RFC1155-SMI",  "Gauge",              "IRTF-NMRG-SMING-TYPES", "Gauge32",
Packit Service 9ccfef
    "RFC1155-SMI",  "Counter",            "IRTF-NMRG-SMING-TYPES", "Counter32",
Packit Service 9ccfef
    "RFC1155-SMI",  "TimeTicks",          "IRTF-NMRG-SMING-TYPES", "TimeTicks",
Packit Service 9ccfef
    "RFC1155-SMI",  "IpAddress",          "IRTF-NMRG-SMING-TYPES", "IpAddress",
Packit Service 9ccfef
    "RFC1155-SMI",  "NetworkAddress",     NULL, NULL, /* ??? */
Packit Service 9ccfef
    "RFC1155-SMI",  "Opaque",             "IRTF-NMRG-SMING", "Opaque",
Packit Service 9ccfef
    "RFC1155-SMI",  NULL,                 "IRTF-NMRG-SMING", NULL,
Packit Service 9ccfef
    "RFC1158-MIB",  "DisplayString",      "IRTF-NMRG-SMING", "DisplayString255",
Packit Service 9ccfef
    "RFC-1212",     "OBJECT-TYPE",        NULL, NULL,
Packit Service 9ccfef
    "RFC1213-MIB",  "mib-2",              "IRTF-NMRG-SMING-SNMP", "mib-2",
Packit Service 9ccfef
    "RFC1213-MIB",  "system",             "SNMPv2-MIB", "system",
Packit Service 9ccfef
    "RFC1213-MIB",  "interfaces",         "IF-MIB", "interfaces",
Packit Service 9ccfef
/*  "RFC1213-MIB",  "at",                 "RFC1213-MIB", "at", */
Packit Service 9ccfef
    "RFC1213-MIB",  "ip",                 "IP-MIB", "ip",
Packit Service 9ccfef
    "RFC1213-MIB",  "icmp",               "IP-MIB", "icmp",
Packit Service 9ccfef
    "RFC1213-MIB",  "tcp",                "TCP-MIB", "tcp",
Packit Service 9ccfef
    "RFC1213-MIB",  "udp",                "UDP-MIB", "udp",
Packit Service 9ccfef
/*  "RFC1213-MIB",  "egp",                "RFC1213-MIB", "egp", */
Packit Service 9ccfef
    "RFC1213-MIB",  "transmission",       "SNMPv2-SMI", "transmission",
Packit Service 9ccfef
    "RFC1213-MIB",  "snmp",               "SNMPv2-MIB", "snmp",
Packit Service 9ccfef
    "RFC1213-MIB",  "sysDescr",           "SNMPv2-MIB", "sysDescr",
Packit Service 9ccfef
    "RFC1213-MIB",  "sysObjectID",        "SNMPv2-MIB", "sysObjectID",
Packit Service 9ccfef
    "RFC1213-MIB",  "sysUpTime",          "SNMPv2-MIB", "sysUpTime",
Packit Service 9ccfef
    "RFC1213-MIB",  "ifIndex",            "IF-MIB", "ifIndex",
Packit Service 9ccfef
/* TODO ...many more objects from RFC1213-MIB.. */    
Packit Service 9ccfef
    "RFC1213-MIB",  "DisplayString",      "IRTF-NMRG-SMING", "DisplayString255",
Packit Service 9ccfef
    "RFC1213-MIB",  "PhysAddress",	  "IRTF-NMRG-SMING", "PhysAddress",
Packit Service 9ccfef
    "RFC-1215",     "TRAP-TYPE",          NULL, NULL,                          
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
    
Packit Service 9ccfef
    /* TODO: how to convert more SMIv1 information? */
Packit Service 9ccfef
Packit Service 9ccfef
    NULL, NULL, NULL, NULL };
Packit Service 9ccfef
Packit Service 9ccfef
static int current_column = 0;
Packit Service 9ccfef
static int silent = 0;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Structure used to build a list of imported types.
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct Import {
Packit Service 9ccfef
    char          *module;
Packit Service 9ccfef
    char          *name;
Packit Service 9ccfef
    struct Import *nextPtr;
Packit Service 9ccfef
} Import;
Packit Service 9ccfef
Packit Service 9ccfef
static Import *importList = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getStringStatus(SmiStatus status)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
	(status == SMI_STATUS_CURRENT)     ? "current" :
Packit Service 9ccfef
	(status == SMI_STATUS_DEPRECATED)  ? "deprecated" :
Packit Service 9ccfef
	(status == SMI_STATUS_OBSOLETE)    ? "obsolete" :
Packit Service 9ccfef
	(status == SMI_STATUS_MANDATORY)   ? "current" :
Packit Service 9ccfef
	(status == SMI_STATUS_OPTIONAL)    ? "current" :
Packit Service 9ccfef
					     "<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getAccessString(SmiAccess access)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
	(access == SMI_ACCESS_NOT_ACCESSIBLE) ? "noaccess" :
Packit Service 9ccfef
	(access == SMI_ACCESS_NOTIFY)	      ? "notifyonly" :
Packit Service 9ccfef
	(access == SMI_ACCESS_READ_ONLY)      ? "readonly" :
Packit Service 9ccfef
	(access == SMI_ACCESS_READ_WRITE)     ? "readwrite" :
Packit Service 9ccfef
						"<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getStringBasetype(SmiBasetype basetype)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_UNKNOWN)           ? "<unknown>" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_OCTETSTRING)       ? "OctetString" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_OBJECTIDENTIFIER)  ? "ObjectIdentifier" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_UNSIGNED32)        ? "Unsigned32" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_INTEGER32)         ? "Integer32" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_UNSIGNED64)        ? "Unsigned64" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_INTEGER64)         ? "Integer64" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_FLOAT32)           ? "Float32" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_FLOAT64)           ? "Float64" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_FLOAT128)          ? "Float128" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_ENUM)              ? "Enumeration" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_BITS)              ? "Bits" :
Packit Service 9ccfef
                                                   "<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getStringTime(time_t t)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char   s[27];
Packit Service 9ccfef
    struct tm	  *tm;
Packit Service 9ccfef
Packit Service 9ccfef
    tm = gmtime(&t);
Packit Service 9ccfef
    sprintf(s, "%04d-%02d-%02d %02d:%02d",
Packit Service 9ccfef
	    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
Packit Service 9ccfef
	    tm->tm_hour, tm->tm_min);
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getTypeString(SmiBasetype basetype, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int         i;
Packit Service 9ccfef
    char        *typeModule, *typeName;
Packit Service 9ccfef
Packit Service 9ccfef
    typeName = smiType ? smiType->name : NULL;
Packit Service 9ccfef
    typeModule = smiType ? smiGetTypeModule(smiType)->name : NULL;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if ((!typeModule) && (typeName) &&
Packit Service 9ccfef
	(basetype != SMI_BASETYPE_ENUM) &&
Packit Service 9ccfef
	(basetype != SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
	for(i=0; convertType[i]; i += 2) {
Packit Service 9ccfef
	    if (!strcmp(typeName, convertType[i])) {
Packit Service 9ccfef
		return convertType[i+1];
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if ((!typeModule) || (!strlen(typeModule)) || (!typeName)) {
Packit Service 9ccfef
	if (basetype == SMI_BASETYPE_ENUM) {
Packit Service 9ccfef
	    return "Enumeration";
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (basetype == SMI_BASETYPE_BITS) {
Packit Service 9ccfef
	    return "Bits";
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
	
Packit Service 9ccfef
    if (!typeName) {
Packit Service 9ccfef
	return getStringBasetype(basetype);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    /* TODO: fully qualified if unambigous */
Packit Service 9ccfef
Packit Service 9ccfef
    return typeName;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getOidString(SmiNode *smiNode, int importedParent)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	 *parentNode;
Packit Service 9ccfef
    SmiModule	 *smiModule;
Packit Service 9ccfef
    static char	 s[200];
Packit Service 9ccfef
    char	 append[200];
Packit Service 9ccfef
    unsigned int i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    append[0] = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    parentNode = smiNode;
Packit Service 9ccfef
    smiModule = smiGetNodeModule(smiNode);
Packit Service 9ccfef
    
Packit Service 9ccfef
    do {
Packit Service 9ccfef
Packit Service 9ccfef
	if (parentNode->oidlen <= 1) {
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	/* prepend the cut-off subidentifier to `append'. */
Packit Service 9ccfef
	strcpy(s, append);
Packit Service 9ccfef
	sprintf(append, ".%u%s", parentNode->oid[parentNode->oidlen-1], s);
Packit Service 9ccfef
Packit Service 9ccfef
	/* retrieve the parent SmiNode */
Packit Service 9ccfef
	parentNode = smiGetParentNode(parentNode);
Packit Service 9ccfef
Packit Service 9ccfef
	if (!parentNode) {
Packit Service 9ccfef
	    sprintf(s, "%s", append);
Packit Service 9ccfef
	    return s;
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	/* found an imported or a local parent node? */
Packit Service 9ccfef
	if ((parentNode->name && strlen(parentNode->name)) &&
Packit Service 9ccfef
	    (smiIsImported(smiModule, NULL, parentNode->name) ||
Packit Service 9ccfef
	     (!importedParent &&
Packit Service 9ccfef
	      (smiGetNodeModule(parentNode) == smiModule)) ||
Packit Service 9ccfef
	     (parentNode->oidlen == 1))) {
Packit Service 9ccfef
	    sprintf(s, "%s%s", parentNode->name, append);
Packit Service 9ccfef
	    return s;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
    } while (parentNode);
Packit Service 9ccfef
Packit Service 9ccfef
    s[0] = 0;
Packit Service 9ccfef
    for (i=0; i < smiNode->oidlen; i++) {
Packit Service 9ccfef
	if (i) strcat(s, ".");
Packit Service 9ccfef
	sprintf(&s[strlen(s)], "%u", smiNode->oid[i]);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static Import* addImport(char *module, char *name)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import **import, *newImport;
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (i = 0; convertImport[i]; i += 4) {
Packit Service 9ccfef
	if (convertImport[i] && convertImport[i+1]
Packit Service 9ccfef
	    && !strcmp(module, convertImport[i])
Packit Service 9ccfef
	    && !strcmp(name, convertImport[i+1])) {
Packit Service 9ccfef
	    module = convertImport[i+2];
Packit Service 9ccfef
	    name = convertImport[i+3];
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	} else if (convertImport[i] && !convertImport[i+1]
Packit Service 9ccfef
		   && !strcmp(module, convertImport[i])) {
Packit Service 9ccfef
	    module = convertImport[i+2];
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (!module || !name) {
Packit Service 9ccfef
	return NULL;
Packit Service 9ccfef
    }
Packit Service 9ccfef
	    
Packit Service 9ccfef
    for (import = &importList; *import; import = &(*import)->nextPtr) {
Packit Service 9ccfef
	int c = strcmp((*import)->module, module);
Packit Service 9ccfef
	if (c < 0) continue;
Packit Service 9ccfef
	if (c == 0) {
Packit Service 9ccfef
	    int d = strcmp((*import)->name, name);
Packit Service 9ccfef
	    if (d < 0) continue;
Packit Service 9ccfef
	    if (d == 0) return *import;
Packit Service 9ccfef
	    if (d > 0) break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (c > 0) break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    newImport = xmalloc(sizeof(Import));
Packit Service 9ccfef
    newImport->module = module;
Packit Service 9ccfef
    newImport->name = name;
Packit Service 9ccfef
    newImport->nextPtr = *import;
Packit Service 9ccfef
    *import = newImport;
Packit Service 9ccfef
	
Packit Service 9ccfef
    return *import;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void createImportList(SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode     *smiNode;
Packit Service 9ccfef
    SmiType     *smiType;
Packit Service 9ccfef
    SmiModule   *smiTypeModule;
Packit Service 9ccfef
    SmiNodekind kind = SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN;
Packit Service 9ccfef
    SmiImport   *smiImport;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, kind);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode, kind)) {
Packit Service 9ccfef
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	if (smiType && (smiType->decl == SMI_DECL_IMPLICIT_TYPE)) {
Packit Service 9ccfef
	    smiType = smiGetParentType(smiType);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiType) {
Packit Service 9ccfef
	    smiTypeModule = smiGetTypeModule(smiType);
Packit Service 9ccfef
	    if (smiTypeModule &&
Packit Service 9ccfef
		strcmp(smiTypeModule->name, smiModule->name)) {
Packit Service 9ccfef
		if (strlen(smiTypeModule->name)) {
Packit Service 9ccfef
		    addImport(smiTypeModule->name, smiType->name);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (smiType->basetype == SMI_BASETYPE_INTEGER32) {
Packit Service 9ccfef
		addImport("SNMPv2-SMI", "Integer32");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiImport = smiGetFirstImport(smiModule); smiImport;
Packit Service 9ccfef
	 smiImport = smiGetNextImport(smiImport)) {
Packit Service 9ccfef
	if (islower((int) smiImport->name[0]) ||
Packit Service 9ccfef
	    (smiImport->module && !strcmp(smiImport->module, "SNMPv2-SMI")) ||
Packit Service 9ccfef
	    (smiImport->module && !strcmp(smiImport->module, "SNMPv2-TC"))) {
Packit Service 9ccfef
	    addImport(smiImport->module, smiImport->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void freeImportList(void)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import *import, *freeme;
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = importList; import; ) {
Packit Service 9ccfef
	freeme = import;
Packit Service 9ccfef
	import = import->nextPtr;
Packit Service 9ccfef
	xfree(freeme);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    importList = NULL;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprint(FILE *f, char *fmt, ...)
Packit Service 9ccfef
{
Packit Service 9ccfef
    va_list ap;
Packit Service 9ccfef
    char    s[200];
Packit Service 9ccfef
    char    *p;
Packit Service 9ccfef
    
Packit Service 9ccfef
    va_start(ap, fmt);
Packit Service 9ccfef
#ifdef HAVE_VSNPRINTF
Packit Service 9ccfef
    current_column += vsnprintf(s, sizeof(s), fmt, ap);
Packit Service 9ccfef
#else
Packit Service 9ccfef
    current_column += vsprintf(s, fmt, ap);	/* buffer overwrite */
Packit Service 9ccfef
#endif
Packit Service 9ccfef
    va_end(ap);
Packit Service 9ccfef
Packit Service 9ccfef
    fputs(s, f);
Packit Service 9ccfef
Packit Service 9ccfef
    if ((p = strrchr(s, '\n'))) {
Packit Service 9ccfef
	current_column = strlen(p) - 1;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintSegment(FILE *f, int column, char *string, int length)
Packit Service 9ccfef
{
Packit Service 9ccfef
    fprint(f, "%*c%s", column, ' ', string);
Packit Service 9ccfef
    if (length) {
Packit Service 9ccfef
	fprint(f, "%*c", length - strlen(string) - column, ' ');
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintWrapped(FILE *f, int column, char *string)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if ((current_column + strlen(string)) > INDENTMAX) {
Packit Service 9ccfef
	putc('\n', f);
Packit Service 9ccfef
	current_column = 0;
Packit Service 9ccfef
	fprintSegment(f, column, "", 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprint(f, "%s", string);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintMultilineString(FILE *f, int column, const char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i, len;
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintSegment(f, column - 1 + INDENTTEXTS, "\"", 0);
Packit Service 9ccfef
    if (s) {
Packit Service 9ccfef
	len = strlen(s);
Packit Service 9ccfef
	for (i=0; i < len; i++) {
Packit Service 9ccfef
	    putc(s[i], f);
Packit Service 9ccfef
	    current_column++;
Packit Service 9ccfef
	    if (s[i] == '\n') {
Packit Service 9ccfef
		current_column = 0;
Packit Service 9ccfef
		fprintSegment(f, column + INDENTTEXTS, "", 0);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    putc('\"', f);
Packit Service 9ccfef
    current_column++;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getValueString(SmiValue *valuePtr, SmiType *typePtr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char    s[100];
Packit Service 9ccfef
    char           ss[9];
Packit Service 9ccfef
    int		   n;
Packit Service 9ccfef
    unsigned int   i;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    
Packit Service 9ccfef
    s[0] = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    switch (valuePtr->basetype) {
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED32:
Packit Service 9ccfef
	sprintf(s, "%lu", valuePtr->value.unsigned32);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER32:
Packit Service 9ccfef
	sprintf(s, "%ld", valuePtr->value.integer32);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED64:
Packit Service 9ccfef
	sprintf(s, UINT64_FORMAT, valuePtr->value.unsigned64);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER64:
Packit Service 9ccfef
	sprintf(s, INT64_FORMAT, valuePtr->value.integer64);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT32:
Packit Service 9ccfef
    sprintf(s, "%G", valuePtr->value.float32);
Packit Service 9ccfef
    break;
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT64:
Packit Service 9ccfef
    sprintf(s, "%lG", valuePtr->value.float64);
Packit Service 9ccfef
    break;
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT128:
Packit Service 9ccfef
    sprintf(s, "%LG", valuePtr->value.float128);
Packit Service 9ccfef
    break;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_ENUM:
Packit Service 9ccfef
	for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit Service 9ccfef
	     nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (nn->value.value.integer32 == valuePtr->value.integer32)
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nn) {
Packit Service 9ccfef
	    sprintf(s, "%s", nn->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    sprintf(s, "%ld", valuePtr->value.integer32);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OCTETSTRING:
Packit Service 9ccfef
	for (i = 0; i < valuePtr->len; i++) {
Packit Service 9ccfef
	    if (!isprint((int)valuePtr->value.ptr[i])) break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i == valuePtr->len) {
Packit Service 9ccfef
	    sprintf(s, "\"%s\"", valuePtr->value.ptr);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
            sprintf(s, "0x%*s", 2 * valuePtr->len, "");
Packit Service 9ccfef
            for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
                sprintf(ss, "%02x", valuePtr->value.ptr[i]);
Packit Service 9ccfef
                strncpy(&s[2+2*i], ss, 2);
Packit Service 9ccfef
            }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_BITS:
Packit Service 9ccfef
	sprintf(s, "(");
Packit Service 9ccfef
	for (i = 0, n = 0; i < valuePtr->len * 8; i++) {
Packit Service 9ccfef
	    if (valuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
Packit Service 9ccfef
		if (n)
Packit Service 9ccfef
		    sprintf(&s[strlen(s)], ", ");
Packit Service 9ccfef
		n++;
Packit Service 9ccfef
		for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit Service 9ccfef
		     nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
		    /* if (nn->value.value.unsigned64 == ((i/8)*8 + (7-(i%8)))) */
Packit Service 9ccfef
		    if (nn->value.value.unsigned64 == i)
Packit Service 9ccfef
			break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		if (nn) {
Packit Service 9ccfef
		    sprintf(&s[strlen(s)], "%s", nn->name);
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    sprintf(&s[strlen(s)], "%d", i);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	sprintf(&s[strlen(s)], ")");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit Service 9ccfef
	/*nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
Packit Service 9ccfef
	if (nodePtr) {
Packit Service 9ccfef
	    sprintf(s, "%s", nodePtr->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    strcpy(s, "");
Packit Service 9ccfef
	    for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
		if (i) strcat(s, ".");
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}*/
Packit Service 9ccfef
	sprintf(s, "%s", typePtr->value.value.ptr);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
	case SMI_BASETYPE_POINTER:
Packit Service 9ccfef
	/*nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
Packit Service 9ccfef
	if (nodePtr) {
Packit Service 9ccfef
	    sprintf(s, "%s", nodePtr->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    strcpy(s, "");
Packit Service 9ccfef
	    for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
		if (i) strcat(s, ".");
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}*/
Packit Service 9ccfef
	sprintf(s, "%s", valuePtr->value.ptr);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
	default:
Packit Service 9ccfef
	sprintf(s, "%s", "");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintSubtype(FILE *f, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiRange       *range;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    char	   s[100];
Packit Service 9ccfef
    int		   i;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((smiType->basetype == SMI_BASETYPE_ENUM) ||
Packit Service 9ccfef
	(smiType->basetype == SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
	for(i = 0, nn = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
	    nn ; i++, nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, ", ");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, " (");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    sprintf(s, "%s(%s)", nn->name,
Packit Service 9ccfef
		    getValueString(&nn->value, smiType));
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + INDENT, s);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) {
Packit Service 9ccfef
	    fprint(f, ")");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	} else if(smiType->basetype == SMI_BASETYPE_POINTER) {
Packit Service 9ccfef
		nn = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
		if(nn)
Packit Service 9ccfef
			fprint(f, " (%s)",nn->name);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for(i = 0, range = smiGetFirstRange(smiType);
Packit Service 9ccfef
	    range ; i++, range = smiGetNextRange(range)) {
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, " | ");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, " (");
Packit Service 9ccfef
	    }	    
Packit Service 9ccfef
	    if (memcmp(&range->minValue, &range->maxValue,
Packit Service 9ccfef
		       sizeof(SmiValue))) {
Packit Service 9ccfef
		sprintf(s, "%s", getValueString(&range->minValue, smiType));
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "..%s", 
Packit Service 9ccfef
			getValueString(&range->maxValue, smiType));
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		sprintf(s, "%s", getValueString(&range->minValue, smiType));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + INDENT, s);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) {
Packit Service 9ccfef
	    fprint(f, ")");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintAttributeSubtype(FILE *f, SmiAttribute *smiAttribute)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiRange       *range;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    char	   s[100];
Packit Service 9ccfef
    int		   i;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((smiAttribute->basetype == SMI_BASETYPE_ENUM) ||
Packit Service 9ccfef
	(smiAttribute->basetype == SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
	for(i = 0, nn = smiGetAttributeFirstNamedNumber(smiAttribute);
Packit Service 9ccfef
	    nn ; i++, nn = smiGetAttributeNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, ", ");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, " (");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    sprintf(s, "%s(%s)", nn->name,
Packit Service 9ccfef
		    getValueString(&nn->value, smiGetAttributeParentType(smiAttribute)));
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + INDENT, s);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) {
Packit Service 9ccfef
	    fprint(f, ")");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	} else if(smiAttribute->basetype == SMI_BASETYPE_POINTER) {
Packit Service 9ccfef
		nn = smiGetAttributeFirstNamedNumber(smiAttribute);
Packit Service 9ccfef
		if(nn)
Packit Service 9ccfef
			fprint(f, " (%s)",nn->name);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for(i = 0, range = smiGetAttributeFirstRange(smiAttribute);
Packit Service 9ccfef
	    range ; i++, range = smiGetAttributeNextRange(range)) {
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, " | ");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, " (");
Packit Service 9ccfef
	    }	    
Packit Service 9ccfef
	    if (memcmp(&range->minValue, &range->maxValue,
Packit Service 9ccfef
		       sizeof(SmiValue))) {
Packit Service 9ccfef
		sprintf(s, "%s", getValueString(&range->minValue, smiGetAttributeParentType(smiAttribute)));
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "..%s", 
Packit Service 9ccfef
			getValueString(&range->maxValue, smiGetAttributeParentType(smiAttribute)));
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		sprintf(s, "%s", getValueString(&range->minValue, smiGetAttributeParentType(smiAttribute)));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + INDENT, s);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) {
Packit Service 9ccfef
	    fprint(f, ")");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintImports(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiImport *import;
Packit Service 9ccfef
    char   *lastModuleName = NULL;
Packit Service 9ccfef
    int    pos = 0, len, maxlen = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    createImportList(smiModule);
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = smiGetFirstImport(smiModule); import; import = smiGetNextImport(import)) {
Packit Service 9ccfef
	len = strlen(import->module);
Packit Service 9ccfef
	maxlen = (len > maxlen) ? len : maxlen;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = smiGetFirstImport(smiModule); import; import = smiGetNextImport(import)) {
Packit Service 9ccfef
	int yaba = !lastModuleName || strcmp(import->module, lastModuleName);
Packit Service 9ccfef
	if (yaba) {
Packit Service 9ccfef
	    if (lastModuleName) {
Packit Service 9ccfef
		fprint(f, ");\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	    fprint(f, "import %-*s (", maxlen, import->module);
Packit Service 9ccfef
	    pos = INDENT + 12 + maxlen;
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprint(f, ", ");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	len = strlen(import->name);
Packit Service 9ccfef
	if (len + pos > INDENTMAX) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	    fprint(f, "     %-*s  ", maxlen, "");
Packit Service 9ccfef
	    pos = INDENT + 12 + maxlen;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, "%s", import->name);
Packit Service 9ccfef
	pos += len;
Packit Service 9ccfef
	lastModuleName = import->module;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (lastModuleName) {
Packit Service 9ccfef
	fprintf(f, ");\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
    freeImportList();
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintRevisions(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    SmiRevision *smiRevision;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiRevision = smiGetFirstRevision(smiModule);
Packit Service 9ccfef
	smiRevision; smiRevision = smiGetNextRevision(smiRevision)) {
Packit Service 9ccfef
	fprintSegment(f, INDENT, "revision {\n", 0);
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "date", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\"%s\";\n", getStringTime(smiRevision->date));
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 2 * INDENT, smiRevision->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
        fprintSegment(f, INDENT, "};\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (i) {
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintTypedefs(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i, j;
Packit Service 9ccfef
    SmiType	 *smiType;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	smiType; smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((!(strcmp(smiModule->name, "SNMPv2-SMI"))) ||
Packit Service 9ccfef
	    (!(strcmp(smiModule->name, "RFC1155-SMI")))) {
Packit Service 9ccfef
	    for(j=0; excludeType[j]; j++) {
Packit Service 9ccfef
		if (!strcmp(smiType->name, excludeType[j])) break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (excludeType[j]) break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// TYPE DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "typedef %s {\n", smiType->name);
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "type", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "%s", getTypeString(smiType->basetype,
Packit Service 9ccfef
				      smiGetParentType(smiType)));
Packit Service 9ccfef
	fprintSubtype(f, smiType);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiType->value.basetype != SMI_BASETYPE_UNKNOWN) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "default", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s", getValueString(&smiType->value, smiType));
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiType->format) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "format", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\"%s\";\n", smiType->format);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiType->units) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "units", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\"%s\";\n", smiType->units);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if ((smiType->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiType->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiType->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiType->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 2 * INDENT, smiType->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
	if (smiType->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiType->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintIdentities(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i;
Packit Service 9ccfef
    SmiIdentity	 *smiIdentity;
Packit Service 9ccfef
    SmiIdentity  *tmpIdentity;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiIdentity = smiGetFirstIdentity(smiModule);
Packit Service 9ccfef
	smiIdentity; smiIdentity = smiGetNextIdentity(smiIdentity)) {
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// IDENTITY DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "identity %s {\n", smiIdentity->name);
Packit Service 9ccfef
Packit Service 9ccfef
	tmpIdentity = smiGetParentIdentity(smiIdentity);
Packit Service 9ccfef
	if (tmpIdentity) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "parent", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s", tmpIdentity->name);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if ((smiIdentity->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiIdentity->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiIdentity->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiIdentity->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 2 * INDENT, smiIdentity->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
	if (smiIdentity->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiIdentity->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintExtensions(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i;
Packit Service 9ccfef
    SmiMacro	 *smiMacro;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiMacro = smiGetFirstMacro(smiModule);
Packit Service 9ccfef
	smiMacro; smiMacro = smiGetNextMacro(smiMacro)) {
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// EXTENSION DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "extension %s {\n", smiMacro->name);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiMacro->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiMacro->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiMacro->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiMacro->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 2 * INDENT, smiMacro->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
	if (smiMacro->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiMacro->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if(smiMacro->abnf) {
Packit Service 9ccfef
		fprintSegment(f, 2 * INDENT, "abnf", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiMacro->abnf);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintUniqueStatement(FILE *f, SmiClass *smiClass)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiAttribute *attributePtr;
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if(smiIsClassScalar(smiClass))
Packit Service 9ccfef
    {
Packit Service 9ccfef
    	fprintSegment(f, 2 * INDENT, "unique", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "();\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    
Packit Service 9ccfef
    attributePtr = smiGetFirstUniqueAttribute(smiClass);
Packit Service 9ccfef
    if (attributePtr) {
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "unique", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "(");
Packit Service 9ccfef
	for (i=0; attributePtr; 
Packit Service 9ccfef
	     attributePtr = smiGetNextUniqueAttribute(attributePtr))
Packit Service 9ccfef
	{
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, ", %s",attributePtr->name);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, "%s",attributePtr->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    i++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, ");\n\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
static void fprintAttributes(FILE *f, SmiClass *smiClass)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i;
Packit Service 9ccfef
    SmiAttribute *smiAttribute;
Packit Service 9ccfef
    SmiType	 *tmpType;
Packit Service 9ccfef
    SmiClass *tmpClass;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (i = 0, smiAttribute = smiGetFirstAttribute(smiClass);
Packit Service 9ccfef
	 smiAttribute; smiAttribute = smiGetNextAttribute(smiAttribute)) {
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, 2*INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "attribute %s {\n", smiAttribute->name);
Packit Service 9ccfef
	
Packit Service 9ccfef
	tmpType = smiGetAttributeParentType(smiAttribute);
Packit Service 9ccfef
	if (tmpType) {
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "type", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s ", tmpType->name);
Packit Service 9ccfef
	    fprintAttributeSubtype(f, smiAttribute);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "access", INDENTVALUE);
Packit Service 9ccfef
	    switch (smiAttribute->access) {
Packit Service 9ccfef
	    case SMI_ACCESS_READ_ONLY:
Packit Service 9ccfef
		fprint(f, "readonly;\n");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case SMI_ACCESS_READ_WRITE:
Packit Service 9ccfef
		fprint(f, "readwrite;\n");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case SMI_ACCESS_EVENT_ONLY:
Packit Service 9ccfef
		fprint(f, "eventonly;\n");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    default:
Packit Service 9ccfef
		fprint(f, ";\n");
Packit Service 9ccfef
		break;	
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    if (smiAttribute->value.basetype != SMI_BASETYPE_UNKNOWN) {
Packit Service 9ccfef
		fprintSegment(f, 3 * INDENT, "default", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "%s", getValueString(&smiAttribute->value, smiGetAttributeParentType(smiAttribute)));
Packit Service 9ccfef
		fprint(f, ";\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    if (smiAttribute->format) {
Packit Service 9ccfef
		fprintSegment(f, 3 * INDENT, "format", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "\"%s\";\n", smiAttribute->format);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (smiAttribute->units) {
Packit Service 9ccfef
		fprintSegment(f, 3 * INDENT, "units", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "\"%s\";\n", smiAttribute->units);
Packit Service 9ccfef
	    }		
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	tmpClass = smiGetAttributeParentClass(smiAttribute);
Packit Service 9ccfef
	if (tmpClass) {
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "type", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", tmpClass->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiAttribute->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiAttribute->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiAttribute->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiAttribute->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 3 * INDENT, smiAttribute->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
	if (smiAttribute->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 3 * INDENT, smiAttribute->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, 2*INDENT, "};\n\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintEvents(FILE *f, SmiClass *smiClass)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i;
Packit Service 9ccfef
    SmiEvent *smiEvent;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiEvent = smiGetFirstEvent(smiClass);
Packit Service 9ccfef
	smiEvent; smiEvent = smiGetNextEvent(smiEvent)) {
Packit Service 9ccfef
	/*    
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
		fprint(f,"\n");
Packit Service 9ccfef
		fprintSegment(f, 2 * INDENT, "// ATTRIBUTE DEFINITIONS\n\n",0);
Packit Service 9ccfef
	}*/
Packit Service 9ccfef
	fprintSegment(f, 2*INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "event %s {\n", smiEvent->name);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiEvent->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiEvent->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiEvent->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiEvent->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 3 * INDENT, smiEvent->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
	if (smiEvent->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 3 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 3 * INDENT, smiEvent->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, 2*INDENT, "};\n\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintClasses(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i;
Packit Service 9ccfef
    SmiClass	 *smiClass;
Packit Service 9ccfef
    SmiClass	 *tmpClass;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (i = 0, smiClass = smiGetFirstClass(smiModule);
Packit Service 9ccfef
	 smiClass; smiClass = smiGetNextClass(smiClass)) {
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// CLASS DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "class %s {\n", smiClass->name);
Packit Service 9ccfef
Packit Service 9ccfef
	tmpClass = smiGetParentClass(smiClass);
Packit Service 9ccfef
	if (tmpClass) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "extends", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n\n", tmpClass->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintAttributes(f,smiClass);
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintUniqueStatement(f,smiClass);
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintEvents(f,smiClass);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiClass->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiClass->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiClass->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiClass->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, 2 * INDENT, smiClass->description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
	if (smiClass->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiClass->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintObjects(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i, j;
Packit Service 9ccfef
    SmiNode	 *smiNode, *relatedNode;
Packit Service 9ccfef
    SmiElement   *smiElement;
Packit Service 9ccfef
    SmiType	 *smiType;
Packit Service 9ccfef
    int		 indent = 0;
Packit Service 9ccfef
    int		 lastindent = -1;
Packit Service 9ccfef
    char	 *s = NULL;
Packit Service 9ccfef
    SmiNodekind  nodekinds;
Packit Service 9ccfef
Packit Service 9ccfef
    nodekinds =  SMI_NODEKIND_NODE | SMI_NODEKIND_TABLE |
Packit Service 9ccfef
	SMI_NODEKIND_ROW | SMI_NODEKIND_COLUMN | SMI_NODEKIND_SCALAR |
Packit Service 9ccfef
	SMI_NODEKIND_CAPABILITIES;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiNode = smiGetFirstNode(smiModule, nodekinds);
Packit Service 9ccfef
	smiNode; smiNode = smiGetNextNode(smiNode, nodekinds)) {
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->nodekind == SMI_NODEKIND_NODE) {
Packit Service 9ccfef
	    indent = 0;
Packit Service 9ccfef
	    s = "node";
Packit Service 9ccfef
	} else if (smiNode->nodekind == SMI_NODEKIND_CAPABILITIES) {
Packit Service 9ccfef
	    indent = 0;
Packit Service 9ccfef
	    s = "node";
Packit Service 9ccfef
	} else if (smiNode->nodekind == SMI_NODEKIND_TABLE) {
Packit Service 9ccfef
	    indent = 0;
Packit Service 9ccfef
	    s = "table";
Packit Service 9ccfef
	} else if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit Service 9ccfef
	    indent = 1;
Packit Service 9ccfef
	    s = "row";
Packit Service 9ccfef
	} else if (smiNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit Service 9ccfef
	    indent = 2;
Packit Service 9ccfef
	    s = "column";
Packit Service 9ccfef
	} else if (smiNode->nodekind == SMI_NODEKIND_SCALAR) {
Packit Service 9ccfef
	    indent = 0;
Packit Service 9ccfef
	    s = "scalar";
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// OBJECT DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	for (j = lastindent; j >= indent; j--) {
Packit Service 9ccfef
	    fprintSegment(f, (1 + j) * INDENT, "", 0);
Packit Service 9ccfef
	    fprint(f, "};\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	lastindent = indent;
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->nodekind == SMI_NODEKIND_CAPABILITIES) {
Packit Service 9ccfef
	    fprintSegment(f, (1 + indent) * INDENT, "", 0);
Packit Service 9ccfef
	    fprint(f, "-- This has been an SMIv2 AGENT-CAPABILITIES node:\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, (1 + indent) * INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "%s %s {\n", s, smiNode->name);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->oid) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "oid", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getOidString(smiNode, 0));
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	if (smiType && (smiType->basetype != SMI_BASETYPE_UNKNOWN)) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "type", INDENTVALUE);
Packit Service 9ccfef
	    if (!smiType->name) {
Packit Service 9ccfef
		/*
Packit Service 9ccfef
		 * an implicitly restricted type.
Packit Service 9ccfef
		 */
Packit Service 9ccfef
		fprint(f, "%s", getTypeString(smiType->basetype,
Packit Service 9ccfef
					      smiGetParentType(smiType)));
Packit Service 9ccfef
		fprintSubtype(f, smiType);
Packit Service 9ccfef
		fprint(f, ";\n");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, "%s;\n",
Packit Service 9ccfef
		       getTypeString(smiType->basetype, smiType));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if ((smiNode->nodekind != SMI_NODEKIND_TABLE) &&
Packit Service 9ccfef
	    (smiNode->nodekind != SMI_NODEKIND_ROW) &&
Packit Service 9ccfef
	    (smiNode->nodekind != SMI_NODEKIND_CAPABILITIES) &&
Packit Service 9ccfef
	    (smiNode->nodekind != SMI_NODEKIND_NODE)) {
Packit Service 9ccfef
	    if (smiNode->access != SMI_ACCESS_UNKNOWN) {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "access", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "%s;\n", getAccessString(smiNode->access));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	relatedNode = smiGetRelatedNode(smiNode);
Packit Service 9ccfef
	switch (smiNode->indexkind) {
Packit Service 9ccfef
	case SMI_INDEX_INDEX:
Packit Service 9ccfef
	    if (smiNode->implied) {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "index implied",
Packit Service 9ccfef
			      INDENTVALUE);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "index", INDENTVALUE);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprint(f, "(");
Packit Service 9ccfef
	    for (j = 0, smiElement = smiGetFirstElement(smiNode); smiElement;
Packit Service 9ccfef
		 j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		if (j) {
Packit Service 9ccfef
		    fprint(f, ", ");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprintWrapped(f, INDENTVALUE + 1,
Packit Service 9ccfef
			      smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
	    } /* TODO: empty? -> print error */
Packit Service 9ccfef
	    fprint(f, ");\n");
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
	    if (relatedNode) {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "augments",
Packit Service 9ccfef
			      INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "%s;\n", relatedNode->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
	    } /* TODO: else print error */
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_REORDER:
Packit Service 9ccfef
	    if (relatedNode) {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "", 0);
Packit Service 9ccfef
		fprint(f, "reorders %s", relatedNode->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
		if (smiNode->implied) {
Packit Service 9ccfef
		    fprint(f, " implied");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprint(f, " (");
Packit Service 9ccfef
		for (j = 0, smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
		     smiElement;
Packit Service 9ccfef
		     j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		    if (j) {
Packit Service 9ccfef
			fprint(f, ", ");
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprintWrapped(f, INDENTVALUE + 1,
Packit Service 9ccfef
				  smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
		    /* TODO: non-local name if non-local */
Packit Service 9ccfef
		} /* TODO: empty? -> print error */
Packit Service 9ccfef
		fprint(f, ");\n");
Packit Service 9ccfef
	    } /* TODO: else print error */
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_SPARSE:
Packit Service 9ccfef
	    if (relatedNode) {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "sparse", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "%s;\n", relatedNode->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
	    } /* TODO: else print error */
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_EXPAND:
Packit Service 9ccfef
	    if (relatedNode) {
Packit Service 9ccfef
		fprintSegment(f, (2 + indent) * INDENT, "", 0);
Packit Service 9ccfef
		fprint(f, "expands %s", relatedNode->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
		if (smiNode->implied) {
Packit Service 9ccfef
		    fprint(f, " implied");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprint(f, " (");
Packit Service 9ccfef
		for (j = 0, smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
		     smiElement;
Packit Service 9ccfef
		     j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		    if (j) {
Packit Service 9ccfef
			fprint(f, ", ");
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprintWrapped(f, INDENTVALUE + 1,
Packit Service 9ccfef
				  smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
		    /* TODO: non-local name if non-local */
Packit Service 9ccfef
		} /* TODO: empty? -> print error */
Packit Service 9ccfef
		fprint(f, ");\n");
Packit Service 9ccfef
	    } /* TODO: else print error */
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_UNKNOWN:
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->create) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "create", INDENTVALUE);
Packit Service 9ccfef
	    /* TODO: create list */
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->value.basetype != SMI_BASETYPE_UNKNOWN) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "default", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s", getValueString(&smiNode->value, smiType));
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->format) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "format", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\"%s\";\n",smiNode->format);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiNode->units) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "units", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\"%s\";\n", smiNode->units);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if ((smiNode->status != SMI_STATUS_CURRENT) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiNode->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiNode->description) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "description",
Packit Service 9ccfef
			  INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, (2 + indent) * INDENT,
Packit Service 9ccfef
				  smiNode->description);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, (2 + indent) * INDENT, "reference",
Packit Service 9ccfef
			  INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, (2 + indent) * INDENT,
Packit Service 9ccfef
				  smiNode->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (i) {
Packit Service 9ccfef
	fprintSegment(f, (1 + indent) * INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "};\n\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintNotifications(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i, j;
Packit Service 9ccfef
    SmiNode	 *smiNode;
Packit Service 9ccfef
    SmiElement   *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiNode = smiGetFirstNode(smiModule,
Packit Service 9ccfef
					 SMI_NODEKIND_NOTIFICATION);
Packit Service 9ccfef
	smiNode;
Packit Service 9ccfef
	smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit Service 9ccfef
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// NOTIFICATION DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "notification %s {\n", smiNode->name);
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->oid) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "oid", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getOidString(smiNode, 0));
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if ((smiElement = smiGetFirstElement(smiNode))) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "objects", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "(");
Packit Service 9ccfef
	    for (j = 0; smiElement;
Packit Service 9ccfef
		 j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		if (j) {
Packit Service 9ccfef
		    fprint(f, ", ");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprintWrapped(f, INDENTVALUE + 1,
Packit Service 9ccfef
			      smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
	    } /* TODO: empty? -> print error */
Packit Service 9ccfef
	    fprint(f, ");\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiNode->status != SMI_STATUS_CURRENT) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiNode->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->description) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiNode->description);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiNode->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "};\n\n");
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintGroups(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i, j;
Packit Service 9ccfef
    SmiNode	 *smiNode;
Packit Service 9ccfef
    SmiElement   *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_GROUP);
Packit Service 9ccfef
	smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_GROUP)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// GROUP DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "group %s {\n", smiNode->name);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->oid) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "oid", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getOidString(smiNode, 0));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "members", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "(");
Packit Service 9ccfef
	for (j = 0, smiElement = smiGetFirstElement(smiNode); smiElement;
Packit Service 9ccfef
		 j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	    if (j) {
Packit Service 9ccfef
		fprint(f, ", ");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + 1,
Packit Service 9ccfef
			  smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
	    /* TODO: non-local name if non-local */
Packit Service 9ccfef
	} /* TODO: empty? -> print error */
Packit Service 9ccfef
	fprint(f, ");\n");
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if ((smiNode->status != SMI_STATUS_CURRENT) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiNode->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->description) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiNode->description);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiNode->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "};\n\n");
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintCompliances(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		  i, j;
Packit Service 9ccfef
    SmiNode	  *smiNode, *smiNode2;
Packit Service 9ccfef
    SmiType	  *smiType;
Packit Service 9ccfef
    SmiOption	  *smiOption;
Packit Service 9ccfef
    SmiRefinement *smiRefinement;
Packit Service 9ccfef
    SmiElement    *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
Packit Service 9ccfef
	smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// COMPLIANCE DEFINITIONS\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "compliance %s {\n", smiNode->name);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (smiNode->oid) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "oid", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getOidString(smiNode, 0));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if ((smiNode->status != SMI_STATUS_CURRENT) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	    (smiNode->status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n", getStringStatus(smiNode->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (smiNode->description) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiNode->description);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, 2 * INDENT, smiNode->reference);
Packit Service 9ccfef
	    fprint(f, ";\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if ((smiElement = smiGetFirstElement(smiNode))) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintSegment(f, 2 * INDENT, "mandatory", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "(");
Packit Service 9ccfef
	    for (j = 0; smiElement;
Packit Service 9ccfef
		 j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		if (j) {
Packit Service 9ccfef
		    fprint(f, ", ");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprintWrapped(f, INDENTVALUE + 1,
Packit Service 9ccfef
			      smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
		/* TODO: non-local name if non-local */
Packit Service 9ccfef
	    } /* TODO: empty? -> print error */
Packit Service 9ccfef
	    fprint(f, ");\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiOption = smiGetFirstOption(smiNode))) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    for(; smiOption; smiOption = smiGetNextOption(smiOption)) {
Packit Service 9ccfef
		smiNode2 = smiGetOptionNode(smiOption);
Packit Service 9ccfef
		fprintSegment(f, 2 * INDENT, "", 0);
Packit Service 9ccfef
		fprint(f, "optional %s {\n", smiNode2->name);
Packit Service 9ccfef
		fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
		fprintMultilineString(f, 3 * INDENT, smiOption->description);
Packit Service 9ccfef
		fprint(f, ";\n");
Packit Service 9ccfef
		fprintSegment(f, 2 * INDENT, "};\n", 0);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiRefinement = smiGetFirstRefinement(smiNode))) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    for(; smiRefinement;
Packit Service 9ccfef
		smiRefinement = smiGetNextRefinement(smiRefinement)) {
Packit Service 9ccfef
		fprintSegment(f, 2 * INDENT, "", 0);
Packit Service 9ccfef
		fprint(f, "refine %s {\n",
Packit Service 9ccfef
		       smiGetRefinementNode(smiRefinement)->name);
Packit Service 9ccfef
Packit Service 9ccfef
		smiType = smiGetRefinementType(smiRefinement);
Packit Service 9ccfef
		if (smiType) {
Packit Service 9ccfef
		    fprintSegment(f, 3 * INDENT, "type", INDENTVALUE);
Packit Service 9ccfef
		    fprint(f, "%s",
Packit Service 9ccfef
			   getTypeString(smiType->basetype,
Packit Service 9ccfef
					 smiGetParentType(smiType)));
Packit Service 9ccfef
		    fprintSubtype(f, smiType);
Packit Service 9ccfef
		    fprint(f, ";\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
Packit Service 9ccfef
		smiType = smiGetRefinementWriteType(smiRefinement);
Packit Service 9ccfef
		if (smiType) {
Packit Service 9ccfef
		    fprintSegment(f, 3 * INDENT, "writetype", INDENTVALUE);
Packit Service 9ccfef
		    fprint(f, "%s",
Packit Service 9ccfef
			   getTypeString(smiType->basetype,
Packit Service 9ccfef
					 smiGetParentType(smiType)));
Packit Service 9ccfef
		    fprintSubtype(f, smiType);
Packit Service 9ccfef
		    fprint(f, ";\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
Packit Service 9ccfef
		if (smiRefinement->access != SMI_ACCESS_UNKNOWN) {
Packit Service 9ccfef
		    fprintSegment(f, 3 * INDENT, "access", INDENTVALUE);
Packit Service 9ccfef
		    fprint(f, "%s;\n", getAccessString(smiRefinement->access));
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
		fprintMultilineString(f, 3 * INDENT,
Packit Service 9ccfef
				      smiRefinement->description);
Packit Service 9ccfef
		fprint(f, ";\n");
Packit Service 9ccfef
		fprintSegment(f, 2 * INDENT, "};\n", 0);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintSegment(f, INDENT, "", 0);
Packit Service 9ccfef
	fprint(f, "};\n\n");
Packit Service 9ccfef
	i++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void dumpSming(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiModule   *smiModule;
Packit Service 9ccfef
    SmiNode	*smiNode;
Packit Service 9ccfef
    int		i;
Packit Service 9ccfef
    FILE	*f = stdout;
Packit Service 9ccfef
Packit Service 9ccfef
    silent = (flags & SMIDUMP_FLAG_SILENT);
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	f = fopen(output, "w");
Packit Service 9ccfef
	if (!f) {
Packit Service 9ccfef
	    fprintf(stderr, "smidump: cannot open %s for writing: ", output);
Packit Service 9ccfef
	    perror(NULL);
Packit Service 9ccfef
	    exit(1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
Packit Service 9ccfef
	smiModule = modv[i];
Packit Service 9ccfef
    
Packit Service 9ccfef
	fprint(f, "//\n");
Packit Service 9ccfef
	fprint(f, "// This module has been generated by smidump "
Packit Service 9ccfef
	       SMI_VERSION_STRING ". Do not edit.\n");
Packit Service 9ccfef
	fprint(f, "//\n");
Packit Service 9ccfef
	fprint(f, "module %s ", smiModule->name);
Packit Service 9ccfef
	fprint(f, "{\n");
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintImports(f, smiModule);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (! silent) {
Packit Service 9ccfef
	    fprint(f, "//\n// MODULE META INFORMATION\n//\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT, "organization", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, INDENT, smiModule->organization);
Packit Service 9ccfef
	fprint(f, ";\n\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "contact", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, INDENT, smiModule->contactinfo);
Packit Service 9ccfef
	fprint(f, ";\n\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, INDENT, smiModule->description);
Packit Service 9ccfef
	fprint(f, ";\n\n");
Packit Service 9ccfef
	if (smiModule->reference) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "reference", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, INDENT, smiModule->reference);
Packit Service 9ccfef
	    fprint(f, ";\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintRevisions(f, smiModule);
Packit Service 9ccfef
	
Packit Service 9ccfef
	smiNode = smiGetModuleIdentityNode(smiModule);
Packit Service 9ccfef
	if (smiNode) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "identity", INDENTVALUE);
Packit Service 9ccfef
	    fprint(f, "%s;\n\n", smiNode->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintExtensions(f, smiModule);
Packit Service 9ccfef
	fprintIdentities(f, smiModule);
Packit Service 9ccfef
	fprintTypedefs(f, smiModule);
Packit Service 9ccfef
	fprintClasses(f, smiModule);
Packit Service 9ccfef
	fprintObjects(f, smiModule);
Packit Service 9ccfef
	fprintNotifications(f, smiModule);
Packit Service 9ccfef
	fprintGroups(f, smiModule);
Packit Service 9ccfef
	fprintCompliances(f, smiModule);
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprint(f, "}; // end of module %s.\n", smiModule->name);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (fflush(f) || ferror(f)) {
Packit Service 9ccfef
	perror("smidump: write error");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	fclose(f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void initSming()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"sming",
Packit Service 9ccfef
	dumpSming,
Packit Service 9ccfef
	0,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_UNITE,
Packit Service 9ccfef
	"SMIng",
Packit Service 9ccfef
	NULL,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}