summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/dexbnf/demangler.c1
-rw-r--r--plugins/itanium/demangler.c1
-rw-r--r--src/format/format.c30
-rw-r--r--src/format/format.h13
-rw-r--r--src/gui/panels/symbols.c33
-rw-r--r--src/mangling/demangler-int.h1
-rw-r--r--src/mangling/demangler.c23
-rw-r--r--src/mangling/demangler.h3
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 *);