/* 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 _GTKEXT_GRAPH_NODE_H #define _GTKEXT_GRAPH_NODE_H #include "params.h" #include "ranks.h" #include "../gtkbufferview.h" #include "../gtkgraphview.h" #include "../../arch/instruction.h" #include "../../analysis/block.h" /* -------------------------- 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_TYPE_GRAPH_NODE, GGraphNode)) #define G_GRAPH_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_GRAPH_NODE, GGraphNodeClass)) #define G_IS_GRAPH_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_GRAPH_NODE)) #define G_IS_GRAPH_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_GRAPH_NODE)) #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 { /* PPF_DIRECT_X, PPF_LEFT_MARGIN, PPF_RIGHT_MARGIN */ struct { union { 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 *relative_ref; /* Eventuelle ref. relative */ }; /* PPF_LEFT_NODE, PPF_RIGHT_NODE, PPF_MIDDLE_OF */ struct { 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 */ PPF_MIDDLE_OF /* Centré entre deux noeuds */ } 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); /* 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); /* 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 *); /* ----------------------- 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, const vmpa2t *); /* 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 *, bool); #define find_node_for_first_instruction(nds, ins) \ _find_node_for_instruction(nds, ins, true) #define find_node_for_last_instruction(nds, ins) \ _find_node_for_instruction(nds, ins, false) #endif /* _GRAPH_NODE_H */