From 0320d85e480882c58f254640a54c6c6e190dbf47 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 5 Mar 2017 01:08:23 +0100 Subject: Compressed the size of operands with no alternative rendering. --- ChangeLog | 6 ++++++ src/arch/operand-int.h | 15 +++++++++++---- src/arch/operand.c | 39 ++++++++++++++++++++++++--------------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c893d8..be4bd7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +17-03-05 Cyrille Bagard + + * src/arch/operand-int.h: + * src/arch/operand.c: + Compress the size of operands with no alternative rendering. + 17-03-03 Cyrille Bagard * src/analysis/db/cdb.c: diff --git a/src/arch/operand-int.h b/src/arch/operand-int.h index 6aa15e8..eb1a1d7 100644 --- a/src/arch/operand-int.h +++ b/src/arch/operand-int.h @@ -37,16 +37,23 @@ typedef int (* operand_compare_fc) (const GArchOperand * const *, const GArchOpe typedef void (* operand_print_fc) (const GArchOperand *, GBufferLine *, AsmSyntax); +/* Adjonction de rendu alternatif */ +typedef struct _alt_rendering +{ + RenderingTagType tag; /* Type de rendu */ + char text[0]; /* Texte alternatif */ + +} alt_rendering; + + /* Définition générique d'un opérande d'architecture (instance) */ struct _GArchOperand { GObject parent; /* A laisser en premier */ - unsigned int shared_count; /* Compteur de partages */ + alt_rendering *alt_info; /* Autre rendu éventuel */ - char *alt_text; /* Eventuel texte alternatif */ - size_t alt_len; /* Taille de ce texte */ - RenderingTagType alt_tag; /* Type de rendu */ + unsigned int shared_count; /* Compteur de partages */ }; diff --git a/src/arch/operand.c b/src/arch/operand.c index dc0559a..731c757 100644 --- a/src/arch/operand.c +++ b/src/arch/operand.c @@ -333,20 +333,23 @@ int g_arch_operand_compare(const GArchOperand * const *a, const GArchOperand * c void g_arch_operand_set_alt_text(GArchOperand *operand, const char *text, RenderingTagType tag) { - if (operand->alt_text != NULL) - free(operand->alt_text); + size_t alt_len; /* Taille du texte alternatif */ + + if (operand->alt_info != NULL) + free(operand->alt_info); + + if (text == NULL) + operand->alt_info = NULL; - if (text != NULL) - { - operand->alt_text = strdup(text); - operand->alt_len = strlen(text); - operand->alt_tag = tag; - } else { - operand->alt_text = NULL; - operand->alt_len = 0; - operand->alt_tag = RTT_COUNT; + alt_len = strlen(text); + + operand->alt_info = (alt_rendering *)malloc(sizeof(RenderingTagType) + alt_len + 1); + + operand->alt_info->tag = tag; + strcpy(operand->alt_info->text, text); + } } @@ -368,13 +371,19 @@ void g_arch_operand_set_alt_text(GArchOperand *operand, const char *text, Render void g_arch_operand_print(const GArchOperand *operand, GBufferLine *line, AsmSyntax syntax) { - if (operand->alt_text != NULL) + size_t alt_len; /* Taille du texte alternatif */ + + if (operand->alt_info != NULL) + { + alt_len = strlen(operand->alt_info->text); + g_buffer_line_append_text(line, BLC_ASSEMBLY, - operand->alt_text, - operand->alt_len, - operand->alt_tag, + operand->alt_info->text, + alt_len, + operand->alt_info->tag, NULL); + } else G_ARCH_OPERAND_GET_CLASS(operand)->print(operand, line, syntax); -- cgit v0.11.2-87-g4458