diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/exporter-int.h | 7 | ||||
-rw-r--r-- | src/analysis/exporter.c | 49 | ||||
-rw-r--r-- | src/analysis/exporter.h | 4 | ||||
-rw-r--r-- | src/analysis/line_code.c | 84 | ||||
-rw-r--r-- | src/analysis/line_comment.c | 62 | ||||
-rw-r--r-- | src/analysis/line_prologue.c | 34 | ||||
-rw-r--r-- | src/analysis/roptions.c | 21 | ||||
-rw-r--r-- | src/analysis/roptions.h | 3 |
8 files changed, 264 insertions, 0 deletions
diff --git a/src/analysis/exporter-int.h b/src/analysis/exporter-int.h index 097b48b..4219be2 100644 --- a/src/analysis/exporter-int.h +++ b/src/analysis/exporter-int.h @@ -29,6 +29,9 @@ +/* Ajoute du texte simple à un fichier ouvert en écriture. */ +typedef void (* add_text_fc) (GContentExporter *, GRenderingOptions *, MainRendering, FILE *); + /* Ajoute à un texte GTK le contenu de la ligne de rendu. */ typedef void (* add_to_gtk_buffer_fc) (GContentExporter *, MainRendering, GtkTextBuffer *, GtkTextIter *, size_t [SAR_COUNT]); @@ -42,6 +45,7 @@ struct _GContentExporter { GObject parent; /* A laisser en premier */ + add_text_fc add_text; /* Remplissage simple */ add_to_gtk_buffer_fc add_to_gtk_buffer; /* Constitution du texte GTK */ add_arch_to_gtk_buffer_fc add_arch_to_gtk_buffer; /* Constitution... */ @@ -59,6 +63,9 @@ struct _GContentExporterClass }; +/* Ajoute du texte simple à un fichier ouvert en écriture. */ +void g_content_exporter_insert_text(GContentExporter *, FILE *, const char *, size_t, RenderingTagType); + /* Ajoute du texte à un texte GTK via l'instance spécifiée. */ void g_content_exporter_insert_with_gtk_tag(GContentExporter *, GtkTextBuffer *, GtkTextIter *, const char *, size_t, RenderingTagType); diff --git a/src/analysis/exporter.c b/src/analysis/exporter.c index e78fd54..e1e9160 100644 --- a/src/analysis/exporter.c +++ b/src/analysis/exporter.c @@ -181,6 +181,32 @@ GtkTextTagTable *_get_gtk_tag_table(GtkTextTagTable *table) /****************************************************************************** * * * Paramètres : exporter = instance sachant exporter son contenu. * +* stream = flux ouvert en écriture. * +* text = texte à insérer dans l'existant. * +* length = taille du texte à traiter. * +* tag = type de décorateur à utiliser. * +* * +* Description : Ajoute du texte simple à un fichier ouvert en écriture. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_content_exporter_insert_text(GContentExporter *exporter, FILE *stream, const char *text, size_t length, RenderingTagType tag) +{ + size_t ret; /* Quantité d'octets écrite */ + + ret = fwrite(text, sizeof(char), length, stream); + if (ret != length) perror("fwrite"); + +} + + +/****************************************************************************** +* * +* Paramètres : exporter = instance sachant exporter son contenu. * * buffer = zone de texte à venir compléter. * * iter = point d'insertion du nouveau texte. [OUT] * * text = texte à insérer dans l'existant. * @@ -212,6 +238,29 @@ void g_content_exporter_insert_with_gtk_tag(GContentExporter *exporter, GtkTextB /****************************************************************************** * * * Paramètres : exporter = instance sachant exporter son contenu. * +* options = options de rendu. * +* rendering = support effectif final des lignes de code. * +* stream = flux ouvert en écriture. * +* * +* Description : Ajoute du texte simple à un fichier ouvert en écriture. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_content_exporter_add_text(GContentExporter *exporter, GRenderingOptions *options, MainRendering rendering, FILE *stream) +{ + if (exporter->add_text != NULL) + exporter->add_text(exporter, options, rendering, stream); + +} + + +/****************************************************************************** +* * +* Paramètres : exporter = instance sachant exporter son contenu. * * rendering = support effectif final des lignes de code. * * buffer = zone de texte à venir compléter. * * iter = point d'insertion du nouveau texte. * diff --git a/src/analysis/exporter.h b/src/analysis/exporter.h index 60c37b1..524d800 100644 --- a/src/analysis/exporter.h +++ b/src/analysis/exporter.h @@ -26,6 +26,7 @@ #include <glib-object.h> +#include <stdio.h> #include <gtk/gtktextbuffer.h> @@ -85,6 +86,9 @@ GtkTextTagTable *_get_gtk_tag_table(GtkTextTagTable *); #define get_gtk_tag_table() _get_gtk_tag_table(NULL) +/* Ajoute du texte simple à un fichier ouvert en écriture. */ +void g_content_exporter_add_text(GContentExporter *, GRenderingOptions *, MainRendering, FILE *); + /* Ajoute à un texte GTK le contenu de l'instance spécifiée. */ void g_content_exporter_add_to_gtk_buffer(GContentExporter *, MainRendering, GtkTextBuffer *, GtkTextIter *, size_t [SAR_COUNT]); diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c index 5787e2a..24f3ec9 100644 --- a/src/analysis/line_code.c +++ b/src/analysis/line_code.c @@ -58,6 +58,9 @@ static void g_code_line_class_init(GCodeLineClass *); /* Initialise la classe des lignes de code binaire. */ static void g_code_line_init(GCodeLine *); +/* Ajoute du texte simple à un fichier ouvert en écriture. */ +static void g_code_line_add_text(GCodeLine *, GRenderingOptions *, MainRendering, FILE *); + /* Ajoute à un texte GTK le contenu de la ligne de code. */ static void g_code_line_add_to_gtk_buffer(GCodeLine *, MainRendering, GtkTextBuffer *, GtkTextIter *, size_t [SAR_COUNT]); @@ -105,6 +108,7 @@ static void g_code_line_init(GCodeLine *line) exporter_parent = G_CONTENT_EXPORTER(line); + exporter_parent->add_text = (add_text_fc)g_code_line_add_text; exporter_parent->add_to_gtk_buffer = (add_to_gtk_buffer_fc)g_code_line_add_to_gtk_buffer; line_parent = G_RENDERING_LINE(line); @@ -114,6 +118,86 @@ static void g_code_line_init(GCodeLine *line) } + +/****************************************************************************** +* * +* Paramètres : line = ligne de représentation à actualiser. * +* options = options de rendu. * +* rendering = support effectif final des lignes de code. * +* stream = flux ouvert en écriture. * +* * +* Description : Ajoute du texte simple à un fichier ouvert en écriture. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_code_line_add_text(GCodeLine *line, GRenderingOptions *options, MainRendering rendering, FILE *stream) +{ + GContentExporter *exporter; /* Autre vision de la ligne */ + bool show_address; /* Affichage de l'adresse ? */ + bool show_code; /* Affichage du code brut ? */ + MemoryDataSize msize; /* Taille du bus d'adresses */ + char address[VMPA_MAX_SIZE]; /* Adresse au format texte */ + size_t len; /* Taille de l'élément inséré */ + const bin_t *content; /* Contenu binaire global */ + off_t bin_offset; /* Début de l'instruction */ + off_t bin_len; /* Taille d'instruction */ + char *bin_code; /* Tampon du code binaire */ + off_t i; /* Boucle de parcours */ + + exporter = G_CONTENT_EXPORTER(line); + + show_address = g_rendering_options_has_to_show_address(options, rendering); + show_code = g_rendering_options_has_to_show_code(options, rendering); + + /* Eventuelle adresse virtuelle ou physique */ + + if (show_address) + { + msize = g_arch_processor_get_memory_size(g_rendering_options_get_processor(options)); + + len = vmpa_to_string(G_RENDERING_LINE(line)->offset, msize, address); + + g_content_exporter_insert_text(exporter, stream, address, len, RTT_NONE); + g_content_exporter_insert_text(exporter, stream, "\t", 1, RTT_NONE); + + } + + /* Eventuel code brut */ + + if (show_code) + { + content = g_binary_format_get_content(G_BIN_FORMAT(g_rendering_options_get_format(options)), NULL); + g_arch_instruction_get_location(line->instr, &bin_offset, &bin_len, NULL); + + bin_code = (char *)calloc(bin_len * 3, sizeof(char)); + + for (i = 0; i < bin_len; i++) + { + if ((i + 1) < bin_len) + snprintf(&bin_code[i * (2 + 1)], 4, "%02hhx ", content[bin_offset + i]); + else + snprintf(&bin_code[i * (2 + 1)], 3, "%02hhx", content[bin_offset + i]); + } + + g_content_exporter_insert_text(exporter, stream, bin_code, bin_len * 3 - 1, RTT_RAW_CODE); + + free(bin_code); + + g_content_exporter_insert_text(exporter, stream, "\t", 1, RTT_NONE); + + } + + /* Instruction proprement dite */ + + g_content_exporter_add_text(G_CONTENT_EXPORTER(line->instr), options, rendering, stream); + +} + + /****************************************************************************** * * * Paramètres : line = ligne de représentation à actualiser. * diff --git a/src/analysis/line_comment.c b/src/analysis/line_comment.c index aa6ae10..8af1777 100644 --- a/src/analysis/line_comment.c +++ b/src/analysis/line_comment.c @@ -57,6 +57,9 @@ static void g_comment_line_class_init(GCommentLineClass *); /* Initialise la classe des lignes de commentaires entière. */ static void g_comment_line_init(GCommentLine *); +/* Ajoute du texte simple à un fichier ouvert en écriture. */ +static void g_comment_line_add_text(GCommentLine *, GRenderingOptions *, MainRendering, FILE *); + /* Ajoute à un texte GTK le contenu de la ligne de commentaires. */ static void g_comment_line_add_to_gtk_buffer(GCommentLine *, MainRendering, GtkTextBuffer *, GtkTextIter *, size_t [SAR_COUNT]); @@ -104,6 +107,7 @@ static void g_comment_line_init(GCommentLine *line) exporter_parent = G_CONTENT_EXPORTER(line); + exporter_parent->add_text = (add_text_fc)g_comment_line_add_text; exporter_parent->add_to_gtk_buffer = (add_to_gtk_buffer_fc)g_comment_line_add_to_gtk_buffer; line_parent = G_RENDERING_LINE(line); @@ -116,6 +120,64 @@ static void g_comment_line_init(GCommentLine *line) /****************************************************************************** * * * Paramètres : line = ligne de représentation à actualiser. * +* options = options de rendu. * +* rendering = support effectif final des lignes de code. * +* stream = flux ouvert en écriture. * +* * +* Description : Ajoute du texte simple à un fichier ouvert en écriture. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_comment_line_add_text(GCommentLine *line, GRenderingOptions *options, MainRendering rendering, FILE *stream) +{ + GContentExporter *exporter; /* Autre vision de la ligne */ + bool show_address; /* Affichage de l'adresse ? */ + bool show_code; /* Affichage du code brut ? */ + MemoryDataSize msize; /* Taille du bus d'adresses */ + char address[VMPA_MAX_SIZE]; /* Adresse au format texte */ + size_t len; /* Taille de l'élément inséré */ + + exporter = G_CONTENT_EXPORTER(line); + + show_address = g_rendering_options_has_to_show_address(options, rendering); + show_code = g_rendering_options_has_to_show_code(options, rendering); + + /* Eventuelle adresse virtuelle ou physique */ + + if (show_address) + { + msize = g_arch_processor_get_memory_size(g_rendering_options_get_processor(options)); + + len = vmpa_to_string(G_RENDERING_LINE(line)->offset, msize, address); + + g_content_exporter_insert_text(exporter, stream, address, len, RTT_NONE); + g_content_exporter_insert_text(exporter, stream, "\t", 1, RTT_NONE); + + } + + /* Eventuel code brut (sauté) */ + + if (show_code) + g_content_exporter_insert_text(exporter, stream, "\t", 1, RTT_NONE); + + /* Commentaire proprement dit */ + + g_content_exporter_insert_text(exporter, stream, "; ", 2, RTT_COMMENT); + + len = strlen(line->comment); + + g_content_exporter_insert_text(exporter, stream, line->comment, len, RTT_COMMENT); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne de représentation à actualiser. * * rendering = support effectif final des lignes de code. * * buffer = zone de texte à venir compléter. * * iter = point d'insertion du nouveau texte. * diff --git a/src/analysis/line_prologue.c b/src/analysis/line_prologue.c index f0f5db9..007804b 100644 --- a/src/analysis/line_prologue.c +++ b/src/analysis/line_prologue.c @@ -56,6 +56,9 @@ static void g_prologue_line_class_init(GPrologueLineClass *); /* Initialise la classe des lignes de descriptions initiales. */ static void g_prologue_line_init(GPrologueLine *); +/* Ajoute du texte simple à un fichier ouvert en écriture. */ +static void g_prologue_line_add_text(GPrologueLine *, GRenderingOptions *, MainRendering, FILE *); + /* Ajoute à un texte GTK le contenu de la ligne d'ouverture. */ static void g_prologue_line_add_to_gtk_buffer(GPrologueLine *, MainRendering, GtkTextBuffer *, GtkTextIter *, size_t [SAR_COUNT]); @@ -103,6 +106,7 @@ static void g_prologue_line_init(GPrologueLine *line) exporter_parent = G_CONTENT_EXPORTER(line); + exporter_parent->add_text = (add_text_fc)g_prologue_line_add_text; exporter_parent->add_to_gtk_buffer = (add_to_gtk_buffer_fc)g_prologue_line_add_to_gtk_buffer; line_parent = G_RENDERING_LINE(line); @@ -115,6 +119,36 @@ static void g_prologue_line_init(GPrologueLine *line) /****************************************************************************** * * * Paramètres : line = ligne de représentation à actualiser. * +* options = options de rendu. * +* rendering = support effectif final des lignes de code. * +* stream = flux ouvert en écriture. * +* * +* Description : Ajoute du texte simple à un fichier ouvert en écriture. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_prologue_line_add_text(GPrologueLine *line, GRenderingOptions *options, MainRendering rendering, FILE *stream) +{ + GContentExporter *exporter; /* Autre vision de la ligne */ + size_t len; /* Taille de l'élément inséré */ + + exporter = G_CONTENT_EXPORTER(line); + + len = strlen(line->comment); + + g_content_exporter_insert_text(exporter, stream, "; ", 2, RTT_COMMENT); + g_content_exporter_insert_text(exporter, stream, line->comment, len, RTT_COMMENT); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne de représentation à actualiser. * * rendering = support effectif final des lignes de code. * * buffer = zone de texte à venir compléter. * * iter = point d'insertion du nouveau texte. * diff --git a/src/analysis/roptions.c b/src/analysis/roptions.c index 4c49a15..6aa4262 100644 --- a/src/analysis/roptions.c +++ b/src/analysis/roptions.c @@ -31,6 +31,8 @@ struct _GRenderingOptions GExeFormat *format; /* Format du contenu bianire */ GArchProcessor *proc; /* Architecture utilisée */ + AsmSyntax syntax; /* Style de rendu ASM */ + bool show_address[MRD_COUNT]; /* Affichage de l'adresse ? */ bool show_code[MRD_COUNT]; /* Affichage du code brut ? */ @@ -159,6 +161,25 @@ GArchProcessor *g_rendering_options_get_processor(const GRenderingOptions *optio /****************************************************************************** * * +* Paramètres : options = options à consulter. * +* * +* Description : Fournit le style de rendu pour le contenu ASM. * +* * +* Retour : Style de rendu pour le langage d'assemblage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +AsmSyntax g_rendering_options_get_syntax(const GRenderingOptions *options) +{ + return options->syntax; + +} + + +/****************************************************************************** +* * * Paramètres : options = options à mettre à jour. * * rendering = type de rendu impliqué. * * state = nouvel état de l'option visée. * diff --git a/src/analysis/roptions.h b/src/analysis/roptions.h index b2e4973..d2fbe0b 100644 --- a/src/analysis/roptions.h +++ b/src/analysis/roptions.h @@ -83,6 +83,9 @@ GExeFormat *g_rendering_options_get_format(const GRenderingOptions *); /* Fournit l'architecture du contenu binaire représenté. */ GArchProcessor *g_rendering_options_get_processor(const GRenderingOptions *); +/* Fournit le style de rendu pour le contenu ASM. */ +AsmSyntax g_rendering_options_get_syntax(const GRenderingOptions *); + /* Affiche (ou non) les adresses des instructions. */ void g_rendering_options_show_address(GRenderingOptions *, MainRendering, bool); |