diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-06-25 00:34:22 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-06-25 00:34:22 (GMT) |
commit | f2696c85e502e36a529a1d8ee3d209498ac2c0e9 (patch) | |
tree | 3d8ffe28a730d32c98e8d048b99f67b7856acec9 /src/graph/dot.c | |
parent | 23c7cd436e2ec980a68e6d12a6d8a750e357763c (diff) |
Used Graphviz library for building graphs (first attempt).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@80 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/graph/dot.c')
-rw-r--r-- | src/graph/dot.c | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/graph/dot.c b/src/graph/dot.c new file mode 100644 index 0000000..dc1c9a9 --- /dev/null +++ b/src/graph/dot.c @@ -0,0 +1,148 @@ + +/* 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 <http://www.gnu.org/licenses/>. + */ + + +#include "dot.h" + + +#include <malloc.h> +#include <graphviz/gvc.h> +#include <graphviz/types.h> + + + +/* 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); + } + +} |