Blame tools/dump-cm.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-cm.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump conceptual models for MIB modules.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 2000 A. Mueller, 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-cm.c 2718 2005-08-24 06:59:15Z sperner $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/* 
Packit Service 9ccfef
 * -- TO DO --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Berechnungen der UML Diagramme debuggen
Packit Service 9ccfef
 *
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
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 <stdlib.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
#include <ctype.h>
Packit Service 9ccfef
#ifdef HAVE_WIN_H
Packit Service 9ccfef
#include "win.h"
Packit Service 9ccfef
#endif
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
#include "rea.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Definitions used by the dia output driver (node layout).
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
static const float HEADFONTSIZETABLE   = (float)0.51;
Packit Service 9ccfef
static const float HEADSPACESIZETABLE  = (float)0.6;
Packit Service 9ccfef
static const float ATTRFONTSIZE        = (float)0.48;
Packit Service 9ccfef
static const float ATTRSPACESIZE       = (float)2.4;
Packit Service 9ccfef
static const float RECTCORRECTION      = (float)0.85;
Packit Service 9ccfef
static const float EDGEYSPACING        = (float)2.0;
Packit Service 9ccfef
static const float TABLEHEIGHT         = (float)2.6;   /* headline of the table */
Packit Service 9ccfef
static const float TABLEELEMHEIGHT     = (float)0.675; /* height of one attribute */
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * global dia graph layout
Packit Service 9ccfef
 */
Packit Service 9ccfef
static const float YSPACING            = (float)3.0;  /* y space between nodes */
Packit Service 9ccfef
static const float XSPACING            = (float)4.0;  /* x space between nodes */ 
Packit Service 9ccfef
static const float NEWLINEDISTANCE     = (float)40.0; /* length of one line */
Packit Service 9ccfef
static const float XOFFSET             = (float)2.0;  /* left upper start of graph */
Packit Service 9ccfef
static const float YOFFSET             = (float)5.0;  /* left upper start of graph */
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * position of the dia info note 
Packit Service 9ccfef
 */
Packit Service 9ccfef
static const float XNOTE               = (float)1.0;  /* left upper corner of note */
Packit Service 9ccfef
static const float YNOTE               = (float)1.0;  /* left upper corner of note */
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Stereotype Name
Packit Service 9ccfef
 */
Packit Service 9ccfef
static const char* STEREOTYPE          = "smi mib class";
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Property String for index objects
Packit Service 9ccfef
 */
Packit Service 9ccfef
static const char* INDEXPROPERTY       = " {index}";
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/* -------------- main functions ------------------------------------------- */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Creates the graph nodes of the given module
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void algCreateNodes(SmiModule *module)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *node;
Packit Service 9ccfef
    
Packit Service 9ccfef
    /* get tables and scalars from the MIB module */
