Blame tools/dump-identifiers.c

Packit 022b05
/*
Packit 022b05
 * dump-identifiers.c --
Packit 022b05
 *
Packit 022b05
 *      Operations to dump flat identifier lists for SMI modules.
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 2000 Frank Strauss, Technical University of Braunschweig.
Packit 022b05
 * Copyright (c) 2000 J. Schoenwaelder, Technical University of Braunschweig.
Packit 022b05
 *
Packit 022b05
 * See the file "COPYING" for information on usage and redistribution
Packit 022b05
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit 022b05
 *
Packit 022b05
 * @(#) $Id: dump-identifiers.c 5758 2006-08-16 21:10:05Z 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 <stdarg.h>
Packit 022b05
#include <string.h>
Packit 022b05
#include <ctype.h>
Packit 022b05
#include <time.h>
Packit 022b05
Packit 022b05
#include "smi.h"
Packit 022b05
#include "smidump.h"
Packit 022b05
Packit 022b05
Packit 022b05
static int moduleLen = 0;
Packit 022b05
static int identifierLen = 0;
Packit 022b05
Packit 022b05
static int showlines = 0;
Packit 022b05
static int showpath = 0;
Packit 022b05
static int ctagfmt = 0;
Packit 022b05
Packit 022b05
Packit 022b05
static char *smiStringNodekind(SmiNodekind nodekind)
Packit 022b05
{
Packit 022b05
    return
Packit 022b05
        (nodekind == SMI_NODEKIND_UNKNOWN)      ? "<unknown>" :
Packit 022b05
        (nodekind == SMI_NODEKIND_NODE)         ? "node" :
Packit 022b05
        (nodekind == SMI_NODEKIND_SCALAR)       ? "scalar" :
Packit 022b05
        (nodekind == SMI_NODEKIND_TABLE)        ? "table" :
Packit 022b05
        (nodekind == SMI_NODEKIND_ROW)          ? "row" :
Packit 022b05
        (nodekind == SMI_NODEKIND_COLUMN)       ? "column" :
Packit 022b05
        (nodekind == SMI_NODEKIND_NOTIFICATION) ? "notification" :
Packit 022b05
        (nodekind == SMI_NODEKIND_GROUP)        ? "group" :
Packit 022b05
        (nodekind == SMI_NODEKIND_COMPLIANCE)   ? "compliance" :
Packit 022b05
        (nodekind == SMI_NODEKIND_CAPABILITIES) ? "capabilities" :
Packit 022b05
                                                  "<UNDEFINED>";
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintNodeIdentifiers(FILE *f, int modc, SmiModule **modv)
Packit 022b05
{
Packit 022b05
    SmiNode      *smiNode;
Packit 022b05
    unsigned int j;
Packit 022b05
    int          i;
Packit 022b05
Packit 022b05
    for (i = 0; i < modc; i++) {
Packit 022b05
	for (smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_ANY);
Packit 022b05
	     smiNode;
Packit 022b05
	     smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	    if (smiNode->name) {
Packit 022b05
		if (ctagfmt) {
Packit 022b05
		    fprintf(f, "%*s", -identifierLen, smiNode->name);
Packit 022b05
		    fprintf(f, " %d", smiGetNodeLine(smiNode));
Packit 022b05
		    fprintf(f, " %*s", -moduleLen, modv[i]->path);
Packit 022b05
		    fprintf(f, " %s OBJECT-TYPE -- %s\n", smiNode->name,
Packit 022b05
			    smiStringNodekind(smiNode->nodekind));
Packit 022b05
		} else {
Packit 022b05
		    fprintf(f, "%*s",
Packit 022b05
			    -moduleLen, showpath ? modv[i]->path : modv[i]->name);
Packit 022b05
		    if (showlines) {
Packit 022b05
			    fprintf(f, ":%d:", smiGetNodeLine(smiNode));
Packit 022b05
		    }
Packit 022b05
		    fprintf(f, " %*s %-12s ", -identifierLen, smiNode->name,
Packit 022b05
			    smiStringNodekind(smiNode->nodekind));
Packit 022b05
		    for (j = 0; j < smiNode->oidlen; j++) {
Packit 022b05
			    fprintf(f, j ? ".%u" : "%u", smiNode->oid[j]);
Packit 022b05
		    }
Packit 022b05
		    fprintf(f, "\n");
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void fprintTypeIdentifiers(FILE *f, int modc, SmiModule **modv)
Packit 022b05
{
Packit 022b05
    SmiType   *smiType;
Packit 022b05
    int	      i;
Packit 022b05
Packit 022b05
    for (i = 0; i < modc; i++) {
Packit 022b05
	for (smiType = smiGetFirstType(modv[i]);
Packit 022b05
	     smiType;
Packit 022b05
	     smiType = smiGetNextType(smiType)) {
Packit 022b05
	    if (smiType->name) {
Packit 022b05
		if (ctagfmt) {
Packit 022b05
		    fprintf(f, "%*s", -identifierLen, smiType->name);
Packit 022b05
		    fprintf(f, " %d", smiGetTypeLine(smiType));
Packit 022b05
		    fprintf(f, " %*s", -moduleLen, modv[i]->path);
Packit 022b05
		    fprintf(f, " %s TEXTUAL-CONVENTION\n", smiType->name);
Packit 022b05
		} else {
Packit 022b05
		fprintf(f, "%*s",
Packit 022b05
			-moduleLen, showpath ? modv[i]->path : modv[i]->name);
Packit 022b05
		if (showlines) {
Packit 022b05
		    fprintf(f, ":%d:", smiGetTypeLine(smiType));
Packit 022b05
		}
Packit 022b05
		fprintf(f, " %*s %-12s\n", -identifierLen, smiType->name,
Packit 022b05
			"type");
Packit 022b05
		    }
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void dumpIdentifiers(int modc, SmiModule **modv, int flags,
Packit 022b05
			    char *output)
Packit 022b05
{
Packit 022b05
    SmiNode   *smiNode;
Packit 022b05
    int	      i, len;
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 (moduleLen = 0, identifierLen = 0, i = 0; i < modc; i++) {
Packit 022b05
	if (showpath) {
Packit 022b05
	    len = strlen(modv[i]->path);
Packit 022b05
	} else {
Packit 022b05
	    len = strlen(modv[i]->name);
Packit 022b05
	}
Packit 022b05
	if (len > moduleLen) moduleLen = len;
Packit 022b05
	for (smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_ANY);
Packit 022b05
	     smiNode;
Packit 022b05
	     smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	    if (smiNode->name) {
Packit 022b05
		len = strlen(smiNode->name);
Packit 022b05
		if (len > identifierLen) identifierLen = len;
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    if (flags & SMIDUMP_FLAG_UNITE) {
Packit 022b05
Packit 022b05
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit 022b05
	    fprintf(f, "# united list of identifiers (generated by smidump "
Packit 022b05
		    SMI_VERSION_STRING ")\n\n");
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
	fprintTypeIdentifiers(f, modc, modv);
Packit 022b05
	fprintNodeIdentifiers(f, modc, modv);
Packit 022b05
Packit 022b05
    } else {
Packit 022b05
Packit 022b05
	for (i = 0; i < modc; i++) {
Packit 022b05
Packit 022b05
	    if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit 022b05
		fprintf(f, "# %s list of identifiers (generated by smidump "
Packit 022b05
			SMI_VERSION_STRING ")\n\n",
Packit 022b05
			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
	    fprintTypeIdentifiers(f, 1, &(modv[i]));
Packit 022b05
	    fprintNodeIdentifiers(f, 1, &(modv[i]));
Packit 022b05
	}
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 initIdentifiers()
Packit 022b05
{
Packit 022b05
    
Packit 022b05
    static SmidumpDriverOption opt[] = {
Packit 022b05
	{ "lines", OPT_FLAG, &showlines, 0,
Packit 022b05
	  "show line numbers"},
Packit 022b05
	{ "path", OPT_FLAG, &showpath, 0,
Packit 022b05
	  "show file path instead of module name"},
Packit 022b05
	{ "ctag", OPT_FLAG, &ctagfmt, 0,
Packit 022b05
	  "show symbols in [g]ctag format"},
Packit 022b05
        { 0, OPT_END, 0, 0 }
Packit 022b05
    };
Packit 022b05
Packit 022b05
    static SmidumpDriver driver = {
Packit 022b05
	"identifiers",
Packit 022b05
	dumpIdentifiers,
Packit 022b05
	SMI_FLAG_NODESCR,
Packit 022b05
	0,
Packit 022b05
	"list of all identifiers",
Packit 022b05
	opt,
Packit 022b05
	NULL
Packit 022b05
    };
Packit 022b05
    
Packit 022b05
    smidumpRegisterDriver(&driver);
Packit 022b05
}