From f225f8af4eff40b5096f512b699571554e54f097 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 18 Jul 2018 01:06:19 +0200
Subject: Got the namespace separator from formats when listing symbols.

---
 plugins/dexbnf/demangler.c   |  1 +
 plugins/itanium/demangler.c  |  1 +
 src/format/format.c          | 30 ++++++++++++++++++++++++++++--
 src/format/format.h          | 13 +++++++++++++
 src/gui/panels/symbols.c     | 33 ++++++++++++++++++++++++++++++++-
 src/mangling/demangler-int.h |  1 +
 src/mangling/demangler.c     | 23 +++++++++++++++++++++++
 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 *);
 
-- 
cgit v0.11.2-87-g4458