diff options
-rw-r--r-- | plugins/dexbnf/demangler.c | 1 | ||||
-rw-r--r-- | plugins/itanium/demangler.c | 1 | ||||
-rw-r--r-- | src/format/format.c | 30 | ||||
-rw-r--r-- | src/format/format.h | 13 | ||||
-rw-r--r-- | src/gui/panels/symbols.c | 33 | ||||
-rw-r--r-- | src/mangling/demangler-int.h | 1 | ||||
-rw-r--r-- | src/mangling/demangler.c | 23 | ||||
-rw-r--r-- | src/mangling/demangler.h | 3 |
8 files changed, 102 insertions, 3 deletions
diff --git a/plugins/dexbnf/demangler.c b/plugins/dexbnf/demangler.c index 3489f15..503f7ce 100644 --- a/plugins/dexbnf/demangler.c +++ b/plugins/dexbnf/demangler.c @@ -90,6 +90,7 @@ static void g_dex_demangler_class_init(GDexDemanglerClass *klass) demangler->can_demangle = (can_be_demangled_fc)NULL; + demangler->ns_sep = "."; demangler->context_type = G_TYPE_DEX_DEMANGLING; } diff --git a/plugins/itanium/demangler.c b/plugins/itanium/demangler.c index 690f7c8..5fe0d09 100644 --- a/plugins/itanium/demangler.c +++ b/plugins/itanium/demangler.c @@ -90,6 +90,7 @@ static void g_itanium_demangler_class_init(GItaniumDemanglerClass *klass) demangler->can_demangle = (can_be_demangled_fc)NULL; + demangler->ns_sep = "::"; demangler->context_type = G_TYPE_ITANIUM_DEMANGLING; } diff --git a/src/format/format.c b/src/format/format.c index 2101767..449f0f0 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -488,6 +488,32 @@ void g_binary_format_complete_analysis(GBinFormat *format, wgroup_id_t gid, GtkS /****************************************************************************** * * * Paramètres : format = format binaire à consulter pour l'opération. * +* * +* Description : Fournit le décodeur de symboles privilégié pour un format. * +* * +* Retour : Décodeur préféré ou NULL s'il n'est pas renseigné. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GCompDemangler *g_binary_format_get_demangler(const GBinFormat *format) +{ + GCompDemangler *result; /* Décodeur à retourner */ + + result = format->demangler; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format binaire à consulter pour l'opération. * * desc = chaîne de caractères à décoder. * * * * Description : Décode une chaîne de caractères donnée en type. * @@ -503,7 +529,7 @@ GDataType *g_binary_format_decode_type(const GBinFormat *format, const char *des GDataType *result; /* Construction à remonter */ GCompDemangler *demangler; /* Accès plus lisible */ - demangler = G_BIN_FORMAT(format)->demangler; + demangler = format->demangler; if (demangler != NULL) result = g_compiler_demangler_decode_type(demangler, desc); @@ -533,7 +559,7 @@ GBinRoutine *g_binary_format_decode_routine(const GBinFormat *format, const char GBinRoutine *result; /* Construction à remonter */ GCompDemangler *demangler; /* Accès plus lisible */ - demangler = G_BIN_FORMAT(format)->demangler; + demangler = format->demangler; if (demangler != NULL) result = g_compiler_demangler_decode_routine(demangler, desc); diff --git a/src/format/format.h b/src/format/format.h index e552f0c..372b3b0 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -37,6 +37,11 @@ +/* Depuis ../mangling/demangler.h : Décodeur de désignations générique (instance) */ +typedef struct _GCompDemangler GCompDemangler; + + + #define G_TYPE_BIN_FORMAT g_binary_format_get_type() #define G_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_binary_format_get_type(), GBinFormat)) #define G_IS_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_binary_format_get_type())) @@ -84,6 +89,14 @@ void g_binary_format_complete_analysis(GBinFormat *, wgroup_id_t, GtkStatusStack +/* ------------------------------ DECODAGE DE SYMBOLES ------------------------------ */ + + +/* Fournit le décodeur de symboles privilégié pour un format. */ +GCompDemangler *g_binary_format_get_demangler(const GBinFormat *); + + + /* ---------------------- RASSEMBLEMENT ET GESTION DE SYMBOLES ---------------------- */ diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c index 414c4c7..ab138e8 100644 --- a/src/gui/panels/symbols.c +++ b/src/gui/panels/symbols.c @@ -47,6 +47,7 @@ #include "../../gtkext/easygtk.h" #include "../../gtkext/gtkdisplaypanel.h" #include "../../gtkext/tmgt.h" +#include "../../mangling/demangler.h" @@ -640,6 +641,9 @@ static void change_symbols_panel_current_content(GSymbolsPanel *panel, GLoadedCo GLoadedBinary *binary; /* Autre version de l'instance */ GtkBuilder *builder; /* Constructeur utilisé */ GtkTreeStore *store; /* Modèle de gestion */ + GBinFormat *format; /* Format du binaire */ + GCompDemangler *demangler; /* Décodeur privilégié associé */ + GtkToggleToolButton *button; /* Bouton à encadrer */ if (G_IS_LOADED_BINARY(new)) binary = G_LOADED_BINARY(new); @@ -668,7 +672,34 @@ static void change_symbols_panel_current_content(GSymbolsPanel *panel, GLoadedCo if (binary != NULL) { - panel->sep = "."/*"::"*/; /* FIXME */ + format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + demangler = g_binary_format_get_demangler(format); + + panel->sep = g_compiler_demangler_get_ns_separator(demangler); + + g_object_unref(G_OBJECT(demangler)); + g_object_unref(G_OBJECT(format)); + + if (panel->sep == NULL) + { + button = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(builder, "tree_display")); + gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE); + + button = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(builder, "list_display")); + gtk_toggle_tool_button_set_active(button, TRUE); + + } + else + { + button = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(builder, "tree_display")); + + if (!gtk_widget_get_sensitive(GTK_WIDGET(button))) + { + gtk_widget_set_sensitive(GTK_WIDGET(button), TRUE); + gtk_toggle_tool_button_set_active(button, TRUE); + } + + } run_panel_update(G_UPDATABLE_PANEL(panel), PUI_0); diff --git a/src/mangling/demangler-int.h b/src/mangling/demangler-int.h index 1039845..7c7ae69 100644 --- a/src/mangling/demangler-int.h +++ b/src/mangling/demangler-int.h @@ -48,6 +48,7 @@ struct _GCompDemanglerClass can_be_demangled_fc can_demangle; /* Possibilité de traitement */ + const char *ns_sep; /* Motif de séparation */ GType context_type; /* Contexte de décodage */ }; diff --git a/src/mangling/demangler.c b/src/mangling/demangler.c index 65bdcaf..0456258 100644 --- a/src/mangling/demangler.c +++ b/src/mangling/demangler.c @@ -128,6 +128,29 @@ static void g_compiler_demangler_finalize(GCompDemangler *demangler) /****************************************************************************** * * +* Paramètres : demangler = décodeur à consulter pour le résultat. * +* * +* Description : Indique le motif de séparation des espaces de noms. * +* * +* Retour : Chaîne de caractères. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_compiler_demangler_get_ns_separator(const GCompDemangler *demangler) +{ + const char *result; /* Chaîne à retourner */ + + result = G_COMP_DEMANGLER_GET_CLASS(demangler)->ns_sep; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : demangler = décodeur à solliciter pour l'opération. * * desc = chaîne de caractères à décoder. * * * diff --git a/src/mangling/demangler.h b/src/mangling/demangler.h index 2879e3c..7d4b6db 100644 --- a/src/mangling/demangler.h +++ b/src/mangling/demangler.h @@ -47,6 +47,9 @@ typedef struct _GCompDemanglerClass GCompDemanglerClass; /* Indique le type défini pour un décodeur de désignations. */ GType g_compiler_demangler_get_type(void); +/* Indique le motif de séparation des espaces de noms. */ +const char *g_compiler_demangler_get_ns_separator(const GCompDemangler *); + /* Tente de décoder une chaîne de caractères donnée en type. */ GDataType *g_compiler_demangler_decode_type(const GCompDemangler *, const char *); |