diff options
Diffstat (limited to 'src/format/symbol.c')
-rw-r--r-- | src/format/symbol.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/src/format/symbol.c b/src/format/symbol.c index 13ce23d..3f8e808 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -25,6 +25,7 @@ #include <assert.h> +#include <malloc.h> #include <string.h> @@ -396,12 +397,12 @@ SymbolStatus g_binary_symbol_get_status(const GBinSymbol *symbol) * * ******************************************************************************/ -const char *g_binary_symbol_get_label(const GBinSymbol *symbol) +char *g_binary_symbol_get_label(const GBinSymbol *symbol) { - const char *result; /* Etiquette à retourner */ + char *result; /* Etiquette à retourner */ if (symbol->alt != NULL) - result = symbol->alt; + result = strdup(symbol->alt); else if (G_BIN_SYMBOL_GET_CLASS(symbol)->get_label != NULL) result = G_BIN_SYMBOL_GET_CLASS(symbol)->get_label(symbol); @@ -461,11 +462,18 @@ void g_binary_symbol_set_alt_label(GBinSymbol *symbol, const char *alt) GLineGenerator *g_binary_symbol_produce_label(GBinSymbol *symbol) { GLineGenerator *result; /* Instance à retourner */ - const char *label; /* Etiquette à insérer */ + char *label; /* Etiquette à insérer */ label = g_binary_symbol_get_label(symbol); - result = (label != NULL ? G_LINE_GENERATOR(symbol) : NULL); + if (label == NULL) + result = NULL; + + else + { + result = G_LINE_GENERATOR(symbol); + free(label); + } return result; @@ -590,14 +598,27 @@ static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *symbol, size_ static void g_binary_symbol_print(GBinSymbol *symbol, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { - const char *label; /* Etiquette à insérer */ + char *label; /* Etiquette à insérer */ g_buffer_line_fill_vmpa(line, get_mrange_addr(&symbol->range), MDS_32_BITS_UNSIGNED, MDS_32_BITS_UNSIGNED); label = g_binary_symbol_get_label(symbol); - g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, SL(label), RTT_LABEL, NULL); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, ":", 1, RTT_PUNCT, NULL); + /** + * Normalement, l'étiquette n'est pas vide car le générateur provient de + * g_binary_symbol_produce_label(), qui filtre. + * + * Mais le symbole a pu être manipulé entre temps, donc on évite un assert(). + */ + + if (label != NULL) + { + g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD); + g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, SL(label), RTT_LABEL, NULL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, ":", 1, RTT_PUNCT, NULL); + + free(label); + + } } |