Blame tools/dump-corba.c

Packit 022b05
/*
Packit 022b05
 * dump-corba.c --
Packit 022b05
 *
Packit 022b05
 *      Operations to dump CORBA IDL and OID definitions. This is based
Packit 022b05
 *	on the JIDM Specification Translation developed by the JIDM task
Packit 022b05
 *	force, published as Open Group <URL:http://www.opengroup.org/>
Packit 022b05
 *	document C802 (ISBN 1-85912-256-6, January 2000).
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit 022b05
 * Copyright (c) 1999 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-corba.c 8090 2008-04-18 12:56:29Z strauss $
Packit 022b05
 */
Packit 022b05
Packit 022b05
#include <config.h>
Packit 022b05
Packit 022b05
#include <stdlib.h>
Packit 022b05
#include <stdio.h>
Packit 022b05
#include <stdarg.h>
Packit 022b05
#include <string.h>
Packit 022b05
#include <ctype.h>
Packit 022b05
#include <time.h>
Packit 022b05
#ifdef HAVE_UNISTD_H
Packit 022b05
#include <unistd.h>
Packit 022b05
#endif
Packit 022b05
#ifdef HAVE_WIN_H
Packit 022b05
#include "win.h"
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#include "smi.h"
Packit 022b05
#include "smidump.h"
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
#define  INDENT		4    /* indent factor */
Packit 022b05
#define  INDENTVALUE	20   /* column to start values, except multiline */
Packit 022b05
#define  INDENTTEXTS	13   /* column to start multiline texts */
Packit 022b05
#define  INDENTMAX	72   /* max column to fill, break lines otherwise */
Packit 022b05
Packit 022b05
Packit 022b05
static int current_column = 0;
Packit 022b05
Packit 022b05
static int silent = 0;
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * The following list of IDL keywords is taken from the CORBA
Packit 022b05
 * 2.3.1 IDL specification section 3.2.4 (October 1999).
Packit 022b05
 */
Packit 022b05
Packit 022b05
Packit 022b05
static char *idlKeywords[] = {
Packit 022b05
    "abstract",
Packit 022b05
    "any",		"attribute",	"boolean",	"case",
Packit 022b05
    "char",		"const",	"context",	"custom",
Packit 022b05
    "default",		"double",	"enum",		"exception",
Packit 022b05
    "factory",		"FALSE",	"fixed",	"float",
Packit 022b05
    "in",		"inout",	"interface",	"long",
Packit 022b05
    "module",		"native",	"object",	"octet",
Packit 022b05
    "oneway",		"out",		"private",	"public",
Packit 022b05
    "raises",		"readonly",	"sequence",	"short",
Packit 022b05
    "string",		"struct",	"supports",	"switch",
Packit 022b05
    "TRUE",		"truncatable",	"typedef",	"unsigned",
Packit 022b05
    "union",		"valuebase",	"valuetype",	"void",
Packit 022b05
    "wchar",		"wstring",	NULL
Packit 022b05
};
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Structure used to build a list of imported types.
Packit 022b05
 */
Packit 022b05
Packit 022b05
Packit 022b05
typedef struct Import {
Packit 022b05
    char          *module;
Packit 022b05
    char          *name;
Packit 022b05
    struct Import *nextPtr;
Packit 022b05
} Import;
Packit 022b05
Packit 022b05
static Import *importList = NULL;
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Structure used to build dictionaries that translate names
Packit 022b05
 * into IDL names following the generic JIDM rules.
Packit 022b05
 */
