From a60e1fe19d09eb379c88fdbbe018ca086dc05bcb Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 21 Feb 2018 22:34:55 +0100
Subject: Cut symbol labels using words instead of single characters.

---
 ChangeLog                |  9 +++++++++
 src/common/extstr.c      | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/common/extstr.h      |  3 +++
 src/gui/panels/symbols.c | 38 +++++++++++++++++++-------------------
 4 files changed, 77 insertions(+), 19 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 90898d4..30cb3c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 18-02-21  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/common/extstr.c:
+	* src/common/extstr.h:
+	Define a custom function to extract tokens from strings.
+
+	* src/gui/panels/symbols.c:
+	Cut symbol labels using words instead of single characters.
+
+18-02-21  Cyrille Bagard <nocbos@gmail.com>
+
 	* pixmaps/symbol_object_classic.png:
 	New entry: create an icon for object symbols.
 
diff --git a/src/common/extstr.c b/src/common/extstr.c
index bd561ba..83dcace 100644
--- a/src/common/extstr.c
+++ b/src/common/extstr.c
@@ -251,6 +251,52 @@ char *_strxxx(char *str, int (* fn) (int))
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : str   = chaîne de caractères à traiter. [OUT]                *
+*                delim = mot de séparation entre les mots identifiés.         *
+*                                                                             *
+*  Description : Extrait un mot d'une chaîne selon des séparations longues.   *
+*                                                                             *
+*  Retour      : Chaîne de caractères cernée ou NULL.                         *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+char *strtok_w(char **str, const char *delim)
+{
+    char *result;
+    char *haystack;
+    char *next;
+    const char *diter;
+
+    haystack = *str;
+
+    if (haystack == NULL)
+        result = NULL;
+
+    else
+    {
+        result = haystack;
+
+        next = strstr(haystack, delim);
+
+        if (next != NULL)
+        {
+            for (diter = delim; *diter; diter++, next++)
+                *next = '\0';
+        }
+
+        *str = next;
+
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : str   = chaîne de caractères à traiter.                      *
 *                delim = séparateur entre les mots.                           *
 *                count = nombre de mots trouvés. [OUT]                        *
diff --git a/src/common/extstr.h b/src/common/extstr.h
index f803129..d5bbee6 100644
--- a/src/common/extstr.h
+++ b/src/common/extstr.h
@@ -52,6 +52,9 @@ char *_strxxx(char *, int (* fn) (int));
 #define strlower(str) _strxxx(str, tolower)
 #define strupper(str) _strxxx(str, toupper)
 
+/* Extrait un mot d'une chaîne selon des séparations longues. */
+char *strtok_w(char **, const char *);
+
 /* Extrait une liste de mots d'une chaîne. */
 char **strtoka(const char *, const char *, size_t *);
 
diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c
index 6b0b999..d1e60fc 100644
--- a/src/gui/panels/symbols.c
+++ b/src/gui/panels/symbols.c
@@ -39,6 +39,7 @@
 #include "panel-int.h"
 #include "updating-int.h"
 #include "../core/global.h"
+#include "../../common/extstr.h"
 #include "../../format/format.h"
 #include "../../format/symiter.h"
 #include "../../gtkext/easygtk.h"
@@ -56,6 +57,7 @@ struct _GSymbolsPanel
     GPanelItem parent;                      /* A laisser en premier        */
 
     GLoadedBinary *binary;                  /* Binaire à prendre en compte */
+    const char *sep;                        /* Délimitateur à utiliser     */
 
     size_t count;                           /* Quantité de symboles utiles */
 
@@ -164,7 +166,7 @@ static gboolean show_all_classes_in_tree_view(GtkTreeModel *, GtkTreePath *, Gtk
 static GtkTreeIter update_symbol_partial_name_in_tree_view(GtkTreeStore *, GtkTreeIter *, const char *, const regmatch_t *, size_t);
 
 /* Met en surbrillance les éléments recherchés dans les noms. */
-static void update_symbol_name_in_tree_view(GtkTreeStore *, const GBinSymbol *, const regmatch_t *);
+static void update_symbol_name_in_tree_view(const GSymbolsPanel *, GtkTreeStore *, const GBinSymbol *, const regmatch_t *);
 
 
 
@@ -655,8 +657,13 @@ static void change_symbols_panel_current_binary(GSymbolsPanel *panel, GLoadedBin
     /* Si le panneau actif représente un binaire, actualisation de l'affichage */
 
     if (binary != NULL)
+    {
+        panel->sep = "."/*"::"*/;  /* FIXME */
+
         run_panel_update(G_UPDATABLE_PANEL(panel), PUI_0);
 
+    }
+
 }
 
 
@@ -941,10 +948,8 @@ static bool find_parent_for_symbol(const GSymbolsPanel *panel, const GBinSymbol
     bool result;                            /* Bilan à retourner           */
     const char *label;                      /* Etiquette immuable          */
     char *string;                           /* Etiquette modifiable        */
-    const char *sep;                        /* Délimitateur à utiliser     */
     char *start;                            /* Début de boucle de parcours */
     char *token;                            /* Partie de texte isolée      */ 
-    char *saveptr;                          /* Ctx. interne de découpage   */
     char *next;                             /* Prochaine partie à traiter  */
 
     result = false;
@@ -956,18 +961,16 @@ static bool find_parent_for_symbol(const GSymbolsPanel *panel, const GBinSymbol
 
     string = strdup(label);
 
-    sep = "."/*"::"*/;  /* FIXME */
-
-    for (start = string, token = strtok_r(start, sep, &saveptr); ; start = NULL, token = next)
+    for (start = string, token = strtok_w(&start, panel->sep); ; token = next)
     {
-        next = strtok_r(NULL, sep, &saveptr);
+        next = strtok_w(&start, panel->sep);
         if (next == NULL)
         {
             *last = (token - string);
             break;
         }
 
-        *parent = ensure_symbol_node_exist(panel, (start == string ? NULL : parent), token, match, token - string);
+        *parent = ensure_symbol_node_exist(panel, (token == string ? NULL : parent), token, match, token - string);
 
         result = true;
 
@@ -1245,9 +1248,10 @@ static GtkTreeIter update_symbol_partial_name_in_tree_view(GtkTreeStore *store,
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : store  = gestionnaire de données en arborescence.            *
+*  Paramètres  : panel  = panneau à mettre à jour.                            *
+*                store  = gestionnaire de données en arborescence.            *
 *                symbol = routine ou objet à intégrer.                        *
-*                match = portion de texte à mettre en évidence.               *
+*                match  = portion de texte à mettre en évidence.              *
 *                                                                             *
 *  Description : Met en surbrillance les éléments recherchés dans les noms.   *
 *                                                                             *
@@ -1257,15 +1261,13 @@ static GtkTreeIter update_symbol_partial_name_in_tree_view(GtkTreeStore *store,
 *                                                                             *
 ******************************************************************************/
 
-static void update_symbol_name_in_tree_view(GtkTreeStore *store, const GBinSymbol *symbol, const regmatch_t *match)
+static void update_symbol_name_in_tree_view(const GSymbolsPanel *panel, GtkTreeStore *store, const GBinSymbol *symbol, const regmatch_t *match)
 {
     const char *label;                      /* Etiquette immuable          */
     char *string;                           /* Etiquette modifiable        */
-    const char *sep;                        /* Délimitateur à utiliser     */
     GtkTreeIter parent;                     /* Point d'analyse courant     */
     char *start;                            /* Début de boucle de parcours */
     char *token;                            /* Partie de texte isolée      */
-    char *saveptr;                          /* Ctx. interne de découpage   */
 
     label = g_binary_symbol_get_label(symbol);
 
@@ -1273,13 +1275,11 @@ static void update_symbol_name_in_tree_view(GtkTreeStore *store, const GBinSymbo
     {
         string = strdup(label);
 
-        sep = "."/*"::"*/;  /* FIXME */
-
-        for (start = string, token = strtok_r(start, sep, &saveptr);
+        for (start = string, token = strtok_w(&start, panel->sep);
              token != NULL;
-             start = NULL, token = strtok_r(NULL, sep, &saveptr))
+             token = strtok_w(&start, panel->sep))
         {
-            parent = update_symbol_partial_name_in_tree_view(store, (start == string ? NULL : &parent),
+            parent = update_symbol_partial_name_in_tree_view(store, (token == string ? NULL : &parent),
                                                              token, match, token - string);
         }
 
@@ -1429,7 +1429,7 @@ static void do_filtering_on_symbols(const GSymbolsPanel *panel, GtkStatusStack *
                 if (*as_list)
                     update_symbol_name_in_list_view(store, iter, &match);
                 else
-                    update_symbol_name_in_tree_view(store, symbol, &match);
+                    update_symbol_name_in_tree_view(panel, store, symbol, &match);
 
                 if (!shown)
                     update_symbol_visibility(store, iter, true);
-- 
cgit v0.11.2-87-g4458