summaryrefslogtreecommitdiff
path: root/src/graph/dot.c
blob: dc1c9a92fbd28293564f8845e055669bbd2bbbef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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);
    }

}