Blame tools/dump-types.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-types.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump the type hierarchy in a human readable format.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 1999 J. Schoenwaelder, Technical University of Braunschweig.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: dump-types.c 8090 2008-04-18 12:56:29Z strauss $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Decide how we want to name the implicitely defined types.
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
#include <ctype.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int noimplicit = 0;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct BaseTypeCount {
Packit Service 9ccfef
    SmiBasetype basetype;
Packit Service 9ccfef
    int         counter;
Packit Service 9ccfef
} BaseTypeCount;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static BaseTypeCount basetypes[] = {
Packit Service 9ccfef
    { SMI_BASETYPE_INTEGER32, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_OCTETSTRING, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_OBJECTIDENTIFIER, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_UNSIGNED32, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_INTEGER64, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_UNSIGNED64, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_FLOAT32, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_FLOAT64, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_FLOAT128, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_ENUM, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_BITS, 0 },
Packit Service 9ccfef
    { SMI_BASETYPE_UNKNOWN, 0 }
Packit Service 9ccfef
};
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct TypeNode {
Packit Service 9ccfef
    SmiType	*smiType;
Packit Service 9ccfef
    SmiModule	*smiModule;
Packit Service 9ccfef
    SmiBasetype smiBasetype;
Packit Service 9ccfef
    struct TypeNode *nextNodePtr;
Packit Service 9ccfef
    struct TypeNode *childNodePtr;
Packit Service 9ccfef
} TypeNode;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static TypeNode typeRoot = {
Packit Service 9ccfef
    NULL, NULL, SMI_BASETYPE_UNKNOWN, NULL, NULL
Packit Service 9ccfef
};
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int pmodc = 0;
Packit Service 9ccfef
static SmiModule **pmodv = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char getStatusChar(SmiStatus status)
Packit Service 9ccfef
{
Packit Service 9ccfef
    switch (status) {
Packit Service 9ccfef
    case SMI_STATUS_UNKNOWN:
Packit Service 9ccfef
	return '+';
Packit Service 9ccfef
    case SMI_STATUS_CURRENT:
Packit Service 9ccfef
	return '+';
Packit Service 9ccfef
    case SMI_STATUS_DEPRECATED:
Packit Service 9ccfef
	return 'x';
Packit Service 9ccfef
    case SMI_STATUS_MANDATORY:
Packit Service 9ccfef
        return '+';
Packit Service 9ccfef
    case SMI_STATUS_OPTIONAL:
Packit Service 9ccfef
	return '+';
Packit Service 9ccfef
    case SMI_STATUS_OBSOLETE:
Packit Service 9ccfef
	return 'o';
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return ' ';
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getFlags(SmiModule *smiModule, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char flags[4];
Packit Service 9ccfef
    int		i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    memset(flags, 0, sizeof(flags));
Packit Service 9ccfef
    strcpy(flags, "---");
Packit Service 9ccfef
Packit Service 9ccfef
    switch (smiType->decl) {
Packit Service 9ccfef
    case SMI_DECL_IMPLICIT_TYPE:
Packit Service 9ccfef
	flags[0] = 'i';
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_DECL_TYPEASSIGNMENT:
Packit Service 9ccfef
	flags[0] = 'a';
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_DECL_TEXTUALCONVENTION:
Packit Service 9ccfef
    case SMI_DECL_TYPEDEF:
Packit Service 9ccfef
	flags[0] = 't';
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    default:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < pmodc; i++) {
Packit Service 9ccfef
	if (strcmp(pmodv[i]->name, smiModule->name) == 0) {
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if ((!smiModule) || (strlen(smiModule->name) == 0)) {
Packit Service 9ccfef
	flags[2] = 'b';
Packit Service 9ccfef
#if 0	/* xxx fixme */
Packit Service 9ccfef
    } else if (!moduleList) {
Packit Service 9ccfef
	flags[2] = '-';
Packit Service 9ccfef
    } else if (mPtr) {
Packit Service 9ccfef
	flags[2] = 'l';
Packit Service 9ccfef
#endif
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	flags[2] = 'i';
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return flags;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void initBaseTypeCount()
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < sizeof(basetypes)/sizeof(BaseTypeCount); i++) {
Packit Service 9ccfef
	basetypes[i].counter = 0;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void incrBaseTypeCount(SmiBasetype basetype)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < sizeof(basetypes)/sizeof(BaseTypeCount); i++) {
Packit Service 9ccfef
	if (basetypes[i].basetype == basetype) {
Packit Service 9ccfef
	    basetypes[i].counter++;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int getBaseTypeCount(SmiBasetype basetype)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < sizeof(basetypes)/sizeof(BaseTypeCount); i++) {
Packit Service 9ccfef
	if (basetypes[i].basetype == basetype) {
Packit Service 9ccfef
	    return basetypes[i].counter;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return -1;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getValueString(SmiValue *valuePtr, SmiType *typePtr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char    s[1024];
Packit Service 9ccfef
    char           ss[9];
Packit Service 9ccfef
    int		   n;
Packit Service 9ccfef
    unsigned int   i;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    SmiNode        *nodePtr;
Packit Service 9ccfef
    
Packit Service 9ccfef
    s[0] = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    switch (valuePtr->basetype) {
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED32:
Packit Service 9ccfef
	sprintf(s, "%lu", valuePtr->value.unsigned32);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER32:
Packit Service 9ccfef
	sprintf(s, "%ld", valuePtr->value.integer32);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED64:
Packit Service 9ccfef
	sprintf(s, UINT64_FORMAT, valuePtr->value.unsigned64);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER64:
Packit Service 9ccfef
	sprintf(s, INT64_FORMAT, valuePtr->value.integer64);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT32:
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT64:
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT128:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_ENUM:
Packit Service 9ccfef
	for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit Service 9ccfef
	     nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (nn->value.value.unsigned32 == valuePtr->value.unsigned32)
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nn) {
Packit Service 9ccfef
	    sprintf(s, "%s", nn->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    sprintf(s, "%ld", valuePtr->value.integer32);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OCTETSTRING:
Packit Service 9ccfef
	for (i = 0; i < valuePtr->len; i++) {
Packit Service 9ccfef
	    if (!isprint((int)valuePtr->value.ptr[i])) break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i == valuePtr->len) {
Packit Service 9ccfef
	    sprintf(s, "\"%s\"", valuePtr->value.ptr);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
            sprintf(s, "0x%*s", 2 * valuePtr->len, "");
Packit Service 9ccfef
            for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
                sprintf(ss, "%02x", valuePtr->value.ptr[i]);
Packit Service 9ccfef
                strncpy(&s[2+2*i], ss, 2);
Packit Service 9ccfef
            }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_BITS:
Packit Service 9ccfef
	sprintf(s, "(");
Packit Service 9ccfef
	for (i = 0, n = 0; i < valuePtr->len * 8; i++) {
Packit Service 9ccfef
	    if (valuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
Packit Service 9ccfef
		if (n)
Packit Service 9ccfef
		    sprintf(&s[strlen(s)], ", ");
Packit Service 9ccfef
		n++;
Packit Service 9ccfef
		for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit Service 9ccfef
		     nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
		    if (nn->value.value.unsigned32 == i)
Packit Service 9ccfef
			break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		if (nn) {
Packit Service 9ccfef
		    sprintf(&s[strlen(s)], "%s", nn->name);
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    sprintf(s, "%d", i);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	sprintf(&s[strlen(s)], ")");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_POINTER:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit Service 9ccfef
	nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
Packit Service 9ccfef
	if (!nodePtr) {
Packit Service 9ccfef
	    sprintf(s, "%s", nodePtr->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    strcpy(s, "");
Packit Service 9ccfef
	    for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
		if (i) strcat(s, ".");
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void addToTypeTree(TypeNode *root,
Packit Service 9ccfef
			  SmiModule *smiModule, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    TypeNode  *newType, **typePtrPtr;
Packit Service 9ccfef
    SmiType   *smiParentType;
Packit Service 9ccfef
    SmiModule *smiParentModule;
Packit Service 9ccfef
Packit Service 9ccfef
    if (! root) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiParentType = smiGetParentType(smiType);
Packit Service 9ccfef
    smiParentModule = smiParentType ? smiGetTypeModule(smiParentType) : NULL;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((root->smiModule == smiParentModule && root->smiType == smiParentType)
Packit Service 9ccfef
	|| (! root->smiModule && ! root->smiType
Packit Service 9ccfef
	    && root->smiBasetype == smiType->basetype)) {
Packit Service 9ccfef
Packit Service 9ccfef
	 newType = xmalloc(sizeof(TypeNode));
Packit Service 9ccfef
	 newType->smiModule = smiModule;
Packit Service 9ccfef
	 newType->smiType = smiType;
Packit Service 9ccfef
	 newType->smiBasetype = smiType->basetype;
Packit Service 9ccfef
	 newType->childNodePtr = NULL;
Packit Service 9ccfef
	 newType->nextNodePtr = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
	 for (typePtrPtr = &(root->childNodePtr);
Packit Service 9ccfef
	      *typePtrPtr; typePtrPtr = &((*typePtrPtr)->nextNodePtr)) ;
Packit Service 9ccfef
	 *typePtrPtr = newType;
Packit Service 9ccfef
	 return;
Packit Service 9ccfef
     }
Packit Service 9ccfef
Packit Service 9ccfef
     if (root->nextNodePtr) {
Packit Service 9ccfef
	 addToTypeTree(root->nextNodePtr, smiModule, smiType);
Packit Service 9ccfef
     }
Packit Service 9ccfef
     
Packit Service 9ccfef
     if (root->childNodePtr) {
Packit Service 9ccfef
	 addToTypeTree(root->childNodePtr, smiModule, smiType);
Packit Service 9ccfef
     }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void freeTypeTree(TypeNode *root)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (root->childNodePtr) {
Packit Service 9ccfef
	if (root->childNodePtr->smiModule) {
Packit Service 9ccfef
	    freeTypeTree(root->childNodePtr);
Packit Service 9ccfef
	    root->childNodePtr = NULL;
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    freeTypeTree(root->childNodePtr);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (root->nextNodePtr) {
Packit Service 9ccfef
	if (root->nextNodePtr->smiModule) {
Packit Service 9ccfef
	    freeTypeTree(root->nextNodePtr);
Packit Service 9ccfef
	    root->nextNodePtr = NULL;
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    freeTypeTree(root->nextNodePtr);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (root->smiModule) {
Packit Service 9ccfef
	xfree(root);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static TypeNode *findInTypeTree(TypeNode *root,
Packit Service 9ccfef
				SmiModule *smiModule, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    TypeNode *result = NULL;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (root->smiModule && root->smiModule == smiModule
Packit Service 9ccfef
	&& smiType->name
Packit Service 9ccfef
	&& root->smiType && root->smiType == smiType) {
Packit Service 9ccfef
	result = root;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (!result && root->childNodePtr) {
Packit Service 9ccfef
	result = findInTypeTree(root->childNodePtr, smiModule, smiType);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (!result && root->nextNodePtr) {
Packit Service 9ccfef
	result = findInTypeTree(root->nextNodePtr, smiModule, smiType);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    return result;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char* getTypeName(TypeNode *typeNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiRefinement *smiRefinement;
Packit Service 9ccfef
    SmiType *smiType;
Packit Service 9ccfef
    char *name = "?";
Packit Service 9ccfef
Packit Service 9ccfef
    if (typeNode->smiType->name) {
Packit Service 9ccfef
#if 1
Packit Service 9ccfef
	return xstrdup(typeNode->smiType->name);
Packit Service 9ccfef
#else
Packit Service 9ccfef
	char *s;
Packit Service 9ccfef
	s = xmalloc(strlen(typeNode->smiType->name)+
Packit Service 9ccfef
		    strlen(typeNode->smiModule ? typeNode->smiModule->name : "") +3);
Packit Service 9ccfef
	sprintf(s, "%s::%s", typeNode->smiModule ? typeNode->smiModule->name : "",
Packit Service 9ccfef
		typeNode->smiType->name);
Packit Service 9ccfef
	return s;
Packit Service 9ccfef
#endif
Packit Service 9ccfef
	
Packit Service 9ccfef
    } else if (typeNode->smiModule) {
Packit Service 9ccfef
	SmiNode *smiNode;
Packit Service 9ccfef
Packit Service 9ccfef
	for (smiNode = smiGetFirstNode(typeNode->smiModule, SMI_NODEKIND_ANY);
Packit Service 9ccfef
	     smiNode;
Packit Service 9ccfef
	     smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit Service 9ccfef
	    if (smiGetNodeType(smiNode) == typeNode->smiType) {
Packit Service 9ccfef
		name = xmalloc(strlen(smiNode->name) + 3);
Packit Service 9ccfef
		sprintf(name, "(%s)", smiNode->name);
Packit Service 9ccfef
		return name;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	for (smiNode = smiGetFirstNode(typeNode->smiModule,
Packit Service 9ccfef
				       SMI_NODEKIND_COMPLIANCE);
Packit Service 9ccfef
	     smiNode;
Packit Service 9ccfef
	     smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
Packit Service 9ccfef
	    for(smiRefinement = smiGetFirstRefinement(smiNode);
Packit Service 9ccfef
		smiRefinement;
Packit Service 9ccfef
		smiRefinement = smiGetNextRefinement(smiRefinement)) {
Packit Service 9ccfef
		smiType = smiGetRefinementType(smiRefinement);
Packit Service 9ccfef
		if (smiType == typeNode->smiType) {
Packit Service 9ccfef
		    smiNode = smiGetRefinementNode(smiRefinement);
Packit Service 9ccfef
		    name = xmalloc(strlen(smiNode->name) + 3);
Packit Service 9ccfef
		    sprintf(name, "(%s)", smiNode->name);
Packit Service 9ccfef
		    return name;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		smiType = smiGetRefinementWriteType(smiRefinement);
Packit Service 9ccfef
		if (smiType == typeNode->smiType) {
Packit Service 9ccfef
		    smiNode = smiGetRefinementNode(smiRefinement);
Packit Service 9ccfef
		    name = xmalloc(strlen(smiNode->name) + 3);
Packit Service 9ccfef
		    sprintf(name, "(%s)", smiNode->name);
Packit Service 9ccfef
		    return name;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return xstrdup(name);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintRestrictions(FILE *f, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    SmiRange       *range;
Packit Service 9ccfef
    char           s1[40], s2[40];
Packit Service 9ccfef
    int            i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if ((smiType->basetype == SMI_BASETYPE_ENUM) ||
Packit Service 9ccfef
	(smiType->basetype == SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
	for(i = 0, nn = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
	    nn ; nn = smiGetNextNamedNumber(nn), i++) {
Packit Service 9ccfef
	    fprintf(f, "%s%s(%ld)", (i == 0) ? " {" : ", ",
Packit Service 9ccfef
		   nn->name, nn->value.value.integer32);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) fprintf(f, "}");
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for(i = 0, range = smiGetFirstRange(smiType);
Packit Service 9ccfef
	    range ; range = smiGetNextRange(range), i++) {
Packit Service 9ccfef
	    strcpy(s1, getValueString(&range->minValue, smiType));
Packit Service 9ccfef
	    strcpy(s2, getValueString(&range->maxValue, smiType));
Packit Service 9ccfef
	    fprintf(f, "%s%s", (i == 0) ? " [" : ", ", s1);
Packit Service 9ccfef
	    if (strcmp(s1, s2)) fprintf(f, "..%s", s2);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) fprintf(f, "]");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintTypeTree(FILE *f, TypeNode *root, char *prefix)
Packit Service 9ccfef
{
Packit Service 9ccfef
    TypeNode *typeNode, *nextNode;
Packit Service 9ccfef
    char *name;
Packit Service 9ccfef
    int namelen = -1;
Packit Service 9ccfef
Packit Service 9ccfef
    if (root->smiModule) {
Packit Service 9ccfef
	fprintf(f, "%s  |\n", prefix);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (typeNode = root; typeNode; typeNode = typeNode->nextNodePtr) {
Packit Service 9ccfef
	if (typeNode->smiType) {
Packit Service 9ccfef
	    int len;
Packit Service 9ccfef
	    name = getTypeName(typeNode);
Packit Service 9ccfef
	    len = strlen(name);
Packit Service 9ccfef
	    if (len > namelen) namelen = len;
Packit Service 9ccfef
	    xfree(name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (typeNode = root; typeNode; typeNode = typeNode->nextNodePtr) {
Packit Service 9ccfef
 	if (typeNode != &typeRoot) {
Packit Service 9ccfef
	    char c = '+', *flags;
Packit Service 9ccfef
	    if (typeNode->smiType) {
Packit Service 9ccfef
		name = getTypeName(typeNode);
Packit Service 9ccfef
		c = getStatusChar(typeNode->smiType->status);
Packit Service 9ccfef
		if (getBaseTypeCount(typeNode->smiBasetype)) {
Packit Service 9ccfef
		    flags = getFlags(typeNode->smiModule, typeNode->smiType);
Packit Service 9ccfef
		    if (flags && *flags) {
Packit Service 9ccfef
			fprintf(f, "%s  %c-- %s %-*s", prefix, c, flags,
Packit Service 9ccfef
				namelen, name);
Packit Service 9ccfef
		    } else {
Packit Service 9ccfef
			fprintf(f, "%s  %c--%-*s", prefix, c,
Packit Service 9ccfef
				namelen, name);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprintRestrictions(f, typeNode->smiType);
Packit Service 9ccfef
		    if (typeNode->smiType->format) {
Packit Service 9ccfef
			fprintf(f, "\t\"%s\"", typeNode->smiType->format);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprintf(f, "\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		xfree(name);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprintf(f, "xxxx\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
 	}
Packit Service 9ccfef
 	if (typeNode->childNodePtr) {
Packit Service 9ccfef
 	    char *newprefix;
Packit Service 9ccfef
 	    newprefix = xmalloc(strlen(prefix)+10);
Packit Service 9ccfef
 	    strcpy(newprefix, prefix);
Packit Service 9ccfef
 	    if (typeNode != &typeRoot) {
Packit Service 9ccfef
		for (nextNode = typeNode->nextNodePtr;
Packit Service 9ccfef
		     nextNode; nextNode = nextNode->nextNodePtr) {
Packit Service 9ccfef
		    if (getBaseTypeCount(nextNode->smiBasetype)) {
Packit Service 9ccfef
			break;
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		}
Packit Service 9ccfef
 		if (nextNode) {
Packit Service 9ccfef
  		    strcat(newprefix, "  |");
Packit Service 9ccfef
 		} else {
Packit Service 9ccfef
 		    strcat(newprefix, "   ");
Packit Service 9ccfef
 		}
Packit Service 9ccfef
 	    }
Packit Service 9ccfef
 	    fprintTypeTree(f, typeNode->childNodePtr, newprefix);
Packit Service 9ccfef
 	    xfree(newprefix);
Packit Service 9ccfef
	    for (nextNode = typeNode->nextNodePtr;
Packit Service 9ccfef
		 nextNode; nextNode = nextNode->nextNodePtr) {
Packit Service 9ccfef
		if (getBaseTypeCount(nextNode->smiBasetype)) {
Packit Service 9ccfef
		    break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (nextNode) {
Packit Service 9ccfef
		fprintf(f, "%s  |\n", prefix);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
 	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void addType(SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiModule *smiModule;
Packit Service 9ccfef
    SmiType   *smiParentType;
Packit Service 9ccfef
Packit Service 9ccfef
    smiModule = smiGetTypeModule(smiType);
Packit Service 9ccfef
    if (! smiModule) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (findInTypeTree(&typeRoot, smiModule, smiType)) {
Packit Service 9ccfef
	return;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiParentType = smiGetParentType(smiType);
Packit Service 9ccfef
    if (smiParentType && smiParentType->name) {
Packit Service 9ccfef
 	if (smiParentType) {
Packit Service 9ccfef
 	    addType(smiParentType);
Packit Service 9ccfef
 	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    addToTypeTree(&typeRoot, smiModule, smiType);
Packit Service 9ccfef
    incrBaseTypeCount(smiType->basetype);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void dumpTypes(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	  *smiNode;
Packit Service 9ccfef
    SmiType       *smiType;
Packit Service 9ccfef
    SmiRefinement *smiRefinement;
Packit Service 9ccfef
    int		  i;
Packit Service 9ccfef
    FILE          *f = stdout;
Packit Service 9ccfef
    const unsigned int nodekind = SMI_NODEKIND_COLUMN | SMI_NODEKIND_SCALAR;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	f = fopen(output, "w");
Packit Service 9ccfef
	if (!f) {
Packit Service 9ccfef
	    fprintf(stderr, "smidump: cannot open %s for writing: ", output);
Packit Service 9ccfef
	    perror(NULL);
Packit Service 9ccfef
	    exit(1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    pmodc = modc;
Packit Service 9ccfef
    pmodv = modv;
Packit Service 9ccfef
    
Packit Service 9ccfef
    initBaseTypeCount();
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_UNITE)) {
Packit Service 9ccfef
	    initBaseTypeCount();
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	for (smiType = smiGetFirstType(modv[i]);
Packit Service 9ccfef
	     smiType;
Packit Service 9ccfef
	     smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	    addType(smiType);
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	for (smiNode = smiGetFirstNode(modv[i], nodekind);
Packit Service 9ccfef
	     smiNode;
Packit Service 9ccfef
	     smiNode = smiGetNextNode(smiNode, nodekind)) {
Packit Service 9ccfef
	    smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	    if (smiType) {
Packit Service 9ccfef
		if (!noimplicit && smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
		    addType(smiType);
Packit Service 9ccfef
		}
Packit Service 9ccfef
		incrBaseTypeCount(smiType->basetype);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	for (smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_COMPLIANCE);
Packit Service 9ccfef
	     smiNode;
Packit Service 9ccfef
	     smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
Packit Service 9ccfef
	    for (smiRefinement = smiGetFirstRefinement(smiNode);
Packit Service 9ccfef
		 smiRefinement;
Packit Service 9ccfef
		 smiRefinement = smiGetNextRefinement(smiRefinement)) {
Packit Service 9ccfef
		smiType = smiGetRefinementType(smiRefinement);
Packit Service 9ccfef
		if (smiType) {
Packit Service 9ccfef
		    if (!noimplicit
Packit Service 9ccfef
			&& smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
			addType(smiType);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    incrBaseTypeCount(smiType->basetype);
Packit Service 9ccfef
		}
Packit Service 9ccfef
		smiType = smiGetRefinementWriteType(smiRefinement);
Packit Service 9ccfef
		if (smiType) {
Packit Service 9ccfef
		    if (!noimplicit
Packit Service 9ccfef
			&& smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
			addType(smiType);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    incrBaseTypeCount(smiType->basetype);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_UNITE)) {
Packit Service 9ccfef
	    if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
		fprintf(f, "# %s type derivation tree (generated by smidump "
Packit Service 9ccfef
			SMI_VERSION_STRING ")\n\n", modv[i]->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
Packit Service 9ccfef
		fprintf(f, "# WARNING: this output may be incorrect due to "
Packit Service 9ccfef
			"significant parse errors\n\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintTypeTree(f, &typeRoot, "");
Packit Service 9ccfef
	    freeTypeTree(&typeRoot);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (flags & SMIDUMP_FLAG_UNITE) {
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
	    fprintf(f, "# united type derivation tree (generated by smidump "
Packit Service 9ccfef
		   SMI_VERSION_STRING ")\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
Packit Service 9ccfef
	    fprintf(f, "# WARNING: this output may be incorrect due to "
Packit Service 9ccfef
		    "significant parse errors\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintTypeTree(f, &typeRoot, "");
Packit Service 9ccfef
	freeTypeTree(&typeRoot);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (fflush(f) || ferror(f)) {
Packit Service 9ccfef
	perror("smidump: write error");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	fclose(f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void initTypes()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriverOption opt[] = {
Packit Service 9ccfef
	{ "no-implicit", OPT_FLAG, &noimplicit, 0,
Packit Service 9ccfef
	  "ignore implicit type definitions"},
Packit Service 9ccfef
        { 0, OPT_END, 0, 0 }
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"types",
Packit Service 9ccfef
	dumpTypes,
Packit Service 9ccfef
	SMI_FLAG_NODESCR,
Packit Service 9ccfef
	0,
Packit Service 9ccfef
	"recursive list of all derived types",
Packit Service 9ccfef
	opt,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}