Blame tools/dump-imports.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-imports.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump import hierarchies in a human readable format.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 1999 J. Schoenwaelder, Technical University of Braunschweig.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: dump-imports.c 5758 2006-08-16 21:10:05Z schoenw $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct Imports {
Packit Service 9ccfef
    char *module;
Packit Service 9ccfef
    int  count;
Packit Service 9ccfef
    struct Imports *nextPtr;
Packit Service 9ccfef
} Imports;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static Imports *getImports(SmiModule *smiModule, int *n)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiImport *smiImport;
Packit Service 9ccfef
    Imports   *imports;
Packit Service 9ccfef
    int       i;
Packit Service 9ccfef
    size_t    size;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiImport = smiGetFirstImport(smiModule), *n = 0;
Packit Service 9ccfef
	 smiImport; smiImport = smiGetNextImport(smiImport)) {
Packit Service 9ccfef
	(*n)++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    size = (*n + 1) * sizeof(Imports);
Packit Service 9ccfef
    imports = xmalloc(size);
Packit Service 9ccfef
    memset(imports, 0, size);
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiImport = smiGetFirstImport(smiModule), *n = 0;
Packit Service 9ccfef
	 smiImport; smiImport = smiGetNextImport(smiImport)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (!smiImport->module) continue;
Packit Service 9ccfef
	
Packit Service 9ccfef
	for (i = 0; i < *n; i++) {
Packit Service 9ccfef
	    if (strcmp(smiImport->module, imports[i].module) == 0) {
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (i == *n) {
Packit Service 9ccfef
	    imports[i].module = xstrdup(smiImport->module);
Packit Service 9ccfef
	    if (imports[i].module) {
Packit Service 9ccfef
		imports[i].count = 0;
Packit Service 9ccfef
		(*n)++;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	imports[i].count++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return imports;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void freeImports(Imports *imports, int n)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < n; i++) {
Packit Service 9ccfef
	xfree(imports[i].module);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(imports);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int fprintImports(FILE *f, SmiModule *smiModule, char *prefix,
Packit Service 9ccfef
			 Imports *backtrace)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiModule *smiModule2;
Packit Service 9ccfef
    Imports *imports, *imp;
Packit Service 9ccfef
    int     i, n, recurse = 0, done = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    for (imp = backtrace; imp; imp = imp->nextPtr) {
Packit Service 9ccfef
	if (strcmp(imp->module, smiModule->name) == 0) {
Packit Service 9ccfef
	    fprintf(stderr, "%s  (recursion - aborted)\n", prefix);
Packit Service 9ccfef
	    return 0;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    imp = (Imports *) xmalloc(sizeof(Imports));
Packit Service 9ccfef
    imp->module = smiModule->name;
Packit Service 9ccfef
    imp->nextPtr = backtrace;
Packit Service 9ccfef
    backtrace = imp;
Packit Service 9ccfef
Packit Service 9ccfef
    imports = getImports(smiModule, &n);
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < n; i++) {
Packit Service 9ccfef
	char *newprefix;
Packit Service 9ccfef
Packit Service 9ccfef
	smiModule2 = smiGetModule(imports[i].module);
Packit Service 9ccfef
	recurse = (NULL == smiGetFirstImport(smiModule2));
Packit Service 9ccfef
	if (recurse) {
Packit Service 9ccfef
	    fprintf(f, "%s  |\n", prefix);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprintf(f, "%s  +--%s [%d identifier%s]\n", prefix, imports[i].module, 
Packit Service 9ccfef
		imports[i].count, imports[i].count > 1 ? "s" : "");
Packit Service 9ccfef
	newprefix = xmalloc(strlen(prefix)+10);
Packit Service 9ccfef
	strcpy(newprefix, prefix);
Packit Service 9ccfef
	if (i == n-1) {
Packit Service 9ccfef
	    strcat(newprefix, "   ");
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    strcat(newprefix, "  |");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	done = fprintImports(f, smiModule2, newprefix, backtrace);
Packit Service 9ccfef
	if (! recurse && done) {
Packit Service 9ccfef
	    if (i == n-1) {
Packit Service 9ccfef
		fprintf(f, "%s   \n", prefix);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprintf(f, "%s  |\n", prefix);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	xfree(newprefix);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    freeImports(imports, n);
Packit Service 9ccfef
    xfree(backtrace);
Packit Service 9ccfef
Packit Service 9ccfef
    return recurse;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void dumpImports(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int  i;
Packit Service 9ccfef
    FILE *f = stdout;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	f = fopen(output, "w");
Packit Service 9ccfef
	if (!f) {
Packit Service 9ccfef
	    fprintf(stderr, "smidump: cannot open %s for writing: ", output);
Packit Service 9ccfef
	    perror(NULL);
Packit Service 9ccfef
	    exit(1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
	    fprintf(f, "# %s imports tree (generated by smidump "
Packit Service 9ccfef
		    SMI_VERSION_STRING ")\n\n", modv[i]->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
Packit Service 9ccfef
	    fprintf(f, "# WARNING: this output may be incorrect due to "
Packit Service 9ccfef
		    "significant parse errors\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintf(f, "%s\n", modv[i]->name);
Packit Service 9ccfef
	fprintImports(f, modv[i], "", NULL);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (fflush(f) || ferror(f)) {
Packit Service 9ccfef
	perror("smidump: write error");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	fclose(f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void initImports()
Packit Service 9ccfef
{
Packit Service 9ccfef
    
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"imports",
Packit Service 9ccfef
	dumpImports,
Packit Service 9ccfef
	SMI_FLAG_NODESCR,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_UNITE,
Packit Service 9ccfef
	"recursive list of all imports",
Packit Service 9ccfef
	NULL,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}