Blame lib/smi.c

Packit 022b05
/*
Packit 022b05
 * smi.c --
Packit 022b05
 *
Packit 022b05
 *      Interface Implementation of libsmi.
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 1999 Frank Strauss, 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: smi.c 8071 2008-04-17 11:14:46Z schoenw $
Packit 022b05
 */
Packit 022b05
Packit 022b05
#include <config.h>
Packit 022b05
Packit 022b05
#include <stdlib.h>
Packit 022b05
#include <stdio.h>
Packit 022b05
#include <string.h>
Packit 022b05
#include <ctype.h>
Packit 022b05
#include <sys/types.h>
Packit 022b05
#ifdef HAVE_UNISTD_H
Packit 022b05
#include <unistd.h>
Packit 022b05
#endif
Packit 022b05
#ifdef HAVE_PWD_H
Packit 022b05
#include <pwd.h>
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#include "smi.h"
Packit 022b05
#include "data.h"
Packit 022b05
#include "error.h"
Packit 022b05
#include "util.h"
Packit 022b05
#include "snprintf.h"
Packit 022b05
Packit 022b05
#ifdef BACKEND_SMI
Packit 022b05
#include "scanner-smi.h"
Packit 022b05
#include "parser-smi.h"
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#ifdef BACKEND_SMING
Packit 022b05
#include "scanner-sming.h"
Packit 022b05
#include "parser-sming.h"
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#ifdef HAVE_DMALLOC_H
Packit 022b05
#include <dmalloc.h>
Packit 022b05
#endif
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
#ifndef MIN
Packit 022b05
#define MIN(a, b)       ((a) < (b) ? (a) : (b))
Packit 022b05
#define MAX(a, b)       ((a) < (b) ? (b) : (a))
Packit 022b05
#endif
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
const char *smi_library_version = SMI_LIBRARY_VERSION;
Packit 022b05
const char *smi_version_string = SMI_VERSION_STRING;
Packit 022b05
Packit 022b05
Handle *smiHandle = NULL;
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Internal functions.
Packit 022b05
 */
Packit 022b05
Packit 022b05
static void getModulenameAndName(const char *arg1, const char *arg2,
Packit 022b05
				 char **module, char **name)