Packit 022b05
Packit 022b05
Packit 022b05
typedef struct IdlEntry {
Packit 022b05
    char            *module;
Packit 022b05
    char            *name;
Packit 022b05
    char            *idlname;
Packit 022b05
    struct IdlEntry *nextPtr;
Packit 022b05
} IdlEntry;
Packit 022b05
Packit 022b05
static IdlEntry *idlModuleNameList = NULL;
Packit 022b05
static IdlEntry *idlNodeNameList = NULL;
Packit 022b05
static IdlEntry *idlTypeNameList = NULL;
Packit 022b05
static IdlEntry *idlVBTypeNameList = NULL;
Packit 022b05
Packit 022b05
static IdlEntry **idlNameLists[] = {
Packit 022b05
    &idlModuleNameList, &idlNodeNameList,
Packit 022b05
    &idlTypeNameList, &idlVBTypeNameList,
Packit 022b05
    NULL
Packit 022b05
};
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static FILE * createFile(char *name, char *suffix)
Packit 022b05
{
Packit 022b05
    char *fullname;
Packit 022b05
    FILE *f;
Packit 022b05
Packit 022b05
    fullname = xmalloc(strlen(name) + (suffix ? strlen(suffix) : 0) + 2);
Packit 022b05
    strcpy(fullname, name);
Packit 022b05
    if (suffix) {
Packit 022b05
        strcat(fullname, suffix);
Packit 022b05
    }
Packit 022b05
    if (!access(fullname, R_OK)) {
Packit 022b05
        fprintf(stderr, "smidump: %s already exists\n", fullname);
Packit 022b05
        xfree(fullname);
Packit 022b05
        return NULL;
Packit 022b05
    }
Packit 022b05
    f = fopen(fullname, "w");
Packit 022b05
    if (!f) {
Packit 022b05
        fprintf(stderr, "smidump: cannot open %s for writing: ", fullname);
Packit 022b05
        perror(NULL);
Packit 022b05
        xfree(fullname);
Packit 022b05
        exit(1);
Packit 022b05
    }
Packit 022b05
    xfree(fullname);
Packit 022b05
    return f;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char* dictFindName(IdlEntry *list, char *module, char* name)
Packit 022b05
{
Packit 022b05
    IdlEntry *p;
Packit 022b05
Packit 022b05
    for (p = list; p; p = p->nextPtr) {
Packit 022b05
	if (! strcasecmp(p->module, module)
Packit 022b05
	    && ((! p->name && ! name) || ! strcasecmp(p->name, name))) {
Packit 022b05
	    return p->idlname;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char* dictAddName(IdlEntry **listPtr, char *module, char *name)
Packit 022b05
{
Packit 022b05
    IdlEntry *p;
Packit 022b05
    char *s, *idl;
Packit 022b05
    int i;
Packit 022b05
Packit 022b05
    /*
Packit 022b05
     * Create a new IDL identifier by translating hyphens
Packit 022b05
     * to underscores.
Packit 022b05
     */
Packit 022b05
Packit 022b05
    s = name ? name : module;
Packit 022b05
    idl = xmalloc(strlen(s) + 1);
Packit 022b05
    for (i = 0; s[i]; i++) {
Packit 022b05
	idl[i] = (s[i] == '-') ? '_' : s[i];
Packit 022b05
    }
Packit 022b05
    idl[i] = 0;
Packit 022b05
Packit 022b05
    /*
Packit 022b05
     * Check for any collisions with IDL keywords or previously
Packit 022b05
     * created IDL identifiers.
Packit 022b05
     */
Packit 022b05
Packit 022b05
    for (i = 0; idlKeywords[i]; i++) {
Packit 022b05
	if (! strcasecmp(idlKeywords[i], idl)) {
Packit 022b05
	    fprintf(stderr, "smidump: "
Packit 022b05
		    "`%s' (%s%s%s) collides with IDL keyword `%s'\n",
Packit 022b05
		    idl, module, name ? "::" : "", name ? name : "",
Packit 022b05
		    idlKeywords[i]);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (i = 0; idlNameLists[i]; i++) {
Packit 022b05
	IdlEntry *list = *(idlNameLists[i]);
Packit 022b05
	for (p = list; p; p = p->nextPtr) {
Packit 022b05
	    if (! strcasecmp(p->idlname, idl)) {
Packit 022b05
		fprintf(stderr, "smidump: "
Packit 022b05
			"`%s' (%s%s%s) collides with `%s' (%s%s%s)\n",
Packit 022b05
			idl, module,
Packit 022b05
			name ? "::" : "", name ? name : "",
Packit 022b05
			p->idlname, p->module,
Packit 022b05
			p->name ? "::" : "", p->name ? p->name : "");
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    /*
Packit 022b05
     * Safe the translated identifier in the dictionary.
Packit 022b05
     */
Packit 022b05
    
Packit 022b05
    p = xmalloc(sizeof(IdlEntry));
Packit 022b05
    p->module = xstrdup(module);
Packit 022b05
    p->name = name ? xstrdup(name) : NULL;
Packit 022b05
    p->idlname = idl;
Packit 022b05
    p->nextPtr = *listPtr;
Packit 022b05
    *listPtr = p;
Packit 022b05
Packit 022b05
    return idl;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void dictFree(IdlEntry **list)
Packit 022b05
{
Packit 022b05
    IdlEntry *p, *q;
Packit 022b05
Packit 022b05
    for (p = *list; p; ) {
Packit 022b05
	q = p;
Packit 022b05
	p = p->nextPtr;
Packit 022b05
	xfree(q->module);
Packit 022b05
	if (q->name) xfree(q->name);
Packit 022b05
	xfree(q->idlname);
Packit 022b05
	xfree(q);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    *list = NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char* getIdlModuleName(char *module)
Packit 022b05
{
Packit 022b05
    char *s;
Packit 022b05
Packit 022b05
    s = dictFindName(idlModuleNameList, module, NULL);
Packit 022b05
    if (! s) {
Packit 022b05
	s = dictAddName(&idlModuleNameList, module, NULL);
Packit 022b05
    }
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *getIdlNodeName(char *module, char *name)
Packit 022b05
{
Packit 022b05
    char *s;
Packit 022b05
    s = dictFindName(idlNodeNameList, module, name);
Packit 022b05
    if (! s) {
Packit 022b05
	s = dictAddName(&idlNodeNameList, module, name);
Packit 022b05
    }
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char* getIdlTypeName(char *module, char *name)
Packit 022b05
{
Packit 022b05
    char *s, *type_name;
Packit 022b05
Packit 022b05
    type_name = xmalloc(strlen(name) + 10);
Packit 022b05
    sprintf(type_name, "%sType", name);
Packit 022b05
    type_name[0] = toupper((int) type_name[0]);
Packit 022b05
Packit 022b05
    s = dictFindName(idlTypeNameList, module, type_name);
Packit 022b05
    if (! s) {
Packit 022b05
	s = dictAddName(&idlTypeNameList, module, type_name);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    xfree(type_name);
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char* getIdlVBTypeName(char *module, char *name, int *isnew)
Packit 022b05
{
Packit 022b05
    char *s, *vbTypeName;
Packit 022b05
Packit 022b05
    vbTypeName = xmalloc(strlen(name) + 10);
Packit 022b05
    sprintf(vbTypeName, "%sVBType", name);
Packit 022b05
    vbTypeName[0] = toupper((int) vbTypeName[0]);
Packit 022b05
Packit 022b05
    if (isnew) {
Packit 022b05
	*isnew = 0;
Packit 022b05
    }
Packit 022b05
    s = dictFindName(idlVBTypeNameList, module, vbTypeName);
Packit 022b05
    if (! s) {
Packit 022b05
	if (isnew) {
Packit 022b05
	    *isnew = 1;
Packit 022b05
	}
Packit 022b05
	s = dictAddName(&idlVBTypeNameList, module, vbTypeName);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    xfree(vbTypeName);
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static int current(SmiStatus status)
Packit 022b05
{
Packit 022b05
    switch (status) {
Packit 022b05
    case SMI_STATUS_CURRENT:
Packit 022b05
    case SMI_STATUS_UNKNOWN:
Packit 022b05
    case SMI_STATUS_MANDATORY:
Packit 022b05
    case SMI_STATUS_OPTIONAL:
Packit 022b05
	return 1;
Packit 022b05
    default:
Packit 022b05
	return 0;
Packit 022b05
    }
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%02dZ",
Packit 022b05
		tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
Packit 022b05
		tm->tm_hour, tm->tm_min);
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *getAccessString(SmiAccess access, int create)
Packit 022b05
{
Packit 022b05
    if (create && (access == SMI_ACCESS_READ_WRITE)) {
Packit 022b05
	return "read-create";
Packit 022b05
    } else {
Packit 022b05
	return
Packit 022b05
	    (access == SMI_ACCESS_NOT_ACCESSIBLE) ? "not-accessible" :
Packit 022b05
	    (access == SMI_ACCESS_NOTIFY)         ? "accessible-for-notify" :
Packit 022b05
	    (access == SMI_ACCESS_READ_ONLY)      ? "read-only" :
Packit 022b05
	    (access == SMI_ACCESS_READ_WRITE)     ? "read-write" :
Packit 022b05
					            "<unknown>";
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *getBaseTypeString(SmiBasetype basetype)
Packit 022b05
{
Packit 022b05
    switch(basetype) {
Packit 022b05
    case SMI_BASETYPE_UNKNOWN:
Packit 022b05
	return "ASN1_Null";
Packit 022b05
    case SMI_BASETYPE_POINTER:
Packit 022b05
	return "ASN1_Null";
Packit 022b05
    case SMI_BASETYPE_INTEGER32:
Packit 022b05
    case SMI_BASETYPE_ENUM:
Packit 022b05
	return "ASN1_Integer";
Packit 022b05
    case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
    case SMI_BASETYPE_BITS:
Packit 022b05
	return "ASN1_OctetString";
Packit 022b05
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
	return "ASN1_ObjectIdentifier";
Packit 022b05
    case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
	return "ASN1_Unsigned";
Packit 022b05
    case SMI_BASETYPE_INTEGER64:
Packit 022b05
	return "ASN1_Integer64";
Packit 022b05
    case SMI_BASETYPE_UNSIGNED64:
Packit 022b05
	return "ASN1_Unsigned64";
Packit 022b05
    case SMI_BASETYPE_FLOAT32:
Packit 022b05
    case SMI_BASETYPE_FLOAT64:
Packit 022b05
    case SMI_BASETYPE_FLOAT128:
Packit 022b05
	return "ASN1_Real";
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
static char *getIdlAnyTypeName(SmiNode *smiNode, SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiModule *smiModule;
Packit 022b05
    char *typeName;
Packit 022b05
Packit 022b05
    if (! smiType->name) {
Packit 022b05
	smiModule = smiGetNodeModule(smiNode);
Packit 022b05
	if (smiModule && strlen(smiModule->name)) {
Packit 022b05
	    typeName = getIdlTypeName(smiModule->name, smiNode->name);
Packit 022b05
	} else {
Packit 022b05
	    typeName = getBaseTypeString(smiType->basetype);
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	smiModule = smiGetTypeModule(smiType);
Packit 022b05
	if (smiModule && strlen(smiModule->name)) {
Packit 022b05
	    typeName = getIdlTypeName(smiModule->name, smiType->name);
Packit 022b05
	} else {
Packit 022b05
	    typeName = getBaseTypeString(smiType->basetype);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return typeName;
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
    SmiNode        *nodePtr;
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, "'%*s'H", 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[1+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
		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
		    if (n)
Packit 022b05
			sprintf(&s[strlen(s)], ", ");
Packit 022b05
		    n++;
Packit 022b05
		    sprintf(&s[strlen(s)], "%s", nn->name);
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
	/* TODO */
Packit 022b05
	nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
Packit 022b05
	if (nodePtr) {
Packit 022b05
	    sprintf(s, "%s", nodePtr->name);
Packit 022b05
	} else {
Packit 022b05
	    strcpy(s, "{");
Packit 022b05
	    for (i=0; i < valuePtr->len; i++) {
Packit 022b05
		if (i) strcat(s, " ");
Packit 022b05
		sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
Packit 022b05
	    }
Packit 022b05
	    strcat(s, "}");
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static Import* addImport(char *module, char *name)
Packit 022b05
{
Packit 022b05
    Import **import, *newImport;
Packit 022b05
    
Packit 022b05
    for (import = &importList; *import; import = &(*import)->nextPtr) {
Packit 022b05
	int c = strcmp((*import)->module, module);
Packit 022b05
	if (c < 0) continue;
Packit 022b05
	if (c == 0) {
Packit 022b05
	    int d = strcmp((*import)->name, name);
Packit 022b05
	    if (d < 0) continue;
Packit 022b05
	    if (d == 0) return *import;
Packit 022b05
	    if (d > 0) break;
Packit 022b05
	}
Packit 022b05
	if (c > 0) break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    newImport = xmalloc(sizeof(Import));
Packit 022b05
    newImport->module = module;
Packit 022b05
    newImport->name = name;
Packit 022b05
    newImport->nextPtr = *import;
Packit 022b05
    *import = newImport;
Packit 022b05
	
Packit 022b05
    return *import;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void createImportList(SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode     *smiNode;
Packit 022b05
    SmiType     *smiType;
Packit 022b05
    SmiModule   *smiTypeModule;
Packit 022b05
    SmiElement  *smiElement;
Packit 022b05
    SmiNode     *smiNodeIndex;
Packit 022b05
    SmiNodekind kind = SMI_NODEKIND_SCALAR
Packit 022b05
	 | SMI_NODEKIND_COLUMN | SMI_NODEKIND_ROW;
Packit 022b05
    
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, kind);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, kind)) {
Packit 022b05
Packit 022b05
	 switch (smiNode->nodekind) {
Packit 022b05
	 case SMI_NODEKIND_ROW:
Packit 022b05
	      for (smiElement = smiGetFirstElement(smiNode); smiElement;
Packit 022b05
		   smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
		   smiNodeIndex = smiGetElementNode(smiElement);
Packit 022b05
		  smiType = smiGetNodeType(smiNodeIndex);
Packit 022b05
		  if (smiType) {
Packit 022b05
		      smiTypeModule = smiGetTypeModule(smiType);
Packit 022b05
		      if (smiTypeModule &&
Packit 022b05
			  strcmp(smiTypeModule->name, smiModule->name)) {
Packit 022b05
			  if (strlen(smiTypeModule->name)) {
Packit 022b05
			      addImport(smiTypeModule->name, smiType->name);
Packit 022b05
			  }
Packit 022b05
		      }
Packit 022b05
		      if (smiType->basetype == SMI_BASETYPE_INTEGER32) {
Packit 022b05
			   addImport("SNMPv2-SMI", "Integer32");
Packit 022b05
		      }
Packit 022b05
		  }
Packit 022b05
	      }
Packit 022b05
	      break;
Packit 022b05
	 case SMI_NODEKIND_SCALAR:
Packit 022b05
	 case SMI_NODEKIND_COLUMN:
Packit 022b05
	      smiType = smiGetNodeType(smiNode);
Packit 022b05
	      if (smiType) {
Packit 022b05
		   smiTypeModule = smiGetTypeModule(smiType);
Packit 022b05
		   if (smiTypeModule &&
Packit 022b05
		       strcmp(smiTypeModule->name, smiModule->name)) {
Packit 022b05
			if (strlen(smiTypeModule->name)) {
Packit 022b05
			     addImport(smiTypeModule->name, smiType->name);
Packit 022b05
			}
Packit 022b05
		   }
Packit 022b05
		   if (smiType->basetype == SMI_BASETYPE_INTEGER32) {
Packit 022b05
			addImport("SNMPv2-SMI", "Integer32");
Packit 022b05
		   }
Packit 022b05
	      }
Packit 022b05
	      break;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void freeImportList(void)
Packit 022b05
{
Packit 022b05
    Import *import, *freeme;
Packit 022b05
Packit 022b05
    for (import = importList; import; ) {
Packit 022b05
	freeme = import;
Packit 022b05
	import = import->nextPtr;
Packit 022b05
	xfree(freeme);
Packit 022b05
    }
Packit 022b05
    importList = NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprint(FILE *f, char *fmt, ...)
Packit 022b05
{
Packit 022b05
    va_list ap;
Packit 022b05
    char    *s;
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, const char *s)
Packit 022b05
{
Packit 022b05
    int i, len;
Packit 022b05
    
Packit 022b05
    fprintSegment(f, INDENTTEXTS - 1, "\"", 0);
Packit 022b05
    if (s) {
Packit 022b05
	len = strlen(s);
Packit 022b05
	for (i=0; i < len; i++) {
Packit 022b05
	    putc(s[i], f);
Packit 022b05
	    current_column++;
Packit 022b05
	    if (s[i] == '\n') {
Packit 022b05
		current_column = 0;
Packit 022b05
		fprintSegment(f, INDENTTEXTS, "", 0);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    putc('\"', f);
Packit 022b05
    current_column++;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintMultiline(FILE *f, const char *s)
Packit 022b05
{
Packit 022b05
    int i, len;
Packit 022b05
    
Packit 022b05
    fprintSegment(f, INDENTTEXTS, "", 0);
Packit 022b05
    if (s) {
Packit 022b05
	len = strlen(s);
Packit 022b05
	for (i=0; i < len; i++) {
Packit 022b05
	    putc(s[i], f);
Packit 022b05
	    current_column++;
Packit 022b05
	    if (s[i] == '\n') {
Packit 022b05
		current_column = 0;
Packit 022b05
		fprintSegment(f, INDENTTEXTS, "", 0);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    putc('\n', f);
Packit 022b05
    current_column++;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *
Packit 022b05
getStringTime(time_t t)
Packit 022b05
{
Packit 022b05
    static char   s[27];
Packit 022b05
    struct tm	  *tm;
Packit 022b05
Packit 022b05
    tm = gmtime(&t);
Packit 022b05
    sprintf(s, "%04d-%02d-%02d %02d:%02d",
Packit 022b05
	    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
Packit 022b05
	    tm->tm_hour, tm->tm_min);
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void
Packit 022b05
fprintCommentString(FILE *f, char *s)
Packit 022b05
{
Packit 022b05
    int i, len;
Packit 022b05
Packit 022b05
    if (s) {
Packit 022b05
	fprintf(f, " *   ");
Packit 022b05
	len = strlen(s);
Packit 022b05
	for (i = 0; i < len; i++) {
Packit 022b05
	    fputc(s[i], f);
Packit 022b05
	    if (s[i] == '\n') {
Packit 022b05
		fprintf(f, " *   ");
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	fputc('\n', f);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char* translate(char *s)
Packit 022b05
{
Packit 022b05
    int i;
Packit 022b05
    
Packit 022b05
    s = xstrdup(s);
Packit 022b05
    for (i = 0; s[i]; i++) {
Packit 022b05
	if (s[i] == '-') s[i] = '_';
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static int isGroup(SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    
Packit 022b05
    for (childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	 childNode;
Packit 022b05
	 childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	if ((childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
	     || childNode->nodekind == SMI_NODEKIND_TABLE)
Packit 022b05
	    && current(childNode->status)) {
Packit 022b05
	    return 1;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return 0;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static int isCreatable(SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    
Packit 022b05
    if ((isGroup(smiNode) || smiNode->nodekind == SMI_NODEKIND_ROW)
Packit 022b05
	&& current(smiNode->status)) {
Packit 022b05
Packit 022b05
	for (childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	     childNode;
Packit 022b05
	     childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	    
Packit 022b05
	    if ((childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
		 || childNode->nodekind == SMI_NODEKIND_COLUMN)
Packit 022b05
		&& current(childNode->status)
Packit 022b05
		&& childNode->access == SMI_ACCESS_READ_WRITE) {
Packit 022b05
		return 1;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return 0;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintDescription(FILE *f, SmiNode *smiNode, int indent)
Packit 022b05
{
Packit 022b05
    fprint(f, "\n");
Packit 022b05
    fprintSegment(f, indent, "/*\n", 0);
Packit 022b05
    if (smiNode->description) {
Packit 022b05
	fprintMultiline(f, smiNode->description);
Packit 022b05
    }
Packit 022b05
    if (smiNode->reference) {
Packit 022b05
	fprintSegment(f, indent, "REFERENCE:", 0);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintMultilineString(f, smiNode->reference);
Packit 022b05
	fprint(f, "\n\n");
Packit 022b05
    }
Packit 022b05
    if (smiNode->units) {
Packit 022b05
	fprintSegment(f, indent, "UNITS:", 0);
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintMultilineString(f, smiNode->units);
Packit 022b05
	fprint(f, "\n\n");
Packit 022b05
    }
Packit 022b05
    fprintSegment(f, indent, "*/\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintIndex(FILE *f, SmiNode *indexNode)
Packit 022b05
{
Packit 022b05
    SmiElement *smiElement;
Packit 022b05
    int        j;
Packit 022b05
Packit 022b05
    for (j = 0, smiElement = smiGetFirstElement(indexNode);
Packit 022b05
	 smiElement;
Packit 022b05
	 j++, smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	if (j) {
Packit 022b05
	    fprint(f, " ");
Packit 022b05
	}
Packit 022b05
	fprint(f, smiGetElementNode(smiElement)->name);
Packit 022b05
	/* TODO: non-local name if non-local */
Packit 022b05
    } /* TODO: empty? -> print error */
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintIncludes(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    Import    *import;
Packit 022b05
    char      *lastModulename = NULL;
Packit 022b05
    
Packit 022b05
    fprint(f, "#include <ASN1Types.idl>\n");
Packit 022b05
    fprint(f, "#include <SNMPMgmt.idl>\n");
Packit 022b05
Packit 022b05
    for (import = importList; import; import = import->nextPtr) {
Packit 022b05
	if (!lastModulename
Packit 022b05
	    || strcmp(lastModulename, import->module)) {
Packit 022b05
	    fprint(f, "#include <%s.idl>\n",
Packit 022b05
		  getIdlModuleName(import->module));
Packit 022b05
	    lastModulename = import->module;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    fprint(f, "\n");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintImportedTypedefs(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    Import    *import;
Packit 022b05
    int	      cnt = 0;
Packit 022b05
    char      *idlTypeName;
Packit 022b05
Packit 022b05
    for (import = importList; import; import = import->nextPtr) {
Packit 022b05
	cnt++;
Packit 022b05
	idlTypeName = getIdlTypeName(import->module, import->name);
Packit 022b05
	fprintSegment(f, INDENT, "typedef ", 0);
Packit 022b05
	fprint(f, "%s::%s %s;\n",
Packit 022b05
	      getIdlModuleName(import->module), idlTypeName, idlTypeName);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (cnt) {
Packit 022b05
	fprint(f, "\n");
Packit 022b05
    }
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
    char         *idlModuleName;
Packit 022b05
Packit 022b05
    smiNode = smiGetModuleIdentityNode(smiModule);
Packit 022b05
Packit 022b05
    if (smiNode) {
Packit 022b05
Packit 022b05
	idlModuleName = getIdlModuleName(smiModule->name);
Packit 022b05
	fprintSegment(f, INDENT, "const ", 0);
Packit 022b05
	fprint(f, "string moduleIdentity = \"%s\";\n", smiNode->name);
Packit 022b05
	fprintSegment(f, INDENT, "const ", 0);
Packit 022b05
	fprint(f, "ASN1_ObjectIdentifier %s = \"::%s::%s\";\n\n",
Packit 022b05
	      getIdlModuleName(smiNode->name),
Packit 022b05
	      idlModuleName, smiNode->name);
Packit 022b05
	if (! silent) {
Packit 022b05
	    fprintSegment(f, INDENT, "/*\n", 0);
Packit 022b05
	    if (smiModule->description) {
Packit 022b05
		fprintMultiline(f, smiModule->description);
Packit 022b05
		fprint(f, "\n");
Packit 022b05
	    }
Packit 022b05
	    smiRevision = smiGetFirstRevision(smiModule);
Packit 022b05
	    fprintSegment(f, INDENT, "LAST-UPDATED:", INDENTVALUE);
Packit 022b05
	    fprint(f, smiRevision
Packit 022b05
		  ? getTimeString(smiRevision->date) : "197001010000Z");
Packit 022b05
	    fprint(f, "\n\n");
Packit 022b05
	    fprintSegment(f, INDENT, "ORGANIZATION:", 0);
Packit 022b05
	    fprint(f, "\n");
Packit 022b05
	    fprintMultilineString(f, smiModule->organization);
Packit 022b05
	    fprint(f, "\n\n");
Packit 022b05
	    fprintSegment(f, INDENT, "CONTACT-INFO:", 0);
Packit 022b05
	    fprint(f, "\n");
Packit 022b05
	    fprintMultilineString(f, smiModule->contactinfo);
Packit 022b05
	    fprint(f, "\n\n");
Packit 022b05
	    for (; smiRevision;
Packit 022b05
		 smiRevision = smiGetNextRevision(smiRevision)) {
Packit 022b05
		if (! smiRevision->description ||
Packit 022b05
		    strcmp(smiRevision->description,
Packit 022b05
			   "[Revision added by libsmi due to a LAST-UPDATED clause.]")) {
Packit 022b05
		    fprintSegment(f, INDENT, "REVISION:", INDENTVALUE);
Packit 022b05
		    fprint(f, "\"%s\"\n", getTimeString(smiRevision->date));
Packit 022b05
		    fprintSegment(f, INDENT, "REVISION-DESCRIPTION:", 0);
Packit 022b05
		    fprint(f, "\n");
Packit 022b05
		    if (smiRevision->description) {
Packit 022b05
			fprintMultilineString(f, smiRevision->description);
Packit 022b05
		    } else {
Packit 022b05
			fprintMultilineString(f, "...");
Packit 022b05
		    }
Packit 022b05
		    fprint(f, "\n\n");
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, INDENT, "*/", 0);
Packit 022b05
	    fprint(f, "\n\n");
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintType(FILE *f, SmiNode *smiNode, SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiNamedNumber *nn;
Packit 022b05
    char           *idlTypeName;
Packit 022b05
    char           *nnName;
Packit 022b05
    int            i;
Packit 022b05
Packit 022b05
    if (! silent) {
Packit 022b05
	if (smiType->name) {
Packit 022b05
	    fprintSegment(f, INDENT, "/*\n", 0);
Packit 022b05
	    if (smiType->description) {
Packit 022b05
		fprintMultiline(f, smiType->description);
Packit 022b05
	    }
Packit 022b05
	    if (smiType->reference) {
Packit 022b05
		fprintSegment(f, INDENT, "REFERENCE:", 0);
Packit 022b05
		fprint(f, "\n");
Packit 022b05
		fprintMultilineString(f, smiType->reference);
Packit 022b05
		fprint(f, "\n\n");
Packit 022b05
	    }
Packit 022b05
	    if (smiType->format) {
Packit 022b05
		fprintSegment(f, INDENT, "DISPLAY-HINT:", 0);
Packit 022b05
		fprint(f, " %s\n", smiType->format);
Packit 022b05
		fprint(f, "\n\n");
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, INDENT, "*/\n", 0);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    if (! smiType->name) {
Packit 022b05
	idlTypeName = getIdlTypeName(smiGetNodeModule(smiNode)->name,
Packit 022b05
				     smiNode->name);
Packit 022b05
    } else {
Packit 022b05
	idlTypeName = getIdlTypeName(smiGetTypeModule(smiType)->name,
Packit 022b05
				     smiType->name);
Packit 022b05
    }
Packit 022b05
    fprintSegment(f, INDENT, "typedef ", 0);
Packit 022b05
    fprint(f, "%s %s; \n",
Packit 022b05
	  getBaseTypeString(smiType->basetype), idlTypeName);
Packit 022b05
    
Packit 022b05
    if (smiType->basetype == SMI_BASETYPE_ENUM) {
Packit 022b05
	for (nn = smiGetFirstNamedNumber(smiType);
Packit 022b05
	     nn;
Packit 022b05
	     nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
	    fprintSegment(f, INDENT, "const ", 0);
Packit 022b05
	    nnName = translate(nn->name);
Packit 022b05
	    fprint(f, "%s %s_%s = %s;\n", idlTypeName, idlTypeName, nnName,
Packit 022b05
		  getValueString(&nn->value, smiType));
Packit 022b05
	    xfree(nnName);
Packit 022b05
	}
Packit 022b05
	fprintSegment(f, INDENT, "const string ", 0);
Packit 022b05
	fprint(f, "%s_NameNumberList = \"", idlTypeName);
Packit 022b05
	for (i = 0, nn = smiGetFirstNamedNumber(smiType);
Packit 022b05
	     nn;
Packit 022b05
	     i++, nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
	    nnName = translate(nn->name);
Packit 022b05
	    if (i) {
Packit 022b05
		fprint(f, " , ");
Packit 022b05
	    }
Packit 022b05
	    fprint(f, "%s (%s)", nnName, getValueString(&nn->value, smiType));
Packit 022b05
	    xfree(nnName);
Packit 022b05
	}
Packit 022b05
	fprint(f, "\";\n");
Packit 022b05
    }
Packit 022b05
    fprint(f, "\n");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintTypedefs(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode        *smiNode;
Packit 022b05
    SmiType        *smiType;
Packit 022b05
    SmiNodekind    kind = SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN;
Packit 022b05
    
Packit 022b05
    for (smiType = smiGetFirstType(smiModule);
Packit 022b05
	 smiType;
Packit 022b05
	 smiType = smiGetNextType(smiType)) {
Packit 022b05
	if (current(smiType->status)) {
Packit 022b05
	    fprintType(f, NULL, smiType);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, kind);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, kind)) {
Packit 022b05
	if (current(smiNode->status)) {
Packit 022b05
	    smiType = smiGetNodeType(smiNode);
Packit 022b05
	    if (smiType && ! smiType->name) {
Packit 022b05
		fprintType(f, smiNode, smiType);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintAttribute(FILE *f, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    char *idlTypeName = NULL, *idlNodeName;
Packit 022b05
    SmiType *smiType;
Packit 022b05
    SmiModule *smiModule;
Packit 022b05
    
Packit 022b05
    if (smiNode->access < SMI_ACCESS_READ_ONLY) {
Packit 022b05
	return;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    smiType = smiGetNodeType(smiNode);
Packit 022b05
    smiModule = smiGetNodeModule(smiNode);
Packit 022b05
Packit 022b05
    if (! smiType) {
Packit 022b05
	return;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
Packit 022b05
    idlTypeName = getIdlAnyTypeName(smiNode, smiType);
Packit 022b05
    if (! silent) {
Packit 022b05
	fprintDescription(f, smiNode, 2*INDENT);
Packit 022b05
    }
Packit 022b05
    fprintSegment(f, 2*INDENT,
Packit 022b05
		 smiNode->access == SMI_ACCESS_READ_ONLY
Packit 022b05
		 ? "readonly attribute" : "attribute", 0);
Packit 022b05
Packit 022b05
    fprint(f, " %s %s;\n", idlTypeName, idlNodeName);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintGroupInterface(FILE *f, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    char *idlNodeName;
Packit 022b05
    SmiModule *smiModule, *childModule;
Packit 022b05
Packit 022b05
    smiModule = smiGetNodeModule(smiNode);
Packit 022b05
    idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
Packit 022b05
    fprintSegment(f, INDENT, "interface", 0);
Packit 022b05
    fprint(f, " %s : SNMPMgmt::SmiEntry {\n", idlNodeName);
Packit 022b05
Packit 022b05
    for (childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	 childNode;
Packit 022b05
	 childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	if (childNode->nodekind == SMI_NODEKIND_TABLE
Packit 022b05
	    && current(childNode->status)) {
Packit 022b05
	    if (! silent) {
Packit 022b05
		fprintDescription(f, childNode, 2*INDENT);
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, 2*INDENT, "SNMPMgmt::SmiTableIterator", 0);
Packit 022b05
	    childModule = smiGetNodeModule(childNode);
Packit 022b05
	    fprint(f, " get_%s();\n", getIdlNodeName(childModule->name,
Packit 022b05
						 childNode->name));
Packit 022b05
	}
Packit 022b05
	if (childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
	    && current(childNode->status)) {
Packit 022b05
	    fprintAttribute(f, childNode);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintRowInterface(FILE *f, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode, *relatedNode;
Packit 022b05
    char *idlModuleName, *idlNodeName;
Packit 022b05
Packit 022b05
    idlNodeName = getIdlNodeName(smiGetNodeModule(smiNode)->name,
Packit 022b05
				 smiNode->name);
Packit 022b05
    if (! silent) {
Packit 022b05
	fprintDescription(f, smiNode, INDENT);
Packit 022b05
    }
Packit 022b05
    fprintSegment(f, INDENT, "interface", 0);
Packit 022b05
    if (smiNode->indexkind == SMI_INDEX_AUGMENT
Packit 022b05
	|| smiNode->indexkind == SMI_INDEX_SPARSE) {
Packit 022b05
	relatedNode = smiGetRelatedNode(smiNode);
Packit 022b05
	idlModuleName = getIdlModuleName(smiGetNodeModule(relatedNode)->name);
Packit 022b05
	fprint(f, " %s : %s::%s {\n", idlNodeName,
Packit 022b05
	      idlModuleName, relatedNode->name);
Packit 022b05
    } else {
Packit 022b05
	fprint(f, " %s : SNMPMgmt::SmiEntry {\n", idlNodeName);	
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (smiNode->indexkind == SMI_INDEX_INDEX
Packit 022b05
	|| smiNode->indexkind == SMI_INDEX_REORDER) {
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, 2*INDENT, "const ", 0);
Packit 022b05
	fprint(f, "string IndexVarList = \"");
Packit 022b05
	fprintIndex(f, smiNode);
Packit 022b05
	fprint(f, "\";\n");
Packit 022b05
    }
Packit 022b05
Packit 022b05
    /* SMI_INDEX_EXPAND ? */
Packit 022b05
Packit 022b05
    for (childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	 childNode;
Packit 022b05
	 childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	if (childNode->nodekind == SMI_NODEKIND_COLUMN
Packit 022b05
	    && current(childNode->status)) {
Packit 022b05
	    fprintAttribute(f, childNode);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintInterfaces(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	if (isGroup(smiNode)) {
Packit 022b05
	    fprintGroupInterface(f, smiNode);
Packit 022b05
	}
Packit 022b05
	if (smiNode->nodekind == SMI_NODEKIND_ROW
Packit 022b05
	    && current(smiNode->status)) {
Packit 022b05
	    fprintRowInterface(f, smiNode);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintConstructor(FILE *f, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    SmiNode *indexNode;
Packit 022b05
    SmiType *smiType;
Packit 022b05
    SmiModule *smiModule;
Packit 022b05
    SmiElement *smiElement = NULL;
Packit 022b05
    char    *idlNodeName;
Packit 022b05
    char    *idlChildNodeName, *idlChildTypeName;
Packit 022b05
    int	    cnt = 0;
Packit 022b05
Packit 022b05
    smiModule = smiGetNodeModule(smiNode);
Packit 022b05
    idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
Packit 022b05
Packit 022b05
    fprint(f, "\n");
Packit 022b05
    fprintSegment(f, 2*INDENT, "", 0);
Packit 022b05
    fprint(f, "%s create_%s (\n", idlNodeName, idlNodeName);
Packit 022b05
Packit 022b05
    /* First include the INDEXes as parameters to allow row creation
Packit 022b05
       for rows with not-accesible index objects. */
Packit 022b05
Packit 022b05
    if (smiNode->indexkind == SMI_INDEX_INDEX
Packit 022b05
	|| smiNode->indexkind == SMI_INDEX_REORDER) {
Packit 022b05
	 for (smiElement = smiGetFirstElement(smiNode);
Packit 022b05
	      smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	      cnt++;
Packit 022b05
	      indexNode = smiGetElementNode(smiElement);
Packit 022b05
	      idlChildNodeName =
Packit 022b05
		   getIdlNodeName(smiGetNodeModule(indexNode)->name,
Packit 022b05
				  indexNode->name);
Packit 022b05
	      smiType = smiGetNodeType(indexNode);
Packit 022b05
	      idlChildTypeName = getIdlAnyTypeName(indexNode, smiType);
Packit 022b05
	      if (cnt > 1) {
Packit 022b05
		   fprint(f, ",\n");
Packit 022b05
	      }
Packit 022b05
	      fprintSegment(f, 3*INDENT, "in ", 0);
Packit 022b05
	      fprint(f, "%s %s", idlChildTypeName, idlChildNodeName);
Packit 022b05
	 }
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    for (childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	 childNode;
Packit 022b05
	 childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	
Packit 022b05
	if ((childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
	     || childNode->nodekind == SMI_NODEKIND_COLUMN)
Packit 022b05
	    && current(childNode->status)
Packit 022b05
	    && childNode->access == SMI_ACCESS_READ_WRITE) {
Packit 022b05
Packit 022b05
	    /* Test if this column is already used as parameter
Packit 022b05
	       because it is an INDEX of the row. */
Packit 022b05
Packit 022b05
	    if (childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
		|| childNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit 022b05
		for (smiElement = smiGetFirstElement(smiNode);
Packit 022b05
		    smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
		    indexNode = smiGetElementNode(smiElement);
Packit 022b05
		    if (indexNode == childNode) {
Packit 022b05
			break;
Packit 022b05
		    }
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
Packit 022b05
	    if (! smiElement) {
Packit 022b05
		cnt++;
Packit 022b05
		idlChildNodeName =
Packit 022b05
		    getIdlNodeName(smiGetNodeModule(childNode)->name,
Packit 022b05
				   childNode->name);
Packit 022b05
		smiType = smiGetNodeType(childNode);
Packit 022b05
		idlChildTypeName = getIdlAnyTypeName(childNode, smiType);
Packit 022b05
		if (cnt > 1) {
Packit 022b05
		    fprint(f, ",\n");
Packit 022b05
		}
Packit 022b05
		fprintSegment(f, 3*INDENT, "in ", 0);
Packit 022b05
		fprint(f, "%s %s", idlChildTypeName, idlChildNodeName);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    fprint(f, "\n");
Packit 022b05
    
Packit 022b05
    fprintSegment(f, 2*INDENT, ") raises (\n", 0);
Packit 022b05
    fprintSegment(f, 3*INDENT, "SNMPMgmt::AlreadyExists,\n", 0);
Packit 022b05
    fprintSegment(f, 3*INDENT, "CosLifeCycle::InvalidCriteria,\n", 0);
Packit 022b05
    fprintSegment(f, 3*INDENT, "CosLifeCycle::CannotMeetCriteria\n", 0);
Packit 022b05
    fprintSegment(f, 2*INDENT, ");\n", 0);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintFactory(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
    int	    cnt = 0;
Packit 022b05
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	
Packit 022b05
	if (isCreatable(smiNode)) {
Packit 022b05
	    cnt++;
Packit 022b05
	    if (cnt == 1) {
Packit 022b05
		fprintSegment(f, INDENT, "interface SmiEntryFactory : "
Packit 022b05
			     "SNMPMgmt::GenericFactory {\n", 0);
Packit 022b05
	    }
Packit 022b05
	    fprintConstructor(f, smiNode);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (cnt) {
Packit 022b05
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNotificationVBTypes(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode     *smiNode, *listSmiNode;
Packit 022b05
    SmiElement  *smiElement;
Packit 022b05
    SmiType	*smiType;
Packit 022b05
    char	*idlTypeName;
Packit 022b05
    char	*idlVBTypeName;
Packit 022b05
    int		isnew;
Packit 022b05
    
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit 022b05
Packit 022b05
	for (smiElement = smiGetFirstElement(smiNode);
Packit 022b05
	     smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	    listSmiNode = smiGetElementNode(smiElement);
Packit 022b05
	    idlVBTypeName = getIdlVBTypeName(
Packit 022b05
		                           smiGetNodeModule(listSmiNode)->name,
Packit 022b05
					   listSmiNode->name, &isnew);
Packit 022b05
	    if (isnew && listSmiNode) {
Packit 022b05
		smiType = smiGetNodeType(listSmiNode);
Packit 022b05
		if (smiType) {
Packit 022b05
		    idlTypeName = getIdlAnyTypeName(listSmiNode, smiType);
Packit 022b05
		    fprintSegment(f, INDENT, "struct ", 0);
Packit 022b05
		    fprint(f, "%s {\n", idlVBTypeName);
Packit 022b05
		    fprintSegment(f, 2*INDENT, "string var_name;\n", 0);
Packit 022b05
		    fprintSegment(f, 2*INDENT, "string var_index;\n", 0);
Packit 022b05
		    fprintSegment(f, 2*INDENT, "", 0);
Packit 022b05
		    fprint(f, "%s %s;\n", idlTypeName,
Packit 022b05
			   smiGetElementNode(smiElement)->name);
Packit 022b05
		    fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNotificationTypes(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode     *smiNode;
Packit 022b05
    SmiElement  *smiElement;
Packit 022b05
    char	*idlTypeName;
Packit 022b05
    char	*idlVBTypeName;
Packit 022b05
    
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit 022b05
Packit 022b05
	if ((smiElement = smiGetFirstElement(smiNode))) {
Packit 022b05
	    idlTypeName = getIdlTypeName(smiGetNodeModule(smiNode)->name,
Packit 022b05
					 smiNode->name);
Packit 022b05
	    fprintSegment(f, INDENT, "struct ", 0);
Packit 022b05
	    fprint(f, "%s {\n", idlTypeName);
Packit 022b05
	    for (; smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
		idlVBTypeName = getIdlVBTypeName(smiGetNodeModule(
Packit 022b05
		                          smiGetElementNode(smiElement))->name,
Packit 022b05
				    smiGetElementNode(smiElement)->name, NULL);
Packit 022b05
		fprintSegment(f, 2*INDENT, "", 0);
Packit 022b05
		fprint(f, "%s %s;\n", idlVBTypeName,
Packit 022b05
		      smiGetElementNode(smiElement)->name);
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintPushNotifications(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode     *smiNode;
Packit 022b05
    SmiElement  *smiElement;
Packit 022b05
    char        *idlNodeName;
Packit 022b05
    char	*idlTypeName;
Packit 022b05
    int         cnt = 0;
Packit 022b05
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit 022b05
Packit 022b05
	cnt++;
Packit 022b05
	if (cnt == 1) {
Packit 022b05
	    if (! silent) {
Packit 022b05
		fprintSegment(f, INDENT,
Packit 022b05
			     "/* typed push event communication */\n", 0);
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, INDENT, "interface Notifications : ", 0);
Packit 022b05
	    fprint(f, "SNMPMgmt::Notifications {\n");
Packit 022b05
	}
Packit 022b05
	idlNodeName = getIdlNodeName(smiModule->name,
Packit 022b05
				     smiNode->name);
Packit 022b05
	if (! silent) {
Packit 022b05
	    fprintDescription(f, smiNode, 2*INDENT);
Packit 022b05
	}
Packit 022b05
	fprintSegment(f, 2*INDENT, "void ", 0);
Packit 022b05
	fprint(f, "%s (\n", idlNodeName);
Packit 022b05
	fprintSegment(f, 3*INDENT, "in CosNaming::Name src_entry_name,\n", 0);
Packit 022b05
	fprintSegment(f, 3*INDENT, "in CORBA::ScopedName event_type,\n", 0);
Packit 022b05
	fprintSegment(f, 3*INDENT, "in ASN1_GeneralizedTime event_time", 0);
Packit 022b05
	if ((smiElement = smiGetFirstElement(smiNode))) {
Packit 022b05
	    idlTypeName = getIdlTypeName(smiModule->name, smiNode->name);
Packit 022b05
	    fprint(f, ",\n");
Packit 022b05
	    fprintSegment(f, 3*INDENT, "in ", 0);
Packit 022b05
	    fprint(f, "%s notification_info", idlTypeName);
Packit 022b05
	}
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, 2*INDENT, ");\n", 0);
Packit 022b05
    }    
Packit 022b05
Packit 022b05
    if (cnt) {
Packit 022b05
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintPullNotifications(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode     *smiNode;
Packit 022b05
    SmiElement  *smiElement;
Packit 022b05
    int         cnt = 0;
Packit 022b05
    char        *idlNodeName;
Packit 022b05
    char	*idlTypeName;
Packit 022b05
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit 022b05
Packit 022b05
	cnt++;
Packit 022b05
	if (cnt == 1) {
Packit 022b05
	    if (! silent) {
Packit 022b05
		fprintSegment(f, INDENT,
Packit 022b05
			     "/* typed pull event communication */\n", 0);
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, INDENT, "interface PullNotifications : ", 0);
Packit 022b05
	    fprint(f, "SNMPMgmt::PullNotifications {\n");
Packit 022b05
	}
Packit 022b05
	idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
Packit 022b05
	
Packit 022b05
	if (! silent) {
Packit 022b05
	    fprintDescription(f, smiNode, 2*INDENT);
Packit 022b05
	}
Packit 022b05
	fprintSegment(f, 2*INDENT, "void ", 0);
Packit 022b05
	fprint(f, "pull_%s (\n", idlNodeName);
Packit 022b05
	fprintSegment(f, 3*INDENT, "out CosNaming::Name src_entry_name,\n", 0);
Packit 022b05
	fprintSegment(f, 3*INDENT, "out CORBA::ScopedName event_type,\n", 0);
Packit 022b05
	fprintSegment(f, 3*INDENT, "out ASN1_GeneralizedTime event_time", 0);
Packit 022b05
	if ((smiElement = smiGetFirstElement(smiNode))) {
Packit 022b05
	    idlTypeName = getIdlTypeName(smiModule->name, smiNode->name);
Packit 022b05
	    fprint(f, ",\n");
Packit 022b05
	    fprintSegment(f, 3*INDENT, "out ", 0);
Packit 022b05
	    fprint(f, "%s notification_info", idlTypeName);
Packit 022b05
	}
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, 2*INDENT, ");\n", 0);
Packit 022b05
	fprintSegment(f, 2*INDENT, "boolean ", 0);
Packit 022b05
	fprint(f, "try_%s (\n", idlNodeName);
Packit 022b05
	fprintSegment(f, 3*INDENT, "out CosNaming::Name src_entry_name,\n", 0);
Packit 022b05
	fprintSegment(f, 3*INDENT, "out CORBA::ScopedName event_type,\n", 0);
Packit 022b05
	fprintSegment(f, 3*INDENT, "out ASN1_GeneralizedTime event_time", 0);
Packit 022b05
	if ((smiElement = smiGetFirstElement(smiNode))) {
Packit 022b05
	    char *idlTypeName;
Packit 022b05
	    idlTypeName = getIdlTypeName(smiModule->name, smiNode->name);
Packit 022b05
	    fprint(f, ",\n");
Packit 022b05
	    fprintSegment(f, 3*INDENT, "out ", 0);
Packit 022b05
	    fprint(f, "%s notification_info", idlTypeName);
Packit 022b05
	}
Packit 022b05
	fprint(f, "\n");
Packit 022b05
	fprintSegment(f, 2*INDENT, ");\n", 0);
Packit 022b05
    }    
Packit 022b05
Packit 022b05
    if (cnt) {
Packit 022b05
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintDefVals(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
    SmiType *smiType;
Packit 022b05
    int     cnt = 0;
Packit 022b05
    char    *idlTypeName;
Packit 022b05
    
Packit 022b05
    
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	
Packit 022b05
	if (smiNode->value.basetype != SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	    smiType = smiGetNodeType(smiNode);
Packit 022b05
	    if (smiType) {
Packit 022b05
		cnt++;
Packit 022b05
		if (cnt == 1) {
Packit 022b05
		    fprintSegment(f, INDENT, "/* pseudo */\n", 0);
Packit 022b05
		    fprintSegment(f, INDENT, "interface DefaultValues {\n", 0);
Packit 022b05
		}
Packit 022b05
		if (! silent) {
Packit 022b05
		    fprintSegment(f, 2*INDENT, "/* DEFVAL: ", 0);
Packit 022b05
		    fprint(f, " %s */\n",
Packit 022b05
			   getValueString(&smiNode->value, smiType));
Packit 022b05
		}
Packit 022b05
		fprintSegment(f, 2*INDENT, "", 0);
Packit 022b05
		idlTypeName = getIdlAnyTypeName(smiNode, smiType);
Packit 022b05
		fprint(f, "%s %s();\n\n", idlTypeName, smiNode->name);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (cnt) {
Packit 022b05
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintDisplayHints(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiType *smiType;
Packit 022b05
    int     cnt = 0;
Packit 022b05
Packit 022b05
    for (smiType = smiGetFirstType(smiModule);
Packit 022b05
	 smiType;
Packit 022b05
	 smiType = smiGetNextType(smiType)) {
Packit 022b05
	if (current(smiType->status) && smiType->format) {
Packit 022b05
	    cnt++;
Packit 022b05
	    if (cnt == 1) {
Packit 022b05
		fprintSegment(f, INDENT, "/* pseudo */\n", 0);
Packit 022b05
		fprintSegment(f, INDENT, "interface TextualConventions {\n", 0);
Packit 022b05
	    }
Packit 022b05
	    fprint(f, "\n");
Packit 022b05
	    if (! silent) {
Packit 022b05
		fprintSegment(f, 2*INDENT, "/*\n", 0);
Packit 022b05
		if (smiType->description) {
Packit 022b05
		    fprintMultiline(f, smiType->description);
Packit 022b05
		}
Packit 022b05
		if (smiType->reference) {
Packit 022b05
		    fprintSegment(f, 2*INDENT, "REFERENCE:", 0);
Packit 022b05
		    fprint(f, "\n");
Packit 022b05
		    fprintMultilineString(f, smiType->reference);
Packit 022b05
		}
Packit 022b05
		if (smiType->format) {
Packit 022b05
		    fprintSegment(f, 2*INDENT, "DISPLAY-HINT:", 0);
Packit 022b05
		    fprint(f, " %s\n", smiType->format);
Packit 022b05
		}
Packit 022b05
		fprintSegment(f, 2*INDENT, "*/\n", 0);
Packit 022b05
	    }
Packit 022b05
	    fprintSegment(f, 2*INDENT, "", 0);
Packit 022b05
	    fprint(f, "string %sToString (in %s Value);\n", smiType->name,
Packit 022b05
		  getIdlTypeName(smiGetTypeModule(smiType)->name,
Packit 022b05
				 smiType->name));
Packit 022b05
	    fprintSegment(f, 2*INDENT, "", 0);
Packit 022b05
	    fprint(f, "%s %sFromString (in string str);\n",
Packit 022b05
		  getIdlTypeName(smiGetTypeModule(smiType)->name,
Packit 022b05
				 smiType->name),
Packit 022b05
		  smiType->name);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (cnt) {
Packit 022b05
	fprintSegment(f, INDENT, "};\n\n", 0);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void dumpIdl(SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    char        *idlModuleName;
Packit 022b05
    FILE        *f;
Packit 022b05
    SmiRevision *smiRevision;
Packit 022b05
    char        *date;
Packit 022b05
Packit 022b05
    f = createFile(getIdlModuleName(smiModule->name), ".idl");
Packit 022b05
    if (! f) {
Packit 022b05
        return;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    fprintf(f,
Packit 022b05
	    "/*	\t\t\t\t\t\t-- DO NOT EDIT --\n"
Packit 022b05
	    " * Generated by smidump version " SMI_VERSION_STRING ":\n");
Packit 022b05
Packit 022b05
    fprintf(f, " *   smidump -f corba %s\n *\n", smiModule->name);
Packit 022b05
Packit 022b05
    fprintf(f,
Packit 022b05
	    " * Derived from %s:\n", smiModule->name);
Packit 022b05
    fprintCommentString(f, smiModule->description);
Packit 022b05
Packit 022b05
    for (smiRevision = smiGetFirstRevision(smiModule);
Packit 022b05
	 smiRevision;
Packit 022b05
	 smiRevision = smiGetNextRevision(smiRevision)) {
Packit 022b05
	date = getStringTime(smiRevision->date);
Packit 022b05
	fprintf(f,
Packit 022b05
		" *\n"
Packit 022b05
		" * Revision %s:\n", date);
Packit 022b05
	fprintCommentString(f, smiRevision->description);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    fprintf(f,
Packit 022b05
	    " *\n * $I" "d$\n"
Packit 022b05
	    " */\n"
Packit 022b05
	    "\n");
Packit 022b05
Packit 022b05
    idlModuleName = getIdlModuleName(smiModule->name);
Packit 022b05
    createImportList(smiModule);
Packit 022b05
Packit 022b05
    fprint(f, "#ifndef _%s_IDL_\n", idlModuleName);
Packit 022b05
    fprint(f, "#define _%s_IDL_\n\n", idlModuleName);
Packit 022b05
Packit 022b05
    fprintIncludes(f, smiModule);
Packit 022b05
Packit 022b05
    fprint(f, "module %s {\n\n", idlModuleName);
Packit 022b05
Packit 022b05
    fprintImportedTypedefs(f, smiModule);
Packit 022b05
    fprintModule(f, smiModule);
Packit 022b05
    fprintTypedefs(f, smiModule);
Packit 022b05
    fprintInterfaces(f, smiModule);
Packit 022b05
    fprintNotificationVBTypes(f, smiModule);
Packit 022b05
    fprintNotificationTypes(f, smiModule);
Packit 022b05
    fprintPushNotifications(f, smiModule);
Packit 022b05
    fprintPullNotifications(f, smiModule);
Packit 022b05
    fprintFactory(f, smiModule);
Packit 022b05
    fprintDefVals(f, smiModule);
Packit 022b05
    fprintDisplayHints(f, smiModule);
Packit 022b05
    
Packit 022b05
    fprint(f, "};\n\n");
Packit 022b05
    fprint(f, "#endif /* !_%s_IDL_ */\n", idlModuleName);
Packit 022b05
Packit 022b05
    freeImportList();
Packit 022b05
    dictFree(&idlModuleNameList);
Packit 022b05
    dictFree(&idlNodeNameList);
Packit 022b05
    dictFree(&idlTypeNameList);
Packit 022b05
    dictFree(&idlVBTypeNameList);
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
    fclose(f);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNameAndOid(FILE *f, SmiNode *smiNode, SmiNode *smiParentNode)
Packit 022b05
{
Packit 022b05
    unsigned int i;
Packit 022b05
    char         *idlModuleName;
Packit 022b05
Packit 022b05
    idlModuleName = getIdlModuleName(smiGetNodeModule(smiNode)->name);
Packit 022b05
Packit 022b05
    if (smiParentNode) {
Packit 022b05
	fprint(f, "::%s::%s::%s ",
Packit 022b05
	       idlModuleName, smiParentNode->name, smiNode->name);
Packit 022b05
    } else {
Packit 022b05
	fprint(f, "::%s::%s ", idlModuleName, smiNode->name);
Packit 022b05
    }
Packit 022b05
    for (i = 0; i < smiNode->oidlen; i++) {
Packit 022b05
	fprint(f, "%s%u", i ? "." : "", smiNode->oid[i]);
Packit 022b05
    }
Packit 022b05
    fprint(f, " ");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void dumpOid(SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode   *smiNode;
Packit 022b05
    SmiType   *smiType;
Packit 022b05
    FILE      *f;
Packit 022b05
Packit 022b05
    f = createFile(getIdlModuleName(smiModule->name), ".oid");
Packit 022b05
    if (! f) {
Packit 022b05
        return;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
Packit 022b05
	if (isGroup(smiNode)) {
Packit 022b05
            fprintNameAndOid(f, smiNode, NULL);
Packit 022b05
	    fprint(f, "Group not-accessible\n");
Packit 022b05
	    /* XXX what if the node is also of SMI_NODEKIND_MODULE ?? */
Packit 022b05
	    continue;
Packit 022b05
	}
Packit 022b05
Packit 022b05
	smiType = smiGetNodeType(smiNode);
Packit 022b05
	
Packit 022b05
	switch (smiNode->nodekind) {
Packit 022b05
	case SMI_NODEKIND_NODE:
Packit 022b05
	    if (current(smiNode->status)) {
Packit 022b05
		fprintNameAndOid(f, smiNode, NULL);
Packit 022b05
		fprint(f, "ASN1_ObjectIdentifier not-accessible\n");
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_SCALAR:
Packit 022b05
	    if (smiType && current(smiNode->status)) {
Packit 022b05
		SmiNode *smiParentNode = smiGetParentNode(smiNode);
Packit 022b05
		fprintNameAndOid(f, smiNode, smiParentNode);
Packit 022b05
		fprint(f, "%s %s\n",
Packit 022b05
		       getBaseTypeString(smiType->basetype),
Packit 022b05
		       getAccessString(smiNode->access, 0));
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_TABLE:
Packit 022b05
	    if (current(smiNode->status)) {
Packit 022b05
		fprintNameAndOid(f, smiNode, NULL);
Packit 022b05
		fprint(f, "Table not-accessible\n");
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_ROW:
Packit 022b05
	    if (current(smiNode->status)) {
Packit 022b05
		fprintNameAndOid(f, smiNode, NULL);
Packit 022b05
		fprint(f, "TableEntry not-accessible\n");
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_COLUMN:
Packit 022b05
	    if (smiType && current(smiNode->status)) {
Packit 022b05
		SmiNode *smiParentNode = smiGetParentNode(smiNode);
Packit 022b05
		int create = smiParentNode ? smiParentNode->create : 0;
Packit 022b05
		fprintNameAndOid(f, smiNode, smiParentNode);
Packit 022b05
		fprint(f, "%s %s\n",
Packit 022b05
		       getBaseTypeString(smiType->basetype),
Packit 022b05
		       getAccessString(smiNode->access, create));
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_NOTIFICATION:
Packit 022b05
	    if (current(smiNode->status)) {
Packit 022b05
		SmiNode *smiParentNode = smiGetParentNode(smiNode);
Packit 022b05
		fprintNameAndOid(f, smiNode, smiParentNode);
Packit 022b05
		fprint(f, "Notification not-accessible\n");
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_GROUP:
Packit 022b05
	    break;
Packit 022b05
	case SMI_NODEKIND_COMPLIANCE:
Packit 022b05
	    break;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    dictFree(&idlModuleNameList);
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
    fclose(f);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
static void dumpCorba(int modc, SmiModule **modv, int flags, char *output)
Packit 022b05
{
Packit 022b05
    int       i;
Packit 022b05
Packit 022b05
    silent = (flags & SMIDUMP_FLAG_SILENT);
Packit 022b05
Packit 022b05
    for (i = 0; i < modc; i++) {
Packit 022b05
	dumpIdl(modv[i]);
Packit 022b05
	dumpOid(modv[i]);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void initCorba()
Packit 022b05
{
Packit 022b05
    
Packit 022b05
    static SmidumpDriver driver = {
Packit 022b05
	"corba",
Packit 022b05
	dumpCorba,
Packit 022b05
	0,
Packit 022b05
	SMIDUMP_DRIVER_CANT_UNITE | SMIDUMP_DRIVER_CANT_OUTPUT,
Packit 022b05
	"corba IDL interface and OID definitions (JIDM)",
Packit 022b05
	NULL,
Packit 022b05
	NULL
Packit 022b05
    };
Packit 022b05
    
Packit 022b05
    smidumpRegisterDriver(&driver);
Packit 022b05
}