Blame tools/dump-sming.c

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