Packit Service 9ccfef
    for (node = smiGetFirstNode(module, SMI_NODEKIND_TABLE);
Packit Service 9ccfef
	 node;
Packit Service 9ccfef
	 node = smiGetNextNode(node, SMI_NODEKIND_TABLE)) {
Packit Service 9ccfef
	if (node->status != SMI_STATUS_OBSOLETE) {
Packit Service 9ccfef
	    if (!SUPPRESS_DEPRECATED || node->status != SMI_STATUS_DEPRECATED)
Packit Service 9ccfef
		graphInsertNode(graph, node);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    for (node = smiGetFirstNode(module, SMI_NODEKIND_SCALAR);
Packit Service 9ccfef
	 node;
Packit Service 9ccfef
	 node = smiGetNextNode(node, SMI_NODEKIND_SCALAR)) {
Packit Service 9ccfef
	if (node->status != SMI_STATUS_OBSOLETE) {
Packit Service 9ccfef
	    if (!SUPPRESS_DEPRECATED || node->status != SMI_STATUS_DEPRECATED)
Packit Service 9ccfef
		graphInsertNode(graph, node);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/* ------ XML primitives ------                                              */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void diaPrintXMLHeader()
Packit Service 9ccfef
{
Packit Service 9ccfef
    printf("\n");
Packit Service 9ccfef
    printf("<diagram xmlns:dia=\"http://www.lysator.liu.se/~alla/dia/\">\n");
Packit Service 9ccfef
    printf("  <diagramdata>\n");
Packit Service 9ccfef
    printf("    <attribute name=\"background\">\n");
Packit Service 9ccfef
    printf("      <color val=\"#ffffff\"/>\n");
Packit Service 9ccfef
    printf("    </attribute>\n");
Packit Service 9ccfef
    printf("    <attribute name=\"paper\">\n");
Packit Service 9ccfef
    printf("      <composite type=\"paper\">\n");
Packit Service 9ccfef
    printf("        <attribute name=\"name\">\n");
Packit Service 9ccfef
    printf("          <string>#A4#</string>\n");
Packit Service 9ccfef
    printf("        </attribute>\n");
Packit Service 9ccfef
    printf("        <attribute name=\"tmargin\">\n");
Packit Service 9ccfef
    printf("         <real val=\"2.82\"/>\n");
Packit Service 9ccfef
    printf("       </attribute>\n");
Packit Service 9ccfef
    printf("       <attribute name=\"bmargin\">\n");
Packit Service 9ccfef
    printf("         <real val=\"2.82\"/>\n");
Packit Service 9ccfef
    printf("        </attribute>\n");
Packit Service 9ccfef
    printf("       <attribute name=\"lmargin\">\n");
Packit Service 9ccfef
    printf("         <real val=\"2.82\"/>\n");
Packit Service 9ccfef
    printf("       </attribute>\n");
Packit Service 9ccfef
    printf("       <attribute name=\"rmargin\">\n");
Packit Service 9ccfef
    printf("         <real val=\"2.82\"/>\n");
Packit Service 9ccfef
    printf("       </attribute>\n");
Packit Service 9ccfef
    printf("       <attribute name=\"is_portrait\">\n");
Packit Service 9ccfef
    printf("         <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    printf("       </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"scaling\">\n");
Packit Service 9ccfef
    printf("         <real val=\"1\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"fitto\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("    </composite>\n");
Packit Service 9ccfef
    printf("   </attribute>\n");
Packit Service 9ccfef
    printf("  </diagramdata>\n");
Packit Service 9ccfef
    printf("  <layer name=\"Background\" visible=\"true\">\n");   
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void diaPrintXMLClose()
Packit Service 9ccfef
{
Packit Service 9ccfef
    printf("  </layer>\n");
Packit Service 9ccfef
    printf("</diagram>\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * prints the type of a given node
Packit Service 9ccfef
 */  
Packit Service 9ccfef
static void diaPrintXMLType(SmiNode *smiNode, int index)
Packit Service 9ccfef
{
Packit Service 9ccfef
    printf("          <attribute name=\"type\">\n");
Packit Service 9ccfef
    if (index) {
Packit Service 9ccfef
	printf("            <string>#%s%s#</string>\n",
Packit Service 9ccfef
	       algGetTypeName(smiNode), INDEXPROPERTY);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	printf("            <string>#%s#</string>\n", algGetTypeName(smiNode));
Packit Service 9ccfef
    }
Packit Service 9ccfef
    printf("          </attribute>\n");    
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * index = 0 -> no index element
Packit Service 9ccfef
 * index = 1 -> index element -> printed with "+"
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLAttribute(SmiNode *node, int index)
Packit Service 9ccfef
{
Packit Service 9ccfef
    printf("        <composite type=\"umlattribute\">\n");
Packit Service 9ccfef
    printf("          <attribute name=\"name\">\n");
Packit Service 9ccfef
    printf("            <string>#%s#</string>\n", node->name);
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    
Packit Service 9ccfef
    diaPrintXMLType(node,index);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("          <attribute name=\"value\">\n");
Packit Service 9ccfef
    printf("            <string/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"visibility\">\n");
Packit Service 9ccfef
Packit Service 9ccfef
    if (node->access == SMI_ACCESS_NOT_ACCESSIBLE) {
Packit Service 9ccfef
	printf("            <enum val=\"1\"/>\n");
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	printf("            <enum val=\"0\"/>\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"abstract\">\n");
Packit Service 9ccfef
    printf("            <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"class_scope\">\n");
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (node->nodekind == SMI_NODEKIND_SCALAR) {
Packit Service 9ccfef
	printf("            <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	printf("            <boolean val=\"false\"/>\n");	
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("        </composite>\n");	   
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * prints the related scalars for a given table
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLRelatedScalars(GraphNode *node)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphEdge *tEdge;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (tEdge = graphGetFirstEdgeByNode(graph, node);
Packit Service 9ccfef
	 tEdge;
Packit Service 9ccfef
	 tEdge = graphGetNextEdgeByNode(graph, tEdge, node)) {
Packit Service 9ccfef
	if (tEdge->startNode == node  &&
Packit Service 9ccfef
	    tEdge->endNode->smiNode->nodekind == SMI_NODEKIND_SCALAR) {
Packit Service 9ccfef
	    tEdge->dia.flags |= DIA_PRINT_FLAG;
Packit Service 9ccfef
	    tEdge->endNode->dia.flags |= DIA_PRINT_FLAG;
Packit Service 9ccfef
Packit Service 9ccfef
	    diaPrintXMLAttribute(tEdge->endNode->smiNode,0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * prints all columns objects of the given node
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLAllColumns(GraphNode *node)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiModule *module  = NULL;
Packit Service 9ccfef
    SmiNode   *smiNode = NULL;
Packit Service 9ccfef
    SmiNode   *ppNode;
Packit Service 9ccfef
Packit Service 9ccfef
    module  = smiGetNodeModule(node->smiNode);
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(module, SMI_NODEKIND_COLUMN);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COLUMN)) {
Packit Service 9ccfef
	ppNode = smiGetParentNode(smiNode);
Packit Service 9ccfef
	ppNode = smiGetParentNode(ppNode);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (!algIsIndexElement(node->smiNode, smiNode) &&
Packit Service 9ccfef
	    cmpSmiNodes(node->smiNode, ppNode))
Packit Service 9ccfef
	    diaPrintXMLAttribute(smiNode, 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * adds the index to an augmenting table (row-element)
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintAugmentIndex(GraphNode *tNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphEdge  *tEdge;
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
Packit Service 9ccfef
    for (tEdge = graphGetFirstEdgeByNode(graph, tNode);
Packit Service 9ccfef
	 tEdge;
Packit Service 9ccfef
	 tEdge = graphGetNextEdgeByNode(graph, tEdge, tNode)) {
Packit Service 9ccfef
	if (tEdge->indexkind == SMI_INDEX_AUGMENT) {
Packit Service 9ccfef
	    for (smiElement = smiGetFirstElement(
Packit Service 9ccfef
		smiGetFirstChildNode(tEdge->startNode->smiNode));
Packit Service 9ccfef
		 smiElement;
Packit Service 9ccfef
		 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		if (!cmpSmiNodes(tNode->smiNode, tEdge->startNode->smiNode)) {
Packit Service 9ccfef
		    diaPrintXMLAttribute(smiGetElementNode(smiElement),1);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void diaPrintXMLObject(GraphNode *node, float x, float y)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (!node) return;
Packit Service 9ccfef
    if (node->dia.flags & DIA_PRINT_FLAG) return;
Packit Service 9ccfef
Packit Service 9ccfef
    node->dia.x = x;
Packit Service 9ccfef
    node->dia.y = y;
Packit Service 9ccfef
    node->dia.flags |= DIA_PRINT_FLAG; /* object is now printed */
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("    <object type=\"UML - Class\" version=\"0\" id=\"%s\">\n",
Packit Service 9ccfef
	   node->smiNode->name);
Packit Service 9ccfef
    printf("      <attribute name=\"obj_pos\">\n");
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n",x,y);
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"obj_bb\">\n");
Packit Service 9ccfef
    printf("       <rectangle val=\"0.0,0.0;0.0,0.0\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"elem_corner\">\n");
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n",x,y);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"elem_width\">\n");
Packit Service 9ccfef
    printf("       <real val=\"%.2f\"/>\n",node->dia.w);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"elem_height\">\n");
Packit Service 9ccfef
    printf("       <real val=\"%.2f\"/>\n",node->dia.h);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"name\">\n");
Packit Service 9ccfef
    printf("       <string>#%s#</string>\n",
Packit Service 9ccfef
	   smiGetFirstChildNode(node->smiNode)->name);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"stereotype\">\n");
Packit Service 9ccfef
    printf("        <string>#%s#</string>\n", STEREOTYPE);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"abstract\">\n");
Packit Service 9ccfef
    printf("       <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"suppress_attributes\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"false\"/>\n");    
Packit Service 9ccfef
    printf("      </attribute>\n");   
Packit Service 9ccfef
    printf("      <attribute name=\"suppress_operations\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"visible_attributes\">\n");
Packit Service 9ccfef
    printf("       <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"visible_operations\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
Packit Service 9ccfef
    printf("     <attribute name=\"attributes\">\n");
Packit Service 9ccfef
Packit Service 9ccfef
    if (node->smiNode->nodekind == SMI_NODEKIND_TABLE) {
Packit Service 9ccfef
Packit Service 9ccfef
	diaPrintXMLRelatedScalars(node);
Packit Service 9ccfef
Packit Service 9ccfef
	diaPrintAugmentIndex(node);
Packit Service 9ccfef
	
Packit Service 9ccfef
	for (smiElement = smiGetFirstElement(
Packit Service 9ccfef
	    smiGetFirstChildNode(node->smiNode));
Packit Service 9ccfef
	     smiElement;
Packit Service 9ccfef
	     smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	    diaPrintXMLAttribute(smiGetElementNode(smiElement),1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (PRINT_DETAILED_ATTR) {
Packit Service 9ccfef
	    diaPrintXMLAllColumns(node);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("     <attribute name=\"operations\"/>\n");
Packit Service 9ccfef
    printf("    <attribute name=\"template\">\n");
Packit Service 9ccfef
    printf("      <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("    </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"templates\"/>\n");
Packit Service 9ccfef
    printf("   </object>\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * prints a group of scalars denoted by group
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLGroup(int group, float x, float y)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphNode *tNode;
Packit Service 9ccfef
Packit Service 9ccfef
    for (tNode = graph->nodes; tNode; tNode = tNode->nextPtr) {
Packit Service 9ccfef
	if (tNode->group == group) break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (!tNode) return;
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("    <object type=\"UML - Class\" version=\"0\" id=\"%s\">\n",
Packit Service 9ccfef
	   smiGetParentNode(tNode->smiNode)->name);
Packit Service 9ccfef
    printf("      <attribute name=\"obj_pos\">\n");
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n",x,y);
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"obj_bb\">\n");
Packit Service 9ccfef
    printf("       <rectangle val=\"0.0,0.0;0.0,0.0\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"elem_corner\">\n");
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n",x,y);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"elem_width\">\n");
Packit Service 9ccfef
    printf("       <real val=\"%.2f\"/>\n",0.0);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"elem_height\">\n");
Packit Service 9ccfef
    printf("       <real val=\"%.2f\"/>\n",0.0);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"name\">\n");
Packit Service 9ccfef
    printf("       <string>#%s#</string>\n",
Packit Service 9ccfef
	   smiGetParentNode(tNode->smiNode)->name);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"stereotype\">\n");
Packit Service 9ccfef
    printf("         <string>#%s#</string>\n", STEREOTYPE);
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"abstract\">\n");
Packit Service 9ccfef
    printf("       <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"suppress_attributes\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"false\"/>\n");    
Packit Service 9ccfef
    printf("      </attribute>\n");   
Packit Service 9ccfef
    printf("      <attribute name=\"suppress_operations\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"visible_attributes\">\n");
Packit Service 9ccfef
    printf("       <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"visible_operations\">\n");
Packit Service 9ccfef
    printf("        <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
Packit Service 9ccfef
    printf("     <attribute name=\"attributes\">\n");
Packit Service 9ccfef
Packit Service 9ccfef
    for (tNode = graph->nodes; tNode; tNode = tNode->nextPtr) {
Packit Service 9ccfef
	if (tNode->group == group) {
Packit Service 9ccfef
	    diaPrintXMLAttribute(tNode->smiNode,0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("     <attribute name=\"operations\"/>\n");
Packit Service 9ccfef
    printf("    <attribute name=\"template\">\n");
Packit Service 9ccfef
    printf("      <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("    </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"templates\"/>\n");
Packit Service 9ccfef
    printf("   </object>\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getRectSX(GraphNode *tNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return (float) (tNode->dia.w / 2.0 + tNode->dia.x - RECTCORRECTION);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getRectEX(GraphNode *tNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return (float) (tNode->dia.w / 2.0 + tNode->dia.x + RECTCORRECTION);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getRectSY(GraphNode *tNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return (float) (tNode->dia.y - 2.0 - RECTCORRECTION);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getRectEY(GraphNode *tNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return (float) (tNode->dia.y - 2.0 + RECTCORRECTION);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int getConPoint(GraphNode *snode, GraphNode *enode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    float x1,y1,x2,y2;
Packit Service 9ccfef
    int   con = 1;
Packit Service 9ccfef
    
Packit Service 9ccfef
    x1 = snode->dia.x;
Packit Service 9ccfef
    y1 = snode->dia.y;
Packit Service 9ccfef
    x2 = enode->dia.x;
Packit Service 9ccfef
    y2 = enode->dia.y;    
Packit Service 9ccfef
Packit Service 9ccfef
    if (x1 == x2 && y1 < y2) con = 6;
Packit Service 9ccfef
    if (x1 == x2 && y1 > y1) con = 1;
Packit Service 9ccfef
    if (x1 > x2 && y1 == y2) con = 3;
Packit Service 9ccfef
    if (x1 < x2 && y1 == y2) con = 4;
Packit Service 9ccfef
    if (x1 > x2 && y1 > y2)  con = 0;
Packit Service 9ccfef
    if (x1 > x2 && y1 < y2)  con = 5;
Packit Service 9ccfef
    if (x1 < x2 && y1 > y2)  con = 2;
Packit Service 9ccfef
    if (x1 < x2 && y1 < y2)  con = 7;
Packit Service 9ccfef
Packit Service 9ccfef
    return con;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getObjX(GraphNode *node, int con)
Packit Service 9ccfef
{
Packit Service 9ccfef
    switch (con) {
Packit Service 9ccfef
    case 0 :
Packit Service 9ccfef
	return node->dia.x;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 1 :
Packit Service 9ccfef
	return (float) (node->dia.w / 2.0 + node->dia.x);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 2 :
Packit Service 9ccfef
	return node->dia.x + node->dia.w;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 3 :
Packit Service 9ccfef
	return node->dia.x;
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    case 4 :
Packit Service 9ccfef
	return node->dia.x + node->dia.w;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 5 :
Packit Service 9ccfef
	return node->dia.x;
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    case 6 :
Packit Service 9ccfef
	return (float) (node->dia.w / 2.0 + node->dia.x);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 7 :
Packit Service 9ccfef
	return node->dia.x + node->dia.w;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return 0.0;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getObjY(GraphNode *node, int con)
Packit Service 9ccfef
{
Packit Service 9ccfef
    switch (con) {
Packit Service 9ccfef
    case 0 :
Packit Service 9ccfef
	return node->dia.y;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 1 :
Packit Service 9ccfef
	return node->dia.y;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 2 :
Packit Service 9ccfef
	return node->dia.y;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 3 :
Packit Service 9ccfef
	return (float) (node->dia.y + TABLEHEIGHT / 2.0);
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    case 4 :
Packit Service 9ccfef
	return (float) (node->dia.y + TABLEHEIGHT / 2.0);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 5 :
Packit Service 9ccfef
	return node->dia.y + node->dia.h;
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    case 6 :
Packit Service 9ccfef
	return node->dia.y + node->dia.h;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 7 :
Packit Service 9ccfef
	return node->dia.y + node->dia.h;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return 0.0;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float getObjYRel(GraphEdge *edge, int con)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphNode *node, *node2;
Packit Service 9ccfef
    float     dist;
Packit Service 9ccfef
    
Packit Service 9ccfef
    node = edge->startNode;
Packit Service 9ccfef
    node2 = edge->endNode;
Packit Service 9ccfef
    if (node->dia.y < node2->dia.y) {
Packit Service 9ccfef
	dist = ABS(((node->dia.y + node->dia.h) - node2->dia.y ) / 2.0);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	dist = ABS((node->dia.y - (node2->dia.y + node2->dia.h)) / 2.0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    switch (con) {
Packit Service 9ccfef
    case 0 :
Packit Service 9ccfef
	return node->dia.y - dist;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 1 :
Packit Service 9ccfef
	return node->dia.y - dist;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 2 :
Packit Service 9ccfef
	return node->dia.y - dist;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 3 :
Packit Service 9ccfef
	return (float) (node->dia.y + TABLEHEIGHT / 2.0);
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    case 4 :
Packit Service 9ccfef
	return (float) (node->dia.y + TABLEHEIGHT / 2.0);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 5 :
Packit Service 9ccfef
	return node->dia.y + node->dia.h + dist;
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    case 6 :
Packit Service 9ccfef
	return node->dia.y + node->dia.h + dist;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 7 :
Packit Service 9ccfef
	return node->dia.y + node->dia.h + dist;
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return 0.0;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * diaPrintXMLCoordinates
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * prints and calculates the coordinates of a given edge
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLCoordinates(GraphEdge *tEdge)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int scon, econ;
Packit Service 9ccfef
Packit Service 9ccfef
    scon = getConPoint(tEdge->startNode, tEdge->endNode);
Packit Service 9ccfef
    econ = getConPoint(tEdge->endNode, tEdge->startNode);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("      <attribute name=\"obj_pos\">\n");
Packit Service 9ccfef
    printf("        <point val=\"%.2f,%.2f\"/>\n"
Packit Service 9ccfef
	   ,getObjX(tEdge->startNode,scon)
Packit Service 9ccfef
	   ,getObjY(tEdge->startNode,scon));	   
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"obj_bb\">\n");
Packit Service 9ccfef
    printf("       <rectangle val=\"%.2f,%.2f;%.2f,%.2f\"/>\n"
Packit Service 9ccfef
	   ,getRectSX(tEdge->startNode)
Packit Service 9ccfef
	   ,getRectSY(tEdge->startNode)
Packit Service 9ccfef
	   ,getRectEX(tEdge->startNode)
Packit Service 9ccfef
	   ,getRectEY(tEdge->startNode));
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"orth_points\">\n");
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n"
Packit Service 9ccfef
	   ,getObjX(tEdge->startNode,scon)
Packit Service 9ccfef
	   ,getObjY(tEdge->startNode,scon));	
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n"
Packit Service 9ccfef
	   ,getObjX(tEdge->startNode,scon)
Packit Service 9ccfef
	   ,getObjYRel(tEdge,scon));
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n"
Packit Service 9ccfef
	   ,getObjX(tEdge->endNode,econ)
Packit Service 9ccfef
	   ,getObjYRel(tEdge,scon));
Packit Service 9ccfef
    printf("       <point val=\"%.2f,%.2f\"/>\n"
Packit Service 9ccfef
	   ,getObjX(tEdge->endNode,econ)
Packit Service 9ccfef
	   ,getObjY(tEdge->endNode,econ));	
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * diaPrintXMLConPoints
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * prints the connection points of an edge
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLConPoints(GraphEdge *tEdge)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int scon, econ;
Packit Service 9ccfef
Packit Service 9ccfef
    scon = getConPoint(tEdge->startNode, tEdge->endNode);
Packit Service 9ccfef
    econ = getConPoint(tEdge->endNode, tEdge->startNode);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("    <connections>\n");
Packit Service 9ccfef
    printf("      <connection handle=\"0\" to=\"%s\" connection=\"%d\"/>\n",
Packit Service 9ccfef
	   tEdge->startNode->smiNode->name,scon);
Packit Service 9ccfef
    printf("      <connection handle=\"1\" to=\"%s\" connection=\"%d\"/>\n",
Packit Service 9ccfef
	   tEdge->endNode->smiNode->name, econ);
Packit Service 9ccfef
    printf("    </connections>\n");    
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void diaPrintXMLDependency(GraphEdge *tEdge)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (tEdge->dia.flags & DIA_PRINT_FLAG) return;
Packit Service 9ccfef
    tEdge->dia.flags |= DIA_PRINT_FLAG;
Packit Service 9ccfef
Packit Service 9ccfef
    printf("    
Packit Service 9ccfef
	   "version=\"0\" id=\"Depend:%s:%s\">\n",
Packit Service 9ccfef
	   tEdge->startNode->smiNode->name,
Packit Service 9ccfef
	   tEdge->endNode->smiNode->name);    
Packit Service 9ccfef
Packit Service 9ccfef
    diaPrintXMLCoordinates(tEdge);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("     <attribute name=\"orth_orient\">\n");
Packit Service 9ccfef
    printf("       <enum val=\"1\"/>\n");
Packit Service 9ccfef
    printf("       <enum val=\"0\"/>\n");
Packit Service 9ccfef
    printf("       <enum val=\"1\"/>\n");
Packit Service 9ccfef
    printf("     </attribute>\n");
Packit Service 9ccfef
    printf("    <attribute name=\"draw_arrow\">\n");
Packit Service 9ccfef
    printf("       <boolean val=\"true\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"name\">\n");
Packit Service 9ccfef
    printf("        <string/>\n");
Packit Service 9ccfef
    printf("   </attribute>\n");
Packit Service 9ccfef
    printf("     <attribute name=\"stereotype\">\n");
Packit Service 9ccfef
    printf("      <string/>\n");
Packit Service 9ccfef
    printf("    </attribute>\n");
Packit Service 9ccfef
Packit Service 9ccfef
    diaPrintXMLConPoints(tEdge);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("    </object>\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * Aggregation is a special case of the association.
Packit Service 9ccfef
 * If aggregate = 1 it is an aggregation if 0 it is an association.
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLAssociation(GraphEdge *tEdge, int aggregate)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (tEdge->dia.flags & DIA_PRINT_FLAG) return;
Packit Service 9ccfef
    tEdge->dia.flags |= DIA_PRINT_FLAG;
Packit Service 9ccfef
    if (aggregate > 1) aggregate = 1;
Packit Service 9ccfef
    if (aggregate < 0) aggregate = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("    
Packit Service 9ccfef
	   "version=\"0\" id=\"Assoc:%s:%s\">\n",
Packit Service 9ccfef
	   tEdge->startNode->smiNode->name,
Packit Service 9ccfef
	   tEdge->endNode->smiNode->name);
Packit Service 9ccfef
    
Packit Service 9ccfef
    diaPrintXMLCoordinates(tEdge);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("      <attribute name=\"orth_orient\">\n");
Packit Service 9ccfef
    printf("        <enum val=\"1\"/>\n");
Packit Service 9ccfef
    printf("        <enum val=\"0\"/>\n");
Packit Service 9ccfef
    printf("        <enum val=\"1\"/>\n");   
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"name\">\n");
Packit Service 9ccfef
Packit Service 9ccfef
    switch(tEdge->indexkind) {
Packit Service 9ccfef
    case SMI_INDEX_UNKNOWN :
Packit Service 9ccfef
	switch (tEdge->enhancedindex) {
Packit Service 9ccfef
	case GRAPH_ENHINDEX_UNKNOWN :
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case GRAPH_ENHINDEX_TYPES :
Packit Service 9ccfef
	    printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case GRAPH_ENHINDEX_NAMES :
Packit Service 9ccfef
	    printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case GRAPH_ENHINDEX_NOTIFICATION :
Packit Service 9ccfef
	    printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case GRAPH_ENHINDEX_INDEX :
Packit Service 9ccfef
	    /* should not occur - is handled below */
Packit Service 9ccfef
	    printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case GRAPH_ENHINDEX_REROUTE :
Packit Service 9ccfef
	    printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case GRAPH_ENHINDEX_POINTER :
Packit Service 9ccfef
	    printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	    break;	    
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_INDEX :
Packit Service 9ccfef
	printf("       <string>#%s#</string>\n","");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_AUGMENT :
Packit Service 9ccfef
	printf("       <string>#%s#</string>\n","augments");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_SPARSE :
Packit Service 9ccfef
	printf("       <string>#%s#</string>\n","sparses");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_REORDER :
Packit Service 9ccfef
	printf("       <string>#%s#</string>\n","reorders");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_INDEX_EXPAND :
Packit Service 9ccfef
	printf("       <string>#%s#</string>\n","expands");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"direction\">\n");
Packit Service 9ccfef
    printf("        <enum val=\"0\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"ends\">\n");
Packit Service 9ccfef
    printf("        <composite>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"role\">\n");
Packit Service 9ccfef
    printf("            <string/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"multiplicity\">\n");
Packit Service 9ccfef
    
Packit Service 9ccfef
    switch (tEdge->cardinality) {
Packit Service 9ccfef
    case GRAPH_CARD_UNKNOWN :
Packit Service 9ccfef
	printf("       <string># #</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ONE_TO_ONE :
Packit Service 9ccfef
	printf("       <string>#1#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ONE_TO_MANY :
Packit Service 9ccfef
	printf("       <string>#1#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ZERO_TO_ONE :
Packit Service 9ccfef
	printf("       <string>#0#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ZERO_TO_MANY :
Packit Service 9ccfef
	printf("       <string>#0#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ONE_TO_ZERO_OR_ONE :
Packit Service 9ccfef
	printf("       <string>#1#</string>\n");
Packit Service 9ccfef
	break;		
Packit Service 9ccfef
    }
Packit Service 9ccfef
   
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"arrow\">\n");
Packit Service 9ccfef
    printf("            <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"aggregate\">\n");
Packit Service 9ccfef
    printf("            <enum val=\"0\"/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("        </composite>\n");
Packit Service 9ccfef
    printf("        <composite>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"role\">\n");
Packit Service 9ccfef
    printf("            <string/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
Packit Service 9ccfef
    printf("          <attribute name=\"multiplicity\">\n");
Packit Service 9ccfef
Packit Service 9ccfef
    switch (tEdge->cardinality) {
Packit Service 9ccfef
    case GRAPH_CARD_UNKNOWN :
Packit Service 9ccfef
	printf("       <string># #</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ONE_TO_ONE :
Packit Service 9ccfef
	printf("       <string>#1#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ONE_TO_MANY :
Packit Service 9ccfef
	printf("       <string>#*#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ZERO_TO_ONE :
Packit Service 9ccfef
	printf("       <string>#1#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ZERO_TO_MANY :
Packit Service 9ccfef
	printf("       <string>#*#</string>\n");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CARD_ONE_TO_ZERO_OR_ONE :
Packit Service 9ccfef
	printf("       <string>#0..1#</string>\n");
Packit Service 9ccfef
	break;	
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"arrow\">\n");
Packit Service 9ccfef
    printf("            <boolean val=\"false\"/>\n");
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("          <attribute name=\"aggregate\">\n");
Packit Service 9ccfef
    printf("            <enum val=\"%d\"/>\n",aggregate);
Packit Service 9ccfef
    printf("          </attribute>\n");
Packit Service 9ccfef
    printf("        </composite>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
Packit Service 9ccfef
    diaPrintXMLConPoints(tEdge);
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("    </object>\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void diaPrintXMLConnection(GraphEdge *tEdge)
Packit Service 9ccfef
{
Packit Service 9ccfef
    switch (tEdge->connection) {
Packit Service 9ccfef
    case GRAPH_CON_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CON_AGGREGATION :
Packit Service 9ccfef
	diaPrintXMLAssociation(tEdge,1);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CON_DEPENDENCY :
Packit Service 9ccfef
	diaPrintXMLDependency(tEdge);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case GRAPH_CON_ASSOCIATION :
Packit Service 9ccfef
	diaPrintXMLAssociation(tEdge,0);
Packit Service 9ccfef
	break;	    
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * diaPrintXMLInfoNote
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Prints an UML note with a short information on it (Modulename and
Packit Service 9ccfef
 * smidump version).
Packit Service 9ccfef
 */
Packit Service 9ccfef
static void diaPrintXMLInfoNote(int modc, SmiModule **modv)
Packit Service 9ccfef
{
Packit Service 9ccfef
    size_t  length;
Packit Service 9ccfef
    float   width;
Packit Service 9ccfef
    char   *note;
Packit Service 9ccfef
    int	    i;
Packit Service 9ccfef
Packit Service 9ccfef
    const char *s1 = "Conceptual model of ";
Packit Service 9ccfef
    const char *s2 = "- generated by smidump " SMI_VERSION_STRING;
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * Calculate the length of the string...
Packit Service 9ccfef
     */
Packit Service 9ccfef
    
Packit Service 9ccfef
    length = strlen(s1) + strlen(s2) + 1;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	length += strlen(modv[i]->name) + 1;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /*
Packit Service 9ccfef
     * ... before allocating a buffer and putting the string together.
Packit Service 9ccfef
     */
Packit Service 9ccfef
Packit Service 9ccfef
    note = xmalloc(length);
Packit Service 9ccfef
    strcpy(note, s1);
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	strcat(note, modv[i]->name);
Packit Service 9ccfef
	strcat(note, " ");
Packit Service 9ccfef
    }
Packit Service 9ccfef
    strcat(note, s2);
Packit Service 9ccfef
Packit Service 9ccfef
    width = (float)strlen(note) * (float)0.76;	/* don't ask */
Packit Service 9ccfef
Packit Service 9ccfef
    printf("<object type=\"UML - Note\" version=\"0\" id=\"O0\">\n");
Packit Service 9ccfef
    printf("  <attribute name=\"obj_pos\">\n");
Packit Service 9ccfef
    printf("    <point val=\"%.2f,%.2f\"/>\n",XNOTE, YNOTE);
Packit Service 9ccfef
    printf("  </attribute>\n");
Packit Service 9ccfef
    printf("  <attribute name=\"obj_bb\">\n");
Packit Service 9ccfef
    printf("    <rectangle val=\"%.2f,%.2f;%.2f,%.2f\"/>\n",
Packit Service 9ccfef
	   XNOTE-0.5, YNOTE-0.5, XNOTE-0.5 + width, YNOTE - 0.5 + 1.7);
Packit Service 9ccfef
    printf("  </attribute>\n");
Packit Service 9ccfef
    printf("  <attribute name=\"elem_corner\">\n");
Packit Service 9ccfef
    printf("    <point val=\"%.2f,%.2f\"/>\n",XNOTE, YNOTE);
Packit Service 9ccfef
    printf("  </attribute>\n");
Packit Service 9ccfef
    printf("  <attribute name=\"elem_width\">\n");
Packit Service 9ccfef
    printf("    <real val=\"%.2f\"/>\n", width);
Packit Service 9ccfef
    printf("  </attribute>\n");
Packit Service 9ccfef
    printf("  <attribute name=\"elem_height\">\n");
Packit Service 9ccfef
    printf("    <real val=\"1.7\"/>\n");
Packit Service 9ccfef
    printf("  </attribute>\n");
Packit Service 9ccfef
    printf("  <attribute name=\"text\">\n");
Packit Service 9ccfef
    printf("    <composite type=\"text\">\n");
Packit Service 9ccfef
    printf("      <attribute name=\"string\">\n");
Packit Service 9ccfef
    printf("        <string>#%s#</string>\n", note);
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"font\">\n");
Packit Service 9ccfef
    printf("        <font name=\"Courier\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"height\">\n");
Packit Service 9ccfef
    printf("        <real val=\"0.8\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"pos\">\n");
Packit Service 9ccfef
    printf("        <point val=\"%.2f,%.2f\"/>\n", XNOTE + 0.35, YNOTE + 1.28);
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"color\">\n");
Packit Service 9ccfef
    printf("        <color val=\"#000000\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("      <attribute name=\"alignment\">\n");
Packit Service 9ccfef
    printf("        <enum val=\"0\"/>\n");
Packit Service 9ccfef
    printf("      </attribute>\n");
Packit Service 9ccfef
    printf("    </composite>\n");
Packit Service 9ccfef
    printf("  </attribute>\n");
Packit Service 9ccfef
    printf("</object>\n");
Packit Service 9ccfef
Packit Service 9ccfef
    xfree(note);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * diaCalcSize
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Calculates the size of a given node for the UML representation.
Packit Service 9ccfef
 */
Packit Service 9ccfef
static GraphNode *diaCalcSize(GraphNode *node)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphEdge  *tEdge;
Packit Service 9ccfef
    SmiNode    *tNode,*ppNode;
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiModule  *module;
Packit Service 9ccfef
Packit Service 9ccfef
    if (node->smiNode->nodekind == SMI_NODEKIND_SCALAR) return node;
Packit Service 9ccfef
    
Packit Service 9ccfef
    node->dia.w = (strlen(node->smiNode->name)+4) * HEADFONTSIZETABLE
Packit Service 9ccfef
	+ HEADSPACESIZETABLE;
Packit Service 9ccfef
    
Packit Service 9ccfef
    node->dia.h = TABLEHEIGHT;
Packit Service 9ccfef
    for (smiElement = smiGetFirstElement(
Packit Service 9ccfef
	smiGetFirstChildNode(node->smiNode));
Packit Service 9ccfef
	 smiElement;
Packit Service 9ccfef
	 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	tNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	
Packit Service 9ccfef
	node->dia.w = max(node->dia.w, (strlen(tNode->name) +
Packit Service 9ccfef
					strlen(algGetTypeName(tNode)) +
Packit Service 9ccfef
					strlen(INDEXPROPERTY))
Packit Service 9ccfef
		      * ATTRFONTSIZE
Packit Service 9ccfef
		      + ATTRSPACESIZE);
Packit Service 9ccfef
	node->dia.h += TABLEELEMHEIGHT;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (tEdge = graphGetFirstEdgeByNode(graph,node);
Packit Service 9ccfef
	 tEdge;
Packit Service 9ccfef
	 tEdge = graphGetNextEdgeByNode(graph, tEdge, node)) {
Packit Service 9ccfef
	if (tEdge->startNode == node &&
Packit Service 9ccfef
	    tEdge->endNode->smiNode->nodekind == SMI_NODEKIND_SCALAR) {
Packit Service 9ccfef
	    node->dia.h += TABLEELEMHEIGHT;
Packit Service 9ccfef
	    tNode = tEdge->endNode->smiNode;
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    node->dia.w = max(node->dia.w, (strlen(tNode->name) +
Packit Service 9ccfef
				    strlen(algGetTypeName(tNode)))
Packit Service 9ccfef
			  * ATTRFONTSIZE
Packit Service 9ccfef
			  + ATTRSPACESIZE);		
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (PRINT_DETAILED_ATTR && node->smiNode->nodekind == SMI_NODEKIND_TABLE) {
Packit Service 9ccfef
	module  = smiGetNodeModule(node->smiNode);
Packit Service 9ccfef
Packit Service 9ccfef
	for (tNode = smiGetFirstNode(module, SMI_NODEKIND_COLUMN);
Packit Service 9ccfef
	     tNode;
Packit Service 9ccfef
	     tNode = smiGetNextNode(tNode, SMI_NODEKIND_COLUMN)) {
Packit Service 9ccfef
	    ppNode = smiGetParentNode(tNode);
Packit Service 9ccfef
	    ppNode = smiGetParentNode(ppNode);
Packit Service 9ccfef
Packit Service 9ccfef
	    if (cmpSmiNodes(node->smiNode, ppNode)) {
Packit Service 9ccfef
		int len;
Packit Service 9ccfef
		char *typeName;
Packit Service 9ccfef
Packit Service 9ccfef
		typeName = algGetTypeName(tNode);
Packit Service 9ccfef
		len = strlen(tNode->name) + (typeName ? strlen(typeName) : 0);
Packit Service 9ccfef
		node->dia.h += TABLEELEMHEIGHT;
Packit Service 9ccfef
		node->dia.w = max(node->dia.w, len)
Packit Service 9ccfef
		    * ATTRFONTSIZE
Packit Service 9ccfef
		    + ATTRSPACESIZE;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    return node;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static float diaPrintNode(GraphNode *node, float x, float y)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphEdge *tEdge;
Packit Service 9ccfef
Packit Service 9ccfef
    for (tEdge = graphGetFirstEdgeByNode(graph, node);
Packit Service 9ccfef
	 tEdge;
Packit Service 9ccfef
	 tEdge = graphGetNextEdgeByNode(graph, tEdge, node)) {
Packit Service 9ccfef
	if (! (tEdge->dia.flags & DIA_PRINT_FLAG)) {
Packit Service 9ccfef
	    if (node == tEdge->startNode) {
Packit Service 9ccfef
		y += tEdge->endNode->dia.h + YSPACING;    
Packit Service 9ccfef
		diaPrintXMLObject(tEdge->endNode, x, y);
Packit Service 9ccfef
		diaPrintXMLConnection(tEdge);
Packit Service 9ccfef
		y = diaPrintNode(tEdge->startNode, x, y);
Packit Service 9ccfef
			      /* (x+tEdge->startNode->dia.w+XSPACING),y); */
Packit Service 9ccfef
		
Packit Service 9ccfef
		y = diaPrintNode(tEdge->endNode,
Packit Service 9ccfef
		  (x+tEdge->startNode->dia.w+XSPACING), y);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return y;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
static void diaPrintXML(int modc, SmiModule **modv)
Packit Service 9ccfef
{
Packit Service 9ccfef
    GraphNode *tNode;
Packit Service 9ccfef
    GraphEdge *tEdge;
Packit Service 9ccfef
    float     x,y,ydiff;
Packit Service 9ccfef
    int       group;
Packit Service 9ccfef
    
Packit Service 9ccfef
    diaPrintXMLHeader();
Packit Service 9ccfef
Packit Service 9ccfef
    for (tNode = graph->nodes; tNode; tNode = tNode->nextPtr) {	
Packit Service 9ccfef
	tNode = diaCalcSize(tNode);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    diaPrintXMLInfoNote(modc, modv);
Packit Service 9ccfef
    
Packit Service 9ccfef
    x = XOFFSET;
Packit Service 9ccfef
    y = YOFFSET;
Packit Service 9ccfef
    ydiff = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    for (tEdge = graph->edges; tEdge; tEdge = tEdge->nextPtr) {
Packit Service 9ccfef
	if (! (tEdge->dia.flags & DIA_PRINT_FLAG)) {
Packit Service 9ccfef
	    diaPrintXMLObject(tEdge->startNode, x, y);
Packit Service 9ccfef
	    x = x + tEdge->startNode->dia.w + XSPACING;
Packit Service 9ccfef
Packit Service 9ccfef
	    diaPrintXMLObject(tEdge->endNode, x, y);
Packit Service 9ccfef
	    diaPrintXMLConnection(tEdge);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    ydiff = tEdge->startNode->dia.h;
Packit Service 9ccfef
Packit Service 9ccfef
      	    y = diaPrintNode(tEdge->startNode,x,y);
Packit Service 9ccfef
	    y = diaPrintNode(tEdge->endNode,x,y);    
Packit Service 9ccfef
Packit Service 9ccfef
	    y = y + ydiff + YSPACING;
Packit Service 9ccfef
	    x = XOFFSET;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    x = XOFFSET;
Packit Service 9ccfef
    y += ydiff;
Packit Service 9ccfef
    ydiff = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    /* printing singular tables */
Packit Service 9ccfef
    for (tNode = graph->nodes; tNode; tNode = tNode->nextPtr) {
Packit Service 9ccfef
	if (!graphGetFirstEdgeByNode(graph,tNode) &&
Packit Service 9ccfef
	    tNode->smiNode->nodekind != SMI_NODEKIND_SCALAR) {
Packit Service 9ccfef
	    diaPrintXMLObject(tNode,x,y);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    x += tNode->dia.w + XSPACING;
Packit Service 9ccfef
	    ydiff = max(ydiff, tNode->dia.h);
Packit Service 9ccfef
	    if (x >= NEWLINEDISTANCE) {
Packit Service 9ccfef
		x = XOFFSET;
Packit Service 9ccfef
		y += ydiff + YSPACING;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    /* printing scalar groups */
Packit Service 9ccfef
    x = XOFFSET;
Packit Service 9ccfef
    y += ydiff + YSPACING;
Packit Service 9ccfef
    for (group = 1;
Packit Service 9ccfef
	 group <= algGetNumberOfGroups();
Packit Service 9ccfef
	 group++) {
Packit Service 9ccfef
	diaPrintXMLGroup(group,x,y);
Packit Service 9ccfef
	x += 2.0;
Packit Service 9ccfef
	y += 2.0;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    diaPrintXMLClose();
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
/* ------------------------------------------------------------------------- */
Packit Service 9ccfef
Packit Service 9ccfef
static void printModuleNames(int modc, SmiModule **modv)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    printf("Conceptual model of: ");
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	printf("%s ", modv[i]->name);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    printf("(generated by smidump " SMI_VERSION_STRING ")\n\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void dumpCm(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int       i;
Packit Service 9ccfef
Packit Service 9ccfef
    if (flags & SMIDUMP_FLAG_UNITE) {
Packit Service 9ccfef
	if (! graph) {
Packit Service 9ccfef
	    graph = xmalloc(sizeof(Graph));
Packit Service 9ccfef
	    graph->nodes = NULL;
Packit Service 9ccfef
	    graph->edges = NULL;
Packit Service 9ccfef
	    graph->components = NULL;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	    algCreateNodes(modv[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (XPLAIN) {
Packit Service 9ccfef
	    printModuleNames(modc, modv);
Packit Service 9ccfef
	    printf("\n--- First Phase - loading tables and scalars\n\n");
Packit Service 9ccfef
	    graphShowNodes(graph);
Packit Service 9ccfef
	    printf("\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	algLinkTables();
Packit Service 9ccfef
	algCheckLinksByName();
Packit Service 9ccfef
	algConnectLonelyNodes();
Packit Service 9ccfef
	algCheckForDependency();
Packit Service 9ccfef
	algCheckForPointerRels();
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (!XPLAIN) {
Packit Service 9ccfef
	    diaPrintXML(modc, modv);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	graphExit(graph);
Packit Service 9ccfef
	graph = NULL;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for (i = 0; i < modc; i++) {
Packit Service 9ccfef
	    if (! graph) {
Packit Service 9ccfef
		graph = xmalloc(sizeof(Graph));
Packit Service 9ccfef
		graph->nodes = NULL;
Packit Service 9ccfef
		graph->edges = NULL;
Packit Service 9ccfef
		graph->components = NULL;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    algCreateNodes(modv[i]);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    if (XPLAIN) {
Packit Service 9ccfef
		printModuleNames(1, &(modv[i]));
Packit Service 9ccfef
		printf("\n--- First Phase - loading tables and scalars\n\n");
Packit Service 9ccfef
		graphShowNodes(graph);
Packit Service 9ccfef
		printf("\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	
Packit Service 9ccfef
	    algLinkTables();
Packit Service 9ccfef
	    algCheckLinksByName();
Packit Service 9ccfef
	    algConnectLonelyNodes();
Packit Service 9ccfef
	    algCheckForDependency();
Packit Service 9ccfef
	    algCheckForPointerRels();
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    if (!XPLAIN) {
Packit Service 9ccfef
		diaPrintXML(1, &(modv[i]));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	
Packit Service 9ccfef
	    graphExit(graph);
Packit Service 9ccfef
	    graph = NULL;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (fflush(stdout) || ferror(stdout)) {
Packit Service 9ccfef
	perror("smidump: write error");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void initCm()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriverOption opt[] = {
Packit Service 9ccfef
	{ "explain", OPT_FLAG, &XPLAIN, 0,
Packit Service 9ccfef
	  "explain what the algorithm does"},
Packit Service 9ccfef
        { 0, OPT_END, 0, 0 }
Packit Service 9ccfef
    };
Packit Service 9ccfef
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"cm",
Packit Service 9ccfef
	dumpCm,
Packit Service 9ccfef
	SMI_FLAG_NODESCR,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_OUTPUT,
Packit Service 9ccfef
	"reverse engineered conceptual model",
Packit Service 9ccfef
	opt,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}