From 88e34a085a69d23da262a92641a80f409931ea82 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 21 Mar 2017 19:45:37 +0100
Subject: Displayed the first line content of each entry point again.

---
 ChangeLog                 | 10 ++++++++++
 src/glibext/gbufferline.c | 22 ++++++++++------------
 src/glibext/linecolumn.c  | 44 ++++++++++++++++++++++++++++++++++++++++++++
 src/glibext/linecolumn.h  |  3 +++
 src/gui/dialogs/gotox.c   | 21 +++++++++++++++------
 5 files changed, 82 insertions(+), 18 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 53b4404..b8cd12c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+17-03-21  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/glibext/gbufferline.c:
+	* src/glibext/linecolumn.c:
+	* src/glibext/linecolumn.h:
+	Update code.
+
+	* src/gui/dialogs/gotox.c:
+	Display the first line content of each entry point again.
+
 17-03-20  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/format/elf/strings.c:
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 4eb56d9..8c8f4f6 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -666,8 +666,7 @@ bool g_buffer_line_has_text(const GBufferLine *line, BufferLineColumn first, Buf
 char *g_buffer_line_get_text(const GBufferLine *line, BufferLineColumn first, BufferLineColumn end, bool markup)
 {
     char *result;                           /* Construction à retourner    */
-    BufferLineColumn i;                     /* Boucle de parcours #1       */
-    size_t j;                               /* Boucle de parcours #2       */
+    BufferLineColumn i;                     /* Boucle de parcours          */
     char *extra;                            /* Contenu à intégrer au texte */
 
     result = NULL;
@@ -679,19 +678,18 @@ char *g_buffer_line_get_text(const GBufferLine *line, BufferLineColumn first, Bu
         if (i > first && result != NULL)
             result = stradd(result, " ");
 
-        for (j = 0; j < line->columns[i].count; j++)
-        {
-            extra = get_line_segment_text(line->columns[i].segments[j], markup);
+        extra = get_line_column_text(&line->columns[i], markup);
 
-            if (result == NULL)
-                result = extra;
+        /* Si la colonne était vide, suivante ! */
+        if (extra == NULL) continue;
 
-            else
-            {
-                result = stradd(result, extra);
-                free(extra);
-            }
+        if (result == NULL)
+            result = extra;
 
+        else
+        {
+            result = stradd(result, extra);
+            free(extra);
         }
 
     }
diff --git a/src/glibext/linecolumn.c b/src/glibext/linecolumn.c
index 0c4a77d..0d38b90 100644
--- a/src/glibext/linecolumn.c
+++ b/src/glibext/linecolumn.c
@@ -28,6 +28,9 @@
 #include <malloc.h>
 
 
+#include "../common/extstr.h"
+
+
 
 /******************************************************************************
 *                                                                             *
@@ -429,6 +432,47 @@ void draw_line_column_segments(const line_column *column, cairo_t *cairo, gint x
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : column = colonne de ligne de texte à venir consulter.        *
+*                markup = indique si le texte doit être décoré ou non.        *
+*                                                                             *
+*  Description : Donne le texte représenté par une colonne de ligne de texte. *
+*                                                                             *
+*  Retour      : Texte à libérer de la mémoire après usage.                   *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+char *get_line_column_text(const line_column *column, bool markup)
+{
+    char *result;                           /* Construction à retourner    */
+    size_t i;                               /* Boucle de parcours          */
+    char *extra;                            /* Contenu à intégrer au texte */
+
+    result = NULL;
+
+    for (i = 0; i < column->count; i++)
+    {
+        extra = get_line_segment_text(column->segments[i], markup);
+
+        if (result == NULL)
+            result = extra;
+
+        else
+        {
+            result = stradd(result, extra);
+            free(extra);
+        }
+
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : column = colonne de ligne de texte à manipuler.              *
 *                ctx    = éléments à disposition pour l'exportation.          *
 *                type   = type d'exportation attendue.                        *
diff --git a/src/glibext/linecolumn.h b/src/glibext/linecolumn.h
index c88baec..5877e36 100644
--- a/src/glibext/linecolumn.h
+++ b/src/glibext/linecolumn.h
@@ -85,6 +85,9 @@ line_segment *get_line_column_content_from_index(const line_column *, size_t);
 /* Imprime le contenu d'une colonne de ligne de texte. */
 void draw_line_column_segments(const line_column *, cairo_t *, gint, gint, const segcnt_list *);
 
+/* Donne le texte représenté par une colonne de ligne de texte. */
+char *get_line_column_text(const line_column *, bool);
+
 /* Exporte la ligne de texte représentée. */
 void export_line_column_segments(const line_column *, buffer_export_context *, BufferExportType, int);
 
diff --git a/src/gui/dialogs/gotox.c b/src/gui/dialogs/gotox.c
index c666ccb..e467f8e 100644
--- a/src/gui/dialogs/gotox.c
+++ b/src/gui/dialogs/gotox.c
@@ -342,8 +342,8 @@ GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *parent, GLoadedBi
 
 static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, const vmpa2t *addr, GBinSymbol *hint)
 {
-#if 0
-    GCodeBuffer *buffer;                    /* Tampon de désassemblage     */
+    GBufferCache *cache;                    /* Tampon de désassemblage     */
+    size_t index;                           /* Indice de ligne à traiter   */
     GBufferLine *line;                      /* Ligne présente à l'adresse  */
     char *virtual;                          /* Transcription d'adresse     */
     const char *label;                      /* Etiquette de symbole trouvé */
@@ -356,10 +356,19 @@ static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary,
     char *content;                          /* Contenu de la ligne visée   */
     GtkTreeIter iter;                       /* Point d'insertion           */
 
-    /* Adresse en mémoire virtuelle */
+    /* Détermination de la ligne concernée */
+
+    cache = g_loaded_binary_get_disassembled_cache(binary);
+
+    index = g_buffer_cache_find_index_by_addr(cache, addr, true);
+
+    index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE);
 
-    buffer = g_loaded_binary_get_disassembled_buffer(binary);
-    line = g_code_buffer_find_line_by_addr(buffer, addr, BLF_HAS_CODE, NULL);
+    line = g_buffer_cache_find_line_by_index(cache, index);
+
+    g_object_unref(G_OBJECT(cache));
+
+    /* Adresse en mémoire virtuelle */
 
     if (line != NULL)
         virtual = g_buffer_line_get_text(line, BLC_VIRTUAL, BLC_VIRTUAL + 1, true);
@@ -466,7 +475,7 @@ static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary,
 
     if (line != NULL)
         g_object_unref(G_OBJECT(line));
-#endif
+
 }
 
 
-- 
cgit v0.11.2-87-g4458