diff options
Diffstat (limited to 'src/analysis/line.c')
-rw-r--r-- | src/analysis/line.c | 711 |
1 files changed, 169 insertions, 542 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c index 21f0fd5..4fc0ac5 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -24,6 +24,10 @@ #include "line.h" +#include "line-int.h" + + + #include <malloc.h> #include <stdio.h> #include <string.h> @@ -40,121 +44,49 @@ extern GtkWidget *mywid; +/* Initialise la classe des lignes de représentation. */ +static void g_rendering_line_class_init(GRenderingLineClass *); +/* Initialise une instance de ligne de représentation. */ +static void g_rendering_line_init(GRenderingLine *); -/* Méthode de mise à jour du nombre d'octets maximal par instruction. */ -typedef void (* get_bin_len_fc) (rendering_line *, off_t *); - -/* Méthode de mise à jour d'une ligne de représentation. */ -typedef void (* refresh_markup_fc) (rendering_line *); - - - -/* Ligne de représentation générique */ -struct _rendering_line -{ - DL_LIST_ITEM(link); /* Maillon de liste chaînée */ - - uint64_t offset; /* Position en mémoire/physique*/ - - RenderingLineType type; /* Type de représentation */ - RenderingLineFlag flags; /* Extension d'informations */ - - PangoLayout *layout; /* Moteur de rendu du code/txt */ - - get_bin_len_fc get_bin_len; /* Nbre d'octets représentés */ - off_t max_bin_len; /* Nombre global maximal */ - - refresh_markup_fc refresh_markup; /* Reconstruit la représentat° */ - -}; - - -#define RENDERING_LINE(l) ((rendering_line *)l) - - -#define lines_list_next_iter(iter, head) dl_list_next_iter(iter, head, rendering_line, link) -#define lines_list_add_tail(new, head) dl_list_add_tail(new, head, rendering_line, link) -#define lines_list_splice_before(pos, head1, head2) dl_list_splice_before(pos, head1, head2, rendering_line, link) -#define lines_list_for_each(pos, head) dl_list_for_each(pos, head, rendering_line, link) - - -/* Procède à l'initialisation des bases d'une représentation. */ -void init_rendering_line(rendering_line *); - - - -/* ------------------------- LIGNE EN TETE DE DESASSEMBLAGE ------------------------- */ - - -/* Ligne de représentation de prologue */ -typedef struct _prologue_line -{ - rendering_line basic; /* A laisser en premier */ - - char *comment; /* Texte à afficher */ - -} prologue_line; - - -/* Met à jour la ligne de représentation de prologue. */ -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 *); +/* Indique le type définit pour une ligne de représentation. */ +G_DEFINE_TYPE(GRenderingLine, g_rendering_line, G_TYPE_OBJECT); -/* ------------------------ LIGNE DE CODE EN LANGAGE MACHINE ------------------------ */ - +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des lignes de représentation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ -/* Ligne de représentation de prologue */ -typedef struct _code_line +static void g_rendering_line_class_init(GRenderingLineClass *klass) { - rendering_line basic; /* A laisser en premier */ - - asm_instr *instr; /* Instruction représentée */ - const disass_options *options; /* Options de représentation */ - -} code_line; - - -/* Taille max d'une traduction */ -#define CODE_BUFFER_LEN 128 - - -/* Met à jour la nombre d'octets maximale par instruction. */ -void get_code_binary_len(code_line *, off_t *); - -/* Met à jour la ligne de représentation de code. */ -void refresh_code_markup(code_line *); - - - + g_signal_new("rendering-line-flags-changed", + G_TYPE_RENDERING_LINE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GRenderingLineClass, rendering_line_flags_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, NULL); +} /****************************************************************************** * * -* Paramètres : line = adresse de la structure commune. * +* Paramètres : line = instance à initialiser. * * * -* Description : Procède à l'initialisation des bases d'une représentation. * +* Description : Initialise une instance de ligne de représentation. * * * * Retour : - * * * @@ -162,7 +94,7 @@ void refresh_code_markup(code_line *); * * ******************************************************************************/ -void init_rendering_line(rendering_line *line) +static void g_rendering_line_init(GRenderingLine *line) { DL_LIST_ITEM_INIT(&line->link); @@ -171,8 +103,25 @@ void init_rendering_line(rendering_line *line) line->get_bin_len = NULL; line->refresh_markup = NULL; +} +/****************************************************************************** +* * +* Paramètres : line = ligne dont les informations sont à consulter. * +* * +* Description : Fournit le type d'une ligne. * +* * +* Retour : Type de la ligne fournie. * +* * +* Remarques : - * +* * +******************************************************************************/ + +RenderingLineType get_rendering_line_type(const GRenderingLine *line) +{ + return line->type; + } @@ -189,10 +138,12 @@ void init_rendering_line(rendering_line *line) * * ******************************************************************************/ -void add_rendering_line_flag(rendering_line *line, RenderingLineFlag flag) +void g_rendering_line_add_flag(GRenderingLine *line, RenderingLineFlag flag) { line->flags |= flag; + g_signal_emit_by_name(line, "rendering-line-flags-changed"); + } @@ -209,61 +160,67 @@ void add_rendering_line_flag(rendering_line *line, RenderingLineFlag flag) * * ******************************************************************************/ -void remove_rendering_line_flag(rendering_line *line, RenderingLineFlag flag) +void g_rendering_line_remove_flag(GRenderingLine *line, RenderingLineFlag flag) { line->flags &= ~flag; + g_signal_emit_by_name(line, "rendering-line-flags-changed"); + } /****************************************************************************** * * * Paramètres : line = ligne dont les informations sont à mettre à jour. * +* flag = extension d'information à ajouter ou retirer. * * * -* Description : Fournit les informations supplémentaires d'une ligne. * +* Description : Bascule l'état d'une information sur d'une ligne. * * * -* Retour : Extensions d'informations courantes. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -RenderingLineFlag get_rendering_line_flags(const rendering_line *line) +void g_rendering_line_toggle_flag(GRenderingLine *line, RenderingLineFlag flag) { - return line->flags; - -} + line->flags = (line->flags & ~flag) | (line->flags ^ flag); + g_signal_emit_by_name(line, "rendering-line-flags-changed"); +} /****************************************************************************** * * -* Paramètres : lines = liste de lignes à compléter, ou NULL. * -* line = nouvelle ligne à intégrer à l'ensemble. * +* Paramètres : line = ligne dont les informations sont à consulter. * * * -* Description : Ajoute une ligne à un ensemble existant. * +* Description : Fournit les informations supplémentaires d'une ligne. * * * -* Retour : - * +* Retour : Extensions d'informations courantes. * * * -* Remarques : La ligne est considérée comme étant insérée au bon endroit. * +* Remarques : - * * * ******************************************************************************/ -void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) +RenderingLineFlag g_rendering_line_get_flags(const GRenderingLine *line) { - lines_list_add_tail(line, lines); + return line->flags; } /****************************************************************************** * * -* 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. * +* Paramètres : line = adresse de la structure à représenter. * +* drawable = support de rendu pour le dessin. * +* gc = contexte graphique à utiliser. * +* x0 = abscisse de la zone de rendu (marge). * +* x1 = abscisse de la zone de rendu (texte). * +* y = ordonnée de la zone de rendu. * +* h = hauteur réservée pour la ligne. * * * -* Description : Insère une ligne dans un ensemble existant. * +* Description : Procède à l'initialisation des bases d'une représentation. * * * * Retour : - * * * @@ -271,70 +228,83 @@ void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) * * ******************************************************************************/ -void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *line, bool first) +void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h) { - rendering_line *iter; /* Boucle de parcours */ + GdkPixbuf *pixbuf; /* Données utiles au dessin */ - lines_list_for_each(iter, *lines) + gdk_draw_layout(drawable, gc, x1, y, line->layout); + + if (line->flags & RLF_BREAK_POINT) + pixbuf = gtk_widget_render_icon(mywid, "gtk-yes", GTK_ICON_SIZE_MENU, NULL); + + else if (line->flags & RLF_RUNNING_BP) + pixbuf = gtk_widget_render_icon(mywid, "gtk-no", GTK_ICON_SIZE_MENU, NULL); + + else pixbuf = NULL; + + if (pixbuf != NULL) { - if (first && iter->offset >= line->offset) break; - else if (!first) - { - /* TODO */; - } + gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y, + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + GDK_RGB_DITHER_NORMAL, 0, 0); + + g_object_unref(pixbuf); } - if (iter == NULL) - lines_list_add_tail(line, lines); + /* Le point d'entrée prime */ - else + if (line->flags & RLF_ENTRY_POINT) + pixbuf = gtk_widget_render_icon(mywid, "gtk-go-forward", GTK_ICON_SIZE_MENU, NULL); + + else pixbuf = NULL; + + if (pixbuf != NULL) { - if (first) - lines_list_splice_before(iter, lines, line); - else - /* TODO */; + gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y, + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + GDK_RGB_DITHER_NORMAL, 0, 0); + + g_object_unref(pixbuf); + } } + +/* ---------------------------------------------------------------------------------- */ +/* TRAITEMENT DES LIGNES PAR GROUPE */ +/* ---------------------------------------------------------------------------------- */ + + /****************************************************************************** * * -* Paramètres : lines = liste de lignes à parcourir. * -* offset = position en mémoire ou physique à chercher. * +* Paramètres : lines = liste de lignes à compléter, ou NULL. * +* line = nouvelle ligne à intégrer à l'ensemble. * * * -* Description : Recherche une ligne d'après sa position en mémoire/physique. * +* Description : Ajoute une ligne à un ensemble existant. * * * -* Retour : Ligne représentant l'adresse donnée, NULL si aucune trouvée. * +* Retour : - * * * -* Remarques : - * +* Remarques : La ligne est considérée comme étant insérée au bon endroit. * * * ******************************************************************************/ -rendering_line *find_offset_in_rendering_lines(rendering_line *lines, uint64_t offset) +void g_rendering_line_add_to_lines(GRenderingLine **lines, GRenderingLine *line) { - rendering_line *result; - - lines_list_for_each(result, lines) - if (result->offset == offset) break; - - return result; + lines_list_add_tail(line, lines); } /****************************************************************************** * * -* Paramètres : line = adresse de la structure à représenter. * -* drawable = support de rendu pour le dessin. * -* gc = contexte graphique à utiliser. * -* x0 = abscisse de la zone de rendu (marge). * -* x1 = abscisse de la zone de rendu (texte). * -* y = ordonnée de la zone de rendu. * -* h = hauteur réservée pour la ligne. * +* 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 : Procède à l'initialisation des bases d'une représentation. * +* Description : Insère une ligne dans un ensemble existant. * * * * Retour : - * * * @@ -342,36 +312,34 @@ rendering_line *find_offset_in_rendering_lines(rendering_line *lines, uint64_t o * * ******************************************************************************/ -void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h) +void g_rendering_line_insert_into_lines(GRenderingLine **lines, GRenderingLine *line, bool first) { - GdkPixbuf *pixbuf; /* Données utiles au dessin */ + GRenderingLine *iter; /* Boucle de parcours */ - gdk_draw_layout(drawable, gc, x1, y, line->layout); + lines_list_for_each(iter, *lines) + { + if (first && iter->offset >= line->offset) break; + else if (!first) + { + /* TODO */; + } - if (line->flags & RLF_ENTRY_POINT) - pixbuf = gtk_widget_render_icon(mywid, "gtk-go-forward", GTK_ICON_SIZE_MENU, NULL); + } - else pixbuf = NULL; + if (iter == NULL) + lines_list_add_tail(line, lines); - if (pixbuf != NULL) + else { - gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y, - gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), - GDK_RGB_DITHER_NORMAL, 0, 0); - - g_object_unref(pixbuf); - + if (first) + lines_list_splice_before(iter, lines, line); + else + /* TODO */; } } - -/* ---------------------------------------------------------------------------------- */ -/* TRAITEMENT DES LIGNES PAR GROUPE */ -/* ---------------------------------------------------------------------------------- */ - - /****************************************************************************** * * * Paramètres : line = liste de lignes de représentation à actualiser. * @@ -385,9 +353,9 @@ void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, * * ******************************************************************************/ -rendering_line *g_rendering_line_get_next_iter(rendering_line *lines, const rendering_line *iter) +GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRenderingLine *iter) { - rendering_line *result; /* Elément suivant à renvoyer */ + GRenderingLine *result; /* Elément suivant à renvoyer */ if (iter == NULL) iter = lines; @@ -410,9 +378,9 @@ rendering_line *g_rendering_line_get_next_iter(rendering_line *lines, const rend * * ******************************************************************************/ -void g_rendering_lines_update_bin_len(rendering_line *lines) +void g_rendering_line_update_bin_len(GRenderingLine *lines) { - rendering_line *iter; /* Boucle de parcours */ + GRenderingLine *iter; /* Boucle de parcours */ off_t bin_len; /* Taille d'instruction */ bin_len = 0; @@ -445,9 +413,9 @@ void g_rendering_lines_update_bin_len(rendering_line *lines) * * ******************************************************************************/ -void g_rendering_lines_get_size(rendering_line *lines, int *width, int *height, int *alone) +void g_rendering_line_get_size(GRenderingLine *lines, int *width, int *height, int *alone) { - rendering_line *iter; /* Boucle de parcours */ + GRenderingLine *iter; /* Boucle de parcours */ int w; /* Largeur de l'objet actuelle */ int h; /* Hauteur de l'objet actuelle */ @@ -470,399 +438,58 @@ void g_rendering_lines_get_size(rendering_line *lines, int *width, int *height, } - -/* ---------------------------------------------------------------------------------- */ -/* LIGNE EN TETE DE DESASSEMBLAGE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : comment = texte à afficher au final. * -* * -* Description : Crée une des lignes de description initiales. * -* * -* Retour : Adresse de la structure mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -rendering_line *create_prologue_line(const char *comment) -{ - prologue_line *result; /* Structure à retourner */ - - result = (prologue_line *)calloc(1, sizeof(prologue_line)); - - 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; - - result->comment = strdup(comment); - - return RENDERING_LINE(result); - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne de représentation à actualiser. * -* * -* Description : Met à jour la ligne de représentation de prologue. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void refresh_prologue_markup(prologue_line *line) -{ - size_t len; /* Taille du contenu */ - char *content; /* Contenu réellement imprimé */ - - len = strlen("<b><span foreground='#003300'>"); - len += strlen("; ") + strlen(line->comment); - len += strlen("</span></b>"); - - content = (char *)calloc(len + 1, sizeof(char)); - - snprintf(content, len + 1, "<b><span foreground='#003300'>; %s</span></b>", line->comment); - - pango_layout_set_markup(RENDERING_LINE(line)->layout, content, len); - - free(content); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* 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. * +* Paramètres : lines = liste de lignes à parcourir. * +* y = ordonnée à vérifier et à mettre à jour. [OUT] * * * -* Description : Crée une ligne de commentaires entière. * +* Description : Recherche une ligne d'après sa position à l'écran. * * * -* 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 = (comment_line *)calloc(1, sizeof(comment_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 : - * +* Retour : Ligne représentant l'adresse donnée, NULL si aucune trouvée. * * * * Remarques : - * * * ******************************************************************************/ -void refresh_comment_markup(comment_line *line) +GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, gdouble *y) { - 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>"); + GRenderingLine *result; /* Trouvaille à retourner */ + int h; /* Hauteur de l'objet actuel */ - /* 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) + lines_list_for_each(result, lines) { - clen = (line->options->show_address ? strlen("\t") : 0); - clen += RENDERING_LINE(line)->max_bin_len; - - content = (char *)realloc(content, (len + clen) * sizeof(char)); + pango_layout_get_pixel_size(result->layout, NULL, &h); - 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'; + if (*y < h) break; + else *y -= h; } - /* 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 */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : instr = instruction à représenter. * -* options = paramétrage du rendu. * -* * -* Description : Crée une ligne de représentation de code binaire. * -* * -* Retour : Adresse de la structure mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -rendering_line *create_code_line(asm_instr *instr, uint64_t offset, const disass_options *options) -{ - code_line *result; /* Structure à retourner */ - - result = (code_line *)calloc(1, sizeof(code_line)); - - 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; - RENDERING_LINE(result)->refresh_markup = (refresh_markup_fc)refresh_code_markup; - - result->instr = instr; - result->options = options; - - return RENDERING_LINE(result); - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne de représentation à actualiser. * -* blen = longueur maximale à mettre à jour. [OUT] * -* * -* Description : Met à jour le nombre d'octets maximal par instruction. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void get_code_binary_len(code_line *line, off_t *blen) -{ - off_t len; /* Taille propre à la ligne */ - - get_asm_instr_offset_and_length(line->instr, NULL, &len); - - *blen = MAX(*blen, len); + return result; } /****************************************************************************** * * -* Paramètres : line = ligne de représentation à actualiser. * +* Paramètres : lines = liste de lignes à parcourir. * +* offset = position en mémoire ou physique à chercher. * * * -* Description : Met à jour la ligne de représentation de code. * +* Description : Recherche une ligne d'après sa position en mémoire/physique. * * * -* Retour : - * +* Retour : Ligne représentant l'adresse donnée, NULL si aucune trouvée. * * * * Remarques : - * * * ******************************************************************************/ -void refresh_code_markup(code_line *line) +GRenderingLine *g_rendering_line_find_by_offset(GRenderingLine *lines, uint64_t offset) { - size_t len; /* Taille du contenu */ - char *content; /* Contenu réellement imprimé */ - off_t bin_offset; /* Début de l'instruction */ - off_t bin_len; /* Taille d'instruction */ - char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */ - const uint8_t *exe_content; /* Contenu binaire global */ - char *bin_code; /* Tampon du code binaire */ - off_t k; /* Boucle de parcours #2 */ - off_t j; /* Boucle de parcours #1 */ - - len = strlen("<tt>") + 1; - content = (char *)calloc(len, sizeof(char)); - strcpy(content, "<tt>"); - - if (line->options->show_code) - get_asm_instr_offset_and_length(line->instr, &bin_offset, &bin_len); - - /* 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; - - } + GRenderingLine *result; /* Trouvaille à retourner */ - len += strlen(buffer); - content = (char *)realloc(content, len * sizeof(char)); - strcat(content, buffer); - - } - - /* Eventuel code brut */ - - if (line->options->show_code) - { - exe_content = get_exe_content(line->options->format, NULL); - - bin_code = (char *)calloc(RENDERING_LINE(line)->max_bin_len + 1, sizeof(char)); - - k = 0; - - for (j = 0; j < bin_len; j++) - { - if ((j + 1) < bin_len) - k += snprintf(&bin_code[j * (2 + 1)], 4, "%02hhx ", exe_content[bin_offset + j]); - else - k += snprintf(&bin_code[j * (2 + 1)], 3, "%02hhx", exe_content[bin_offset + j]); - } - - for (; k < RENDERING_LINE(line)->max_bin_len; k++) - snprintf(&bin_code[k], 2, " "); - - if (line->options->show_address) len += strlen("\t"); - len += strlen(bin_code); - content = (char *)realloc(content, len * sizeof(char)); - if (line->options->show_address) strcat(content, "\t"); - strcat(content, bin_code); - - free(bin_code); - - } - - /* Instruction proprement dite */ - - print_hinstruction(line->options->proc, line->options->format, - line->instr, buffer, CODE_BUFFER_LEN, ASX_INTEL/*FIXME*/); - - if (line->options->show_address || line->options->show_code) len += strlen("\t"); - len += strlen(buffer); - - content = (char *)realloc(content, len * sizeof(char)); - if (line->options->show_address || line->options->show_code) strcat(content, "\t"); - strcat(content, buffer); - - /* 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); + lines_list_for_each(result, lines) + if (result->offset == offset) break; - free(content); + return result; } |