Blame tools/dump-yang.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-yang.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump MIB modules in the YANG output format.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 2007 J. Schoenwaelder, Jacobs University Bremen.
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-yang.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 <ctype.h>
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
#include "fprint.h"
Packit Service 9ccfef
#include "fortopat.h"
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * TODO:
Packit Service 9ccfef
 * - reproduce the table comment text as a yang comment
Packit Service 9ccfef
 * - fix the format strings to xsd pattern algorithm so that it
Packit Service 9ccfef
 *   produces more accurate results
Packit Service 9ccfef
 * - compute proper boundaries for binary/string length restrictions
Packit Service 9ccfef
 * - translate notifications properly (whatever that means ;-)
Packit Service 9ccfef
 * - handle opaque in a reasonable way (test case AGGREGATE-MIB)
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
static int sflag = 0;		/* generate smi: extensions */
Packit Service 9ccfef
static int nflag = 0;		/* generate notifications */
Packit Service 9ccfef
static int INDENT = 2;		/* indent factor */
Packit Service 9ccfef
Packit Service 9ccfef
#define  INDENTVALUE	20   /* column to start values, except multiline */
Packit Service 9ccfef
#define	 URNBASE	"urn:ietf:params:xml:ns:yang:smiv2:"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
#define FLAG_CONFIG_FALSE 0x01
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static const char *convertType[] = {
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Translation of the SMIng built-in types to the YANG
Packit Service 9ccfef
     * equivalents.
Packit Service 9ccfef
     */
Packit Service 9ccfef
    
Packit Service 9ccfef
    "",		  "Integer32",   NULL,	     "int32",
Packit Service 9ccfef
    "",		  "Integer64",   NULL,	     "int64",
Packit Service 9ccfef
    "",		  "Unsigned32",  NULL,	     "uint32",
Packit Service 9ccfef
    "",		  "Unsigned64",  NULL,	     "uint64",
Packit Service 9ccfef
    "",		  "OctetString", NULL,	     "binary",
Packit Service 9ccfef
    "",		  "Enumeration", NULL,	     "enumeration",
Packit Service 9ccfef
    "",		  "Bits",	 NULL,	     "bits",
Packit Service 9ccfef
    "",		  "ObjectIdentifier", "yang-types", "object-identifier",
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * We want to do these translations as well in order to retire the
Packit Service 9ccfef
     * SNMPv2-SMI module which is not really an SMIv2 module but part
Packit Service 9ccfef
     * of the definition of SNMPv2-SMI itself.
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    "SNMPv2-SMI", "Integer32",  NULL,        "int32",
Packit Service 9ccfef
    "SNMPv2-SMI", "Integer64",  NULL,        "int64",
Packit Service 9ccfef
    "SNMPv2-SMI", "Unsigned32", NULL,        "uint32",
Packit Service 9ccfef
    "SNMPv2-SMI", "Opaque",    NULL,	     "binary",
Packit Service 9ccfef
    "SNMPv2-SMI", "Counter32", "yang-types", "counter32",
Packit Service 9ccfef
    "SNMPv2-SMI", "Counter64", "yang-types", "counter64",
Packit Service 9ccfef
    "SNMPv2-SMI", "Gauge32",   "yang-types", "gauge32",
Packit Service 9ccfef
    "SNMPv2-SMI", "TimeTicks", "yang-types", "timeticks",
Packit Service 9ccfef
    "SNMPv2-SMI", "IpAddress", "inet-types", "ipv4-address",
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * And we like to do the same for RFC1155-SMI definitions...
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    "RFC1155-SMI", "Opaque",    NULL,	     "binary",
Packit Service 9ccfef
    "RFC1155-SMI", "Counter",   "yang-types", "counter32",
Packit Service 9ccfef
    "RFC1155-SMI", "Gauge",     "yang-types", "gauge32",
Packit Service 9ccfef
    "RFC1155-SMI", "TimeTicks", "yang-types", "timeticks",
Packit Service 9ccfef
    "RFC1155-SMI", "IpAddress", "inet-types", "ipv4-address",
Packit Service 9ccfef
    
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * We also translate frequently used SNMPv2-TCs that have a YANG
Packit Service 9ccfef
     * equivalent. Note that DateAndTime is slightly different from
Packit Service 9ccfef
     * the ISO profile used by date-and-time.
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    "SNMPv2-TC",  "PhysAddress", "yang-types", "phys-address",
Packit Service 9ccfef
    "SNMPv2-TC",  "MacAddress",  "ieee-types", "mac-address",
Packit Service 9ccfef
    "SNMPv2-TC",  "TimeStamp",   "yang-types", "timestamp",
Packit Service 9ccfef
Packit Service 9ccfef
    NULL, NULL, NULL, NULL
Packit Service 9ccfef
};
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static const char *convertImport[] = {
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Things that are not types but removed from imports...
Packit Service 9ccfef
     */
Packit Service 9ccfef
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",  "mib-2",              NULL, NULL,
Packit Service 9ccfef
    "SNMPv2-TC",   "TEXTUAL-CONVENTION", NULL, 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
    "SNMPv2-MIB",  "snmpTraps",	         NULL, NULL,
Packit Service 9ccfef
Packit Service 9ccfef
    NULL, NULL, NULL, NULL
Packit Service 9ccfef
};
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * SMIv2 modules we never like to import from...
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
static const char *ignoreImports[] = {
Packit Service 9ccfef
    "RFC1155-SMI", "SNMPv2-SMI", "SNMPv2-CONF", NULL
Packit Service 9ccfef
};
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
typedef struct Import {
Packit Service 9ccfef
    char          *module;
Packit Service 9ccfef
    char	  *prefix;
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
static int silent = 0;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char*
Packit Service 9ccfef
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
static char*
Packit Service 9ccfef
getStringDate(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",
Packit Service 9ccfef
	    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char*
Packit Service 9ccfef
getValueString(SmiValue *valuePtr, SmiType *typePtr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char    s[1024];
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
    SmiNode        *nodePtr;
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
    case SMI_BASETYPE_FLOAT64:
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT128:
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.unsigned32 == valuePtr->value.unsigned32)
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 << 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.unsigned32 == 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, "%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_POINTER:
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
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
isPrefixUnique(const char *prefix)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import *import;
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = importList; import; import = import->nextPtr) {
Packit Service 9ccfef
         if (strcmp(prefix, import->prefix) == 0) {
Packit Service 9ccfef
             return 0;
Packit Service 9ccfef
	 }
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return 1;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char*
Packit Service 9ccfef
guessNicePrefix(const char *moduleName)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *prefix;
Packit Service 9ccfef
    int i, d;
Packit Service 9ccfef
Packit Service 9ccfef
    char *specials[] = {
Packit Service 9ccfef
	"yang-smi", "smi",
Packit Service 9ccfef
	"yang-types", "yang",
Packit Service 9ccfef
	"inet-types", "inet",
Packit Service 9ccfef
	"ieee-types", "ieee",
Packit Service 9ccfef
	"SNMPv2-TC", "smiv2",
Packit Service 9ccfef
	NULL, NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; specials[i]; i +=2) {
Packit Service 9ccfef
	if (strcmp(moduleName, specials[i]) == 0) {
Packit Service 9ccfef
            if (isPrefixUnique(specials[i+1])) {
Packit Service 9ccfef
                return xstrdup(specials[i+1]);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    prefix = xstrdup(moduleName);
Packit Service 9ccfef
    for (i = 0; prefix[i]; i++) {
Packit Service 9ccfef
        prefix[i] = tolower(prefix[i]);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0, d = 0; prefix[i]; i++) {
Packit Service 9ccfef
        if (prefix[i] == '-') {
Packit Service 9ccfef
	    d++;
Packit Service 9ccfef
	    if (d > 1) {
Packit Service 9ccfef
		prefix[i] = 0;
Packit Service 9ccfef
		if (isPrefixUnique(prefix)) {
Packit Service 9ccfef
		    return prefix;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		prefix[i] = '-';
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return prefix;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static const char*
Packit Service 9ccfef
getModulePrefix(const char *moduleName)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import *import;
Packit Service 9ccfef
    static char *prefix = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = importList; import; import = import->nextPtr) {
Packit Service 9ccfef
        if (strcmp(moduleName, import->module) == 0) {
Packit Service 9ccfef
            return import->prefix;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
 
Packit Service 9ccfef
    if (prefix) xfree(prefix);
Packit Service 9ccfef
    prefix = guessNicePrefix(moduleName);
Packit Service 9ccfef
    return prefix;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static Import*
Packit Service 9ccfef
addImport(char *module, char *name)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import **import, *newImport;
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) return *import;
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->prefix = guessNicePrefix(module);
Packit Service 9ccfef
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
Packit Service 9ccfef
createImportList(SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiImport   *smiImport;
Packit Service 9ccfef
    SmiIdentifier impModule, impName;
Packit Service 9ccfef
    SmiType	*smiType;
Packit Service 9ccfef
    SmiNode	*smiNode;
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiImport = smiGetFirstImport(smiModule); smiImport;
Packit Service 9ccfef
	 smiImport = smiGetNextImport(smiImport)) {
Packit Service 9ccfef
Packit Service 9ccfef
	impModule = smiImport->module;
Packit Service 9ccfef
	impName = smiImport->name;
Packit Service 9ccfef
Packit Service 9ccfef
	for (i = 0; convertType[i]; i += 4) {
Packit Service 9ccfef
	    if (strcmp(smiImport->module, convertType[i]) == 0
Packit Service 9ccfef
		&& strcmp(smiImport->name, convertType[i+1]) == 0) {
Packit Service 9ccfef
		impModule = (SmiIdentifier) convertType[i+2];
Packit Service 9ccfef
		impName = (SmiIdentifier) convertType[i+3];
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (! impModule || ! impName) continue;
Packit Service 9ccfef
Packit Service 9ccfef
	for (i = 0; convertImport[i]; i += 4) {
Packit Service 9ccfef
	    if (strcmp(smiImport->module, convertImport[i]) == 0
Packit Service 9ccfef
		&& strcmp(smiImport->name, convertImport[i+1]) == 0) {
Packit Service 9ccfef
		impModule = (SmiIdentifier) convertImport[i+2];
Packit Service 9ccfef
		impName = (SmiIdentifier) convertImport[i+3];
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (! impModule || ! impName) continue;
Packit Service 9ccfef
#if 0	
Packit Service 9ccfef
	fprintf(stderr, "%s\t%s\n", impModule, impName);
Packit Service 9ccfef
#endif
Packit Service 9ccfef
	addImport(impModule, impName);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Add import for the smi:oid extension and friends.
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    if (sflag) {
Packit Service 9ccfef
	addImport("yang-smi", "oid");
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Add import for yang-types that were originally ASN.1
Packit Service 9ccfef
     * builtins...
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	 smiType; smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	SmiType *parentType = smiGetParentType(smiType);
Packit Service 9ccfef
	if (parentType && strcmp(parentType->name, "ObjectIdentifier") == 0) {
Packit Service 9ccfef
	    addImport("yang-types", "object-identifier");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule,
Packit Service 9ccfef
				   SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode,
Packit Service 9ccfef
				  SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN)) {
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	if (! smiType->name) {
Packit Service 9ccfef
	    smiType = smiGetParentType(smiType);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiType && strcmp(smiType->name, "ObjectIdentifier") == 0) {
Packit Service 9ccfef
	    addImport("yang-types", "object-identifier");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
freeImportList(void)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import *import, *freeme;
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = importList; import; ) {
Packit Service 9ccfef
        xfree(import->prefix);
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 int
Packit Service 9ccfef
isGroup(SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *childNode;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(childNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
	childNode;
Packit Service 9ccfef
	childNode = smiGetNextChildNode(childNode)) {
Packit Service 9ccfef
	if ((childNode->nodekind == SMI_NODEKIND_SCALAR
Packit Service 9ccfef
	     || childNode->nodekind == SMI_NODEKIND_TABLE)
Packit Service 9ccfef
	    && childNode->status == SMI_STATUS_CURRENT) {
Packit Service 9ccfef
	    return 1;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return 0;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
isIndex(SmiNode *groupNode, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    int cnt = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * We return an indication whether smiNode is part of an index. In
Packit Service 9ccfef
     * fact, we return number of times smiNode is part of an index
Packit Service 9ccfef
     * since we sometimes have to disambiguate names...
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiElement = smiGetFirstElement(groupNode);
Packit Service 9ccfef
	 smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	if (smiNode == smiGetElementNode(smiElement)) {
Packit Service 9ccfef
	    cnt++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return cnt;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintRevisions(FILE *f, int indent, 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 ", 0);
Packit Service 9ccfef
	fprint(f, "\"%s\" {\n", getStringDate(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
static void
Packit Service 9ccfef
fprintImports(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import *import;
Packit Service 9ccfef
    int i, len = 4;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (import = importList; import; import = import->nextPtr) {
Packit Service 9ccfef
	for (i = 0; ignoreImports[i]; i++) {
Packit Service 9ccfef
	    if (strcmp(ignoreImports[i], import->module) == 0) {
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (ignoreImports[i] == NULL) {
Packit Service 9ccfef
	    if (strlen(import->module) > len) len = strlen(import->module);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (import = importList; import; import = import->nextPtr) {
Packit Service 9ccfef
	for (i = 0; ignoreImports[i]; i++) {
Packit Service 9ccfef
	    if (strcmp(ignoreImports[i], import->module) == 0) {
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (ignoreImports[i] == NULL) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "import", 0);
Packit Service 9ccfef
	    fprint(f, " %-*s { prefix \"%s\"; }\n", len,
Packit Service 9ccfef
		   import->module, import->prefix);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintSubtype(FILE *f, int indent, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiRange       *range;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    char	   s[1024];
Packit Service 9ccfef
    char	   *tkw, *lkw, *vkw;
Packit Service 9ccfef
    int		   i = 0;
Packit Service 9ccfef
    int		   len = 4;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((smiType->basetype == SMI_BASETYPE_ENUM) ||
Packit Service 9ccfef
	(smiType->basetype == SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
	for (nn = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
	     nn ; nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (strlen(nn->name) > len) len = strlen(nn->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
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, " {\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    tkw = (smiType->basetype == SMI_BASETYPE_BITS) ? "bits" : "enumeration";
Packit Service 9ccfef
	    lkw = (smiType->basetype == SMI_BASETYPE_BITS) ? "bit" : "enum";
Packit Service 9ccfef
	    vkw = (smiType->basetype == SMI_BASETYPE_BITS) ? "position" : "value";
Packit Service 9ccfef
	    sprintf(s, "%s %-*s { %s %s; }\n",
Packit Service 9ccfef
		    lkw, len, nn->name,
Packit Service 9ccfef
		    vkw, getValueString(&nn->value, smiType));
Packit Service 9ccfef
	    fprintSegment(f, indent + INDENT, s, 0);
Packit Service 9ccfef
	}
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, " {\n");
Packit Service 9ccfef
		if (smiType->basetype == SMI_BASETYPE_OCTETSTRING) {
Packit Service 9ccfef
		    fprintSegment(f, indent + INDENT, "length \"", 0);
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprintSegment(f, indent + INDENT, "range \"", 0);
Packit Service 9ccfef
		}
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
	    fprint(f, s);
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
    if (smiType->format
Packit Service 9ccfef
	&& smiType->basetype == SMI_BASETYPE_OCTETSTRING) {
Packit Service 9ccfef
Packit Service 9ccfef
	char *pattern;
Packit Service 9ccfef
	pattern = smiFormatToPattern(smiType->format,
Packit Service 9ccfef
				     smiGetFirstRange(smiType));
Packit Service 9ccfef
	if (pattern) {
Packit Service 9ccfef
	    if (! i) {
Packit Service 9ccfef
		fprint(f, "{\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintSegment(f, indent + INDENT, "pattern \"", 0);
Packit Service 9ccfef
	    fprint(f, "%s\";\n", pattern);
Packit Service 9ccfef
	    xfree(pattern);
Packit Service 9ccfef
	    i++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! i) {
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintSegment(f, indent, "}\n", 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintStatus(FILE *f, int indent, SmiStatus status)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if ((status != SMI_STATUS_CURRENT) &&
Packit Service 9ccfef
	(status != SMI_STATUS_UNKNOWN) &&
Packit Service 9ccfef
	(status != SMI_STATUS_MANDATORY) &&
Packit Service 9ccfef
	(status != SMI_STATUS_OPTIONAL)) {
Packit Service 9ccfef
	fprintSegment(f, indent, "status", 0);
Packit Service 9ccfef
	fprint(f, " %s;\n", getStringStatus(status));
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintUnits(FILE *f, int indent, const char *units)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (units) {
Packit Service 9ccfef
	fprintSegment(f, indent, "units", 0);
Packit Service 9ccfef
	fprint(f, " \"%s\";\n", units);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintFormat(FILE *f, int indent, const char *format)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (sflag && format) {
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "smi:display-hint", 0);
Packit Service 9ccfef
	fprint(f, " \"%s\";\n", format);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintObjectIdentifier(FILE *f, int indent, SmiSubid *oid, int oidlen)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    if (sflag && oid && oidlen) {
Packit Service 9ccfef
	fprintSegment(f, indent, "smi:oid", 0);
Packit Service 9ccfef
	fprint(f, " \"");
Packit Service 9ccfef
	for (i=0; i < oidlen; i++) {
Packit Service 9ccfef
	    fprint(f, "%s%d", i ? "." : "", oid[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, "\";\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintDescription(FILE *f, int indent, const char *description)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (description) {
Packit Service 9ccfef
	fprintSegment(f, indent, "description", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, indent, description);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintReference(FILE *f, int indent, const char *reference)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (reference) {
Packit Service 9ccfef
	fprintSegment(f, indent, "reference", INDENTVALUE);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, indent, reference);
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintConfig(FILE *f, int indent, SmiAccess access)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (access == SMI_ACCESS_READ_WRITE) {
Packit Service 9ccfef
	fprintSegment(f, indent, "config true;\n", 0);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprintSegment(f, indent, "config false;\n", 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintDefault(FILE *f, int indent, SmiValue *value, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (sflag && value->basetype != SMI_BASETYPE_UNKNOWN) {
Packit Service 9ccfef
	fprintSegment(f, indent, "smi:default", 0);
Packit Service 9ccfef
	fprint(f, " \"%s\";\n", getValueString(value, smiType));
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
fprintTypename(FILE *f, SmiType *smiType, int format)
Packit Service 9ccfef
{
Packit Service 9ccfef
    const char *typeModule = NULL, *typeName = NULL;
Packit Service 9ccfef
    SmiModule *smiModule;
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    if (! smiType) return 0;
Packit Service 9ccfef
Packit Service 9ccfef
    smiModule = smiGetTypeModule(smiType);
Packit Service 9ccfef
Packit Service 9ccfef
    if (smiType && ! smiType->name) {
Packit Service 9ccfef
	return fprintTypename(f, smiGetParentType(smiType), format);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; convertType[i]; i += 4) {
Packit Service 9ccfef
	if (strcmp(smiModule->name, convertType[i]) == 0
Packit Service 9ccfef
	    && strcmp(smiType->name, convertType[i+1]) == 0) {
Packit Service 9ccfef
	    typeModule = convertType[i+2];
Packit Service 9ccfef
	    typeName = convertType[i+3];
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (! typeName) {
Packit Service 9ccfef
	typeModule = smiModule->name;
Packit Service 9ccfef
	typeName = smiType->name;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (typeModule) {
Packit Service 9ccfef
	typeModule = getModulePrefix(typeModule);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * We handle a special case here. If we have a format string and
Packit Service 9ccfef
     * the type is binary, we turn it into string.
Packit Service 9ccfef
     */
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (! typeModule && typeName && strcmp(typeName, "binary") == 0) {
Packit Service 9ccfef
	if (format) {
Packit Service 9ccfef
	    typeName = "string";
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
	
Packit Service 9ccfef
    if (typeModule && typeName) {
Packit Service 9ccfef
	fprint(f, "%s:%s", typeModule, typeName);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprint(f, "%s", typeName);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return 1;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintTypedefs(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 i;
Packit Service 9ccfef
    SmiType	 *smiType, *baseType;
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
	baseType = smiGetParentType(smiType);
Packit Service 9ccfef
Packit Service 9ccfef
	if (!i && !silent) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "/*** TYPE DEFINITIONS ***/\n\n", 0);
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 ", 0);
Packit Service 9ccfef
	fprintTypename(f, baseType, smiType->format != NULL);
Packit Service 9ccfef
	fprintSubtype(f, 2 * INDENT, smiType);
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintUnits(f, 2 * INDENT, smiType->units);
Packit Service 9ccfef
	fprintStatus(f, 2 * INDENT, smiType->status);
Packit Service 9ccfef
	fprintDescription(f, 2 * INDENT, smiType->description);
Packit Service 9ccfef
	fprintReference(f, 2 * INDENT, smiType->reference);
Packit Service 9ccfef
	fprintFormat(f, 2 * INDENT, smiType->format);
Packit Service 9ccfef
	fprintDefault(f, 2 * INDENT, &smiType->value, smiType);
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
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintPath(FILE *f, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
     SmiNode *entryNode = NULL;
Packit Service 9ccfef
     SmiNode *tableNode = NULL;
Packit Service 9ccfef
     SmiNode *contNode = NULL;
Packit Service 9ccfef
     SmiModule *smiModule = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
     switch (smiNode->nodekind) {
Packit Service 9ccfef
     case SMI_NODEKIND_SCALAR:
Packit Service 9ccfef
	     contNode = smiGetParentNode(smiNode);
Packit Service 9ccfef
	     break;
Packit Service 9ccfef
     case SMI_NODEKIND_COLUMN:
Packit Service 9ccfef
	     entryNode = smiGetParentNode(smiNode);
Packit Service 9ccfef
	     tableNode = smiGetParentNode(entryNode);
Packit Service 9ccfef
	     contNode = smiGetParentNode(tableNode);
Packit Service 9ccfef
	     break;
Packit Service 9ccfef
     case SMI_NODEKIND_ROW:
Packit Service 9ccfef
	     entryNode = smiNode;
Packit Service 9ccfef
	     tableNode = smiGetParentNode(entryNode);
Packit Service 9ccfef
	     contNode = smiGetParentNode(tableNode);
Packit Service 9ccfef
	     break;
Packit Service 9ccfef
     case SMI_NODEKIND_TABLE:
Packit Service 9ccfef
	     contNode = smiGetParentNode(tableNode);
Packit Service 9ccfef
	     break;
Packit Service 9ccfef
     default:
Packit Service 9ccfef
	     break;
Packit Service 9ccfef
     }
Packit Service 9ccfef
Packit Service 9ccfef
     smiModule = smiGetNodeModule(contNode);
Packit Service 9ccfef
     if (smiModule) {
Packit Service 9ccfef
         fprint(f, "/%s:%s", getModulePrefix(smiModule->name), contNode->name);
Packit Service 9ccfef
     }
Packit Service 9ccfef
     if (contNode == smiNode) return;
Packit Service 9ccfef
Packit Service 9ccfef
     if (entryNode) {
Packit Service 9ccfef
	 smiModule = smiGetNodeModule(entryNode);
Packit Service 9ccfef
	 if (smiModule) {
Packit Service 9ccfef
	     fprint(f, "/%s:%s", getModulePrefix(smiModule->name), entryNode->name);
Packit Service 9ccfef
	 }
Packit Service 9ccfef
	 if (entryNode == smiNode) return;
Packit Service 9ccfef
     }
Packit Service 9ccfef
Packit Service 9ccfef
     smiModule = smiGetNodeModule(smiNode);
Packit Service 9ccfef
     if (smiModule) {
Packit Service 9ccfef
         fprint(f, "/%s:%s", getModulePrefix(smiModule->name), smiNode->name);
Packit Service 9ccfef
     }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintLeaf(FILE *f, int indent, SmiNode *smiNode, int flags)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    SmiAccess config;
Packit Service 9ccfef
    
Packit Service 9ccfef
    smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent, "leaf ", 0);
Packit Service 9ccfef
    fprint(f, "%s {\n", smiNode->name);
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent + INDENT, "type ", 0);
Packit Service 9ccfef
    fprintTypename(f, smiType, smiNode->format != NULL);
Packit Service 9ccfef
    if (! smiType->name) {
Packit Service 9ccfef
	fprintSubtype(f, indent + INDENT, smiType);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	fprint(f, ";\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintUnits(f, indent + INDENT, smiNode->units);
Packit Service 9ccfef
    if (flags & FLAG_CONFIG_FALSE) {
Packit Service 9ccfef
	config = SMI_ACCESS_READ_ONLY;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	config = smiNode->access;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintConfig(f, indent + INDENT, config);
Packit Service 9ccfef
    fprintStatus(f, indent + INDENT, smiNode->status);
Packit Service 9ccfef
    fprintDescription(f, indent + INDENT, smiNode->description);
Packit Service 9ccfef
    fprintReference(f, indent + INDENT, smiNode->reference);
Packit Service 9ccfef
    fprintFormat(f, indent + INDENT, smiNode->format);
Packit Service 9ccfef
    fprintDefault(f, indent + INDENT, &smiNode->value, smiType);
Packit Service 9ccfef
    fprintObjectIdentifier(f, indent + INDENT, smiNode->oid, smiNode->oidlen);
Packit Service 9ccfef
    fprintSegment(f, indent, "}\n", 0);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintKeyrefLeaf(FILE *f, int indent, SmiNode *smiNode, int flags)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *entryNode;
Packit Service 9ccfef
    SmiAccess config;
Packit Service 9ccfef
Packit Service 9ccfef
    entryNode = smiGetParentNode(smiNode);
Packit Service 9ccfef
    fprintSegment(f, indent, "leaf ", 0);
Packit Service 9ccfef
    fprint(f, "%s {\n", smiNode->name);
Packit Service 9ccfef
    fprintSegment(f, indent + INDENT, "type keyref {\n", 0);
Packit Service 9ccfef
    fprintSegment(f, indent + 2 * INDENT, "path \"", 0);
Packit Service 9ccfef
    fprintPath(f, smiNode);
Packit Service 9ccfef
    fprint(f, "\";\n");
Packit Service 9ccfef
    fprintSegment(f, indent + INDENT, "}\n", 0);
Packit Service 9ccfef
    if (flags & FLAG_CONFIG_FALSE) {
Packit Service 9ccfef
	config = SMI_ACCESS_READ_ONLY;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	config = entryNode->create
Packit Service 9ccfef
	    ? SMI_ACCESS_READ_WRITE : SMI_ACCESS_READ_ONLY;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintConfig(f, indent + INDENT, config);
Packit Service 9ccfef
    fprintStatus(f, indent + INDENT, smiNode->status);
Packit Service 9ccfef
    fprintDescription(f, indent + INDENT,
Packit Service 9ccfef
		      "Automagically generated keyref leaf.");
Packit Service 9ccfef
    fprintSegment(f, indent, "}\n", 0);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintKey(FILE *f, int indent, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    int j;
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent, "key \"", 0);
Packit Service 9ccfef
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, indent + 5,
Packit Service 9ccfef
		      smiGetElementNode(smiElement)->name);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprint(f, "\";\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintLeafs(FILE *f, int indent, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *childNode;
Packit Service 9ccfef
    int c;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (c = 0, childNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
	 childNode;
Packit Service 9ccfef
	 childNode = smiGetNextChildNode(childNode)) {
Packit Service 9ccfef
	if (childNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintLeaf(f, indent, childNode, 0);
Packit Service 9ccfef
	    c++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintList(FILE *f, int indent, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *entryNode;
Packit Service 9ccfef
    SmiNode *childNode;
Packit Service 9ccfef
    SmiNode *parentNode;
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
Packit Service 9ccfef
    entryNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
    fprintSegment(f, indent, "/* XXX table comments here XXX */\n", 0);
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent, "list", 0);
Packit Service 9ccfef
    fprint(f, " %s {\n\n", entryNode->name);
Packit Service 9ccfef
Packit Service 9ccfef
    fprintKey(f, indent + INDENT, entryNode);
Packit Service 9ccfef
    fprintStatus(f, indent + INDENT, entryNode->status);
Packit Service 9ccfef
    fprintDescription(f, indent + INDENT, entryNode->description);
Packit Service 9ccfef
    fprintReference(f, indent + INDENT, entryNode->reference);
Packit Service 9ccfef
    fprintObjectIdentifier(f, indent + INDENT,
Packit Service 9ccfef
			   entryNode->oid, entryNode->oidlen);
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiElement = smiGetFirstElement(entryNode); smiElement;
Packit Service 9ccfef
	 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	childNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	parentNode = smiGetParentNode(childNode);
Packit Service 9ccfef
        if (childNode->nodekind == SMI_NODEKIND_COLUMN
Packit Service 9ccfef
            && parentNode != entryNode) {
Packit Service 9ccfef
	    fprintKeyrefLeaf(f, indent + INDENT, childNode, 0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintLeafs(f, indent + INDENT, entryNode);
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent, "}\n", 0);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintAugment(FILE *f, int indent, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *baseEntryNode = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
    if (smiNode) {
Packit Service 9ccfef
        baseEntryNode = smiGetRelatedNode(smiNode);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (! smiNode || ! baseEntryNode) {
Packit Service 9ccfef
        return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
    fprintSegment(f, indent, "/* XXX table comments here XXX */\n", 0);
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent, "augment", 0);
Packit Service 9ccfef
    fprint(f, " \"");
Packit Service 9ccfef
    fprintPath(f, baseEntryNode);
Packit Service 9ccfef
    fprint(f, "\" {\n");
Packit Service 9ccfef
    fprintStatus(f, indent + INDENT, smiNode->status);
Packit Service 9ccfef
    fprintDescription(f, indent + INDENT, smiNode->description);
Packit Service 9ccfef
    fprintReference(f, indent + INDENT, smiNode->reference);
Packit Service 9ccfef
Packit Service 9ccfef
    fprintLeafs(f, indent + INDENT, smiNode);
Packit Service 9ccfef
    fprintObjectIdentifier(f, indent + INDENT,
Packit Service 9ccfef
			   smiNode->oid, smiNode->oidlen);
Packit Service 9ccfef
    fprintSegment(f, indent, "}\n\n", 0);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintAugments(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit Service 9ccfef
	smiNode;
Packit Service 9ccfef
	smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit Service 9ccfef
	if (smiNode->nodekind == SMI_NODEKIND_ROW
Packit Service 9ccfef
	    && smiNode->indexkind == SMI_INDEX_AUGMENT) {
Packit Service 9ccfef
	    fprintAugment(f, INDENT, smiNode);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintContainer(FILE *f, int indent, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *childNode;
Packit Service 9ccfef
    int c;
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, indent, "container", 0);
Packit Service 9ccfef
    fprint(f, " %s {\n\n", smiNode->name);
Packit Service 9ccfef
Packit Service 9ccfef
    for (c = 0, childNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
	 childNode;
Packit Service 9ccfef
	 childNode = smiGetNextChildNode(childNode)) {
Packit Service 9ccfef
	if (c) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (childNode->nodekind == SMI_NODEKIND_SCALAR) {
Packit Service 9ccfef
	    fprintLeaf(f, indent + INDENT, childNode, 0);
Packit Service 9ccfef
	    c++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (childNode->nodekind == SMI_NODEKIND_TABLE) {
Packit Service 9ccfef
	    SmiNode *entryNode = smiGetFirstChildNode(childNode);
Packit Service 9ccfef
	    if (entryNode) {
Packit Service 9ccfef
	        switch (entryNode->indexkind) {
Packit Service 9ccfef
		case SMI_INDEX_INDEX:
Packit Service 9ccfef
		case SMI_INDEX_REORDER:
Packit Service 9ccfef
		case SMI_INDEX_SPARSE:
Packit Service 9ccfef
		case SMI_INDEX_EXPAND:
Packit Service 9ccfef
			fprintList(f, indent + INDENT, childNode);
Packit Service 9ccfef
			c++;
Packit Service 9ccfef
			break;
Packit Service 9ccfef
#if 0
Packit Service 9ccfef
		case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
			fprintAugment(f, indent + INDENT, childNode);
Packit Service 9ccfef
			c++;
Packit Service 9ccfef
			break;
Packit Service 9ccfef
#endif
Packit Service 9ccfef
		default:
Packit Service 9ccfef
			break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	} 
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintObjectIdentifier(f, indent + INDENT,
Packit Service 9ccfef
			   smiNode->oid, smiNode->oidlen);
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintSegment(f, indent, "}\n\n", 0);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintContainers(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit Service 9ccfef
	smiNode;
Packit Service 9ccfef
	smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit Service 9ccfef
	if (isGroup(smiNode)) {
Packit Service 9ccfef
	    fprintContainer(f, INDENT, smiNode);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintNamespace(FILE *f, int indent, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
     if (! silent) {
Packit Service 9ccfef
	  fprintSegment(f, indent, "/*** NAMESPACE / PREFIX DEFINITION ***/\n\n", 0);
Packit Service 9ccfef
     }
Packit Service 9ccfef
Packit Service 9ccfef
     fprintSegment(f, indent, "namespace ", 0);
Packit Service 9ccfef
     fprint(f, "\"%s%s\";\n", URNBASE, smiModule->name);
Packit Service 9ccfef
     fprintSegment(f, indent, "prefix ", 0);
Packit Service 9ccfef
     fprint(f, "\"%s\";\n\n", getModulePrefix(smiModule->name));
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintLinkage(FILE *f, int indent, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
     if (! silent) {
Packit Service 9ccfef
	  fprintSegment(f, indent, "/*** LINKAGE (IMPORTS / INCLUDES) ***/\n\n", 0);
Packit Service 9ccfef
     }
Packit Service 9ccfef
     fprintImports(f, smiModule);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintMeta(FILE *f, int indent, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
     if (! silent) {
Packit Service 9ccfef
	  fprintSegment(f, indent, "/*** META INFORMATION ***/\n\n", 0);
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
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintNotificationIndex(FILE *f, int indent,
Packit Service 9ccfef
			SmiNode *entryNode, SmiNode *ignoreNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiNode *childNode;
Packit Service 9ccfef
    SmiNode *parentNode;
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiElement = smiGetFirstElement(entryNode); smiElement;
Packit Service 9ccfef
	 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	childNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	parentNode = smiGetParentNode(childNode);
Packit Service 9ccfef
	if (childNode != ignoreNode) {
Packit Service 9ccfef
	    fprintKeyrefLeaf(f, indent, childNode, FLAG_CONFIG_FALSE);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int
Packit Service 9ccfef
GetPosition(SmiElement *startElement, SmiElement *thisElement)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    SmiNode *thisNode = smiGetElementNode(thisElement);
Packit Service 9ccfef
    int cnt = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiElement = startElement, cnt = 0;
Packit Service 9ccfef
	 smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	smiNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	if (smiNode == thisNode) cnt++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt <= 1) {
Packit Service 9ccfef
	return 0;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiElement = startElement, cnt = 0;
Packit Service 9ccfef
	 smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	smiNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	if (smiNode == thisNode) cnt++;
Packit Service 9ccfef
	if (smiElement == thisElement) {
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return cnt;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintNotification(FILE *f, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiNode *vbNode, *entryNode;
Packit Service 9ccfef
    int c, cnt;
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintSegment(f, INDENT, "notification", 0);
Packit Service 9ccfef
    fprint(f, " %s {\n", smiNode->name);
Packit Service 9ccfef
    fprintStatus(f, INDENT + INDENT, smiNode->status);
Packit Service 9ccfef
    fprintDescription(f, INDENT + INDENT, smiNode->description);
Packit Service 9ccfef
    fprintReference(f, INDENT + INDENT, smiNode->reference);
Packit Service 9ccfef
    fprintObjectIdentifier(f, INDENT + INDENT, smiNode->oid, smiNode->oidlen);
Packit Service 9ccfef
    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
    for (c = 0, smiElement = smiGetFirstElement(smiNode); smiElement;
Packit Service 9ccfef
	 c++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	vbNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	if (! vbNode) continue;
Packit Service 9ccfef
Packit Service 9ccfef
	cnt = GetPosition(smiGetFirstElement(smiNode), smiElement);
Packit Service 9ccfef
Packit Service 9ccfef
	entryNode = (vbNode->nodekind == SMI_NODEKIND_COLUMN)
Packit Service 9ccfef
	    ? smiGetParentNode(vbNode) : NULL;
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT + INDENT, "container ", 0);
Packit Service 9ccfef
	if (cnt) {
Packit Service 9ccfef
	    fprintf(f, "%s-%s-%d {\n", smiNode->name, vbNode->name, cnt);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(f, "%s-%s {\n", smiNode->name, vbNode->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (entryNode) {
Packit Service 9ccfef
	    switch (entryNode->indexkind) {
Packit Service 9ccfef
	    case SMI_INDEX_INDEX:
Packit Service 9ccfef
		fprintNotificationIndex(f, INDENT + INDENT + INDENT,
Packit Service 9ccfef
					entryNode, vbNode);
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
		fprintNotificationIndex(f, INDENT + INDENT + INDENT,
Packit Service 9ccfef
					smiGetRelatedNode(entryNode), vbNode);
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    default:
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (entryNode && isIndex(entryNode, vbNode)) {
Packit Service 9ccfef
	    fprintKeyrefLeaf(f, INDENT + INDENT + INDENT,
Packit Service 9ccfef
			     vbNode, FLAG_CONFIG_FALSE);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintLeaf(f, INDENT + INDENT + INDENT,
Packit Service 9ccfef
		       vbNode, FLAG_CONFIG_FALSE);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintSegment(f, INDENT + INDENT, "}\n\n", 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    fprintSegment(f, INDENT, "}\n", 0);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
fprintNotifications(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    int c;
Packit Service 9ccfef
Packit Service 9ccfef
    for (c = 0, smiNode = smiGetFirstNode(smiModule,
Packit Service 9ccfef
					  SMI_NODEKIND_NOTIFICATION);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 c++, smiNode = smiGetNextNode(smiNode,
Packit Service 9ccfef
				       SMI_NODEKIND_NOTIFICATION)) {
Packit Service 9ccfef
	if (c) {
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintNotification(f, smiNode);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
dumpYang(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiModule   *smiModule;
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
    fprint_indent_texts = INDENT;
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
        createImportList(smiModule);
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 ":\n");
Packit Service 9ccfef
	fprint(f, " *\n");
Packit Service 9ccfef
	fprint(f, " *      smidump -f yang");
Packit Service 9ccfef
	if (silent) {
Packit Service 9ccfef
	    fprint(f, " -q");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (sflag) {
Packit Service 9ccfef
	    fprint(f, " --yang-smi-extensions");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nflag) {
Packit Service 9ccfef
	    fprint(f, " --yang-no-notifications");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, " %s\n", smiModule->name);
Packit Service 9ccfef
	fprint(f, " *\n");
Packit Service 9ccfef
	fprint(f, " * Do not edit. Edit the source file instead!\n");
Packit Service 9ccfef
	fprint(f, " */\n\n");
Packit Service 9ccfef
	fprint(f, "module %s {\n", smiModule->name);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
	fprintNamespace(f, INDENT, smiModule);
Packit Service 9ccfef
	fprintLinkage(f, INDENT, smiModule);
Packit Service 9ccfef
	fprintMeta(f, INDENT, smiModule);
Packit Service 9ccfef
	fprintRevisions(f, INDENT, smiModule);
Packit Service 9ccfef
Packit Service 9ccfef
	fprintTypedefs(f, modv[i]);
Packit Service 9ccfef
	fprintContainers(f, modv[i]);
Packit Service 9ccfef
	fprintAugments(f, modv[i]);
Packit Service 9ccfef
Packit Service 9ccfef
	if (! nflag) {
Packit Service 9ccfef
	    fprintNotifications(f, modv[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
    	fprint(f, "} /* end of module %s */\n", smiModule->name);
Packit Service 9ccfef
Packit Service 9ccfef
        freeImportList();
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 initYang()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriverOption opt[] = {
Packit Service 9ccfef
	{ "smi-extensions", OPT_FLAG, &sflag, 0,
Packit Service 9ccfef
	  "generate smi extensions" },
Packit Service 9ccfef
	{ "no-notifications", OPT_FLAG, &nflag, 0,
Packit Service 9ccfef
	  "do not generate notifications" },
Packit Service 9ccfef
	{ "indent", OPT_INT, &INDENT, 0,
Packit Service 9ccfef
	  "indentation (default 2)" },
Packit Service 9ccfef
        { 0, OPT_END, 0, 0 }
Packit Service 9ccfef
    };
Packit Service 9ccfef
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"yang",
Packit Service 9ccfef
	dumpYang,
Packit Service 9ccfef
	0,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_UNITE,
Packit Service 9ccfef
	"YANG format",
Packit Service 9ccfef
	opt,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}