diff options
Diffstat (limited to 'src/gtkext/graph/node.c')
-rw-r--r-- | src/gtkext/graph/node.c | 78 |
1 files changed, 67 insertions, 11 deletions
diff --git a/src/gtkext/graph/node.c b/src/gtkext/graph/node.c index 0d746e2..d9b0eca 100644 --- a/src/gtkext/graph/node.c +++ b/src/gtkext/graph/node.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * node.c - éléments de graphiques chez dot * - * Copyright (C) 2009-2012 Cyrille Bagard + * Copyright (C) 2009-2013 Cyrille Bagard * * This file is part of OpenIDA. * @@ -29,6 +29,7 @@ #include <string.h> +#include "../gtkbufferview.h" #include "../../common/extstr.h" @@ -60,6 +61,10 @@ struct _GGraphNodeClass }; +/* Taille maximale des lignes de description de noeud */ +#define NODE_DESC_LEN 128 + + /* Initialise la classe des intermédiaires avec les noeuds dot. */ static void g_graph_node_class_init(GGraphNodeClass *); @@ -184,8 +189,9 @@ GGraphNode *g_graph_node_new(GtkWidget *view) /****************************************************************************** * * -* Paramètres : node = intermédiaire à consulter. * -* cmds = description pour dot à compléter. * +* Paramètres : node = intermédiaire à consulter. * +* cmds = description pour dot à compléter. * +* level = profondeur du noeud pour l'indentation. * * * * Description : Déclare l'intermédiaire en tant que noeud pour dot. * * * @@ -195,33 +201,45 @@ GGraphNode *g_graph_node_new(GtkWidget *view) * * ******************************************************************************/ -char *g_graph_node_register_for_dot(const GGraphNode *node, char *cmds) +char *g_graph_node_register_for_dot(const GGraphNode *node, char *cmds, unsigned int level) { GtkRequisition requisition; /* Taille à l'écran requise */ - char buffer[128]; + unsigned int i; /* Boucle de parcours */ + char buffer[NODE_DESC_LEN]; /* Tampon pour les commandes */ gtk_widget_size_request(node->view, &requisition); - snprintf(buffer, 128, " subgraph cluster%s {\n", node->name); + for (i = 0; i < level; i++) + cmds = stradd(cmds, DOT_IDENT); + + snprintf(buffer, NODE_DESC_LEN, "subgraph cluster%s {\n", node->name); cmds = stradd(cmds, buffer); - cmds = stradd(cmds, " style=invisible;\n"); + for (i = 0; i < (level + 1); i++) + cmds = stradd(cmds, DOT_IDENT); + + cmds = stradd(cmds, "style=invisible;\n"); + + for (i = 0; i < (level + 1); i++) + cmds = stradd(cmds, DOT_IDENT); - cmds = stradd(cmds, " "); cmds = stradd(cmds, node->name); cmds = stradd(cmds, " [shape=box, fixedsize "); - snprintf(buffer, 128, ", width=\"%g\"", + snprintf(buffer, NODE_DESC_LEN, ", width=\"%g\"", requisition.width / G_GRAPH_NODE_GET_CLASS(node)->dpi_x); cmds = stradd(cmds, buffer); - snprintf(buffer, 128, ", height=\"%g\"", + snprintf(buffer, NODE_DESC_LEN, ", height=\"%g\"", requisition.height / G_GRAPH_NODE_GET_CLASS(node)->dpi_y); cmds = stradd(cmds, buffer); cmds = stradd(cmds, "];\n"); - cmds = stradd(cmds, " }\n"); + for (i = 0; i < level; i++) + cmds = stradd(cmds, DOT_IDENT); + + cmds = stradd(cmds, "}\n"); return cmds; @@ -327,6 +345,44 @@ void g_graph_node_connect(const GGraphNode *node, gint x, gint y, GdkPoint **poi /****************************************************************************** * * +* Paramètres : nodes = liste de noeuds à parcourir. * +* count = taille de la liste. * +* addrt = adresse de début du noeud recherché. * +* * +* Description : Recherche un noeud donné dans une série de noeuds. * +* * +* Retour : Noeud trouvé ou NULL si aucun. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GGraphNode *find_graph_node_by_start_address(GGraphNode **nodes, size_t count, vmpa_t addr) +{ + GGraphNode *result; /* Trouvaille à remonter */ + size_t i; /* Boucle de parcours */ + GBufferView *buffer; /* Tampon d'une partie de code */ + vmpa_t start; /* Adresse de départ du tampon */ + + result = NULL; + + for (i = 0; i < count && result == NULL; i++) + { + buffer = gtk_buffer_view_get_buffer(GTK_BUFFER_VIEW(nodes[i]->view)); + g_buffer_view_get_restrictions(buffer, &start, NULL); + + if (start == addr) + result = nodes[i]; + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : nodes = liste de noeuds à parcourir. * * count = taille de la liste. * * target = nom du noeud recherché. * |