Blame tools/dump-fig.c

Packit 022b05
/*
Packit 022b05
 * dump-fig.c --
Packit 022b05
 *
Packit 022b05
 *      Operations to dump graphic representation of MIBs in fig format.
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 1999 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-fig.c 1050 2000-11-29 16:34:45Z strauss $
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
Packit 022b05
#include "smi.h"
Packit 022b05
#include "smidump.h"
Packit 022b05
Packit 022b05
Packit 022b05
#define	 X_OFFSET	225
Packit 022b05
#define	 Y_OFFSET	225
Packit 022b05
#define	 X_INDENT	225
Packit 022b05
#define	 Y_INDENT	225
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void setupPage()
Packit 022b05
{
Packit 022b05
    printf("#FIG 3.2\n"
Packit 022b05
	   "#\n"
Packit 022b05
	   "# This FIG file has been generated by smidump " SMI_VERSION_STRING
Packit 022b05
	   ". Do not edit.\n#\n"
Packit 022b05
	   "Landscape\n"
Packit 022b05
	   "Center\n"
Packit 022b05
	   "Metric\n"
Packit 022b05
	   "A4\n"
Packit 022b05
	   "50.00\n"
Packit 022b05
	   "Single\n"
Packit 022b05
	   "-1\n"
Packit 022b05
	   "1200 2\n");
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void printString(int x, int y, int angle, char *string)
Packit 022b05
{
Packit 022b05
    int height = 180, length = 22;
Packit 022b05
Packit 022b05
    printf("4 0 0 0 0 18 12 0.0 4 %d %d %d %d %s\\001\n",
Packit 022b05
	   height, length, x, y, string);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static int isGroup(SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    
Packit 022b05
    for(childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	childNode;
Packit 022b05
	childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	if ((childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
	     || childNode->nodekind == SMI_NODEKIND_TABLE)
Packit 022b05
	    && childNode->status == SMI_STATUS_CURRENT) {
Packit 022b05
	    return 1;
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
Packit 022b05
    return 0;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void printGroup(int *x, int *y, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    char string[4096];
Packit 022b05
Packit 022b05
    *y += Y_OFFSET;
Packit 022b05
    printString(*x, *y, 0, smiNode->name);
Packit 022b05
Packit 022b05
    for(childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	childNode;
Packit 022b05
	childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	if (childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
	    || childNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit 022b05
	    if (childNode->status != SMI_STATUS_OBSOLETE) {
Packit 022b05
		*y += Y_OFFSET;
Packit 022b05
		sprintf(string, "%s(%d)", childNode->name,
Packit 022b05
			childNode->oid[childNode->oidlen-1]);
Packit 022b05
		printString(*x + X_INDENT, *y, 0, string);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    *y += Y_OFFSET;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void printGroups(int *x, int *y, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
Packit 022b05
    for(smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit 022b05
	smiNode;
Packit 022b05
	smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	if (isGroup(smiNode)) {
Packit 022b05
	    printGroup(x, y, smiNode);
Packit 022b05
	}
Packit 022b05
	if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit 022b05
	    printGroup(x, y, smiNode);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void dumpFigTree(Module *module)
Packit 022b05
{
Packit 022b05
    SmiModule    *smiModule;
Packit 022b05
    int		 x, y;
Packit 022b05
Packit 022b05
    smiModule = module->smiModule;
Packit 022b05
Packit 022b05
    setupPage();
Packit 022b05
Packit 022b05
    x = X_OFFSET, y = Y_OFFSET;
Packit 022b05
    printGroups(&x, &y, smiModule);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void printClass(int *x, int *y, SmiNode *smiNode)
Packit 022b05
{
Packit 022b05
    SmiNode *childNode;
Packit 022b05
    SmiType *smiType;
Packit 022b05
    char string[4096];
Packit 022b05
Packit 022b05
    *y += Y_OFFSET;
Packit 022b05
    printString(*x, *y, 0, smiNode->name);
Packit 022b05
Packit 022b05
    for(childNode = smiGetFirstChildNode(smiNode);
Packit 022b05
	childNode;
Packit 022b05
	childNode = smiGetNextChildNode(childNode)) {
Packit 022b05
	if (childNode->nodekind == SMI_NODEKIND_SCALAR
Packit 022b05
	    || childNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit 022b05
	    if (childNode->status != SMI_STATUS_OBSOLETE) {
Packit 022b05
		smiType = smiGetNodeType(childNode);
Packit 022b05
		*y += Y_OFFSET;
Packit 022b05
		sprintf(string, "%s : %s", childNode->name, smiType->name);
Packit 022b05
		printString(*x + X_INDENT, *y, 0, string);
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    *y += Y_OFFSET;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
static void printClasses(int *x, int *y, SmiModule *smiModule)
Packit 022b05
{
Packit 022b05
    SmiNode *smiNode;
Packit 022b05
Packit 022b05
    for(smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit 022b05
	smiNode;
Packit 022b05
	smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit 022b05
	if (isGroup(smiNode)) {
Packit 022b05
	    printClass(x, y, smiNode);
Packit 022b05
	}
Packit 022b05
	if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit 022b05
	    printClass(x, y, smiNode);
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void dumpFigUml(Module *module)
Packit 022b05
{
Packit 022b05
    SmiModule    *smiModule;
Packit 022b05
    int		 x, y;
Packit 022b05
Packit 022b05
    smiModule = module->smiModule;
Packit 022b05
Packit 022b05
    setupPage();
Packit 022b05
Packit 022b05
    x = X_OFFSET, y = Y_OFFSET;
Packit 022b05
    printClasses(&x, &y, smiModule);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
void init_fig()
Packit 022b05
{
Packit 022b05
    static SmidumpDriver driverTree = {
Packit 022b05
	"fig-tree",
Packit 022b05
	dumpFigTree,
Packit 022b05
	SMI_FLAG_NODESCR,
Packit 022b05
	SMIDUMP_DRIVER_CANT_UNITE | SMIDUMP_DRIVER_CANT_OUTPUT,
Packit 022b05
	"tree graphics in xfig fig format",
Packit 022b05
	NULL,
Packit 022b05
	NULL
Packit 022b05
    };
Packit 022b05
    static SmidumpDriver driverUml = {
Packit 022b05
	"fig-uml",
Packit 022b05
	dumpFigUml,
Packit 022b05
	SMI_FLAG_NODESCR,
Packit 022b05
	SMIDUMP_DRIVER_CANT_UNITE | SMIDUMP_DRIVER_CANT_OUTPUT,
Packit 022b05
	"UML graphics in xfig fig format",
Packit 022b05
	NULL,
Packit 022b05
	NULL
Packit 022b05
    };
Packit 022b05
    
Packit 022b05
    smidumpRegisterDriver(&driverTree);
Packit 022b05
    smidumpRegisterDriver(&driverUml);
Packit 022b05
}