diff options
Diffstat (limited to 'src/gtksnippet.c')
-rw-r--r-- | src/gtksnippet.c | 153 |
1 files changed, 132 insertions, 21 deletions
diff --git a/src/gtksnippet.c b/src/gtksnippet.c index 3254d8e..3fc8ccc 100644 --- a/src/gtksnippet.c +++ b/src/gtksnippet.c @@ -446,6 +446,48 @@ void gtk_snippet_test(GtkSnippet *snippet) +/****************************************************************************** +* * +* Paramètres : snippet = composant GTK à mettre à jour. * +* show = état de l'affichage auquel parvenir. * +* * +* Description : Choisit d'afficher les adresses virtuelles ou non. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_snippet_show_vaddress(GtkSnippet *snippet, gboolean show) +{ + snippet->show_vaddress = show; + + gtk_snippet_build_content(snippet); + +} + + +/****************************************************************************** +* * +* Paramètres : snippet = composant GTK à mettre à jour. * +* show = état de l'affichage auquel parvenir. * +* * +* Description : Choisit d'afficher le code brut ou non. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_snippet_show_code(GtkSnippet *snippet, gboolean show) +{ + snippet->show_code = show; + + gtk_snippet_build_content(snippet); + +} @@ -527,17 +569,46 @@ void gtk_snippet_add_line(GtkSnippet *snippet, const code_line_info *line) void gtk_snippet_build_content(GtkSnippet *snippet) { + const uint8_t *exe_content; /* Contenu binaire global */ + off_t max_bin_len; /* Taille max du code brut */ + unsigned int i; /* Boucle de traitement */ + off_t bin_len; /* Taille d'instruction */ + char *bin_code; /* Tampon du code binaire */ char *content; /* Contenu à définir */ size_t content_len; /* Taille du contenu */ AdressMode mode; /* Affichage des adresses */ - unsigned int i; /* Boucle de traitement */ char buffer[CONTENT_BUFFER_LEN]; /* Zone tampon à utiliser */ + off_t bin_offset; /* Début de l'instruction */ + off_t k; /* Boucle de parcours #2 */ + off_t j; /* Boucle de parcours #1 */ int width; /* Largeur de l'objet actuelle */ int height; /* Hauteur de l'objet actuelle */ PangoLayoutIter *iter; /* Boucle de parcours */ int y0; /* Ordonnée du haut d'une ligne*/ int y1; /* Ordonnée du bas d'une ligne */ + /* Calcul de la largeur maximale brute si besoin est */ + if (snippet->show_code) + { + exe_content = get_exe_content(snippet->format, NULL); + + max_bin_len = 1; + + for (i = 0; i < snippet->info_count; i++) + { + /* Commentaire uniquement */ + if (snippet->info[i].instr == NULL) continue; + + get_asm_instr_offset_and_length(snippet->info[i].instr, NULL, &bin_len); + if (bin_len > max_bin_len) max_bin_len = bin_len; + + } + + max_bin_len = max_bin_len * 2 + (max_bin_len - 1); + bin_code = (char *)calloc(max_bin_len + 1, sizeof(char)); + + } + content_len = strlen("<tt>") + 1; content = (char *)calloc(content_len, sizeof(char)); strcpy(content, "<tt>"); @@ -552,27 +623,62 @@ void gtk_snippet_build_content(GtkSnippet *snippet) strcat(content, "\n"); } - /* Adresse */ + /* Eventuelle adresse virtuelle */ - switch (mode) + if (snippet->show_vaddress) { - case ADM_32BITS: - snprintf(buffer, CONTENT_BUFFER_LEN, - "<span foreground='#333333'>0x%08llx</span>", - snippet->info[i].offset); - break; - - case ADM_64BITS: - snprintf(buffer, CONTENT_BUFFER_LEN, - "<span foreground='#333333'>0x%16llx</span>", - snippet->info[i].offset); - break; + switch (mode) + { + case ADM_32BITS: + snprintf(buffer, CONTENT_BUFFER_LEN, + "<span foreground='#333333'>0x%08llx</span>", + snippet->info[i].offset); + break; + + case ADM_64BITS: + snprintf(buffer, CONTENT_BUFFER_LEN, + "<span foreground='#333333'>0x%16llx</span>", + snippet->info[i].offset); + break; + + } + + content_len += strlen(buffer); + content = (char *)realloc(content, content_len * sizeof(char)); + strcat(content, buffer); } - content_len += strlen(buffer); - content = (char *)realloc(content, content_len * sizeof(char)); - strcat(content, buffer); + /* Eventuel code brut */ + + if (snippet->show_code) + { + k = 0; + + if (snippet->info[i].instr != NULL) + { + get_asm_instr_offset_and_length(snippet->info[i].instr, &bin_offset, &bin_len); + + 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 < max_bin_len; k++) + snprintf(&bin_code[k], 2, " "); + + if (snippet->show_vaddress) content_len += strlen("\t"); + content_len += strlen(bin_code); + content = (char *)realloc(content, content_len * sizeof(char)); + if (snippet->show_vaddress) strcat(content, "\t"); + strcat(content, bin_code); + + } /* Eventuelle instruction */ @@ -580,10 +686,11 @@ void gtk_snippet_build_content(GtkSnippet *snippet) { print_hinstruction(snippet->proc, snippet->format, snippet->info[i].instr, buffer, CONTENT_BUFFER_LEN, ASX_INTEL); - content_len += strlen("\t") + strlen(buffer); + if (snippet->show_vaddress || snippet->show_code) content_len += strlen("\t"); + content_len += strlen(buffer); content = (char *)realloc(content, content_len * sizeof(char)); - strcat(content, "\t"); + if (snippet->show_vaddress || snippet->show_code) strcat(content, "\t"); strcat(content, buffer); } @@ -592,10 +699,12 @@ void gtk_snippet_build_content(GtkSnippet *snippet) if (snippet->info[i].comment != NULL) { - content_len += strlen("\t<b><span foreground='#003300'>; ") + strlen(snippet->info[i].comment) + strlen("</span></b>"); + if (snippet->show_vaddress || snippet->show_code) content_len += strlen("\t"); + content_len += strlen("<b><span foreground='#003300'>; ") + strlen(snippet->info[i].comment) + strlen("</span></b>"); content = (char *)realloc(content, content_len * sizeof(char)); - strcat(content, "\t<b><span foreground='#003300'>; "); + if (snippet->show_vaddress || snippet->show_code) strcat(content, "\t"); + strcat(content, "<b><span foreground='#003300'>; "); strcat(content, snippet->info[i].comment); strcat(content, "</span></b>"); @@ -607,6 +716,8 @@ void gtk_snippet_build_content(GtkSnippet *snippet) content = (char *)realloc(content, content_len * sizeof(char)); strcat(content, "</tt>"); + if (snippet->show_code) free(bin_code); + pango_layout_set_markup(snippet->layout, content, content_len - 1); pango_layout_get_pixel_size(snippet->layout, &width, &height); |