/* Chrysalide - Outil d'analyse de fichiers binaires * node.h - prototypes pour les éléments de graphiques chez dot * * Copyright (C) 2009-2013 Cyrille Bagard * * This file is part of Chrysalide. * * 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 . */ #ifndef _GRAPH_NODE_H #define _GRAPH_NODE_H #include "params.h" #include "ranks.h" #include "../gtkbufferview.h" #include "../gtkgraphview.h" #include "../../arch/instruction.h" #include "../../analysis/block.h" /* Indentation pour l'édition des commandes */ #define DOT_IDENT " " /* Taille maximale des noms de noeud ("_%p") */ #define NODE_NAME_LEN (3 + sizeof(GtkWidget *) * 2 + 1) /* -------------------------- GESTION DES NOEUDS A L'UNITE -------------------------- */ #define G_TYPE_GRAPH_NODE g_graph_node_get_type() #define G_GRAPH_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_graph_node_get_type(), GGraphNode)) #define G_IS_GRAPH_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_graph_node_get_type())) #define G_GRAPH_NODE_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_graph_node_get_type(), GGraphNodeIface)) #define G_GRAPH_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_GRAPH_NODE, GGraphNodeClass)) /* Intermédiaire entre le noeud dot et la bribe de code (instance) */ typedef struct _GGraphNode GGraphNode; /* Intermédiaire entre le noeud dot et la bribe de code (classe) */ typedef struct _GGraphNodeClass GGraphNodeClass; /* Indications sur l'abscisse idéale à adopter */ typedef union _pending_position { gint direct_x; /* Position strictement vert. */ gint left_margin; /* Limite à ne pas dépasser #1 */ gint right_margin; /* Limite à ne pas dépasser #2 */ GGraphNode *left_node; /* Noeud de référence à droite */ GGraphNode *right_node; /* Noeud de référence à gauche */ } pending_position; /* Définition présente dans les indications */ typedef enum _PendingPositionFlags { PPF_NONE, /* Aucune -> centrage */ PPF_DIRECT_X, /* Position strictement vert. */ PPF_LEFT_MARGIN, /* Limite à ne pas dépasser #1 */ PPF_RIGHT_MARGIN, /* Limite à ne pas dépasser #2 */ PPF_LEFT_NODE, /* Noeud de référence à droite */ PPF_RIGHT_NODE /* Noeud de référence à gauche */ } PendingPositionFlags; /* Détail sur une visite */ typedef enum _GNodeVisitState { GVS_ENTER, /* Entrée dans un groupe */ GVS_NODE, /* Traitement d'une feuille */ GVS_EXIT /* Sortie d'un groupe */ } GNodeVisitState; /* Rappel à chaque noeud visité */ typedef bool (* graph_node_visitor_cb) (GGraphNode *, GNodeVisitState, void *); /* Indique le type définit par la GLib pour le noeud. */ GType g_graph_node_get_type(void); /* Constitue un intermédiaire entre un noeud dot et du code. */ GGraphNode *g_graph_node_new(GtkWidget *); /* Fournit le rang du noeud dans le graphique. */ unsigned int g_graph_node_get_rank(const GGraphNode *); /* Réinitialise la position d'un noeud de graphique. */ void g_graph_node_reset_position(GGraphNode *); /* Définit les abscisses relatives du contenu d'un noeud. */ void g_graph_node_prepare_x_line(GGraphNode *node, GGraphNode *nodes); /* Applique une position finale au noeud. */ void g_graph_node_apply_position(GGraphNode *); /* Altère la position du noeud d'encapsulation. */ void g_graph_node_set_x_position(GGraphNode *, gint); /* Prépare la position du noeud pour l'alignement des liens. */ void g_graph_node_set_pending_position(GGraphNode *, PendingPositionFlags, pending_position, GGraphNode *); /* Indique la position du noeud pour l'alignement des liens. */ void g_graph_node_get_pending_position(GGraphNode *, PendingPositionFlags *, pending_position *); /* Fournit la position du noeud d'encapsulation. */ void g_graph_node_get_position(const GGraphNode *, gint *, gint *); #define g_graph_node_has_x_position(node) \ ({ \ gint _x; \ g_graph_node_get_position(node, &_x, NULL); \ _x != UNINITIALIZED_NODE_POS; \ }) /* Espace constitué, entièrement ou non. */ GtkAllocation g_graph_node_get_allocation(const GGraphNode *); /* Parcourt tous les noeuds graphiques dans un ordre donné. */ bool g_graph_node_visit_nodes(GGraphNode *, graph_node_visitor_cb, void *); /* Recherche le noeud contenant un autre noeud. */ GGraphNode *g_graph_node_find_container(GGraphNode *, GGraphNode *); /* Recherche le noeud contenant un autre noeud à un même niveau. */ GGraphNode *g_graph_node_find_container_at_same_level(GGraphNode *, GGraphNode *, GGraphNode *); /* Inscrit le noeud au rang donné. */ char *g_graph_node_append_name_to_rank(const GGraphNode *, char *); /* Déclare l'intermédiaire en tant que noeud pour dot. */ char *g_graph_node_register_for_dot(const GGraphNode *, char *, unsigned int); /* Place le morceau de code de l'intermédiaire à l'écran. */ void g_graph_node_place_old(GGraphNode *, GtkGraphView *, gint , gint); /* Etablit une jonction ferme avec un noeud. */ void g_graph_node_connect(const GGraphNode *, gint, gint, GdkPoint **, size_t *); /* ----------------------- MANIPULATION D'ENSEMBLES DE NOEUDS ----------------------- */ /* Recherche une vue donnée dans une série de vues. */ GtkBufferView *find_graph_view_by_start_address(GtkBufferView **, size_t, vmpa_t); /* Réalise une conversion de blocs en noeuds. */ GGraphNode *convert_blocks_into_nodes(GInstrBlock *, GtkBufferView **, size_t); /* Recherche le noeud contenant une instruction donnée. */ GGraphNode *find_node_for_instruction(GGraphNode *, GArchInstruction *); /* Recherche un noeud donné dans une série de noeuds. */ GGraphNode *find_graph_node_by_start_address(GGraphNode **, size_t, vmpa_t); /* Recherche un noeud donné dans une série de noeuds. */ GGraphNode *find_graph_node_by_name(GGraphNode **, size_t, const char *); #endif /* _GRAPH_NODE_H */