Blame tools/dump-xml.c

Packit 022b05
/*
Packit 022b05
 * dump-xml.c --
Packit 022b05
 *
Packit 022b05
 *      Operations to dump SMIng module information in XML format.
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 2000 Frank Strauss, Technical University of Braunschweig.
Packit 022b05
 * Copyright (c) 2000 J. Schoenwaelder, 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-xml.c 8090 2008-04-18 12:56:29Z strauss $
Packit 022b05
 */
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * TODO:
Packit 022b05
 *
Packit 022b05
 * - value representations (getValueString())
Packit 022b05
 * - finish DTD and check against it
Packit 022b05
 * - shall we nest tables like in SMIng?
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 int disableschema  = 0;
Packit 022b05
static int disabledoctype = 0;
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
typedef struct XmlEscape {
Packit 022b05
    char character;
Packit 022b05
    char *escape;
Packit 022b05
} XmlEscape;
Packit 022b05
Packit 022b05
static XmlEscape xmlEscapes [] = {
Packit 022b05
    { '<',	"<" },
Packit 022b05
    { '>',	">" },
Packit 022b05
    { '&',	"&" },
Packit 022b05
    { 0,	NULL }
Packit 022b05
};
Packit 022b05
Packit 022b05
Packit 022b05
static int current_column = 0;
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *getStringLanguage(SmiLanguage lang)
Packit 022b05
{
Packit 022b05
    return
Packit 022b05
	(lang == SMI_LANGUAGE_SMIV1) ? "SMIv1" :
Packit 022b05
	(lang == SMI_LANGUAGE_SMIV2) ? "SMIv2" :
Packit 022b05
	(lang == SMI_LANGUAGE_SMING) ? "SMIng" :
Packit 022b05
                                     	NULL;
Packit 022b05
}
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)   ? "mandatory" :
Packit 022b05
	(status == SMI_STATUS_OPTIONAL)    ? "optional" :
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 *getTimeString(time_t t)
Packit 022b05
{
Packit 022b05
    static char   *s = NULL;
Packit 022b05
    struct tm	  *tm;
Packit 022b05
Packit 022b05
    if (s) xfree(s);
Packit 022b05
    
Packit 022b05
    tm = gmtime(&t);
Packit 022b05
    smiAsprintf(&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 void fprint(FILE *f, char *fmt, ...)
Packit 022b05
{
Packit 022b05
    va_list ap;
Packit 022b05
    char    *s;
Packit 022b05
    char    *p;
Packit 022b05
Packit 022b05
    va_start(ap, fmt);
Packit 022b05
    current_column += smiVasprintf(&s, fmt, ap);
Packit 022b05
    va_end(ap);
Packit 022b05
    fputs(s, f);
Packit 022b05
    if ((p = strrchr(s, '\n'))) {
Packit 022b05
        current_column = strlen(p) - 1;
Packit 022b05
    }
Packit 022b05
    free(s);
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 fprintMultilineString(FILE *f, int column, const char *s)
Packit 022b05
{
Packit 022b05
    int i, j, len;
Packit 022b05
Packit 022b05
#ifdef INDENTTEXTS
Packit 022b05
    fprintSegment(f, column + INDENTTEXTS, "", 0);
Packit 022b05
#endif
Packit 022b05
    if (s) {
Packit 022b05
	len = strlen(s);
Packit 022b05
	for (i=0; i < len; i++) {
Packit 022b05
	    for (j = 0; xmlEscapes[j].character; j++) {
Packit 022b05
		if (xmlEscapes[j].character == s[i]) break;
Packit 022b05
	    }
Packit 022b05
	    if (xmlEscapes[j].character) {
Packit 022b05
		fputs(xmlEscapes[j].escape, f);
Packit 022b05
		current_column += strlen(xmlEscapes[j].escape);
Packit 022b05
	    } else {
Packit 022b05
		putc(s[i], f);
Packit 022b05
		current_column++;
Packit 022b05
	    }
Packit 022b05
	    if (s[i] == '\n') {
Packit 022b05
		current_column = 0;
Packit 022b05
#ifdef INDENTTEXTS
Packit 022b05
		fprintSegment(f, column + INDENTTEXTS, "", 0);
Packit 022b05
#endif
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
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[1024];
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
    case SMI_BASETYPE_FLOAT64:
Packit 022b05
    case SMI_BASETYPE_FLOAT128:
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_ENUM:
Packit 022b05
	for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit 022b05
	     nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
	    if (nn->value.value.unsigned32 == valuePtr->value.unsigned32)
Packit 022b05
		break;
Packit 022b05
	}
Packit 022b05
	if (nn) {
Packit 022b05
	    sprintf(s, "%s", nn->name);
Packit 022b05
	} else {
Packit 022b05
	    sprintf(s, "%ld", valuePtr->value.integer32);
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
	for (i = 0; i < valuePtr->len; i++) {
Packit 022b05
	    if (!isprint((int)valuePtr->value.ptr[i])) break;
Packit 022b05
	}
Packit 022b05
	if (i == valuePtr->len) {
Packit 022b05
	    sprintf(s, "\"%s\"", valuePtr->value.ptr);
Packit 022b05
	} else {
Packit 022b05
            sprintf(s, "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.unsigned32 == 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, "%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_POINTER:
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
	for (i = 0; i < valuePtr->len; i++) {
Packit 022b05
	    sprintf(&s[strlen(s)], i ? ".%u" : "%u", valuePtr->value.oid[i]);
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNodeStartTag(FILE *f, int indent,
Packit 022b05
			       const char *tag, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    unsigned int i;
Packit 022b05
    
Packit 022b05
    fprintSegment(f, indent, "", 0);
Packit 022b05
    fprint(f, "<%s name=\"%s\"", tag, smiNode->name);
Packit 022b05
    fprint(f, " oid=\"");
Packit 022b05
    for (i = 0; i < smiNode->oidlen; i++) {
Packit 022b05
	fprint(f, i ? ".%u" : "%u", smiNode->oid[i]);
Packit 022b05
    }
Packit 022b05
    fprint(f, "\"");
Packit 022b05
    if (smiNode->create) {
Packit 022b05
	fprint(f, " create=\"true\"");
Packit 022b05
    }
Packit 022b05
    if (smiNode->status != SMI_STATUS_UNKNOWN) {
Packit 022b05
	fprint(f, " status=\"%s\"", getStringStatus(smiNode->status));
Packit 022b05
    }
Packit 022b05
    fprint(f, ">\n");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNodeEndTag(FILE *f, int indent, const char *tag)
Packit 022b05
{
Packit 022b05
    fprintSegment(f, indent, "", 0);
Packit 022b05
    fprint(f, "</%s>\n", tag);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintRanges(FILE *f, int indent, SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiRange       *range;
Packit 022b05
Packit 022b05
    for(range = smiGetFirstRange(smiType);
Packit 022b05
	range;
Packit 022b05
	range = smiGetNextRange(range)) {
Packit 022b05
	fprintSegment(f, indent, "
Packit 022b05
	fprint(f, " min=\"%s\"", getValueString(&range->minValue, smiType));
Packit 022b05
	fprint(f, " max=\"%s\"", getValueString(&range->maxValue, smiType));
Packit 022b05
	fprint(f, "/>\n");
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNamedNumbers(FILE *f, int indent, SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiNamedNumber *nn;
Packit 022b05
Packit 022b05
    if ((smiType->basetype != SMI_BASETYPE_ENUM) &&
Packit 022b05
	(smiType->basetype != SMI_BASETYPE_BITS)) {
Packit 022b05
	return;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (nn = smiGetFirstNamedNumber(smiType);
Packit 022b05
	 nn;
Packit 022b05
	 nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
	fprintSegment(f, indent, "
Packit 022b05
	fprint(f, " name=\"%s\"", nn->name);
Packit 022b05
	fprint(f, " number=\"%s\"", getValueString(&nn->value, smiType));
Packit 022b05
	fprint(f, "/>\n");
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintValue(FILE *f, int indent, SmiValue *smiValue,
Packit 022b05
			SmiType *smiType)
Packit 022b05
{
Packit 022b05
    if (smiType && smiValue && smiValue->basetype != SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	fprintSegment(f, indent, "<default>", 0);
Packit 022b05
	fprint(f, "%s", getValueString(smiValue, smiType));
Packit 022b05
	fprint(f, "</default>\n");
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintDescription(FILE *f, int indent, const char *description)
Packit 022b05
{
Packit 022b05
    if (description) {
Packit 022b05
	fprintSegment(f, indent, "<description>\n", 0);
Packit 022b05
	fprintMultilineString(f, indent, description);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, indent, "</description>\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintReference(FILE *f, int indent, const char *reference)
Packit 022b05
{
Packit 022b05
    if (reference) {
Packit 022b05
	fprintSegment(f, indent, "<reference>\n", 0);
Packit 022b05
	fprintMultilineString(f, indent, reference);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, indent, "</reference>\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintFormat(FILE *f, int indent, const char *format)
Packit 022b05
{
Packit 022b05
    if (format) {
Packit 022b05
	fprintSegment(f, indent, "", 0);
Packit 022b05
	fprint(f, "<format>%s</format>\n", format);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintUnits(FILE *f, int indent, const char *units)
Packit 022b05
{
Packit 022b05
    if (units) {
Packit 022b05
	fprintSegment(f, indent, "", 0);
Packit 022b05
	fprint(f, "<units>%s</units>\n", units);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintAccess(FILE *f, int indent, SmiAccess smiAccess)
Packit 022b05
{
Packit 022b05
    if (smiAccess != SMI_ACCESS_UNKNOWN) {
Packit 022b05
	fprintSegment(f, indent, "", 0);
Packit 022b05
	fprint(f, "<access>%s</access>\n", getAccessString(smiAccess));
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintElementList(FILE *f, int indent, const char *tag,
Packit 022b05
			      SmiElement *smiElement)
Packit 022b05
{
Packit 022b05
    SmiModule *smiModule;
Packit 022b05
    SmiNode   *smiNode;
Packit 022b05
Packit 022b05
    for (; smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	smiNode = smiGetElementNode(smiElement);
Packit 022b05
	smiModule = smiGetNodeModule(smiNode);
Packit 022b05
	fprintSegment(f, indent, "", 0);
Packit 022b05
	fprint(f, "<%s module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
	       tag, smiModule->name, smiNode->name);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintIndex(FILE *f, int indent, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode   *relatedNode;
Packit 022b05
    SmiModule *relatedModule = NULL;
Packit 022b05
Packit 022b05
    fprintSegment(f, indent, "
Packit 022b05
    if (smiNode->implied) {
Packit 022b05
	fprint(f, " implied=\"true\"");
Packit 022b05
    }
Packit 022b05
    fprint(f, ">\n");
Packit 022b05
Packit 022b05
    relatedNode = smiGetRelatedNode(smiNode);
Packit 022b05
    if (relatedNode) {
Packit 022b05
	relatedModule = smiGetNodeModule(relatedNode);
Packit 022b05
    }
Packit 022b05
    switch (smiNode->indexkind) {
Packit 022b05
    case SMI_INDEX_INDEX:
Packit 022b05
	fprintElementList(f, indent + INDENT, "index",
Packit 022b05
			  smiGetFirstElement(smiNode));
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_AUGMENT:
Packit 022b05
	if (relatedNode && relatedModule) {
Packit 022b05
	    fprintSegment(f, indent + INDENT, "", 0);
Packit 022b05
	    fprint(f, "<augments module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
		   relatedModule->name, relatedNode->name);
Packit 022b05
	} /* TODO: else print error */
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_REORDER:
Packit 022b05
	if (relatedNode && relatedModule) {
Packit 022b05
	    fprintSegment(f, indent + INDENT, "", 0);
Packit 022b05
	    fprint(f, "<reorders module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
		   relatedModule->name, relatedNode->name);
Packit 022b05
	    fprintElementList(f, indent + INDENT, "index",
Packit 022b05
			      smiGetFirstElement(smiNode));
Packit 022b05
	} /* TODO: else print error */
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_SPARSE:
Packit 022b05
	if (relatedNode && relatedModule) {
Packit 022b05
	    fprintSegment(f, indent + INDENT, "", 0);
Packit 022b05
	    fprint(f, "<sparse module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
		   relatedModule->name, relatedNode->name);
Packit 022b05
	} /* TODO: else print error */
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_EXPAND:
Packit 022b05
	if (relatedNode && relatedModule) {
Packit 022b05
	    fprintSegment(f, indent + INDENT, "", 0);
Packit 022b05
	    fprint(f, "<expands module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
		   relatedModule->name, relatedNode->name);
Packit 022b05
	    fprintElementList(f, indent + INDENT, "index",
Packit 022b05
			      smiGetFirstElement(smiNode));
Packit 022b05
	} /* TODO: else print error */
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_UNKNOWN:
Packit 022b05
	break;
Packit 022b05
    }
Packit 022b05
    fprintSegment(f, indent, "</linkage>\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintModule(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiRevision *smiRevision;
Packit 022b05
    SmiNode     *smiNode;
Packit 022b05
    int         i;
Packit 022b05
    char	*lang;
Packit 022b05
Packit 022b05
    lang = getStringLanguage(smiModule->language);
Packit 022b05
Packit 022b05
    fprintSegment(f, INDENT, "", 0);
Packit 022b05
    if (lang) {
Packit 022b05
	fprint(f, "<module name=\"%s\" language=\"%s\">\n",
Packit 022b05
	       smiModule->name, lang);
Packit 022b05
    } else {
Packit 022b05
	fprint(f, "<module name=\"%s\">\n", smiModule->name);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (smiModule->organization) {
Packit 022b05
	fprintSegment(f, 2 * INDENT, "<organization>", INDENTVALUE);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintMultilineString(f, 2 * INDENT, smiModule->organization);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, 2 * INDENT, "</organization>\n", 0);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (smiModule->contactinfo) {
Packit 022b05
	fprintSegment(f, 2 * INDENT, "<contact>", INDENTVALUE);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintMultilineString(f, 2 * INDENT, smiModule->contactinfo);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, 2 * INDENT, "</contact>\n", 0);
Packit 022b05
    }
Packit 022b05
    fprintDescription(f, 2 * INDENT, smiModule->description);
Packit 022b05
    fprintReference(f, 2 * INDENT, smiModule->reference);
Packit 022b05
Packit 022b05
    for(i = 0, smiRevision = smiGetFirstRevision(smiModule);
Packit 022b05
	smiRevision; smiRevision = smiGetNextRevision(smiRevision)) {
Packit 022b05
	fprintSegment(f, 2 * INDENT, "", 0);
Packit 022b05
	fprint(f, "<revision date=\"%s\">\n",
Packit 022b05
	       getTimeString(smiRevision->date));
Packit 022b05
	fprintDescription(f, 3 * INDENT, smiRevision->description);
Packit 022b05
        fprintSegment(f, 2 * INDENT, "</revision>\n", 0);
Packit 022b05
	i++;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    smiNode = smiGetModuleIdentityNode(smiModule);
Packit 022b05
    if (smiNode) {
Packit 022b05
	fprintSegment(f, 2 * INDENT, "", 0);
Packit 022b05
	fprint(f, "<identity node=\"%s\"/>\n", smiNode->name);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    fprintSegment(f, INDENT, "</module>\n\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintImport(FILE *f, int indent, SmiImport *smiImport)
Packit 022b05
{
Packit 022b05
    fprintSegment(f, indent, "", 0);
Packit 022b05
    fprint(f, "<import module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
	   smiImport->module, smiImport->name);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
    
Packit 022b05
static void fprintImports(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiImport *smiImport;
Packit 022b05
    int        i;
Packit 022b05
Packit 022b05
    for (i = 0, smiImport = smiGetFirstImport(smiModule);
Packit 022b05
	 smiImport;
Packit 022b05
	 i++, smiImport = smiGetNextImport(smiImport)) {
Packit 022b05
	if (i == 0) {
Packit 022b05
	    fprintSegment(f, INDENT, "<imports>\n", 0);
Packit 022b05
	}
Packit 022b05
	fprintImport(f, 2 * INDENT, smiImport);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, INDENT, "</imports>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintTypedef(FILE *f, int indent, SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiModule *parentModule;
Packit 022b05
    SmiType *parentType;
Packit 022b05
    
Packit 022b05
    fprintSegment(f, indent, "
Packit 022b05
    if (smiType->name) {
Packit 022b05
	fprint(f, " name=\"%s\"", smiType->name);
Packit 022b05
    }
Packit 022b05
    fprint(f, " basetype=\"%s\"", getStringBasetype(smiType->basetype));
Packit 022b05
    if (smiType->name && smiType->status != SMI_STATUS_UNKNOWN) {
Packit 022b05
	fprint(f, " status=\"%s\"", getStringStatus(smiType->status));
Packit 022b05
    }
Packit 022b05
    fprint(f, ">\n");
Packit 022b05
    
Packit 022b05
    parentType = smiGetParentType(smiType);
Packit 022b05
    parentModule = smiGetTypeModule(parentType);
Packit 022b05
    if (parentType && parentType->name &&
Packit 022b05
	parentModule && strlen(parentModule->name)) {
Packit 022b05
	fprintSegment(f, indent + INDENT, "
Packit 022b05
	fprintf(f, "module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
		parentModule->name, parentType->name);
Packit 022b05
    }
Packit 022b05
    fprintRanges(f, indent + INDENT, smiType);
Packit 022b05
    fprintNamedNumbers(f, indent + INDENT, smiType);
Packit 022b05
    fprintValue(f, indent + INDENT, &smiType->value, smiType);
Packit 022b05
    fprintFormat(f, indent + INDENT, smiType->format);
Packit 022b05
    fprintUnits(f, indent + INDENT, smiType->units);
Packit 022b05
    fprintDescription(f, indent + INDENT, smiType->description);
Packit 022b05
    fprintReference(f, indent + INDENT, smiType->reference);
Packit 022b05
    
Packit 022b05
    fprintSegment(f, indent, "</typedef>\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintTypedefs(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    int		 i;
Packit 022b05
    SmiType	 *smiType;
Packit 022b05
    
Packit 022b05
    for(i = 0, smiType = smiGetFirstType(smiModule);
Packit 022b05
	smiType;
Packit 022b05
	i++, smiType = smiGetNextType(smiType)) {
Packit 022b05
Packit 022b05
	if (i == 0) {
Packit 022b05
	    fprintSegment(f, INDENT, "<typedefs>\n", 0);
Packit 022b05
	}
Packit 022b05
	fprintTypedef(f, 2 * INDENT, smiType);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, INDENT, "</typedefs>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNode(FILE *f, int indent, SmiNode *smiNode,
Packit 022b05
		       SmiNode *lastSmiNode)
Packit 022b05
{
Packit 022b05
    SmiModule   *smiModule;
Packit 022b05
    SmiType     *smiType;
Packit 022b05
    char        *tag = NULL;
Packit 022b05
    
Packit 022b05
    if (smiNode->nodekind == SMI_NODEKIND_NODE) {
Packit 022b05
	tag = "node";
Packit 022b05
    } else if (smiNode->nodekind == SMI_NODEKIND_CAPABILITIES) {
Packit 022b05
	tag = "node";
Packit 022b05
    } else if (smiNode->nodekind == SMI_NODEKIND_TABLE) {
Packit 022b05
	tag = "table";
Packit 022b05
    } else if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit 022b05
	indent += INDENT;
Packit 022b05
	tag = "row";
Packit 022b05
    } else if (smiNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit 022b05
	indent += 2 * INDENT;
Packit 022b05
	tag = "column";
Packit 022b05
    } else if (smiNode->nodekind == SMI_NODEKIND_SCALAR) {
Packit 022b05
	tag = "scalar";
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (lastSmiNode
Packit 022b05
	&& lastSmiNode->nodekind == SMI_NODEKIND_COLUMN
Packit 022b05
	&& smiNode->nodekind != SMI_NODEKIND_COLUMN) {
Packit 022b05
	fprintNodeEndTag(f, indent + INDENT, "row");
Packit 022b05
        fprintNodeEndTag(f, indent, "table");
Packit 022b05
    }
Packit 022b05
Packit 022b05
    smiType = smiGetNodeType(smiNode);
Packit 022b05
    
Packit 022b05
    fprintNodeStartTag(f, indent, tag, smiNode);
Packit 022b05
    if (smiType && (smiType->basetype != SMI_BASETYPE_UNKNOWN)) {
Packit 022b05
	fprintSegment(f, indent + INDENT, "<syntax>\n", 0);
Packit 022b05
	smiModule = smiGetTypeModule(smiType);
Packit 022b05
	if (smiType->name && smiModule) {
Packit 022b05
	    fprintSegment(f, indent + 2 *INDENT, "", 0);
Packit 022b05
	    fprint(f, "
Packit 022b05
	    fprintf(f, "module=\"%s\" name=\"%s\"/>\n",
Packit 022b05
		    smiModule->name, smiType->name);
Packit 022b05
	} else {
Packit 022b05
	    fprintTypedef(f, indent + 2 * INDENT, smiType);
Packit 022b05
	}
Packit 022b05
	fprintSegment(f, indent + INDENT, "</syntax>\n", 0);
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
	fprintAccess(f, indent + INDENT, smiNode->access);
Packit 022b05
    }
Packit 022b05
    if (smiType) {
Packit 022b05
	fprintValue(f, indent + INDENT, &smiNode->value, smiType);
Packit 022b05
    }
Packit 022b05
    fprintFormat(f, indent + INDENT, smiNode->format);
Packit 022b05
    fprintUnits(f, indent + INDENT, smiNode->units);
Packit 022b05
    if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit 022b05
	fprintIndex(f, indent + INDENT, smiNode);
Packit 022b05
    }
Packit 022b05
    fprintDescription(f, indent + INDENT, smiNode->description);
Packit 022b05
    fprintReference(f, indent + INDENT, smiNode->reference);
Packit 022b05
Packit 022b05
    if (smiNode->nodekind != SMI_NODEKIND_ROW
Packit 022b05
	&& smiNode->nodekind != SMI_NODEKIND_TABLE) {
Packit 022b05
	fprintNodeEndTag(f, indent, tag);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNodes(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    int		 i;
Packit 022b05
    SmiNode	 *smiNode, *lastSmiNode;
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, lastSmiNode = NULL,
Packit 022b05
	     smiNode = smiGetFirstNode(smiModule, nodekinds);
Packit 022b05
	 smiNode;
Packit 022b05
	 i++, lastSmiNode = smiNode,
Packit 022b05
	     smiNode = smiGetNextNode(smiNode, nodekinds)) {
Packit 022b05
Packit 022b05
	if (i == 0) {
Packit 022b05
	    fprintSegment(f, INDENT, "<nodes>\n", 0);
Packit 022b05
	}
Packit 022b05
Packit 022b05
	fprintNode(f, 2 * INDENT, smiNode, lastSmiNode);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    if (lastSmiNode
Packit 022b05
	&& lastSmiNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit 022b05
	fprintNodeEndTag(f, 3 * INDENT, "row");
Packit 022b05
        fprintNodeEndTag(f, 2 * INDENT, "table");
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, INDENT, "</nodes>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNotification(FILE *f, int indent, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    fprintNodeStartTag(f, indent, "notification", smiNode);
Packit 022b05
Packit 022b05
    fprintSegment(f, indent + INDENT, "<objects>\n", 0);
Packit 022b05
    fprintElementList(f, indent + 2 * INDENT, "object",
Packit 022b05
		      smiGetFirstElement(smiNode));
Packit 022b05
    fprintSegment(f, indent + INDENT, "</objects>\n", 0);
Packit 022b05
    fprintDescription(f, indent + INDENT, smiNode->description);
Packit 022b05
    fprintReference(f, indent + INDENT, smiNode->reference);
Packit 022b05
    
Packit 022b05
    fprintNodeEndTag(f, indent, "notification");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNotifications(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
    int	     i;
Packit 022b05
    
Packit 022b05
    for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
Packit 022b05
	smiNode;
Packit 022b05
	i++, smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit 022b05
Packit 022b05
	if (i == 0) {
Packit 022b05
	    fprintSegment(f, INDENT, "<notifications>\n", 0);
Packit 022b05
	}
Packit 022b05
	fprintNotification(f, 2 * INDENT, smiNode);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, INDENT, "</notifications>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintGroup(FILE *f, int indent, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    fprintNodeStartTag(f, indent, "group", smiNode);
Packit 022b05
    
Packit 022b05
    fprintSegment(f, indent + INDENT, "<members>\n", 0);
Packit 022b05
    fprintElementList(f, indent + 2 * INDENT, "member",
Packit 022b05
		      smiGetFirstElement(smiNode));
Packit 022b05
    fprintSegment(f, indent + INDENT, "</members>\n", 0);
Packit 022b05
    fprintDescription(f, indent + INDENT, smiNode->description);
Packit 022b05
    fprintReference(f, indent + INDENT, smiNode->reference);
Packit 022b05
Packit 022b05
    fprintNodeEndTag(f, indent, "group");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintGroups(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
    int	     i;
Packit 022b05
    
Packit 022b05
    for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_GROUP);
Packit 022b05
	smiNode;
Packit 022b05
	i++, smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_GROUP)) {
Packit 022b05
Packit 022b05
	if (i == 0) {
Packit 022b05
	    fprintSegment(f, INDENT, "<groups>\n", 0);
Packit 022b05
	}
Packit 022b05
	fprintGroup(f, 2 * INDENT, smiNode);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, INDENT, "</groups>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintComplGroups(FILE *f, int indent, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode   *optSmiNode;
Packit 022b05
    SmiModule *optSmiModule;
Packit 022b05
    SmiOption *smiOption;
Packit 022b05
Packit 022b05
    if (! smiGetFirstElement(smiNode) && !smiGetFirstOption(smiNode)) {
Packit 022b05
	return;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    fprintSegment(f, indent, "<requires>\n", 0);
Packit 022b05
    fprintElementList(f, indent + INDENT, "mandatory",
Packit 022b05
		      smiGetFirstElement(smiNode));
Packit 022b05
Packit 022b05
    for(smiOption = smiGetFirstOption(smiNode);
Packit 022b05
	smiOption;
Packit 022b05
	smiOption = smiGetNextOption(smiOption)) {
Packit 022b05
	optSmiNode = smiGetOptionNode(smiOption);
Packit 022b05
	optSmiModule = smiGetNodeModule(optSmiNode);
Packit 022b05
	fprintSegment(f, indent + INDENT, "", 0);
Packit 022b05
	fprint(f, "<option module=\"%s\" name=\"%s\">\n",
Packit 022b05
	       optSmiModule->name, optSmiNode->name);
Packit 022b05
	fprintDescription(f, indent + 2 * INDENT, smiOption->description);
Packit 022b05
	fprintSegment(f, indent + INDENT, "</option>\n", 0);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    fprintSegment(f, indent, "</requires>\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintRefinement(FILE *f, int indent, SmiRefinement *smiRefinement)
Packit 022b05
{
Packit 022b05
    SmiModule *smiModule;
Packit 022b05
    SmiNode   *smiNode;
Packit 022b05
    SmiType   *smiType;
Packit 022b05
Packit 022b05
    smiNode = smiGetRefinementNode(smiRefinement);
Packit 022b05
    smiModule = smiGetNodeModule(smiNode);
Packit 022b05
Packit 022b05
    fprintSegment(f, indent, "
Packit 022b05
    fprintf(f, "module=\"%s\" name=\"%s\">\n", smiModule->name, smiNode->name);
Packit 022b05
Packit 022b05
    smiType = smiGetRefinementType(smiRefinement);
Packit 022b05
    if (smiType) {
Packit 022b05
	fprintSegment(f, indent + INDENT, "<syntax>\n", 0);
Packit 022b05
	fprintTypedef(f, indent + 2 * INDENT, smiType);
Packit 022b05
	fprintSegment(f, indent + INDENT, "</syntax>\n", 0);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    smiType = smiGetRefinementWriteType(smiRefinement);
Packit 022b05
    if (smiType) {
Packit 022b05
	fprintSegment(f, indent + INDENT, "<writesyntax>\n", 0);
Packit 022b05
	fprintTypedef(f, indent + 2 * INDENT, smiType);
Packit 022b05
	fprintSegment(f, indent + INDENT, "</writesyntax>\n", 0);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (smiRefinement->access != SMI_ACCESS_UNKNOWN) {
Packit 022b05
	fprintAccess(f, indent + INDENT, smiRefinement->access);
Packit 022b05
    }
Packit 022b05
    fprintDescription(f, indent + INDENT, smiRefinement->description);
Packit 022b05
    fprintSegment(f, indent, "</refinement>\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintRefinements(FILE *f, int indent, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiRefinement *smiRefinement;
Packit 022b05
    int            i;
Packit 022b05
Packit 022b05
    for(i = 0, smiRefinement = smiGetFirstRefinement(smiNode);
Packit 022b05
	smiRefinement;
Packit 022b05
	i++, smiRefinement = smiGetNextRefinement(smiRefinement)) {
Packit 022b05
Packit 022b05
    	if (!i) {
Packit 022b05
	    fprintSegment(f, indent, "<refinements>\n", 0);
Packit 022b05
	}
Packit 022b05
Packit 022b05
	fprintRefinement(f, indent + INDENT, smiRefinement);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, indent, "</refinements>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintCompliance(FILE *f, int indent, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    fprintNodeStartTag(f, indent, "compliance", smiNode);
Packit 022b05
Packit 022b05
    fprintDescription(f, indent + INDENT, smiNode->description);
Packit 022b05
    fprintReference(f, indent + INDENT, smiNode->reference);
Packit 022b05
    fprintComplGroups(f, indent + INDENT, smiNode);
Packit 022b05
    fprintRefinements(f, indent + INDENT, smiNode);
Packit 022b05
Packit 022b05
    fprintNodeEndTag(f, indent, "compliance");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintCompliances(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
    int      i;
Packit 022b05
Packit 022b05
    for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
Packit 022b05
	smiNode;
Packit 022b05
	i++, smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
Packit 022b05
	
Packit 022b05
	if (!i) {
Packit 022b05
	    fprintSegment(f, INDENT, "<compliances>\n", 0);
Packit 022b05
	}
Packit 022b05
Packit 022b05
	fprintCompliance(f, 2 * INDENT, smiNode);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (i) {
Packit 022b05
	fprintSegment(f, INDENT, "</compliances>\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void dumpXml(int modc, SmiModule **modv, int flags, char *output)
Packit 022b05
{
Packit 022b05
    int  i;
Packit 022b05
    FILE *f = stdout;
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
	fprint(f, "\n");
Packit 022b05
	if (!disabledoctype) {
Packit 022b05
	    fprint(f, "\n");
Packit 022b05
	}
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprint(f, "
Packit 022b05
	       SMI_VERSION_STRING ". Do not edit. -->\n");
Packit 022b05
	fprint(f, "\n");
Packit 022b05
Packit 022b05
	if (!disableschema) {
Packit 022b05
	    fprint(f, "
Packit 022b05
	    fprint(f, "     xsi:noNamespaceSchemaLocation=\"http://www.ibr.cs.tu-bs.de/projects/nmrg/smi.xsd\">\n");
Packit 022b05
	} else {
Packit 022b05
	    fprint(f, "<smi>\n");
Packit 022b05
	}
Packit 022b05
	
Packit 022b05
	fprintModule(f, modv[i]);
Packit 022b05
	fprintImports(f, modv[i]);
Packit 022b05
	fprintTypedefs(f, modv[i]);
Packit 022b05
	fprintNodes(f, modv[i]);
Packit 022b05
	fprintNotifications(f, modv[i]);
Packit 022b05
	fprintGroups(f, modv[i]);
Packit 022b05
	fprintCompliances(f, modv[i]);
Packit 022b05
	
Packit 022b05
	fprint(f, "</smi>\n");
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 initXml()
Packit 022b05
{
Packit 022b05
    
Packit 022b05
    static SmidumpDriverOption opt[] = {
Packit 022b05
	{ "no-schema", OPT_FLAG, &disableschema, 0,
Packit 022b05
	  "disable XML Schema spec in the toplevel element"},
Packit 022b05
	{ "no-doctype", OPT_FLAG, &disabledoctype, 0,
Packit 022b05
	  "disable DOCTYPE spec in the XML prolog"},
Packit 022b05
        { 0, OPT_END, 0, 0 }
Packit 022b05
    };
Packit 022b05
Packit 022b05
    static SmidumpDriver driver = {
Packit 022b05
	"xml",
Packit 022b05
	dumpXml,
Packit 022b05
	0,
Packit 022b05
	SMIDUMP_DRIVER_CANT_UNITE,
Packit 022b05
	"intermediate SMI XML exchange format",
Packit 022b05
	opt,
Packit 022b05
	NULL
Packit 022b05
    };
Packit 022b05
    
Packit 022b05
    smidumpRegisterDriver(&driver);
Packit 022b05
}