summaryrefslogtreecommitdiff
path: root/src/gtksnippet.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtksnippet.c')
-rw-r--r--src/gtksnippet.c153
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);