Blame tools/dump-compliance.c

Packit 022b05
/*
Packit 022b05
 * dump-compliances.c --
Packit 022b05
 *
Packit 022b05
 *      Operations to dump compliances in a human readable format.
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 2005 J. Schoenwaelder, International University Bremen.
Packit 022b05
 *
Packit 022b05
 * See the file "COPYING" for information on usage and redistribution
Packit 022b05
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit 022b05
 *
Packit 022b05
 * @(#) $Id: dump-compliances.c 1571 2003-07-14 22:58:42Z schoenw $
Packit 022b05
 */
Packit 022b05
Packit 022b05
#include <config.h>
Packit 022b05
Packit 022b05
#include <stdio.h>
Packit 022b05
#include <string.h>
Packit 022b05
Packit 022b05
#include "smi.h"
Packit 022b05
#include "smidump.h"
Packit 022b05
Packit 022b05
Packit 022b05
static char *getFlags(SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
Packit 022b05
    switch (smiNode->access) {
Packit 022b05
    case SMI_ACCESS_UNKNOWN:
Packit 022b05
	return "---";
Packit 022b05
    case SMI_ACCESS_NOT_ACCESSIBLE:
Packit 022b05
	return "---";
Packit 022b05
    case SMI_ACCESS_NOTIFY:
Packit 022b05
	return "--n";
Packit 022b05
    case SMI_ACCESS_EVENT_ONLY:
Packit 022b05
	return "--n";
Packit 022b05
    case SMI_ACCESS_READ_ONLY:
Packit 022b05
	return "r-n";
Packit 022b05
    case SMI_ACCESS_READ_WRITE:
Packit 022b05
	return "rwn";
Packit 022b05
    case SMI_ACCESS_NOT_IMPLEMENTED:
Packit 022b05
	return "---";
Packit 022b05
    case SMI_ACCESS_INSTALL:
Packit 022b05
	return "-i-";
Packit 022b05
    case SMI_ACCESS_INSTALL_NOTIFY:
Packit 022b05
	return "-in";
Packit 022b05
    case SMI_ACCESS_REPORT_ONLY:
Packit 022b05
	return "--r";
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return "";
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char getStatusChar(SmiStatus status)
Packit 022b05
{
Packit 022b05
    switch (status) {
Packit 022b05
    case SMI_STATUS_UNKNOWN:
Packit 022b05
	return '+';
Packit 022b05
    case SMI_STATUS_CURRENT:
Packit 022b05
	return '+';
Packit 022b05
    case SMI_STATUS_DEPRECATED:
Packit 022b05
	return 'x';
Packit 022b05
    case SMI_STATUS_MANDATORY:
Packit 022b05
        return '+';
Packit 022b05
    case SMI_STATUS_OPTIONAL:
Packit 022b05
	return '+';
Packit 022b05
    case SMI_STATUS_OBSOLETE:
Packit 022b05
	return 'o';
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return ' ';
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static char *getTypeName(SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    char *type;
Packit 022b05
    SmiType *smiType, *parentType;
Packit 022b05
Packit 022b05
    smiType = smiGetNodeType(smiNode);
Packit 022b05
Packit 022b05
    if (!smiType || smiNode->nodekind == SMI_NODEKIND_TABLE)
Packit 022b05
	return NULL;
Packit 022b05
    
Packit 022b05
    if (smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit 022b05
	parentType = smiGetParentType(smiType);
Packit 022b05
	if (!parentType)
Packit 022b05
	    return NULL;
Packit 022b05
	smiType = parentType;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    type = xstrdup(smiType->name);
Packit 022b05
    return type;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintGroup(FILE *f, SmiNode *smiNode, char c,
Packit 022b05
			int *typelen, int *namelen, int pass)
Packit 022b05
{
Packit 022b05
    SmiElement *smiElement;
Packit 022b05
    SmiNode *smiObject;
Packit 022b05
    SmiModule *smiModule;
Packit 022b05
    char *type_name;
Packit 022b05
    int tlen = 9, nlen = 9;
Packit 022b05
Packit 022b05
    switch (smiNode->nodekind) {
Packit 022b05
    case SMI_NODEKIND_GROUP:
Packit 022b05
	for (smiElement = smiGetFirstElement(smiNode);
Packit 022b05
	     smiElement;
Packit 022b05
	     smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	    smiObject = smiGetElementNode(smiElement);
Packit 022b05
	    smiModule = smiGetNodeModule(smiNode);
Packit 022b05
	    type_name = getTypeName(smiObject);
Packit 022b05
	    if (pass == 1) {
Packit 022b05
		if (type_name) {
Packit 022b05
		    int newlen = strlen(type_name);
Packit 022b05
		    tlen = (tlen < newlen) ? newlen : tlen;
Packit 022b05
		}
Packit 022b05
		if (smiObject->name) {
Packit 022b05
		    int newlen = strlen(smiObject->name);
Packit 022b05
		    nlen = (nlen < newlen) ? newlen : nlen;
Packit 022b05
		}
Packit 022b05
	    } else if (pass == 2) {
Packit 022b05
		fprintf(f, "  %c%c%s %-*s %-*s (%s)\n",
Packit 022b05
			getStatusChar(smiObject->status), c,
Packit 022b05
			getFlags(smiObject),
Packit 022b05
			*typelen, type_name ? type_name : "-",
Packit 022b05
			*namelen, smiObject->name, smiNode->name);
Packit 022b05
	    }
Packit 022b05
	    xfree(type_name);
Packit 022b05
	}
Packit 022b05
	break;
Packit 022b05
    case SMI_NODEKIND_SCALAR:
Packit 022b05
    case SMI_NODEKIND_COLUMN:
Packit 022b05
	smiObject = smiNode;
Packit 022b05
	type_name = getTypeName(smiObject);
Packit 022b05
	if (pass == 1) {
Packit 022b05
	    if (type_name) {
Packit 022b05
		int newlen = strlen(type_name);
Packit 022b05
		tlen = tlen < newlen ? newlen : tlen;
Packit 022b05
	    }
Packit 022b05
	    if (smiObject->name) {
Packit 022b05
		int newlen = strlen(smiObject->name);
Packit 022b05
		nlen = (nlen < newlen) ? newlen : nlen;
Packit 022b05
	    }
Packit 022b05
	} else if (pass == 2) {
Packit 022b05
	    fprintf(f, "  %c%c%s %-*s %s\n",
Packit 022b05
		    getStatusChar(smiObject->status), 'r',
Packit 022b05
		    getFlags(smiObject),
Packit 022b05
		    *typelen, type_name ? type_name : "-",
Packit 022b05
		    smiObject->name);
Packit 022b05
	}
Packit 022b05
	xfree(type_name);
Packit 022b05
	break;
Packit 022b05
    default:
Packit 022b05
	break;
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (pass == 1) {
Packit 022b05
	if (typelen) *typelen = tlen;
Packit 022b05
	if (namelen) *namelen = nlen;
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintCompliance(FILE *f, SmiNode *smiNode,
Packit 022b05
			     int *typelen, int *namelen, int pass)
Packit 022b05
{
Packit 022b05
    SmiElement *smiElement;
Packit 022b05
    SmiOption *smiOption;
Packit 022b05
    SmiRefinement *smiRefinement;
Packit 022b05
    int tlen = 0, nlen = 0;
Packit 022b05
Packit 022b05
    for (smiElement = smiGetFirstElement(smiNode);
Packit 022b05
	 smiElement;
Packit 022b05
	 smiElement = smiGetNextElement(smiElement)) {
Packit 022b05
	fprintGroup(f, smiGetElementNode(smiElement), 'm',
Packit 022b05
		    (pass == 1) ? &tlen : typelen,
Packit 022b05
		    (pass == 1) ? &nlen : namelen, pass);
Packit 022b05
	if (pass == 1) {
Packit 022b05
	    if (typelen) {
Packit 022b05
		*typelen = *typelen < tlen ? tlen : *typelen;
Packit 022b05
	    }
Packit 022b05
	    if (namelen) {
Packit 022b05
		*namelen = *namelen < nlen ? nlen : *namelen;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for(smiOption = smiGetFirstOption(smiNode);
Packit 022b05
	smiOption;
Packit 022b05
	smiOption = smiGetNextOption(smiOption)) {
Packit 022b05
	fprintGroup(f, smiGetOptionNode(smiOption), 'c',
Packit 022b05
		    (pass == 1) ? &tlen : typelen,
Packit 022b05
		    (pass == 1) ? &nlen : namelen, pass);
Packit 022b05
	if (pass == 1) {
Packit 022b05
	    if (typelen) {
Packit 022b05
		*typelen = *typelen < tlen ? tlen : *typelen;
Packit 022b05
	    }
Packit 022b05
	    if (namelen) {
Packit 022b05
		*namelen = *namelen < nlen ? nlen : *namelen;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (smiRefinement = smiGetFirstRefinement(smiNode);
Packit 022b05
	 smiRefinement;
Packit 022b05
	 smiRefinement = smiGetNextRefinement(smiRefinement)) {
Packit 022b05
	fprintGroup(f, smiGetRefinementNode(smiRefinement), 'r',
Packit 022b05
		    (pass == 1) ? &tlen : typelen,
Packit 022b05
		    (pass == 1) ? &nlen : namelen, pass);
Packit 022b05
	if (pass == 1) {
Packit 022b05
	    if (typelen) {
Packit 022b05
		*typelen = *typelen < tlen ? tlen : *typelen;
Packit 022b05
	    }
Packit 022b05
	    if (namelen) {
Packit 022b05
		*namelen = *namelen < nlen ? nlen : *namelen;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintCompliances(FILE *f, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
    int i, typelen = 0, namelen = 0;
Packit 022b05
Packit 022b05
    for (i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
Packit 022b05
	 smiNode;
Packit 022b05
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE), i++) {
Packit 022b05
	fprintf(f, "%s%s:\n", i ? "\n" : "", smiNode->name);
Packit 022b05
	fprintCompliance(f, smiNode, &typelen, &namelen, 1);
Packit 022b05
	fprintCompliance(f, smiNode, &typelen, &namelen, 2);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void
Packit 022b05
dumpCompliances(int modc, SmiModule **modv, int flags, char *output)
Packit 022b05
{
Packit 022b05
    int     i;
Packit 022b05
    FILE    *f = stdout;
Packit 022b05
    
Packit 022b05
    if (output) {
Packit 022b05
	f = fopen(output, "w");
Packit 022b05
	if (!f) {
Packit 022b05
	    fprintf(stderr, "smidump: cannot open %s for writing: ", output);
Packit 022b05
	    perror(NULL);
Packit 022b05
	    exit(1);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    for (i = 0; i < modc; i++) {
Packit 022b05
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit 022b05
	    fprintf(f, "# %s compliances (generated by smidump "
Packit 022b05
		    SMI_VERSION_STRING ")\n\n", modv[i]->name);
Packit 022b05
	}
Packit 022b05
Packit 022b05
	if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
Packit 022b05
	    fprintf(f, "# WARNING: this output may be incorrect due to "
Packit 022b05
		    "significant parse errors\n\n");
Packit 022b05
	}
Packit 022b05
	
Packit 022b05
	fprintCompliances(f, modv[i]);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (fflush(f) || ferror(f)) {
Packit 022b05
	perror("smidump: write error");
Packit 022b05
	exit(1);
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (output) {
Packit 022b05
	fclose(f);
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void initCompliances()
Packit 022b05
{
Packit 022b05
    static SmidumpDriver driver = {
Packit 022b05
	"compliances",
Packit 022b05
	dumpCompliances,
Packit 022b05
	SMI_FLAG_NODESCR,
Packit 022b05
	SMIDUMP_DRIVER_CANT_UNITE,
Packit 022b05
	"compliances with all included objects / notifications",
Packit 022b05
	/* opt, */ NULL,
Packit 022b05
	NULL
Packit 022b05
    };
Packit 022b05
    
Packit 022b05
    smidumpRegisterDriver(&driver);
Packit 022b05
}