Packit 022b05
{
Packit 022b05
    char	    *p;
Packit 022b05
    int		    l;
Packit 022b05
Packit 022b05
    if ((!arg1) && (!arg2)) {
Packit 022b05
	*module = NULL;
Packit 022b05
	*name = NULL;
Packit 022b05
    } else if (!arg2) {
Packit 022b05
	if (isupper((int)arg1[0])) {
Packit 022b05
	    if ((p = strstr(arg1, "::"))) {
Packit 022b05
		/* SMIng style module/label separator */
Packit 022b05
		*name = smiStrdup(&p[2]);
Packit 022b05
		l = strcspn(arg1, "::");
Packit 022b05
		*module = smiStrndup(arg1, l);
Packit 022b05
	    } else if ((p = strchr(arg1, '!'))) {
Packit 022b05
		/* old scotty style module/label separator */
Packit 022b05
		*name = smiStrdup(&p[1]);
Packit 022b05
		l = strcspn(arg1, "!");
Packit 022b05
		*module = smiStrndup(arg1, l);
Packit 022b05
	    } else if ((p = strchr(arg1, '.'))) {
Packit 022b05
		/* SMIv1/v2 style module/label separator */
Packit 022b05
		*name = smiStrdup(&p[1]);
Packit 022b05
		l = strcspn(arg1, ".");
Packit 022b05
		*module = smiStrndup(arg1, l);
Packit 022b05
	    } else {
Packit 022b05
		*name = smiStrdup(arg1);
Packit 022b05
		*module = smiStrdup("");
Packit 022b05
	    }
Packit 022b05
	} else {
Packit 022b05
	    *name = smiStrdup(arg1);
Packit 022b05
	    *module = smiStrdup("");
Packit 022b05
	}
Packit 022b05
    } else if (!arg1) {
Packit 022b05
	if (isupper((int)arg2[0])) {
Packit 022b05
	    if ((p = strstr(arg2, "::"))) {
Packit 022b05
		/* SMIng style module/label separator */
Packit 022b05
		*name = smiStrdup(&p[2]);
Packit 022b05
		l = strcspn(arg2, "::");
Packit 022b05
		*module = smiStrndup(arg2, l);
Packit 022b05
	    } else if ((p = strchr(arg2, '!'))) {
Packit 022b05
		/* old scotty style module/label separator */
Packit 022b05
		*name = smiStrdup(&p[1]);
Packit 022b05
		l = strcspn(arg2, "!");
Packit 022b05
		*module = smiStrndup(arg2, l);
Packit 022b05
	    } else if ((p = strchr(arg2, '.'))) {
Packit 022b05
		/* SMIv1/v2 style module/label separator */
Packit 022b05
		*name = smiStrdup(&p[1]);
Packit 022b05
		l = strcspn(arg2, ".");
Packit 022b05
		*module = smiStrndup(arg2, l);
Packit 022b05
	    } else {
Packit 022b05
		*name = smiStrdup(arg2);
Packit 022b05
		*module = smiStrdup("");
Packit 022b05
	    }
Packit 022b05
	} else {
Packit 022b05
	    *name = smiStrdup(arg2);
Packit 022b05
	    *module = smiStrdup("");
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	*module = smiStrdup(arg1);
Packit 022b05
	*name = smiStrdup(arg2);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static Node *getNode(unsigned int oidlen, SmiSubid oid[])
Packit 022b05
{
Packit 022b05
    Node *nodePtr, *parentPtr;
Packit 022b05
    unsigned int i;
Packit 022b05
Packit 022b05
    for(nodePtr = smiHandle->rootNodePtr, i=0; i < oidlen; i++) {
Packit 022b05
	parentPtr = nodePtr;
Packit 022b05
	nodePtr = findNodeByParentAndSubid(parentPtr, oid[i]);
Packit 022b05
	if (!nodePtr) {
Packit 022b05
	    return parentPtr;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return nodePtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static Object *getNextChildObject(Node *startNodePtr, Module *modulePtr,
Packit 022b05
				  SmiNodekind nodekind)
Packit 022b05
{
Packit 022b05
    Node   *nodePtr;
Packit 022b05
    Object *objectPtr = NULL;
Packit 022b05
Packit 022b05
    if (!startNodePtr || !modulePtr)
Packit 022b05
	return NULL;
Packit 022b05
Packit 022b05
    for (nodePtr = startNodePtr; nodePtr; nodePtr = nodePtr->nextPtr) {
Packit 022b05
	for (objectPtr = nodePtr->firstObjectPtr; objectPtr;
Packit 022b05
	     objectPtr = objectPtr->nextSameNodePtr) {
Packit 022b05
	    if (((!modulePtr) || (objectPtr->modulePtr == modulePtr)) &&
Packit 022b05
		((nodekind == SMI_NODEKIND_ANY) ||
Packit 022b05
		 (nodekind & objectPtr->export.nodekind))) {
Packit 022b05
		break;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	if (objectPtr) break;
Packit 022b05
	objectPtr = getNextChildObject(nodePtr->firstChildPtr,
Packit 022b05
				       modulePtr, nodekind);
Packit 022b05
	if (objectPtr) break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return objectPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Interface Functions.
Packit 022b05
 */
Packit 022b05
Packit 022b05
int smiInit(const char *tag)
Packit 022b05
{
Packit 022b05
    char *p, *pp, *tag2;
Packit 022b05
#ifdef HAVE_PWD_H
Packit 022b05
    struct passwd *pw;
Packit 022b05
#endif
Packit 022b05
Packit 022b05
    smiHandle = findHandleByName(tag);
Packit 022b05
    if (smiHandle) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
    smiHandle = addHandle(tag);
Packit 022b05
    
Packit 022b05
    smiDepth = 0;
Packit 022b05
Packit 022b05
    smiHandle->errorLevel = DEFAULT_ERRORLEVEL;
Packit 022b05
    smiHandle->errorHandler = smiErrorHandler;
Packit 022b05
#if !defined(_MSC_VER)
Packit 022b05
    smiHandle->cache = NULL;
Packit 022b05
    smiHandle->cacheProg = NULL;
Packit 022b05
#endif
Packit 022b05
    
Packit 022b05
    if (smiInitData()) {
Packit 022b05
	return -1;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    /*
Packit 022b05
     * Setup the SMI MIB module search path:
Packit 022b05
     *  1. set to builtin DEFAULT_SMIPATH
Packit 022b05
     *  2. read global config file if present (append/prepend/replace)
Packit 022b05
     *  3. read user config file if present (append/prepend/replace)
Packit 022b05
     *  4. evaluate SMIPATH env-var if set (append/prepend/replace)
Packit 022b05
     */
Packit 022b05
Packit 022b05
    /* 1. set to builtin DEFAULT_SMIPATH */
Packit 022b05
    smiHandle->path = smiStrdup(DEFAULT_SMIPATH);
Packit 022b05
Packit 022b05
    tag2 = smiStrdup(tag);
Packit 022b05
    if (tag2) tag2 = strtok(tag2, ":");
Packit 022b05
    if (tag2) {
Packit 022b05
	/* 2. read global config file if present (append/prepend/replace) */
Packit 022b05
	smiReadConfig(DEFAULT_GLOBALCONFIG, tag2);
Packit 022b05
#ifdef HAVE_PWD_H
Packit 022b05
	pw = getpwuid(getuid());
Packit 022b05
	if (pw && pw->pw_dir) {
Packit 022b05
	    /* 3. read user config file if present (append/prepend/replace) */
Packit 022b05
	    smiAsprintf(&p, "%s%c%s",
Packit 022b05
			pw->pw_dir, DIR_SEPARATOR, DEFAULT_USERCONFIG);
Packit 022b05
	    smiReadConfig(p, tag2);
Packit 022b05
	    smiFree(p);
Packit 022b05
	}
Packit 022b05
#endif
Packit 022b05
    }
Packit 022b05
    smiFree(tag2);
Packit 022b05
Packit 022b05
    /* 4. evaluate SMIPATH env-var if set (append/prepend/replace) */
Packit 022b05
    p = getenv("SMIPATH");
Packit 022b05
    if (p) {
Packit 022b05
	if (p[0] == PATH_SEPARATOR) {
Packit 022b05
	    smiAsprintf(&pp, "%s%s", smiHandle->path, p);
Packit 022b05
	    smiFree(smiHandle->path);
Packit 022b05
	    smiHandle->path = pp;
Packit 022b05
	} else if (p[strlen(p)-1] == PATH_SEPARATOR) {
Packit 022b05
	    smiAsprintf(&pp, "%s%s", p, smiHandle->path);
Packit 022b05
	    smiFree(smiHandle->path);
Packit 022b05
	    smiHandle->path = pp;
Packit 022b05
	} else {
Packit 022b05
	    smiHandle->path = smiStrdup(p);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    if (!smiHandle->path) {
Packit 022b05
	return -1;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return 0;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void smiExit()
Packit 022b05
{
Packit 022b05
    if (!smiHandle)
Packit 022b05
	return;
Packit 022b05
Packit 022b05
    smiFreeData();
Packit 022b05
Packit 022b05
    smiFree(smiHandle->path);
Packit 022b05
#if !defined(_MSC_VER)
Packit 022b05
    smiFree(smiHandle->cache);
Packit 022b05
    smiFree(smiHandle->cacheProg);
Packit 022b05
#endif
Packit 022b05
    
Packit 022b05
    removeHandle(smiHandle);
Packit 022b05
    
Packit 022b05
    smiHandle = NULL;
Packit 022b05
    return;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
char *smiGetPath()
Packit 022b05
{
Packit 022b05
    if (smiHandle->path) {
Packit 022b05
	return smiStrdup(smiHandle->path);
Packit 022b05
    } else {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiSetPath(const char *s)
Packit 022b05
{
Packit 022b05
    char *s2;
Packit 022b05
Packit 022b05
    if (!smiHandle) smiInit(NULL);
Packit 022b05
Packit 022b05
    if (!s) {
Packit 022b05
	smiFree(smiHandle->path);
Packit 022b05
	smiHandle->path = NULL;
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    s2 = smiStrdup(s);
Packit 022b05
    if (s2) {
Packit 022b05
	smiFree(smiHandle->path);
Packit 022b05
	smiHandle->path = s2;
Packit 022b05
	return 0;
Packit 022b05
    } else {
Packit 022b05
	return -1;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void smiSetSeverity(char *pattern, int severity)
Packit 022b05
{
Packit 022b05
    smiSetErrorSeverity(pattern, severity);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiReadConfig(const char *filename, const char *tag)
Packit 022b05
{
Packit 022b05
    FILE *file;
Packit 022b05
    char buf[201];
Packit 022b05
    char *cmd, *arg, *s;
Packit 022b05
    
Packit 022b05
    file = fopen(filename, "r");
Packit 022b05
    if (file) {
Packit 022b05
	while (!feof(file)) {
Packit 022b05
	    if (!fgets(buf, 200, file)) continue;
Packit 022b05
	    if ((!strlen(buf)) || (buf[0] == '#')) continue;
Packit 022b05
	    cmd = strtok(buf, " \t\n\r");
Packit 022b05
	    if (!cmd) continue;
Packit 022b05
	    if (cmd[0] == '#') continue;
Packit 022b05
	    if (cmd[strlen(cmd)-1] == ':') {
Packit 022b05
		if (!tag) continue;
Packit 022b05
		cmd[strlen(cmd)-1] = 0;
Packit 022b05
		if (strcmp(cmd, tag)) continue;
Packit 022b05
		cmd = strtok(NULL, " \t\n\r");
Packit 022b05
	    }
Packit 022b05
	    arg = strtok(NULL, " \t\n\r");
Packit 022b05
	    if (!strcmp(cmd, "load")) {
Packit 022b05
		smiLoadModule(arg);
Packit 022b05
	    } else if (!strcmp(cmd, "path")) {
Packit 022b05
		if (arg) {
Packit 022b05
		    if (arg[0] == PATH_SEPARATOR) {
Packit 022b05
			smiAsprintf(&s, "%s%s", smiHandle->path, arg);
Packit 022b05
			smiFree(smiHandle->path);
Packit 022b05
			smiHandle->path = s;
Packit 022b05
		    } else if (arg[strlen(arg)-1] == PATH_SEPARATOR) {
Packit 022b05
			smiAsprintf(&s, "%s%s", arg, smiHandle->path);
Packit 022b05
			smiFree(smiHandle->path);
Packit 022b05
			smiHandle->path = s;
Packit 022b05
		    } else {
Packit 022b05
			smiHandle->path = smiStrdup(arg);
Packit 022b05
		    }
Packit 022b05
		}
Packit 022b05
	    } else if (!strcmp(cmd, "cache")) {
Packit 022b05
#if !defined(_MSC_VER)
Packit 022b05
		smiFree(smiHandle->cache);
Packit 022b05
		smiFree(smiHandle->cacheProg);
Packit 022b05
#endif
Packit 022b05
		if (arg && strcmp(arg, "off")) {
Packit 022b05
#if !defined(_MSC_VER)
Packit 022b05
		    smiHandle->cache = smiStrdup(arg);
Packit 022b05
		    arg = strtok(NULL, "\n\r");
Packit 022b05
		    smiHandle->cacheProg = smiStrdup(arg);
Packit 022b05
#else
Packit 022b05
		    smiPrintError(NULL, ERR_CACHE_CONFIG_NOT_SUPPORTED,
Packit 022b05
				  filename);
Packit 022b05
#endif
Packit 022b05
		}
Packit 022b05
	    } else if (!strcmp(cmd, "level")) {
Packit 022b05
		smiSetErrorLevel(atoi(arg));
Packit 022b05
	    } else if (!strcmp(cmd, "hide")) {
Packit 022b05
		smiSetSeverity(arg, 9);
Packit 022b05
	    } else {
Packit 022b05
		smiPrintError(NULL, ERR_UNKNOWN_CONFIG_CMD, cmd, filename);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	fclose(file);
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
    return -1;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiIsLoaded(const char *module)
Packit 022b05
{
Packit 022b05
    if (!module)
Packit 022b05
	return 0;
Packit 022b05
    
Packit 022b05
    return isInView(module);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
char *smiLoadModule(const char *module)
Packit 022b05
{
Packit 022b05
    Module *modulePtr;
Packit 022b05
    
Packit 022b05
    if (!smiHandle) smiInit(NULL);
Packit 022b05
Packit 022b05
    if (smiIsPath(module)) {
Packit 022b05
Packit 022b05
	modulePtr = loadModule(module, NULL);
Packit 022b05
Packit 022b05
	if (modulePtr) {
Packit 022b05
	    if (!isInView(modulePtr->export.name)) {
Packit 022b05
		addView(modulePtr->export.name);
Packit 022b05
	    }
Packit 022b05
	    return modulePtr->export.name;
Packit 022b05
	} else {
Packit 022b05
	    return NULL;
Packit 022b05
	}
Packit 022b05
Packit 022b05
    } else {
Packit 022b05
	
Packit 022b05
	if ((modulePtr = findModuleByName(module))) {
Packit 022b05
	    /* already loaded. */
Packit 022b05
	    if (!isInView(module)) {
Packit 022b05
		addView(module);
Packit 022b05
	    }
Packit 022b05
	    return modulePtr->export.name;
Packit 022b05
	} else {
Packit 022b05
	    if ((modulePtr = loadModule(module, NULL))) {
Packit 022b05
		if (!isInView(module)) {
Packit 022b05
		    addView(module);
Packit 022b05
		}
Packit 022b05
		return modulePtr->export.name;
Packit 022b05
	    } else {
Packit 022b05
		return NULL;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
 
Packit 022b05
Packit 022b05
Packit 022b05
void smiSetErrorLevel(int level)
Packit 022b05
{
Packit 022b05
    if (!smiHandle) smiInit(NULL);
Packit 022b05
    
Packit 022b05
    smiHandle->errorLevel = level;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void smiSetFlags(int userflags)
Packit 022b05
{
Packit 022b05
    if (!smiHandle) smiInit(NULL);
Packit 022b05
    
Packit 022b05
    smiHandle->flags = (smiHandle->flags & ~SMI_FLAG_MASK) | userflags;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetFlags()
Packit 022b05
{
Packit 022b05
    if (!smiHandle) smiInit(NULL);
Packit 022b05
    
Packit 022b05
    return smiHandle->flags & SMI_FLAG_MASK;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiModule *smiGetModule(const char *module)
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
    
Packit 022b05
    if (!module) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    modulePtr = findModuleByName(module);
Packit 022b05
    
Packit 022b05
    if (!modulePtr) {
Packit 022b05
	modulePtr = loadModule(module, NULL);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiModule *smiGetFirstModule()
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
Packit 022b05
    for (modulePtr = smiHandle->firstModulePtr;
Packit 022b05
	 modulePtr && modulePtr->export.name &&
Packit 022b05
	     (strlen(modulePtr->export.name) == 0);
Packit 022b05
	 modulePtr = modulePtr->nextPtr);
Packit 022b05
Packit 022b05
    return &modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiModule *smiGetNextModule(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
    
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    
Packit 022b05
    for (modulePtr = ((Module *)smiModulePtr)->nextPtr;
Packit 022b05
	 modulePtr && modulePtr->export.name &&
Packit 022b05
	     (strlen(modulePtr->export.name) == 0);
Packit 022b05
	 modulePtr = modulePtr->nextPtr);
Packit 022b05
Packit 022b05
    return &modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiImport *smiGetFirstImport(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &((Module *)smiModulePtr)->firstImportPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiImport *smiGetNextImport(SmiImport *smiImportPtr)
Packit 022b05
{
Packit 022b05
    if (!smiImportPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return &((Import *)smiImportPtr)->nextPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiIsImported(SmiModule *smiModulePtr,
Packit 022b05
		  SmiModule *importedModulePtr,
Packit 022b05
		  char *importedName)
Packit 022b05
{
Packit 022b05
    Import	   *importPtr;
Packit 022b05
    Module	   *modulePtr;
Packit 022b05
    char	   *importedModule;
Packit 022b05
    
Packit 022b05
    if ((!smiModulePtr) || (!importedName)) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    modulePtr = (Module *)smiModulePtr;
Packit 022b05
    
Packit 022b05
    if (importedModulePtr) {
Packit 022b05
	importedModule = importedModulePtr->name;
Packit 022b05
    } else {
Packit 022b05
	importedModule = NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    for (importPtr = modulePtr->firstImportPtr; importPtr;
Packit 022b05
	 importPtr = importPtr->nextPtr) {
Packit 022b05
	if ((!strcmp(importedName, importPtr->export.name)) &&
Packit 022b05
	    ((!importedModule) ||
Packit 022b05
	     (!strcmp(importedModule, importPtr->export.module)))) {
Packit 022b05
	    return 1;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return 0;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiRevision *smiGetFirstRevision(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &((Module *)smiModulePtr)->firstRevisionPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiRevision *smiGetNextRevision(SmiRevision *smiRevisionPtr)
Packit 022b05
{
Packit 022b05
    if (!smiRevisionPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return &((Revision *)smiRevisionPtr)->nextPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetRevisionLine(SmiRevision *smiRevisionPtr)
Packit 022b05
{
Packit 022b05
    return ((Revision *)smiRevisionPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetType(SmiModule *smiModulePtr, char *type)
Packit 022b05
{
Packit 022b05
    Type	    *typePtr = NULL;
Packit 022b05
    Module	    *modulePtr = NULL;
Packit 022b05
    char	    *module2, *type2;
Packit 022b05
Packit 022b05
    if (!type) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    modulePtr = (Module *)smiModulePtr;
Packit 022b05
Packit 022b05
    getModulenameAndName(smiModulePtr ? smiModulePtr->name : NULL, type,
Packit 022b05
			 &module2, &type2);
Packit 022b05
    
Packit 022b05
    if (!modulePtr && module2 && strlen(module2)) {
Packit 022b05
	if (!(modulePtr = findModuleByName(module2))) {
Packit 022b05
	    modulePtr = loadModule(module2, NULL);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (modulePtr) {
Packit 022b05
	typePtr = findTypeByModuleAndName(modulePtr, type2);
Packit 022b05
    } else {
Packit 022b05
	typePtr = findTypeByName(type2);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    smiFree(module2);
Packit 022b05
    smiFree(type2);
Packit 022b05
Packit 022b05
    if (!typePtr ||
Packit 022b05
	typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetFirstType(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
    
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    for (typePtr = ((Module *)smiModulePtr)->firstTypePtr; typePtr;
Packit 022b05
	 typePtr = typePtr->nextPtr) {
Packit 022b05
	/* loop until we found a `real' type */
Packit 022b05
	if (typePtr->export.name &&
Packit 022b05
	    typePtr->export.basetype != SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	    break;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetNextType(SmiType *smiTypePtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
Packit 022b05
    if (!smiTypePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (typePtr = ((Type *)smiTypePtr)->nextPtr; typePtr;
Packit 022b05
	 typePtr = typePtr->nextPtr) {
Packit 022b05
	/* loop until we found a `real' type */
Packit 022b05
	if (typePtr->export.name &&
Packit 022b05
	    typePtr->export.basetype != SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	    break;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetParentType(SmiType *smiTypePtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
Packit 022b05
    if (!smiTypePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    typePtr = ((Type *)smiTypePtr)->parentPtr;
Packit 022b05
    
Packit 022b05
    if (!typePtr ||
Packit 022b05
	typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiModule *smiGetTypeModule(SmiType *smiTypePtr)
Packit 022b05
{
Packit 022b05
    return &((Type *)smiTypePtr)->modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
int smiGetTypeLine(SmiType *smiTypePtr)
Packit 022b05
{
Packit 022b05
    return ((Type *)smiTypePtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNamedNumber *smiGetFirstNamedNumber(SmiType *smiTypePtr)
Packit 022b05
{
Packit 022b05
    Type    *typePtr;
Packit 022b05
Packit 022b05
    typePtr = (Type *)smiTypePtr;
Packit 022b05
    
Packit 022b05
    if ((!typePtr) || (!typePtr->listPtr) ||
Packit 022b05
	((typePtr->export.basetype != SMI_BASETYPE_ENUM) &&
Packit 022b05
	 (typePtr->export.basetype != SMI_BASETYPE_BITS) && 
Packit 022b05
	 (typePtr->export.basetype != SMI_BASETYPE_POINTER))) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &((NamedNumber *)typePtr->listPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNamedNumber *smiGetNextNamedNumber(SmiNamedNumber *smiNamedNumberPtr)
Packit 022b05
{
Packit 022b05
    Type  *typePtr;
Packit 022b05
    List  *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiNamedNumberPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    typePtr = ((NamedNumber *)smiNamedNumberPtr)->typePtr;
Packit 022b05
Packit 022b05
    
Packit 022b05
    if ((!typePtr) || (!typePtr->listPtr) ||
Packit 022b05
	((typePtr->export.basetype != SMI_BASETYPE_ENUM) &&
Packit 022b05
	 (typePtr->export.basetype != SMI_BASETYPE_BITS))) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (listPtr = typePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
Packit 022b05
	if (((NamedNumber *)(listPtr->ptr))->export.name ==
Packit 022b05
	                                               smiNamedNumberPtr->name)
Packit 022b05
	    break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if ((!listPtr) || (!listPtr->nextPtr)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    return &((NamedNumber *)listPtr->nextPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiNamedNumber *smiGetAttributeFirstNamedNumber(SmiAttribute *smiAttributePtr)
Packit 022b05
{
Packit 022b05
    Attribute    *attributePtr;
Packit 022b05
Packit 022b05
    attributePtr = (Attribute *)smiAttributePtr;
Packit 022b05
    
Packit 022b05
    if ((!attributePtr) || (!attributePtr->listPtr) ||
Packit 022b05
	((attributePtr->export.basetype != SMI_BASETYPE_ENUM) &&
Packit 022b05
	 (attributePtr->export.basetype != SMI_BASETYPE_BITS) && 
Packit 022b05
	 (attributePtr->export.basetype != SMI_BASETYPE_POINTER))) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &((NamedNumber *)attributePtr->listPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNamedNumber *smiGetAttributeNextNamedNumber(SmiNamedNumber *smiNamedNumberPtr)
Packit 022b05
{
Packit 022b05
    Attribute  *attributePtr;
Packit 022b05
    List  *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiNamedNumberPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    attributePtr = (Attribute*)(((NamedNumber *)smiNamedNumberPtr)->typePtr);
Packit 022b05
Packit 022b05
    
Packit 022b05
    if ((!attributePtr) || (!attributePtr->listPtr) ||
Packit 022b05
	((attributePtr->export.basetype != SMI_BASETYPE_ENUM) &&
Packit 022b05
	 (attributePtr->export.basetype != SMI_BASETYPE_BITS))) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (listPtr = attributePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
Packit 022b05
	if (((NamedNumber *)(listPtr->ptr))->export.name ==
Packit 022b05
	                                               smiNamedNumberPtr->name)
Packit 022b05
	    break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if ((!listPtr) || (!listPtr->nextPtr)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    return &((NamedNumber *)listPtr->nextPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiRange *smiGetFirstRange(SmiType *smiTypePtr)
Packit 022b05
{
Packit 022b05
    Type    *typePtr;
Packit 022b05
Packit 022b05
    typePtr = (Type *)smiTypePtr;
Packit 022b05
    
Packit 022b05
    if ((!typePtr) || (!typePtr->listPtr) ||
Packit 022b05
	(typePtr->export.basetype == SMI_BASETYPE_ENUM) ||
Packit 022b05
	(typePtr->export.basetype == SMI_BASETYPE_BITS)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return &((Range *)typePtr->listPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiRange *smiGetNextRange(SmiRange *smiRangePtr)
Packit 022b05
{
Packit 022b05
    Type  *typePtr;
Packit 022b05
    List  *listPtr;
Packit 022b05
Packit 022b05
    if (!smiRangePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    typePtr = ((Range *)smiRangePtr)->typePtr;
Packit 022b05
Packit 022b05
    if ((!typePtr) || (!typePtr->listPtr) ||
Packit 022b05
	(typePtr->export.basetype == SMI_BASETYPE_ENUM) ||
Packit 022b05
	(typePtr->export.basetype == SMI_BASETYPE_BITS)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
 
Packit 022b05
    for (listPtr = typePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
Packit 022b05
	if (!memcmp(&((Range *)listPtr->ptr)->export.minValue,
Packit 022b05
		    &smiRangePtr->minValue, sizeof(struct SmiValue)))
Packit 022b05
	    break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if ((!listPtr) || (!listPtr->nextPtr)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    return &((Range *)listPtr->nextPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiRange *smiGetAttributeFirstRange(SmiAttribute *smiAttributePtr)
Packit 022b05
{
Packit 022b05
    Attribute    *attributePtr;
Packit 022b05
Packit 022b05
    attributePtr = (Attribute *)smiAttributePtr;
Packit 022b05
    
Packit 022b05
    if ((!attributePtr) || (!attributePtr->listPtr) ||
Packit 022b05
	(attributePtr->export.basetype == SMI_BASETYPE_ENUM) ||
Packit 022b05
	(attributePtr->export.basetype == SMI_BASETYPE_BITS)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return &((Range *)attributePtr->listPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiRange *smiGetAttributeNextRange(SmiRange *smiRangePtr)
Packit 022b05
{
Packit 022b05
    Attribute  *attributePtr;
Packit 022b05
    List  *listPtr;
Packit 022b05
Packit 022b05
    if (!smiRangePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    attributePtr = (Attribute*)((Range *)smiRangePtr)->typePtr;
Packit 022b05
Packit 022b05
    if ((!attributePtr) || (!attributePtr->listPtr) ||
Packit 022b05
	(attributePtr->export.basetype == SMI_BASETYPE_ENUM) ||
Packit 022b05
	(attributePtr->export.basetype == SMI_BASETYPE_BITS)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
 
Packit 022b05
    for (listPtr = attributePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
Packit 022b05
	if (!memcmp(&((Range *)listPtr->ptr)->export.minValue,
Packit 022b05
		    &smiRangePtr->minValue, sizeof(struct SmiValue)))
Packit 022b05
	    break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if ((!listPtr) || (!listPtr->nextPtr)) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    return &((Range *)listPtr->nextPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
SmiIdentity *smiGetFirstIdentity(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
	if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return ((Module *)smiModulePtr)->firstIdentityPtr ?
Packit 022b05
	&((Module *)smiModulePtr)->firstIdentityPtr->export : NULL;
Packit 022b05
    
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiIdentity *smiGetNextIdentity(SmiIdentity *smiIdentityPtr)
Packit 022b05
{
Packit 022b05
    if (!smiIdentityPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return ((Identity *)smiIdentityPtr)->nextPtr ?
Packit 022b05
	&((Identity *)smiIdentityPtr)->nextPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiModule *smiGetIdentityModule(SmiIdentity *smiIdentityPtr)
Packit 022b05
{
Packit 022b05
    return &((Identity *)smiIdentityPtr)->modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiIdentity *smiGetParentIdentity(SmiIdentity *smiIdentityPtr)
Packit 022b05
{
Packit 022b05
    return (SmiIdentity*)(((Identity *)smiIdentityPtr)->parentPtr);
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiIdentity *smiGetIdentity(SmiModule *smiModulePtr, char *identity)
Packit 022b05
{
Packit 022b05
	
Packit 022b05
	if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    else
Packit 022b05
    {
Packit 022b05
    	SmiIdentity *ide; 
Packit 022b05
    	
Packit 022b05
    	for(ide = smiGetFirstIdentity(smiModulePtr); 
Packit 022b05
    		ide;
Packit 022b05
    		ide = smiGetNextIdentity(ide))
Packit 022b05
    			if(!strncmp(ide->name,identity,64))return ide;
Packit 022b05
    		
Packit 022b05
    	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
}
Packit 022b05
Packit 022b05
int smiGetIdentityLine(SmiIdentity *smiIdentityPtr)
Packit 022b05
{
Packit 022b05
    return ((Identity *)smiIdentityPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
	
Packit 022b05
SmiClass *smiGetFirstClass(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
	if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return ((Module *)smiModulePtr)->firstClassPtr ?
Packit 022b05
	&((Module *)smiModulePtr)->firstClassPtr->export : NULL;
Packit 022b05
    
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiClass *smiGetNextClass(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    if (!smiClassPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return ((Class *)smiClassPtr)->nextPtr ?
Packit 022b05
	&((Class *)smiClassPtr)->nextPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiModule *smiGetClassModule(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    return &((Class *)smiClassPtr)->modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiClass *smiGetParentClass(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    return (SmiClass*)(((Class *)smiClassPtr)->parentPtr);
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiClass *smiGetClass(SmiModule *smiModulePtr, char *class)
Packit 022b05
{
Packit 022b05
	
Packit 022b05
	if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    else
Packit 022b05
    {
Packit 022b05
    	SmiClass *cl; 
Packit 022b05
    	
Packit 022b05
    	for(cl = smiGetFirstClass(smiModulePtr); 
Packit 022b05
    		cl;
Packit 022b05
    		cl = smiGetNextClass(cl))
Packit 022b05
    			if(!strncmp(cl->name,class,64))return cl;
Packit 022b05
    		
Packit 022b05
    	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
}
Packit 022b05
Packit 022b05
int smiGetClassLine(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    return ((Class *)smiClassPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiAttribute *smiGetFirstAttribute(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    Attribute *attributePtr;
Packit 022b05
    
Packit 022b05
    if (!smiClassPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
  	attributePtr = ((Class *)smiClassPtr)->firstAttributePtr;
Packit 022b05
    
Packit 022b05
    return &attributePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
 SmiAttribute *smiGetNextAttribute( SmiAttribute *smiTypePtr)
Packit 022b05
{
Packit 022b05
    Attribute *attributePtr;
Packit 022b05
Packit 022b05
    if (!smiTypePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    attributePtr = ((Attribute *)smiTypePtr)->nextPtr;
Packit 022b05
    
Packit 022b05
    return &attributePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiAttribute *smiGetAttribute(SmiClass *smiClassPtr, char *attribute)
Packit 022b05
{
Packit 022b05
    Attribute *attributePtr;
Packit 022b05
    
Packit 022b05
    if (! smiClassPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    attributePtr = ((Class *)smiClassPtr)->firstAttributePtr;
Packit 022b05
    
Packit 022b05
    for (attributePtr = ((Class *)smiClassPtr)->firstAttributePtr; 
Packit 022b05
	 attributePtr; attributePtr = attributePtr->nextPtr)
Packit 022b05
    {
Packit 022b05
	if (!strncmp(attributePtr->export.name, attribute,64)) {
Packit 022b05
	    return &attributePtr->export;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    /*
Packit 022b05
     * attribute might belong to the parent so check parent if
Packit 022b05
     * attribute not found
Packit 022b05
     */
Packit 022b05
    
Packit 022b05
    smiClassPtr = smiGetParentClass(smiClassPtr);
Packit 022b05
    attributePtr = (Attribute*)smiGetAttribute(smiClassPtr , attribute);
Packit 022b05
  		
Packit 022b05
    return &attributePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiType *smiGetAttributeParentType(SmiAttribute *smiAttributePtr)
Packit 022b05
{
Packit 022b05
    Type *parentTypePtr;
Packit 022b05
    
Packit 022b05
    if (! smiAttributePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    parentTypePtr = ((Attribute*)smiAttributePtr)->parentTypePtr;
Packit 022b05
    
Packit 022b05
    return (parentTypePtr) ? &parentTypePtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiClass *smiGetAttributeParentClass( SmiAttribute *smiAttributePtr)
Packit 022b05
{
Packit 022b05
    Class *parentClassPtr;
Packit 022b05
    
Packit 022b05
    if (! smiAttributePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    parentClassPtr = ((Attribute*)smiAttributePtr)->parentClassPtr;
Packit 022b05
Packit 022b05
    return parentClassPtr ? &parentClassPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiAttribute *smiGetFirstUniqueAttribute(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    Class *classPtr;
Packit 022b05
    
Packit 022b05
    if (! smiClassPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    classPtr = (Class*)smiClassPtr;
Packit 022b05
	
Packit 022b05
    if (! classPtr->uniqueList) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    if (classPtr->uniqueList->ptr == classPtr) {
Packit 022b05
	return NULL; /* scalar class */
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return (SmiAttribute*)(classPtr->uniqueList->ptr);
Packit 022b05
}
Packit 022b05
Packit 022b05
SmiAttribute *smiGetNextUniqueAttribute( SmiAttribute *smiTypePtr)
Packit 022b05
{
Packit 022b05
    Class *classPtr;
Packit 022b05
    List  *listPtr; 
Packit 022b05
    
Packit 022b05
    if (! smiTypePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    classPtr = ((Attribute*)smiTypePtr)->classPtr;
Packit 022b05
    
Packit 022b05
    if (classPtr && classPtr->uniqueList) {
Packit 022b05
	for (listPtr=classPtr->uniqueList;listPtr; listPtr=listPtr->nextPtr) {
Packit 022b05
	    if (&((Attribute*)(listPtr->ptr))->export ==  smiTypePtr) {	
Packit 022b05
		if (listPtr->nextPtr) {
Packit 022b05
		    return &((Attribute*)(listPtr->nextPtr->ptr))->export;
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetAttributeLine(SmiAttribute *smiAttributePtr)
Packit 022b05
{
Packit 022b05
    return ((Attribute *)smiAttributePtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiIsClassScalar(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    Class *classPtr;
Packit 022b05
    
Packit 022b05
    if (! smiClassPtr) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
	
Packit 022b05
    classPtr = (Class*)smiClassPtr;
Packit 022b05
    
Packit 022b05
    if (! classPtr->uniqueList) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return (classPtr->uniqueList->ptr == classPtr);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiEvent *smiGetFirstEvent(SmiClass *smiClassPtr)
Packit 022b05
{
Packit 022b05
    Event *eventPtr;
Packit 022b05
    
Packit 022b05
    if (! smiClassPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    eventPtr = ((Class *)smiClassPtr)->firstEventPtr;
Packit 022b05
    return &(eventPtr->export);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiEvent *smiGetNextEvent(SmiEvent *smiEventPtr)
Packit 022b05
{
Packit 022b05
    Event *eventPtr;
Packit 022b05
Packit 022b05
    if (! smiEventPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    eventPtr = ((Event *)smiEventPtr)->nextPtr;
Packit 022b05
    return &eventPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetEventLine(SmiEvent *smiEventPtr)
Packit 022b05
{
Packit 022b05
    return ((Event *)smiEventPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
	
Packit 022b05
Packit 022b05
SmiMacro *smiGetMacro(SmiModule *smiModulePtr, char *macro)
Packit 022b05
{
Packit 022b05
    Macro	    *macroPtr = NULL;
Packit 022b05
    Module	    *modulePtr = NULL;
Packit 022b05
    char	    *module2, *macro2;
Packit 022b05
    
Packit 022b05
    if (!macro) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    modulePtr = (Module *)smiModulePtr;
Packit 022b05
Packit 022b05
    getModulenameAndName(smiModulePtr ? smiModulePtr->name : NULL, macro,
Packit 022b05
			 &module2, &macro2);
Packit 022b05
    
Packit 022b05
    if (!modulePtr && module2 && strlen(module2)) {
Packit 022b05
	if (!(modulePtr = findModuleByName(module2))) {
Packit 022b05
	    modulePtr = loadModule(module2, NULL);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (modulePtr) {
Packit 022b05
	macroPtr = findMacroByModuleAndName(modulePtr, macro2);
Packit 022b05
    } else {
Packit 022b05
	macroPtr = findMacroByName(macro2);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    smiFree(module2);
Packit 022b05
    smiFree(macro2);
Packit 022b05
    return macroPtr ? &macroPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiMacro *smiGetFirstMacro(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return ((Module *)smiModulePtr)->firstMacroPtr ?
Packit 022b05
	&((Module *)smiModulePtr)->firstMacroPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiMacro *smiGetNextMacro(SmiMacro *smiMacroPtr)
Packit 022b05
{
Packit 022b05
    if (!smiMacroPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return ((Macro *)smiMacroPtr)->nextPtr ?
Packit 022b05
	&((Macro *)smiMacroPtr)->nextPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
SmiModule *smiGetMacroModule(SmiMacro *smiMacroPtr)
Packit 022b05
{
Packit 022b05
    return &((Macro *)smiMacroPtr)->modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetMacroLine(SmiMacro *smiMacroPtr)
Packit 022b05
{
Packit 022b05
    return ((Macro *)smiMacroPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetNode(SmiModule *smiModulePtr, const char *node)
Packit 022b05
{
Packit 022b05
    Object	    *objectPtr = NULL;
Packit 022b05
    Module	    *modulePtr = NULL;
Packit 022b05
    Node            *nodePtr;
Packit 022b05
    char	    *module2, *node2, *p;
Packit 022b05
    unsigned int    oidlen;
Packit 022b05
    SmiSubid	    oid[128];
Packit 022b05
    
Packit 022b05
    if (!node) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    modulePtr = (Module *)smiModulePtr;
Packit 022b05
Packit 022b05
    getModulenameAndName(smiModulePtr ? smiModulePtr->name : NULL, node,
Packit 022b05
			 &module2, &node2);
Packit 022b05
    
Packit 022b05
    if (!modulePtr && module2 && strlen(module2)) {
Packit 022b05
	if (!(modulePtr = findModuleByName(module2))) {
Packit 022b05
	    modulePtr = loadModule(module2, NULL);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (isdigit((int)node2[0])) {
Packit Service 419abb
	for (oidlen = 0, p = strtok(node2, ". "); p;
Packit 022b05
	     oidlen++, p = strtok(NULL, ". ")) {
Packit 022b05
	    oid[oidlen] = strtoul(p, NULL, 0);
Packit 022b05
	}
Packit 022b05
	nodePtr = getNode(oidlen, oid);
Packit 022b05
	if (nodePtr) {
Packit 022b05
	    if (modulePtr) {
Packit 022b05
		objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
Packit 022b05
	    } else {
Packit 022b05
		objectPtr = findObjectByNode(nodePtr);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	p = strtok(node2, ". ");
Packit 022b05
	if (modulePtr) {
Packit 022b05
	    objectPtr = findObjectByModuleAndName(modulePtr, p);
Packit 022b05
	} else {
Packit 022b05
	    objectPtr = findObjectByName(p);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    smiFree(module2);
Packit 022b05
    smiFree(node2);
Packit 022b05
    return objectPtr ? &objectPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetNodeByOID(unsigned int oidlen, SmiSubid oid[])
Packit 022b05
{
Packit 022b05
    Node            *nodePtr;
Packit 022b05
    Object	    *objectPtr;
Packit 022b05
    
Packit 022b05
    if (!oidlen) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    nodePtr = getNode(oidlen, oid);
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    objectPtr = findObjectByNode(nodePtr);
Packit 022b05
Packit 022b05
    return objectPtr ? &objectPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetFirstNode(SmiModule *smiModulePtr, SmiNodekind nodekind)
Packit 022b05
{
Packit 022b05
    Module *modulePtr;
Packit 022b05
    Node   *nodePtr = NULL;
Packit 022b05
    Object *objectPtr;
Packit 022b05
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    modulePtr = (Module *)smiModulePtr;
Packit 022b05
Packit 022b05
    if (modulePtr && modulePtr->prefixNodePtr) {
Packit 022b05
	/* start at the common oid prefix of this module */
Packit 022b05
	nodePtr = modulePtr->prefixNodePtr;
Packit 022b05
    } else {
Packit 022b05
	nodePtr = smiHandle->rootNodePtr->firstChildPtr;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    do {
Packit 022b05
	objectPtr = getNextChildObject(nodePtr, modulePtr, nodekind);
Packit 022b05
	
Packit 022b05
	if (objectPtr)
Packit 022b05
	    return &objectPtr->export;
Packit 022b05
	
Packit 022b05
	if (nodePtr->firstChildPtr) {
Packit 022b05
	    nodePtr = nodePtr->firstChildPtr;
Packit 022b05
	} else if (nodePtr->nextPtr) {
Packit 022b05
	    nodePtr = nodePtr->nextPtr;
Packit 022b05
	} else {
Packit 022b05
	    for (nodePtr = nodePtr->parentPtr;
Packit 022b05
		 nodePtr && (nodePtr->parentPtr) && (!nodePtr->nextPtr);
Packit 022b05
		 nodePtr = nodePtr->parentPtr);
Packit 022b05
	    if (nodePtr) nodePtr = nodePtr->nextPtr;
Packit 022b05
	}
Packit 022b05
    } while (nodePtr);
Packit 022b05
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetNextNode(SmiNode *smiNodePtr, SmiNodekind nodekind)
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
    Object	      *objectPtr;
Packit 022b05
    Node	      *nodePtr;
Packit 022b05
    int               i;
Packit 022b05
    
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = (Object *)smiNodePtr;
Packit 022b05
    nodePtr = objectPtr->nodePtr;
Packit 022b05
    modulePtr = objectPtr->modulePtr;
Packit 022b05
Packit 022b05
    if (!modulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    do {
Packit 022b05
	if (nodePtr->firstChildPtr) {
Packit 022b05
	    nodePtr = nodePtr->firstChildPtr;
Packit 022b05
	} else if (nodePtr->nextPtr) {
Packit 022b05
	    nodePtr = nodePtr->nextPtr;
Packit 022b05
	} else {
Packit 022b05
	    for (nodePtr = nodePtr->parentPtr;
Packit 022b05
		 (nodePtr->parentPtr) && (!nodePtr->nextPtr);
Packit 022b05
		 nodePtr = nodePtr->parentPtr);
Packit 022b05
	    nodePtr = nodePtr->nextPtr;
Packit 022b05
	    /* did we move outside the common oid prefix of this module? */
Packit 022b05
	    for (i = 0; i < modulePtr->prefixNodePtr->oidlen; i++)
Packit 022b05
		if ((!nodePtr) || (!nodePtr->oid) ||
Packit 022b05
		    (nodePtr->oid[i] != modulePtr->prefixNodePtr->oid[i]))
Packit 022b05
		    return NULL;
Packit 022b05
	}
Packit 022b05
Packit 022b05
	objectPtr = getNextChildObject(nodePtr, modulePtr, nodekind);
Packit 022b05
Packit 022b05
	if (objectPtr)
Packit 022b05
	    return &objectPtr->export;
Packit 022b05
	
Packit 022b05
    } while (nodePtr);
Packit 022b05
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetParentNode(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
    Object	      *objectPtr;
Packit 022b05
    Import	      *importPtr;
Packit 022b05
    Node	      *nodePtr;
Packit 022b05
    
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = (Object *)smiNodePtr;
Packit 022b05
    nodePtr = objectPtr->nodePtr;
Packit 022b05
    modulePtr = objectPtr->modulePtr;
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (nodePtr == smiHandle->rootNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    nodePtr = nodePtr->parentPtr;
Packit 022b05
    if (! nodePtr) {
Packit 022b05
        return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    /*
Packit 022b05
     * First, try to find a definition in the same module.
Packit 022b05
     */
Packit 022b05
    objectPtr = NULL;
Packit 022b05
    if (modulePtr) {
Packit 022b05
	objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    /*
Packit 022b05
     * If found, check if it's imported. In case, get the original definition.
Packit 022b05
     */
Packit 022b05
    if (objectPtr) {
Packit 022b05
	importPtr = findImportByName(objectPtr->export.name,
Packit 022b05
				     objectPtr->modulePtr);
Packit 022b05
	if (importPtr) {
Packit 022b05
	    objectPtr = findObjectByModulenameAndNode(importPtr->export.module,
Packit 022b05
						      nodePtr);
Packit 022b05
	} else {
Packit 022b05
	    objectPtr = NULL;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    /*
Packit 022b05
     * If not yet found, try to find any definition.
Packit 022b05
     */
Packit 022b05
    if (!objectPtr) {
Packit 022b05
	objectPtr = findObjectByNode(nodePtr);
Packit 022b05
Packit 022b05
	if ((!objectPtr) && (nodePtr->parentPtr)) {
Packit 022b05
	    /* an implicitly created node, e.g. gaga.0 in an object
Packit 022b05
	     * definition with oid == gaga.0.1.
Packit 022b05
	     */
Packit 022b05
	    objectPtr = addObject(SMI_UNKNOWN_LABEL,
Packit 022b05
				  nodePtr->parentPtr, nodePtr->subid,
Packit 022b05
				  0, NULL);
Packit 022b05
	    objectPtr->nodePtr = nodePtr;
Packit 022b05
	    objectPtr->modulePtr = modulePtr;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return objectPtr ? &objectPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetRelatedNode(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return &((Object *)smiNodePtr)->relatedPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetFirstChildNode(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
    Object	      *objectPtr;
Packit 022b05
    Node	      *nodePtr;
Packit 022b05
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = (Object *)smiNodePtr;
Packit 022b05
    nodePtr = objectPtr->nodePtr;
Packit 022b05
    modulePtr = objectPtr->modulePtr;
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    nodePtr = nodePtr->firstChildPtr;
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
Packit 022b05
    if (!objectPtr) objectPtr = findObjectByNode(nodePtr);
Packit 022b05
Packit 022b05
    return objectPtr ? &objectPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetNextChildNode(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    Module	      *modulePtr;
Packit 022b05
    Object	      *objectPtr;
Packit 022b05
    Node	      *nodePtr;
Packit 022b05
    
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = (Object *)smiNodePtr;
Packit 022b05
    nodePtr = objectPtr->nodePtr;
Packit 022b05
    modulePtr = objectPtr->modulePtr;
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    nodePtr = nodePtr->nextPtr;
Packit 022b05
Packit 022b05
    if (!nodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
Packit 022b05
    if (!objectPtr) objectPtr = findObjectByNode(nodePtr);
Packit 022b05
    
Packit 022b05
    return objectPtr ? &objectPtr->export : NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetModuleIdentityNode(SmiModule *smiModulePtr)
Packit 022b05
{
Packit 022b05
    if (!smiModulePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return &((Module *)smiModulePtr)->objectPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiModule *smiGetNodeModule(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    return &((Object *)smiNodePtr)->modulePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetNodeType(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
Packit 022b05
    typePtr = ((Object *)smiNodePtr)->typePtr;
Packit 022b05
    
Packit 022b05
    if (!typePtr ||
Packit 022b05
	typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetNodeLine(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    return ((Object *)smiNodePtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiElement *smiGetFirstElement(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    List	      *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    listPtr = ((Object *)smiNodePtr)->listPtr;
Packit 022b05
Packit 022b05
    return (SmiElement *)listPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiElement *smiGetNextElement(SmiElement *smiElementPtr)
Packit 022b05
{
Packit 022b05
    List	      *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiElementPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    listPtr = ((List *)smiElementPtr)->nextPtr;
Packit 022b05
    
Packit 022b05
    return (SmiElement *)listPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetElementNode(SmiElement *smiElementPtr)
Packit 022b05
{
Packit 022b05
    if ((Object *)((List *)smiElementPtr)->ptr)
Packit 022b05
        return &((Object *)((List *)smiElementPtr)->ptr)->export;
Packit 022b05
    else
Packit 022b05
        return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiOption *smiGetFirstOption(SmiNode *smiComplianceNodePtr)
Packit 022b05
{
Packit 022b05
    Object	      *objectPtr;
Packit 022b05
    
Packit 022b05
    if (!smiComplianceNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = (Object *)smiComplianceNodePtr;
Packit 022b05
    
Packit 022b05
    if (!objectPtr->optionlistPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (objectPtr->export.nodekind != SMI_NODEKIND_COMPLIANCE) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
						     
Packit 022b05
    return &((Option *)objectPtr->optionlistPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiOption *smiGetNextOption(SmiOption *smiOptionPtr)
Packit 022b05
{
Packit 022b05
    List	      *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiOptionPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
						     
Packit 022b05
    for (listPtr =
Packit 022b05
	    ((Option *)smiOptionPtr)->compliancePtr->optionlistPtr;
Packit 022b05
	 listPtr;
Packit 022b05
	 listPtr = listPtr->nextPtr) {
Packit 022b05
	if ((Option *)(listPtr->ptr) == (Option *)smiOptionPtr) {
Packit 022b05
	    if (listPtr->nextPtr) {
Packit 022b05
		return &((Option *)listPtr->nextPtr->ptr)->export;
Packit 022b05
	    } else {
Packit 022b05
		return NULL;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetOptionNode(SmiOption *smiOptionPtr)
Packit 022b05
{
Packit 022b05
    return &((Option *)smiOptionPtr)->objectPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetOptionLine(SmiOption *smiOptionPtr)
Packit 022b05
{
Packit 022b05
    return ((Option *)smiOptionPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiRefinement *smiGetFirstRefinement(SmiNode *smiComplianceNodePtr)
Packit 022b05
{
Packit 022b05
    Object	      *objectPtr;
Packit 022b05
    
Packit 022b05
    if (!smiComplianceNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    objectPtr = (Object *)smiComplianceNodePtr;
Packit 022b05
    
Packit 022b05
    if (!objectPtr->refinementlistPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (objectPtr->export.nodekind != SMI_NODEKIND_COMPLIANCE) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
						     
Packit 022b05
    return &((Refinement *)objectPtr->refinementlistPtr->ptr)->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiRefinement *smiGetNextRefinement(SmiRefinement *smiRefinementPtr)
Packit 022b05
{
Packit 022b05
    List	      *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiRefinementPtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
						     
Packit 022b05
    for (listPtr =
Packit 022b05
	    ((Refinement *)smiRefinementPtr)->compliancePtr->refinementlistPtr;
Packit 022b05
	 listPtr;
Packit 022b05
	 listPtr = listPtr->nextPtr) {
Packit 022b05
	if ((Refinement *)(listPtr->ptr) == (Refinement *)smiRefinementPtr) {
Packit 022b05
	    if (listPtr->nextPtr) {
Packit 022b05
		return &((Refinement *)listPtr->nextPtr->ptr)->export;
Packit 022b05
	    } else {
Packit 022b05
		return NULL;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return NULL;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiNode *smiGetRefinementNode(SmiRefinement *smiRefinementPtr)
Packit 022b05
{
Packit 022b05
    return &((Refinement *)smiRefinementPtr)->objectPtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetRefinementType(SmiRefinement *smiRefinementPtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
Packit 022b05
    typePtr = ((Refinement *)smiRefinementPtr)->typePtr;
Packit 022b05
    
Packit 022b05
    if (!typePtr ||
Packit 022b05
	typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiType *smiGetRefinementWriteType(SmiRefinement *smiRefinementPtr)
Packit 022b05
{
Packit 022b05
    Type *typePtr;
Packit 022b05
Packit 022b05
    typePtr = ((Refinement *)smiRefinementPtr)->writetypePtr;
Packit 022b05
    
Packit 022b05
    if (!typePtr ||
Packit 022b05
	typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return &typePtr->export;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetRefinementLine(SmiRefinement *smiRefinementPtr)
Packit 022b05
{
Packit 022b05
    return ((Refinement *)smiRefinementPtr)->line;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
SmiElement *smiGetFirstUniquenessElement(SmiNode *smiNodePtr)
Packit 022b05
{
Packit 022b05
    List	      *listPtr;
Packit 022b05
    
Packit 022b05
    if (!smiNodePtr) {
Packit 022b05
	return NULL;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    listPtr = ((Object *)smiNodePtr)->uniquenessPtr;
Packit 022b05
Packit 022b05
    return (SmiElement *)listPtr;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
char *smiRenderOID(unsigned int oidlen, SmiSubid *oid, int flags)
Packit 022b05
{
Packit 022b05
    SmiNode *nodePtr = NULL;
Packit 022b05
    SmiModule *modulePtr = NULL;
Packit 022b05
    unsigned int i = 0;
Packit 022b05
    char *ss, *s = NULL;
Packit 022b05
Packit 022b05
    if (!oid) {
Packit 022b05
	if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
	    smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
	} else {
Packit 022b05
	    s = NULL;
Packit 022b05
	}
Packit 022b05
	return s;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    if (flags & (SMI_RENDER_NAME | SMI_RENDER_QUALIFIED)) {
Packit 022b05
	int len;
Packit 022b05
	for (len = oidlen; len; len--) {
Packit 022b05
	    nodePtr = smiGetNodeByOID(len, oid);
Packit 022b05
	    if (! nodePtr || nodePtr->name) break;
Packit 022b05
	}
Packit 022b05
	if (nodePtr && nodePtr->name) {
Packit 022b05
	    i = nodePtr->oidlen;
Packit 022b05
	    if (flags & SMI_RENDER_QUALIFIED) {
Packit 022b05
		modulePtr = smiGetNodeModule(nodePtr);
Packit 022b05
	    }
Packit 022b05
	    if (modulePtr) {
Packit 022b05
		smiAsprintf(&s, "%s::%s",
Packit 022b05
			    modulePtr->name, nodePtr->name);
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "%s", nodePtr->name);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (; i < oidlen; i++) {
Packit 022b05
	ss = s;
Packit 022b05
	smiAsprintf(&s, "%s%s%u", ss ? ss : "", i ? "." : "", oid[i]);
Packit 022b05
	smiFree(ss);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if ((!s) && (flags & SMI_RENDER_UNKNOWN)) {
Packit 022b05
	smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
char *smiRenderValue(SmiValue *smiValuePtr, SmiType *smiTypePtr, int flags)
Packit 022b05
{
Packit 022b05
    unsigned int i, pfx;
Packit 022b05
    int j, k, n, have_pfx;
Packit 022b05
    char *last_fmt, *fmt;
Packit 022b05
    SmiUnsigned64 vv;
Packit 022b05
    int xlen;
Packit 022b05
    SmiNamedNumber *nn;
Packit 022b05
    char *s, *ss;
Packit 022b05
    char f[8];
Packit 022b05
    SmiUnsigned32 v32;
Packit 022b05
    SmiUnsigned64 v64;
Packit 022b05
    
Packit 022b05
    if (!smiValuePtr) {
Packit 022b05
	if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
	    smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
	} else {
Packit 022b05
	    s = NULL;
Packit 022b05
	}
Packit 022b05
	return s;
Packit 022b05
    }
Packit 022b05
    
Packit 022b05
    switch (smiValuePtr->basetype) {
Packit 022b05
    case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
	if (!(flags & SMI_RENDER_FORMAT) ||
Packit 022b05
	    !smiTypePtr || !smiTypePtr->format ||
Packit 022b05
	    !strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
Packit 022b05
	    if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
Packit 022b05
		(smiTypePtr->format[1] == '-')) {
Packit 022b05
		i = atoi(&smiTypePtr->format[2]);
Packit 022b05
		if (i < 0) i = 0;
Packit 022b05
		if (i > 20) i = 20;
Packit 022b05
		smiAsprintf(&s, "%0*lu.",
Packit 022b05
			    1 + i,
Packit 022b05
			    smiValuePtr->value.unsigned32);
Packit 022b05
		if (s) {
Packit 022b05
		    for (j = strlen(s) - 1; i > 0; i--, j--) {
Packit 022b05
			s[j] = s[j-1];
Packit 022b05
		    }
Packit 022b05
		    s[j] = '.';
Packit 022b05
		}
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "%lu", smiValuePtr->value.unsigned32);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'x') {
Packit 022b05
	    smiAsprintf(&s, "%lx", smiValuePtr->value.unsigned32);
Packit 022b05
	} else if (smiTypePtr->format[0] == 'o') {
Packit 022b05
	    smiAsprintf(&s, "%lo", smiValuePtr->value.unsigned32);
Packit 022b05
	} else if (smiTypePtr->format[0] == 'b') {
Packit 022b05
	    for (i = 32 - 1;
Packit 022b05
		 i > 0 && !(smiValuePtr->value.unsigned32 & (1 << i)); i--);
Packit 022b05
	    s = smiMalloc(i + 1 + 1);
Packit 022b05
	    if (s) {
Packit 022b05
		for (j = 0; i >= 0; i--, j++) {
Packit 022b05
		    s[j] = smiValuePtr->value.unsigned32 & (1<
Packit 022b05
		}
Packit 022b05
		s[j] = 0;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_UNSIGNED64:
Packit 022b05
	if (!(flags & SMI_RENDER_FORMAT) ||
Packit 022b05
	    !smiTypePtr || !smiTypePtr->format ||
Packit 022b05
	    !strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
Packit 022b05
	    if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
Packit 022b05
		(smiTypePtr->format[1] == '-')) {
Packit 022b05
		i = atoi(&smiTypePtr->format[2]);
Packit 022b05
		if (i < 0) i = 0;
Packit 022b05
		if (i > 20) i = 20;
Packit 022b05
		sprintf(f, "%%0%s.", UINT64_FORMAT);
Packit 022b05
		f[2] = '*';
Packit 022b05
		smiAsprintf(&s, f,
Packit 022b05
			    1 + i,
Packit 022b05
			    smiValuePtr->value.unsigned64);
Packit 022b05
		if (s) {
Packit 022b05
		    for (j = strlen(s) - 1; i > 0; i--, j--) {
Packit 022b05
			s[j] = s[j-1];
Packit 022b05
		    }
Packit 022b05
		    s[j] = '.';
Packit 022b05
		}
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, UINT64_FORMAT, smiValuePtr->value.unsigned64);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'x') {
Packit 022b05
	    strcpy(f, UINT64_FORMAT);
Packit 022b05
	    f[strlen(f)-1] = 'x';
Packit 022b05
	    smiAsprintf(&s, f, smiValuePtr->value.unsigned64);
Packit 022b05
	} else if (smiTypePtr->format[0] == 'o') {
Packit 022b05
	    strcpy(f, UINT64_FORMAT);
Packit 022b05
	    f[strlen(f)-1] = 'o';
Packit 022b05
	    smiAsprintf(&s, f, smiValuePtr->value.unsigned64);
Packit 022b05
	} else if (smiTypePtr->format[0] == 'b') {
Packit 022b05
	    for (i = 64 - 1;
Packit 022b05
		 i > 0 && !(smiValuePtr->value.unsigned64 & (1 << i)); i--);
Packit 022b05
	    s = smiMalloc(i + 1 + 1);
Packit 022b05
	    if (s) {
Packit 022b05
		for (j = 0; i >= 0; i--, j++) {
Packit 022b05
		    s[j] = smiValuePtr->value.unsigned64 & (1<
Packit 022b05
		}
Packit 022b05
		s[j] = 0;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_INTEGER32:
Packit 022b05
	if (!(flags & SMI_RENDER_FORMAT) ||
Packit 022b05
	    !smiTypePtr || !smiTypePtr->format ||
Packit 022b05
	    !strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
Packit 022b05
	    if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
Packit 022b05
		(smiTypePtr->format[1] == '-')) {
Packit 022b05
		i = atoi(&smiTypePtr->format[2]);
Packit 022b05
		if (i < 0) i = 0;
Packit 022b05
		if (i > 20) i = 20;
Packit 022b05
		smiAsprintf(&s, "%0*ld.",
Packit 022b05
			    1 + i + (smiValuePtr->value.integer32 < 0 ? 1 : 0),
Packit 022b05
			    smiValuePtr->value.integer32);
Packit 022b05
		if (s) {
Packit 022b05
		    for (j = strlen(s) - 1; i > 0; i--, j--) {
Packit 022b05
			s[j] = s[j-1];
Packit 022b05
		    }
Packit 022b05
		    s[j] = '.';
Packit 022b05
		}
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "%ld", smiValuePtr->value.integer32);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'x') {
Packit 022b05
	    if (smiValuePtr->value.integer32 >= 0) {
Packit 022b05
		smiAsprintf(&s, "%lx", smiValuePtr->value.integer32);
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "-%lx", - smiValuePtr->value.integer32);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'o') {
Packit 022b05
	    if (smiValuePtr->value.integer32 >= 0) {
Packit 022b05
		smiAsprintf(&s, "%lo", smiValuePtr->value.integer32);
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "-%lo", - smiValuePtr->value.integer32);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'b') {
Packit 022b05
	    if (smiValuePtr->value.integer32 >= 0) {
Packit 022b05
		v32 = smiValuePtr->value.integer32;
Packit 022b05
		j = 0;
Packit 022b05
	    } else {
Packit 022b05
		v32 = - smiValuePtr->value.integer32;
Packit 022b05
		j = 1;
Packit 022b05
	    }
Packit 022b05
	    for (i = 32 - 1;
Packit 022b05
		 i > 0 && !(v32 & (1 << i)); i--);
Packit 022b05
	    s = smiMalloc(i + j + 1 + 1);
Packit 022b05
	    if (s) {
Packit 022b05
		s[0] = '-';
Packit 022b05
		for (; i >= 0; i--, j++) {
Packit 022b05
		    s[j] = v32 & (1<
Packit 022b05
		}
Packit 022b05
		s[j] = 0;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_INTEGER64:
Packit 022b05
	if (!(flags & SMI_RENDER_FORMAT) ||
Packit 022b05
	    !smiTypePtr || !smiTypePtr->format ||
Packit 022b05
	    !strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
Packit 022b05
	    if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
Packit 022b05
		(smiTypePtr->format[1] == '-')) {
Packit 022b05
		i = atoi(&smiTypePtr->format[2]);
Packit 022b05
		if (i < 0) i = 0;
Packit 022b05
		if (i > 20) i = 20;
Packit 022b05
		sprintf(f, "%%0%s.", INT64_FORMAT);
Packit 022b05
		f[2] = '*';
Packit 022b05
		smiAsprintf(&s, f,
Packit 022b05
			    1 + i + (smiValuePtr->value.integer64 < 0 ? 1 : 0),
Packit 022b05
			    smiValuePtr->value.integer64);
Packit 022b05
		if (s) {
Packit 022b05
		    for (j = strlen(s) - 1; i > 0; i--, j--) {
Packit 022b05
			s[j] = s[j-1];
Packit 022b05
		    }
Packit 022b05
		    s[j] = '.';
Packit 022b05
		}
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, INT64_FORMAT, smiValuePtr->value.integer64);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'x') {
Packit 022b05
	    if (smiValuePtr->value.integer64 >= 0) {
Packit 022b05
		strcpy(f, UINT64_FORMAT);
Packit 022b05
		f[strlen(f)-1] = 'x';
Packit 022b05
		smiAsprintf(&s, f, smiValuePtr->value.integer64);
Packit 022b05
	    } else {
Packit 022b05
		sprintf(f, "-%s", UINT64_FORMAT);
Packit 022b05
		f[strlen(f)-1] = 'x';
Packit 022b05
		smiAsprintf(&s, f, - smiValuePtr->value.integer64);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'o') {
Packit 022b05
	    if (smiValuePtr->value.integer64 >= 0) {
Packit 022b05
		strcpy(f, UINT64_FORMAT);
Packit 022b05
		sprintf(f, "-%s", UINT64_FORMAT);
Packit 022b05
		f[strlen(f)-1] = 'o';
Packit 022b05
		smiAsprintf(&s, f, smiValuePtr->value.integer64);
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, f, - smiValuePtr->value.integer64);
Packit 022b05
	    }
Packit 022b05
	} else if (smiTypePtr->format[0] == 'b') {
Packit 022b05
	    if (smiValuePtr->value.integer64 >= 0) {
Packit 022b05
		v64 = smiValuePtr->value.integer64;
Packit 022b05
		j = 0;
Packit 022b05
	    } else {
Packit 022b05
		v64 = - smiValuePtr->value.integer64;
Packit 022b05
		j = 1;
Packit 022b05
	    }
Packit 022b05
	    for (i = 64 - 1;
Packit 022b05
		 i > 0 && !(v64 & (1 << i)); i--);
Packit 022b05
	    s = smiMalloc(i + j + 1 + 1);
Packit 022b05
	    if (s) {
Packit 022b05
		s[0] = '-';
Packit 022b05
		for (; i >= 0; i--, j++) {
Packit 022b05
		    s[j] = v64 & (1<
Packit 022b05
		}
Packit 022b05
		s[j] = 0;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
	s = smiRenderOID(smiValuePtr->len, smiValuePtr->value.oid, flags);
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
	if (!(flags & SMI_RENDER_FORMAT) ||
Packit 022b05
	    (!smiTypePtr->format &&
Packit 022b05
	     (smiTypePtr->name && strcmp( smiTypePtr->name, "IpAddress")) ) ) {
Packit 022b05
	    for (i = 0; i < smiValuePtr->len; i++) {
Packit 022b05
		if (!isprint((int)smiValuePtr->value.ptr[i])) break;
Packit 022b05
	    }
Packit 022b05
	    if ((i < smiValuePtr->len) ||
Packit 022b05
		!(flags & SMI_RENDER_PRINTABLE)) {
Packit 022b05
		smiAsprintf(&s, "");
Packit 022b05
		for (i=0; i < smiValuePtr->len; i++) {
Packit 022b05
		    ss = s;
Packit 022b05
		    smiAsprintf(&s, "%s%02x", ss, smiValuePtr->value.ptr[i]);
Packit 022b05
		    smiFree(ss);
Packit 022b05
		}
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "%s", smiValuePtr->value.ptr);
Packit 022b05
	    }
Packit 022b05
	} else {
Packit 022b05
	    i = 0;
Packit 022b05
	    smiAsprintf(&s, "");
Packit 022b05
	    /* SNMPv2-SMI:IpAddress does not have a display hint.
Packit 022b05
	       ==> let's use this one: "1d." if we have an IpAddress here */
Packit 022b05
	    fmt = (smiTypePtr->name &&
Packit 022b05
		   strcmp( smiTypePtr->name, "IpAddress" ) ) ?
Packit 022b05
		smiTypePtr->format : "1d.";
Packit 022b05
	    while (*fmt && i < smiValuePtr->len) {
Packit 022b05
		last_fmt = fmt;
Packit 022b05
		have_pfx = pfx = 0; /* scan prefix: */
Packit 022b05
		while (*fmt && isdigit((int)*fmt)) {
Packit 022b05
		    pfx = pfx * 10 + *fmt - '0', have_pfx = 1, fmt++;
Packit 022b05
		}
Packit 022b05
		if (! have_pfx) {
Packit 022b05
		    pfx = 1;
Packit 022b05
		}
Packit 022b05
		switch (*fmt) {
Packit 022b05
		case 't':
Packit 022b05
		    /* XXX UTF-8 not implemented, fall through to ASCII (a) */
Packit 022b05
		case 'a':
Packit 022b05
		    n = (pfx < (smiValuePtr->len - i)) ?
Packit 022b05
			pfx : smiValuePtr->len - i;
Packit 022b05
		    for (k = 0; k < n; k++) {
Packit 022b05
			if (! isascii((int) smiValuePtr->value.ptr[i+k])) {
Packit 022b05
			    smiFree(s);
Packit 022b05
			    if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
				smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
			    } else {
Packit 022b05
				s = NULL;
Packit 022b05
			    }
Packit 022b05
			    return s;
Packit 022b05
			}
Packit 022b05
			ss = s;
Packit 022b05
			smiAsprintf(&s, "%s%c", ss, smiValuePtr->value.ptr[i+k]);
Packit 022b05
			smiFree(ss);
Packit 022b05
		    }
Packit 022b05
		    i += n;
Packit 022b05
		    break;
Packit 022b05
		case 'b':
Packit 022b05
		case 'd':
Packit 022b05
		case 'o':
Packit 022b05
		case 'x':
Packit 022b05
		    /* XXX: limited to no more than
Packit 022b05
		       sizeof(SmiUnsigned64) octets */
Packit 022b05
		    vv = 0;
Packit 022b05
		    xlen = pfx * 2;
Packit 022b05
		    while (pfx > 0 && i < smiValuePtr->len) {
Packit 022b05
			vv = vv * 256 +
Packit 022b05
			     ((unsigned char)smiValuePtr->value.ptr[i]);
Packit 022b05
			i++;
Packit 022b05
			pfx--;
Packit 022b05
		    }
Packit 022b05
		    switch (*fmt) {
Packit 022b05
		    case 'd':
Packit 022b05
			ss = s;
Packit 022b05
			sprintf(f, "%%s%s", UINT64_FORMAT);
Packit 022b05
			smiAsprintf(&s, f, ss, vv);
Packit 022b05
			smiFree(ss);
Packit 022b05
			break;
Packit 022b05
		    case 'o':
Packit 022b05
			ss = s;
Packit 022b05
			sprintf(f, "%%s%s", UINT64_FORMAT);
Packit 022b05
			f[strlen(f)-1] = 'o';
Packit 022b05
			smiAsprintf(&s, f, ss, vv);
Packit 022b05
			smiFree(ss);
Packit 022b05
			break;
Packit 022b05
		    case 'x':
Packit 022b05
			ss = s;
Packit 022b05
			sprintf(f, "%%s%%0%s", UINT64_FORMAT);
Packit 022b05
			f[4] = '*';
Packit 022b05
			f[strlen(f)-1] = 'x';
Packit 022b05
			smiAsprintf(&s, f, ss, xlen, vv);
Packit 022b05
			smiFree(ss);
Packit 022b05
			break;
Packit 022b05
		    case 'b':
Packit 022b05
			k = pfx * 8 - 1;
Packit 022b05
			if (k > sizeof(SmiUnsigned64) * 8 - 1)
Packit 022b05
			    k = sizeof(SmiUnsigned64) * 8 - 1;
Packit 022b05
			for (j = 0; k >= 0; k--, j++) {
Packit 022b05
			    ss = s;
Packit 022b05
			    smiAsprintf(&s, "%s%c",
Packit 022b05
					ss, vv & (1 << k) ? '1' : '0');
Packit 022b05
			    smiFree(ss);
Packit 022b05
			}
Packit 022b05
			break;
Packit 022b05
		    }
Packit 022b05
		    break;
Packit 022b05
		default:
Packit 022b05
		    smiFree(s);
Packit 022b05
		    if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
			smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
		    } else {
Packit 022b05
			s = NULL;
Packit 022b05
		    }
Packit 022b05
		    return s;
Packit 022b05
		}
Packit 022b05
		fmt++;
Packit 022b05
Packit 022b05
		/*
Packit 022b05
		 * Check for a separator and repeat with last format if
Packit 022b05
		 * data is still available.
Packit 022b05
		 */
Packit 022b05
		if (*fmt && ! isdigit((int) *fmt) && *fmt != '*') {
Packit 022b05
		    if (i < smiValuePtr->len) {
Packit 022b05
			ss = s;
Packit 022b05
			smiAsprintf(&s, "%s%c", ss, fmt[0]);
Packit 022b05
			smiFree(ss);
Packit 022b05
		    }
Packit 022b05
		    fmt++;
Packit 022b05
		}
Packit 022b05
Packit 022b05
		if (! *fmt && (i < smiValuePtr->len)) {
Packit 022b05
		    fmt = last_fmt;
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_ENUM:
Packit 022b05
	if ((flags & SMI_RENDER_NAME) && (smiTypePtr)) {
Packit 022b05
	    for (nn = smiGetFirstNamedNumber(smiTypePtr); nn;
Packit 022b05
		 nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
		if (nn->value.value.integer32 == smiValuePtr->value.integer32)
Packit 022b05
		    break;
Packit 022b05
	    }
Packit 022b05
	    if (nn) {
Packit 022b05
		if (flags & SMI_RENDER_NUMERIC) {
Packit 022b05
		    smiAsprintf(&s, "%s(%ld)",
Packit 022b05
				nn->name, nn->value.value.integer32);
Packit 022b05
		} else {
Packit 022b05
		    smiAsprintf(&s, "%s", nn->name);
Packit 022b05
		}
Packit 022b05
	    } else {
Packit 022b05
		smiAsprintf(&s, "%ld", smiValuePtr->value.integer32);
Packit 022b05
	    }
Packit 022b05
	} else {
Packit 022b05
	    smiAsprintf(&s, "%ld", smiValuePtr->value.integer32);
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_BITS:
Packit 022b05
	smiAsprintf(&s, "");
Packit 022b05
	for (i = 0, nn = NULL; i < smiValuePtr->len * 8; i++) {
Packit 022b05
	    if (smiValuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
Packit 022b05
		if ((flags & SMI_RENDER_NAME) && (smiTypePtr)) {
Packit 022b05
		    for (nn = smiGetFirstNamedNumber(smiTypePtr); nn;
Packit 022b05
			 nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
			if (nn->value.value.unsigned32 == i)
Packit 022b05
			    break;
Packit 022b05
		    }
Packit 022b05
		}
Packit 022b05
		ss = s;
Packit 022b05
		if ((flags & SMI_RENDER_NAME) &&
Packit 022b05
		    (flags & SMI_RENDER_NUMERIC) && nn) {
Packit 022b05
		    smiAsprintf(&s, "%s%s%s(%d)",
Packit 022b05
				ss, strlen(ss) ? " " : "", nn->name, i);
Packit 022b05
		} else if (nn) {
Packit 022b05
		    smiAsprintf(&s, "%s%s%s",
Packit 022b05
				ss, strlen(ss) ? " " : "", nn->name);
Packit 022b05
		} else {
Packit 022b05
		    smiAsprintf(&s, "%s%s%d",
Packit 022b05
				ss, strlen(ss) ? " " : "", i);
Packit 022b05
		}
Packit 022b05
		smiFree(ss);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_FLOAT32:
Packit 022b05
    case SMI_BASETYPE_FLOAT64:
Packit 022b05
    case SMI_BASETYPE_FLOAT128:
Packit 022b05
    case SMI_BASETYPE_UNKNOWN:
Packit 022b05
    default:
Packit 022b05
	if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
	    smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
	} else {
Packit 022b05
	    s = NULL;
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
char *smiRenderNode(SmiNode *smiNodePtr, int flags)
Packit 022b05
{
Packit 022b05
    char *s;
Packit 022b05
    SmiModule *modulePtr;
Packit 022b05
    
Packit 022b05
    if ((!smiNodePtr) || (smiNodePtr->name == NULL)) {
Packit 022b05
	if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
	    smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
	} else {
Packit 022b05
	    s = NULL;
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	modulePtr = smiGetNodeModule(smiNodePtr);
Packit 022b05
	if ((!(flags & SMI_RENDER_QUALIFIED)) ||
Packit 022b05
	    (!modulePtr) ||
Packit 022b05
	    (!strlen(modulePtr->name))) {
Packit 022b05
	    smiAsprintf(&s, "%s", smiNodePtr->name);
Packit 022b05
	} else {
Packit 022b05
	    smiAsprintf(&s, "%s::%s", modulePtr->name, smiNodePtr->name);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
char *smiRenderType(SmiType *smiTypePtr, int flags)
Packit 022b05
{
Packit 022b05
    char *s;
Packit 022b05
    SmiModule *modulePtr;
Packit 022b05
    
Packit 022b05
    if ((!smiTypePtr) || (smiTypePtr->name == NULL)) {
Packit 022b05
	if (flags & SMI_RENDER_UNKNOWN) {
Packit 022b05
	    smiAsprintf(&s, SMI_UNKNOWN_LABEL);
Packit 022b05
	} else {
Packit 022b05
	    s = NULL;
Packit 022b05
	}
Packit 022b05
    } else {
Packit 022b05
	modulePtr = smiGetTypeModule(smiTypePtr);
Packit 022b05
	if ((!(flags & SMI_RENDER_QUALIFIED)) ||
Packit 022b05
	    (!modulePtr) ||
Packit 022b05
	    (!strlen(modulePtr->name))) {
Packit 022b05
	    smiAsprintf(&s, "%s", smiTypePtr->name);
Packit 022b05
	} else {
Packit 022b05
	    smiAsprintf(&s, "%s::%s", modulePtr->name, smiTypePtr->name);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    return s;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
unsigned int smiGetMinSize(SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiRange *smiRange;
Packit 022b05
    SmiType  *parentType;
Packit 022b05
    unsigned int min = 65535, size;
Packit 022b05
    
Packit 022b05
    switch (smiType->basetype) {
Packit 022b05
    case SMI_BASETYPE_BITS:
Packit 022b05
	return 0;
Packit 022b05
    case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
	size = 0;
Packit 022b05
	break;
Packit 022b05
    default:
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (smiRange = smiGetFirstRange(smiType);
Packit 022b05
	 smiRange ; smiRange = smiGetNextRange(smiRange)) {
Packit 022b05
	if (smiRange->minValue.value.unsigned32 < min) {
Packit 022b05
	    min = smiRange->minValue.value.unsigned32;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    if (min < 65535 && min > size) {
Packit 022b05
	size = min;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    parentType = smiGetParentType(smiType);
Packit 022b05
    if (parentType) {
Packit 022b05
	unsigned int psize = smiGetMinSize(parentType);
Packit 022b05
	if (psize > size) {
Packit 022b05
	    size = psize;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return size;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
unsigned int smiGetMaxSize(SmiType *smiType)
Packit 022b05
{
Packit 022b05
    SmiRange *smiRange;
Packit 022b05
    SmiType  *parentType;
Packit 022b05
    SmiNamedNumber *nn;
Packit 022b05
    unsigned int max = 0, size;
Packit 022b05
    
Packit 022b05
    switch (smiType->basetype) {
Packit 022b05
    case SMI_BASETYPE_BITS:
Packit 022b05
    case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
	size = 65535;
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
	size = 128;
Packit 022b05
	break;
Packit 022b05
    default:
Packit 022b05
	return 0xffffffff;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (smiType->basetype == SMI_BASETYPE_BITS) {
Packit 022b05
	for (nn = smiGetFirstNamedNumber(smiType);
Packit 022b05
	     nn;
Packit 022b05
	     nn = smiGetNextNamedNumber(nn)) {
Packit 022b05
	    if (nn->value.value.unsigned32 > max) {
Packit 022b05
		max = nn->value.value.unsigned32;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
	size = (max / 8) + 1;
Packit 022b05
	return size;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (smiRange = smiGetFirstRange(smiType);
Packit 022b05
	 smiRange ; smiRange = smiGetNextRange(smiRange)) {
Packit 022b05
	if (smiRange->maxValue.value.unsigned32 > max) {
Packit 022b05
	    max = smiRange->maxValue.value.unsigned32;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    if (max > 0 && max < size) {
Packit 022b05
	size = max;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    parentType = smiGetParentType(smiType);
Packit 022b05
    if (parentType) {
Packit 022b05
	unsigned int psize = smiGetMaxSize(parentType);
Packit 022b05
	if (psize < size) {
Packit 022b05
	    size = psize;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return size;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiUnpack(SmiNode *row, SmiSubid *oid, unsigned int oidlen,
Packit 022b05
	      SmiValue **vals, int *valslen)
Packit 022b05
{
Packit 022b05
    SmiNode *indexNode = NULL;
Packit 022b05
    SmiElement *smiElement;
Packit 022b05
    SmiNode *iNode;
Packit 022b05
    SmiType *iType; 
Packit 022b05
    int i, j, last = 0;
Packit 022b05
   
Packit 022b05
    if (!vals || !valslen || !row || !oid) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    switch (row->indexkind) {
Packit 022b05
    case SMI_INDEX_INDEX:
Packit 022b05
    case SMI_INDEX_REORDER:
Packit 022b05
	indexNode = row;
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_EXPAND:	/* TODO: we have to do more work here! */
Packit 022b05
	indexNode = NULL;
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_AUGMENT:
Packit 022b05
    case SMI_INDEX_SPARSE:
Packit 022b05
	indexNode = smiGetRelatedNode(row);
Packit 022b05
	break;
Packit 022b05
    case SMI_INDEX_UNKNOWN:
Packit 022b05
	indexNode = NULL;
Packit 022b05
	break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    *valslen = 0;
Packit 022b05
    for (smiElement = smiGetFirstElement(indexNode);
Packit 022b05
	 smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	iNode = smiGetElementNode(smiElement);
Packit 022b05
	if (iNode) {
Packit 022b05
	    iType = smiGetNodeType(iNode);
Packit 022b05
	    if (! iType) break;
Packit 022b05
	    (*valslen)++;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    if (smiElement) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    *vals = smiMalloc(*valslen * sizeof(SmiValue));
Packit 022b05
Packit 022b05
    for (smiElement = smiGetFirstElement(indexNode), i = 0, j = 0;
Packit 022b05
	 smiElement; smiElement = smiGetNextElement(smiElement), i++) {
Packit 022b05
	iNode = smiGetElementNode(smiElement);
Packit 022b05
	last = (smiGetNextElement(smiElement) == NULL);
Packit 022b05
	iType = smiGetNodeType(iNode);
Packit 022b05
	fprintf(stderr, "** %s (%s)\n", iNode->name, iType->name);
Packit 022b05
	(*vals)[i].basetype = iType->basetype;
Packit 022b05
	switch (iType->basetype) {
Packit 022b05
	case SMI_BASETYPE_ENUM:
Packit 022b05
	case SMI_BASETYPE_INTEGER32:
Packit 022b05
	    (*vals)[i].value.integer32 = oid[j]; j++;
Packit 022b05
	    break;
Packit 022b05
	case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
	    (*vals)[i].value.unsigned32 = oid[j]; j++;
Packit 022b05
	    break;
Packit 022b05
	case SMI_BASETYPE_OCTETSTRING:
Packit 022b05
	    /* need to know whether implied/fixed length or not */
Packit 022b05
	    break;
Packit 022b05
	case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit 022b05
	    /* need to know whether implied/fixed length or not */
Packit 022b05
	    break;
Packit 022b05
	default:
Packit 022b05
	    return 0;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return *valslen;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiAsprintf(char **strp, const char *format, ...)
Packit 022b05
{
Packit 022b05
    int rc;
Packit 022b05
    va_list ap;
Packit 022b05
Packit 022b05
    va_start(ap, format);
Packit 022b05
    rc = vasprintf(strp, format, ap);
Packit 022b05
    va_end(ap);
Packit 022b05
    if (! strp) {
Packit 022b05
	smiPrintError(NULL, ERR_OUT_OF_MEMORY);
Packit 022b05
    }
Packit 022b05
    return rc;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
int smiVasprintf(char **strp, const char *format, va_list ap)
Packit 022b05
{
Packit 022b05
    int rc;
Packit 022b05
Packit 022b05
    rc = vasprintf(strp, format, ap);
Packit 022b05
    if (! strp) {
Packit 022b05
	smiPrintError(NULL, ERR_OUT_OF_MEMORY);
Packit 022b05
    }
Packit 022b05
    return rc;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
int smiGetMinMaxRange(SmiType *smiType, SmiValue *min, SmiValue *max)
Packit 022b05
{
Packit 022b05
    SmiBasetype    basetype = SMI_BASETYPE_UNKNOWN;
Packit 022b05
    SmiRange       *range;
Packit 022b05
Packit 022b05
    min->basetype = max->basetype = SMI_BASETYPE_UNKNOWN;
Packit 022b05
    min->len = max->len = 0;
Packit 022b05
Packit 022b05
    range = smiGetFirstRange(smiType);
Packit 022b05
    if (!range) {
Packit 022b05
	return 0;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    basetype = range->minValue.basetype;
Packit 022b05
    min->basetype = max->basetype = basetype;
Packit 022b05
Packit 022b05
    switch (basetype) {
Packit 022b05
    case SMI_BASETYPE_INTEGER32:
Packit 022b05
	min->value.integer32 = SMI_BASETYPE_INTEGER32_MAX;
Packit 022b05
	max->value.integer32 = SMI_BASETYPE_INTEGER32_MIN;
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_INTEGER64:
Packit 022b05
	min->value.integer64 = SMI_BASETYPE_INTEGER64_MAX;
Packit 022b05
	max->value.integer64 = SMI_BASETYPE_INTEGER64_MIN;
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
	min->value.unsigned32 = SMI_BASETYPE_UNSIGNED32_MAX;
Packit 022b05
	max->value.unsigned32 = SMI_BASETYPE_UNSIGNED32_MIN;
Packit 022b05
	break;
Packit 022b05
    case SMI_BASETYPE_UNSIGNED64:
Packit 022b05
	min->value.unsigned64 = SMI_BASETYPE_UNSIGNED64_MAX;
Packit 022b05
	max->value.unsigned64 = SMI_BASETYPE_UNSIGNED32_MIN;
Packit 022b05
	break;
Packit 022b05
    default:
Packit 022b05
	fprintf(stderr, "smidump: unexpected basetype %d\n", basetype);
Packit 022b05
	return -1;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (range = smiGetFirstRange(smiType);
Packit 022b05
	 range;
Packit 022b05
	 range = smiGetNextRange(range)) {
Packit 022b05
	switch (basetype) {
Packit 022b05
	case SMI_BASETYPE_INTEGER32:
Packit 022b05
	    if (range->minValue.value.integer32 < min->value.integer32) {
Packit 022b05
		min->value.integer32 = range->minValue.value.integer32;
Packit 022b05
	    }
Packit 022b05
	    if (range->maxValue.value.integer32 > max->value.integer32) {
Packit 022b05
		max->value.integer32 = range->maxValue.value.integer32;
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_BASETYPE_INTEGER64:
Packit 022b05
	    if (range->minValue.value.integer64 < min->value.integer64) {
Packit 022b05
		min->value.integer64 = range->minValue.value.integer64;
Packit 022b05
	    }
Packit 022b05
	    if (range->maxValue.value.integer64 > max->value.integer64) {
Packit 022b05
		max->value.integer64 = range->maxValue.value.integer64;
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_BASETYPE_UNSIGNED32:
Packit 022b05
	    if (range->minValue.value.unsigned32 < min->value.unsigned32) {
Packit 022b05
		min->value.unsigned32 = range->minValue.value.unsigned32;
Packit 022b05
	    }
Packit 022b05
	    if (range->maxValue.value.unsigned32 > max->value.unsigned32) {
Packit 022b05
		max->value.unsigned32 = range->maxValue.value.unsigned32;
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	case SMI_BASETYPE_UNSIGNED64:
Packit 022b05
	    if (range->minValue.value.unsigned64 < min->value.unsigned64) {
Packit 022b05
		min->value.unsigned64 = range->minValue.value.unsigned64;
Packit 022b05
	    }
Packit 022b05
	    if (range->maxValue.value.unsigned64 > max->value.unsigned64) {
Packit 022b05
		max->value.unsigned64 = range->maxValue.value.unsigned64;
Packit 022b05
	    }
Packit 022b05
	    break;
Packit 022b05
	default:
Packit 022b05
	    fprintf(stderr, "smidump: unexpected basetype %d\n", basetype);
Packit 022b05
	    return -1;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return 0;
Packit 022b05
}