From 88e34a085a69d23da262a92641a80f409931ea82 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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 + + * 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 * 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 +#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