|
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 |
}
|