/* OpenIDA - Outil d'analyse de fichiers binaires * dot.c - interactions avec le système dot * * Copyright (C) 2009 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "dot.h" #include #include #include /* Graphique selon Graphviz */ struct _graph_layout { GVC_t *context; /* Contexte pour Graphviz */ graph_t *graph; /* Graphique construit */ }; /****************************************************************************** * * * Paramètres : cmds = description textuelle du graphique à représenter. * * * * Description : Charge un graphique à partir de sa description. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ graph_layout *create_graph_layout(char *cmds) { graph_layout *result; /* Composants à retourner */ int ret; /* Bilan d'un appel */ result = (graph_layout *)calloc(1, sizeof(graph_layout)); result->context = gvContext(); result->graph = agmemread(cmds); if (result->graph == NULL) goto cdl_error; ret = gvLayout(result->context, result->graph, "dot"); printf("ret = %d\n", ret); ret = gvRender(result->context, result->graph, "dot", NULL); printf("ret = %d\n", ret); return result; cdl_error: delete_graph_layout(result); return NULL; } /****************************************************************************** * * * Paramètres : layout = graphique à supprimer de la mémoire. * * * * Description : Décharge un graphique. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void delete_graph_layout(graph_layout *layout) { if (layout->graph != NULL) { gvFreeLayout(layout->context, layout->graph); agclose(layout->graph); } gvFreeContext(layout->context); free(layout); } /****************************************************************************** * * * Paramètres : layout = graphique à supprimer de la mémoire. * * fixed = support de destination. * * nodes = liste de noeuds à traiter. * * count = taille de la liste. * * * * Description : Place tous les éléments du graphique à l'écran. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void place_nodes_of_graph_layout(const graph_layout *layout, GtkFixed *fixed, GGraphNode **nodes, size_t count) { node_t *iter; /* Boucle de parcours */ GGraphNode *node; /* Intermédiaire concerné */ for (iter = agfstnode(layout->graph); iter != NULL; iter = agnxtnode(layout->graph, iter)) { node = find_graph_node_by_name(nodes, count, iter->name); g_graph_node_place(node, fixed, (double)iter->u.coord.x, (double)iter->u.coord.y); } }