diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/instruction-int.h | 4 | ||||
-rw-r--r-- | src/arch/instruction.c | 31 | ||||
-rw-r--r-- | src/arch/instruction.h | 3 | ||||
-rw-r--r-- | src/gtkext/gtkblockdisplay.c | 6 |
4 files changed, 42 insertions, 2 deletions
diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h index fb1f796..081adba 100644 --- a/src/arch/instruction-int.h +++ b/src/arch/instruction-int.h @@ -37,6 +37,9 @@ typedef const char * (* get_instruction_encoding_fc) (const GArchInstruction *); /* Fournit le nom humain de l'instruction manipulée. */ typedef const char * (* get_instruction_keyword_fc) (GArchInstruction *, AsmSyntax ); +/* Construit un petit résumé concis de l'instruction. */ +typedef char * (* build_instruction_tooltip_fc) (const GArchInstruction *); + /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -91,6 +94,7 @@ struct _GArchInstructionClass get_instruction_encoding_fc get_encoding; /* Obtention de l'encodage */ get_instruction_keyword_fc get_keyword; /* Texte humain équivalent */ + build_instruction_tooltip_fc build_tooltip; /* Construction d'une bulle*/ print_instruction_fc print; /* Imprime l'ensemble */ diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 7e1e646..0041129 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -1059,6 +1059,35 @@ const char *g_arch_instruction_get_keyword(GArchInstruction *instr, AsmSyntax sy } +/****************************************************************************** +* * +* Paramètres : instr = instruction d'assemblage à consulter. * +* * +* Description : Construit un petit résumé concis de l'instruction. * +* * +* Retour : Chaîne de caractères à libérer après usage ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *g_arch_instruction_build_tooltip(const GArchInstruction *instr) +{ + char *result; /* Description à retourner */ + GArchInstructionClass *class; /* Classe des instructions */ + + class = G_ARCH_INSTRUCTION_GET_CLASS(instr); + + if (class->build_tooltip != NULL) + result = class->build_tooltip(instr); + + else + result = NULL; + + return result; + +} + /* ---------------------------------------------------------------------------------- */ /* OFFRE DE CAPACITES DE GENERATION */ @@ -1188,7 +1217,7 @@ static void _g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line key = g_arch_instruction_get_keyword(instr, 0/*, syntax*/); klen = strlen(key); - g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION, NULL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION, G_OBJECT(instr)); /* Liste des opérandes */ diff --git a/src/arch/instruction.h b/src/arch/instruction.h index f508c35..ca047b7 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -248,6 +248,9 @@ GArchInstruction *g_arch_instruction_get_given_destination(GArchInstruction *, I /* Fournit le nom humain de l'instruction manipulée. */ const char *g_arch_instruction_get_keyword(GArchInstruction *, AsmSyntax); +/* Construit un petit résumé concis de l'instruction. */ +char *g_arch_instruction_build_tooltip(const GArchInstruction *); + #endif /* _ARCH_INSTRUCTION_H */ diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c index e4d9d48..8078e7e 100644 --- a/src/gtkext/gtkblockdisplay.c +++ b/src/gtkext/gtkblockdisplay.c @@ -25,6 +25,7 @@ #include "gtkbufferdisplay-int.h" +#include "../arch/instruction.h" #include "../arch/operand.h" #include "../analysis/loaded.h" @@ -305,7 +306,10 @@ static gboolean gtk_block_display_query_tooltip(GtkWidget *widget, gint x, gint if (creator != NULL) { - if (G_IS_ARCH_OPERAND(creator)) + if (G_IS_ARCH_INSTRUCTION(creator)) + info = g_arch_instruction_build_tooltip(G_ARCH_INSTRUCTION(creator)); + + else if (G_IS_ARCH_OPERAND(creator)) info = g_arch_operand_build_tooltip(G_ARCH_OPERAND(creator), panel->binary); else |