diff options
Diffstat (limited to 'src/analysis/line.c')
-rw-r--r-- | src/analysis/line.c | 226 |
1 files changed, 220 insertions, 6 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c index 052adea..f5f3d9c 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -55,6 +55,8 @@ struct _rendering_line { DL_LIST_ITEM; + uint64_t offset; /* Position en mémoire/physique*/ + RenderingLineType type; /* Type de représentation */ PangoLayout *layout; /* Moteur de rendu du code/txt */ @@ -75,7 +77,6 @@ void init_rendering_line(rendering_line *); - /* ------------------------- LIGNE EN TETE DE DESASSEMBLAGE ------------------------- */ @@ -94,6 +95,25 @@ void refresh_prologue_markup(prologue_line *); +/* ----------------------- COMMENTAIRES SUR UNE LIGNE ENTIERE ----------------------- */ + + +/* Ligne de commantaires entière */ +typedef struct _comment_line +{ + rendering_line basic; /* A laisser en premier */ + + char *comment; /* Texte à afficher */ + const disass_options *options; /* Options de représentation */ + +} comment_line; + + +/* Met à jour la ligne de représentation de commentaires. */ +void refresh_comment_markup(comment_line *); + + + /* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ @@ -162,7 +182,7 @@ void init_rendering_line(rendering_line *line) * * * Retour : - * * * -* Remarques : - * +* Remarques : La ligne est considérée comme étant insérée au bon endroit. * * * ******************************************************************************/ @@ -173,6 +193,48 @@ void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) } +/****************************************************************************** +* * +* Paramètres : lines = liste de lignes à compléter, ou NULL. * +* line = nouvelle ligne à intégrer à l'ensemble. * +* first = position de la ligne en cas d'adresse partagée. * +* * +* Description : Insère une ligne dans un ensemble existant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *line, bool first) +{ + rendering_line *iter; /* Boucle de parcours */ + rendering_line *next; /* Prochaine ligne parcourue */ + + dl_list_for_each_safe(iter, DLL_HCAST(lines), next, rendering_line *) + { + if (first && iter->offset >= line->offset) break; + else if (!first) + { + /* TODO */; + } + + } + + if (iter == NULL) + dl_list_add_tail(line, DLL_HCAST(lines)); + + else + { + if (first) + dl_list_insert_before(line, iter, DLL_HCAST(lines)); + else + /* TODO */; + } + +} + @@ -295,6 +357,8 @@ rendering_line *create_prologue_line(const char *comment) init_rendering_line(RENDERING_LINE(result)); + RENDERING_LINE(result)->offset = 0; + RENDERING_LINE(result)->type = RLT_PROLOGUE; RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_prologue_markup; @@ -340,6 +404,154 @@ void refresh_prologue_markup(prologue_line *line) /* ---------------------------------------------------------------------------------- */ +/* COMMENTAIRES SUR UNE LIGNE ENTIERE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : offset = position dans la mémoire ou le fichier. * +* type = type du commentaire. * +* comment = texte à afficher au final. * +* options = paramétrage du rendu. * +* * +* Description : Crée une ligne de commentaires entière. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +rendering_line *create_comment_line(uint64_t offset, RenderingLineType type, const char *comment, const disass_options *options) +{ + comment_line *result; /* Structure à retourner */ + + result = (prologue_line *)calloc(1, sizeof(prologue_line)); + + init_rendering_line(RENDERING_LINE(result)); + + RENDERING_LINE(result)->offset = offset; + + RENDERING_LINE(result)->type = type; + + RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_comment_markup; + + result->comment = strdup(comment); + result->options = options; + + return RENDERING_LINE(result); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne de représentation à actualiser. * +* * +* Description : Met à jour la ligne de représentation de commentaires. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void refresh_comment_markup(comment_line *line) +{ + size_t len; /* Taille du contenu */ + char *content; /* Contenu réellement imprimé */ + char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */ + size_t clen; /* Taille du commentaire */ + + len = strlen("<tt>") + 1; + content = (char *)calloc(len, sizeof(char)); + strcpy(content, "<tt>"); + + /* Eventuelle adresse virtuelle */ + + if (line->options->show_address) + { + switch (ADM_32BITS /* FIXME */) + { + case ADM_32BITS: + snprintf(buffer, CODE_BUFFER_LEN, + "<span foreground='#333333'>0x%08llx</span>", + RENDERING_LINE(line)->offset); + break; + + case ADM_64BITS: + snprintf(buffer, CODE_BUFFER_LEN, + "<span foreground='#333333'>0x%16llx</span>", + RENDERING_LINE(line)->offset); + break; + + } + + len += strlen(buffer); + content = (char *)realloc(content, len * sizeof(char)); + strcat(content, buffer); + + } + + /* Eventuel code brut (sauté) */ + + if (line->options->show_code) + { + clen = (line->options->show_address ? strlen("\t") : 0); + clen += RENDERING_LINE(line)->max_bin_len; + + content = (char *)realloc(content, (len + clen) * sizeof(char)); + + if (line->options->show_address) + { + strcat(content, "\t"); + len += strlen("\t"); + } + + memset(&content[len - 1], RENDERING_LINE(line)->type == RLT_PROTOTYPE ? '-' : ' ', + RENDERING_LINE(line)->max_bin_len); + len += RENDERING_LINE(line)->max_bin_len; + + content[len] = '\0'; + + } + + /* Commentaire proprement dit */ + + clen = (line->options->show_address || line->options->show_code ? strlen("\t") : 0); + clen += strlen("<b><span foreground='#003300'>"); + clen += strlen("; ") + strlen(line->comment); + clen += strlen("</span></b>"); + + content = (char *)realloc(content, (len + clen) * sizeof(char)); + + if (line->options->show_address || line->options->show_code) + { + strcat(content, "\t"); + len += strlen("\t"); + clen -= strlen("\t"); + } + + snprintf(&content[len - 1], clen + 1, "<b><span foreground='#003300'>; %s</span></b>", line->comment); + + len += clen; + + /* Finalisation */ + + len += strlen("</tt>"); + content = (char *)realloc(content, len * sizeof(char)); + strcat(content, "</tt>"); + + pango_layout_set_markup(RENDERING_LINE(line)->layout, content, len - 1); + + free(content); + +} + + + +/* ---------------------------------------------------------------------------------- */ /* LIGNE DE CODE EN LANGAGE MACHINE */ /* ---------------------------------------------------------------------------------- */ @@ -357,7 +569,7 @@ void refresh_prologue_markup(prologue_line *line) * * ******************************************************************************/ -rendering_line *create_code_line(asm_instr *instr, const disass_options *options) +rendering_line *create_code_line(asm_instr *instr, uint64_t offset, const disass_options *options) { code_line *result; /* Structure à retourner */ @@ -365,6 +577,8 @@ rendering_line *create_code_line(asm_instr *instr, const disass_options *options init_rendering_line(RENDERING_LINE(result)); + RENDERING_LINE(result)->offset = offset; + RENDERING_LINE(result)->type = RLT_CODE; RENDERING_LINE(result)->get_bin_len = (get_bin_len_fc)get_code_binary_len; @@ -430,7 +644,7 @@ void refresh_code_markup(code_line *line) content = (char *)calloc(len, sizeof(char)); strcpy(content, "<tt>"); - if (line->options->show_address || line->options->show_code) + if (line->options->show_code) get_asm_instr_offset_and_length(line->instr, &bin_offset, &bin_len); /* Eventuelle adresse virtuelle */ @@ -442,13 +656,13 @@ void refresh_code_markup(code_line *line) case ADM_32BITS: snprintf(buffer, CODE_BUFFER_LEN, "<span foreground='#333333'>0x%08llx</span>", - bin_offset); + RENDERING_LINE(line)->offset); break; case ADM_64BITS: snprintf(buffer, CODE_BUFFER_LEN, "<span foreground='#333333'>0x%16llx</span>", - bin_offset); + RENDERING_LINE(line)->offset); break; } |