summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-07-04 12:21:26 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-07-04 12:21:26 (GMT)
commita60e81ac70b3d829f486ce7b6534005a9d025206 (patch)
tree0e3b284a12a1f8f4932f5cd05247a556cf8c5bf9 /src/analysis
parentb6893c7b85c34f7a3c65ac76bfd9d95b1c4ebf55 (diff)
Defined general rendering options using a GLib object.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@89 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rwxr-xr-xsrc/analysis/Makefile.am1
-rw-r--r--src/analysis/binary.c20
-rw-r--r--src/analysis/binary.h2
-rw-r--r--src/analysis/line-int.h6
-rw-r--r--src/analysis/line.c61
-rw-r--r--src/analysis/line.h35
-rw-r--r--src/analysis/line_code.c41
-rw-r--r--src/analysis/line_code.h2
-rw-r--r--src/analysis/line_comment.c35
-rw-r--r--src/analysis/line_comment.h2
-rw-r--r--src/analysis/line_prologue.c10
-rw-r--r--src/analysis/roptions.c239
-rw-r--r--src/analysis/roptions.h88
13 files changed, 430 insertions, 112 deletions
diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am
index f763f53..5f6beed 100755
--- a/src/analysis/Makefile.am
+++ b/src/analysis/Makefile.am
@@ -9,6 +9,7 @@ libanalysis_la_SOURCES = \
line_comment.h line_comment.c \
line_prologue.h line_prologue.c \
prototype.h prototype.c \
+ roptions.h roptions.c \
variable.h variable.c
libanalysis_la_LDFLAGS =
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index e74680e..d7d050b 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -70,7 +70,7 @@ struct _openida_binary
GArchProcessor *proc; /* Architecture du binaire */
GRenderingLine *lines; /* Lignes de rendu en place */
- disass_options options; /* Options de désassemblage */
+ GRenderingOptions *options; /* Options de désassemblage */
};
@@ -137,11 +137,13 @@ openida_binary *load_binary_file(const char *filename)
result->proc = get_arch_processor_from_format(result->format);
- result->options.show_address = true;
- result->options.show_code = true;
+ result->options = g_rendering_options_new(result->format, result->proc);
- result->options.format = result->format;
- result->options.proc = result->proc;
+ g_rendering_options_show_address(result->options, MRD_BLOCK, true);
+ g_rendering_options_show_code(result->options, MRD_BLOCK, true);
+
+ g_rendering_options_show_address(result->options, MRD_GRAPH, true);
+ g_rendering_options_show_code(result->options, MRD_GRAPH, false);
disassemble_openida_binary(result);
@@ -300,9 +302,9 @@ exe_format *get_openida_binary_format(const openida_binary *binary)
* *
******************************************************************************/
-disass_options *get_openida_binary_options(const openida_binary *binary)
+GRenderingOptions *get_openida_binary_options(const openida_binary *binary)
{
- return &binary->options;
+ return binary->options;
}
@@ -642,7 +644,7 @@ void disassemble_openida_binary(openida_binary *binary)
instr = g_arch_processor_decode_instruction(binary->proc, &binary->bin_data[start], &pos, len, start, addr);
- line = g_code_line_new(addr, instr, &binary->options);
+ line = g_code_line_new(addr, instr, binary->options);
g_rendering_line_add_to_lines(&binary->lines, line);
}
@@ -657,7 +659,7 @@ void disassemble_openida_binary(openida_binary *binary)
routine_desc = g_binary_routine_to_string(routines[k]);
- line = g_comment_line_new(routine_offset, routine_desc, &binary->options);
+ line = g_comment_line_new(routine_offset, routine_desc, binary->options);
g_rendering_line_insert_into_lines(&binary->lines, line, true);
free(routine_desc);
diff --git a/src/analysis/binary.h b/src/analysis/binary.h
index 94f4514..0c63738 100644
--- a/src/analysis/binary.h
+++ b/src/analysis/binary.h
@@ -58,7 +58,7 @@ uint8_t *get_openida_binary_data(const openida_binary *, off_t *);
exe_format *get_openida_binary_format(const openida_binary *);
/* Fournit les options d'affichage définies pour le binaire. */
-disass_options *get_openida_binary_options(const openida_binary *);
+GRenderingOptions *get_openida_binary_options(const openida_binary *);
/* Fournit les lignes de rendu issues du désassemblage. */
GRenderingLine *get_openida_binary_lines(const openida_binary *);
diff --git a/src/analysis/line-int.h b/src/analysis/line-int.h
index ea8bce0..cf70695 100644
--- a/src/analysis/line-int.h
+++ b/src/analysis/line-int.h
@@ -36,7 +36,7 @@
typedef void (* get_bin_len_fc) (GRenderingLine *, off_t *);
/* Méthode de mise à jour d'une ligne de représentation. */
-typedef void (* refresh_markup_fc) (GRenderingLine *, LinesMainOwner);
+typedef void (* refresh_markup_fc) (GRenderingLine *, MainRendering);
/* Ligne de représentation générique (instance) */
@@ -57,10 +57,10 @@ struct _GRenderingLine
GRenderingLine *to; /* Eventuelle ligne visée */
InstructionLinkType link_type; /* Type de visée */
- PangoLayout *layout[LMO_COUNT]; /* Moteur de rendu du code/txt */
+ PangoLayout *layout[MRD_COUNT]; /* Moteur de rendu du code/txt */
get_bin_len_fc get_bin_len; /* Nbre d'octets représentés */
- off_t max_bin_len[LMO_COUNT]; /* Nombre global maximal */
+ off_t max_bin_len[MRD_COUNT]; /* Nombre global maximal */
refresh_markup_fc refresh_markup; /* Reconstruit la représentat° */
diff --git a/src/analysis/line.c b/src/analysis/line.c
index 332e88d..42b034a 100644
--- a/src/analysis/line.c
+++ b/src/analysis/line.c
@@ -38,8 +38,7 @@
-
-
+/* ------------------------ TRAITEMENT INDIVIDUEL DES LIGNES ------------------------ */
/* Initialise la classe des lignes de représentation. */
@@ -56,11 +55,15 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *, const cha
+/* ---------------------------------------------------------------------------------- */
+/* TRAITEMENT INDIVIDUEL DES LIGNES */
+/* ---------------------------------------------------------------------------------- */
+
+
/* Indique le type définit pour une ligne de représentation. */
G_DEFINE_TYPE(GRenderingLine, g_rendering_line, G_TYPE_OBJECT);
-
/******************************************************************************
* *
* Paramètres : klass = classe à initialiser. *
@@ -104,7 +107,7 @@ static void g_rendering_line_init(GRenderingLine *line)
{
GdkScreen *screen; /* Ecran d'application */
PangoFontDescription *desc; /* Description de la police */
- LinesMainOwner i; /* Boucle de parcours */
+ MainRendering i; /* Boucle de parcours */
static PangoContext *context = NULL; /* Contexte graphique Pango */
@@ -120,7 +123,7 @@ static void g_rendering_line_init(GRenderingLine *line)
}
- for (i = 0; i < LMO_COUNT; i++)
+ for (i = 0; i < MRD_COUNT; i++)
line->layout[i] = pango_layout_new(context);
line->get_bin_len = NULL;
@@ -397,14 +400,14 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *line, const
/******************************************************************************
* *
-* 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. *
-* owner = support effectif final des lignes de code. *
+* 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. *
+* rendering = support effectif final des lignes de code. *
* *
* Description : Procède à l'initialisation des bases d'une représentation. *
* *
@@ -414,11 +417,11 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *line, const
* *
******************************************************************************/
-void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h, LinesMainOwner owner)
+void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h, MainRendering rendering)
{
GdkPixbuf *pixbuf; /* Données utiles au dessin */
- gdk_draw_layout(drawable, gc, x1, y, line->layout[owner]);
+ gdk_draw_layout(drawable, gc, x1, y, line->layout[rendering]);
if (line->to != NULL)
pixbuf = g_rendering_line_render_icon(line, "gtk-bold", GTK_ICON_SIZE_MENU);
@@ -561,9 +564,9 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen
/******************************************************************************
* *
-* Paramètres : lines = liste de lignes de représentation à actualiser. *
-* last = dernière élément imposé du parcours ou NULL. *
-* owner = support effectif des lignes pour l'appelant. *
+* Paramètres : lines = liste de lignes de représentation à actualiser. *
+* last = dernière élément imposé du parcours ou NULL. *
+* rendering = support effectif des lignes pour l'appelant. *
* *
* Description : Met à jour le nombre d'octets maximal par instruction. *
* *
@@ -573,7 +576,7 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen
* *
******************************************************************************/
-void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last, LinesMainOwner owner)
+void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last, MainRendering rendering)
{
GRenderingLine *iter; /* Boucle de parcours */
off_t bin_len; /* Taille d'instruction */
@@ -591,8 +594,8 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last
lines_list_for_each(iter, lines)
{
- iter->max_bin_len[owner] = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0);
- iter->refresh_markup(iter, owner);
+ iter->max_bin_len[rendering] = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0);
+ iter->refresh_markup(iter, rendering);
if (iter == last) break;
@@ -603,12 +606,12 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last
/******************************************************************************
* *
-* Paramètres : lines = liste de lignes de représentation à actualiser. *
-* last = dernière élément imposé du parcours ou NULL. *
-* owner = support effectif final des lignes de code. *
-* width = largeur maximale des lignes. [OUT] *
-* height = hauteur maximale des lignes. [OUT] *
-* alone = hauteur d'une seule ligne. [OUT] *
+* Paramètres : lines = liste de lignes de représentation à actualiser. *
+* last = dernière élément imposé du parcours ou NULL. *
+* rendering = support effectif final des lignes de code. *
+* width = largeur maximale des lignes. [OUT] *
+* height = hauteur maximale des lignes. [OUT] *
+* alone = hauteur d'une seule ligne. [OUT] *
* *
* Description : Fournit les dimensions de lignes de représentation. *
* *
@@ -618,7 +621,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last
* *
******************************************************************************/
-void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, LinesMainOwner owner, int *width, int *height, int *alone)
+void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, MainRendering rendering, int *width, int *height, int *alone)
{
GRenderingLine *iter; /* Boucle de parcours */
int w; /* Largeur de l'objet actuelle */
@@ -630,7 +633,7 @@ void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last
lines_list_for_each(iter, lines)
{
- pango_layout_get_pixel_size(iter->layout[owner], &w, &h);
+ pango_layout_get_pixel_size(iter->layout[rendering], &w, &h);
*width = MAX(*width, w);
*height += h;
diff --git a/src/analysis/line.h b/src/analysis/line.h
index 981cf90..4a293cf 100644
--- a/src/analysis/line.h
+++ b/src/analysis/line.h
@@ -25,27 +25,14 @@
#define _ANALYSIS_LINE_H
-#include <stdbool.h>
#include <gtk/gtk.h>
-#include "../arch/processor.h"
-#include "../format/exe_format.h"
-
-
-
-/* Support principal de lignes */
-typedef enum _LinesMainOwner
-{
- LMO_BLOCK, /* Unique bloc de code */
- LMO_GRAPH, /* Graphique de blocs de code */
-
- LMO_COUNT
-
-} LinesMainOwner;
+#include "roptions.h"
+/* ------------------------ TRAITEMENT INDIVIDUEL DES LIGNES ------------------------ */
/* Définitions des types de ligne */
@@ -67,18 +54,6 @@ typedef enum _RenderingLineFlag
} RenderingLineFlag;
-/* Passage de paramètres compact */
-typedef struct _disass_options
-{
- bool show_address; /* Affichage de l'adresse ? */
- bool show_code; /* Affichage du code brut ? */
-
- exe_format *format; /* Format du contenu bianire */
- GArchProcessor *proc; /* Architecture utilisée */
-
-} disass_options;
-
-
#define G_TYPE_RENDERING_LINE g_rendering_line_get_type()
#define G_RENDERING_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_rendering_line_get_type(), GRenderingLine))
@@ -128,7 +103,7 @@ bool g_rendering_line_has_destination(const GRenderingLine *);
GRenderingLine *g_rendering_line_get_destination(const GRenderingLine *, InstructionLinkType *);
/* Procède à l'initialisation des bases d'une représentation. */
-void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint, LinesMainOwner);
+void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint, MainRendering);
@@ -145,10 +120,10 @@ void g_rendering_line_insert_into_lines(GRenderingLine **, GRenderingLine *, boo
GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *, const GRenderingLine *, const GRenderingLine *);
/* Met à jour le nombre d'octets maximal par instruction. */
-void g_rendering_line_update_bin_len(GRenderingLine *, GRenderingLine *, LinesMainOwner);
+void g_rendering_line_update_bin_len(GRenderingLine *, GRenderingLine *, MainRendering);
/* Fournit les dimensions de lignes de représentation. */
-void g_rendering_line_get_size(GRenderingLine *, const GRenderingLine *, LinesMainOwner, int *, int *, int *);
+void g_rendering_line_get_size(GRenderingLine *, const GRenderingLine *, MainRendering, int *, int *, int *);
/* Recherche une ligne d'après sa position à l'écran. */
GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *, const GRenderingLine *, gdouble *);
diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c
index 84ab36c..c44899e 100644
--- a/src/analysis/line_code.c
+++ b/src/analysis/line_code.c
@@ -38,7 +38,7 @@ struct _GCodeLine
GRenderingLine parent; /* Instance parente */
GArchInstruction *instr; /* Instruction représentée */
- const disass_options *options; /* Options de représentation */
+ const GRenderingOptions *options; /* Options de représentation */
};
@@ -61,7 +61,7 @@ static void g_code_line_init(GCodeLine *);
void g_code_line_get_binary_len(GCodeLine *, off_t *);
/* Met à jour la ligne de représentation de code. */
-void g_code_line_refresh_markup(GCodeLine *, LinesMainOwner);
+void g_code_line_refresh_markup(GCodeLine *, MainRendering);
@@ -140,8 +140,8 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
-* owner = support effectif final des lignes de code. *
+* Paramètres : line = ligne de représentation à actualiser. *
+* rendering = support effectif final des lignes de code. *
* *
* Description : Met à jour la ligne de représentation de code. *
* *
@@ -151,8 +151,10 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen)
* *
******************************************************************************/
-void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
+void g_code_line_refresh_markup(GCodeLine *line, MainRendering rendering)
{
+ bool show_address; /* Affichage de l'adresse ? */
+ bool show_code; /* Affichage du code brut ? */
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
off_t bin_offset; /* Début de l'instruction */
@@ -165,18 +167,21 @@ void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
off_t k; /* Boucle de parcours #2 */
off_t j; /* Boucle de parcours #1 */
+ show_address = g_rendering_options_has_to_show_address(line->options, rendering);
+ show_code = g_rendering_options_has_to_show_code(line->options, rendering);
+
len = strlen("<tt>") + 1;
content = (char *)calloc(len, sizeof(char));
strcpy(content, "<tt>");
- if (line->options->show_code)
+ if (show_code)
g_arch_instruction_get_location(line->instr, &bin_offset, &bin_len, NULL);
/* Eventuelle adresse virtuelle */
- if (line->options->show_address)
+ if (show_address)
{
- switch (g_arch_processor_get_memory_size(line->options->proc))
+ switch (g_arch_processor_get_memory_size(g_rendering_options_get_processor(line->options)))
{
case MDS_8_BITS:
snprintf(buffer, CODE_BUFFER_LEN,
@@ -213,10 +218,10 @@ void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
/* Eventuel code brut */
- if (line->options->show_code)
+ if (show_code)
{
- exe_content = get_exe_content(line->options->format, NULL);
- max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[owner];
+ exe_content = get_exe_content(g_rendering_options_get_format(line->options), NULL);
+ max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[rendering];
bin_code = (char *)calloc(*max_bin_len + 1, sizeof(char));
@@ -233,10 +238,10 @@ void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
for (; k < *max_bin_len; k++)
snprintf(&bin_code[k], 2, " ");
- if (line->options->show_address) len += strlen("\t");
+ if (show_address) len += strlen("\t");
len += strlen(bin_code);
content = (char *)realloc(content, len * sizeof(char));
- if (line->options->show_address) strcat(content, "\t");
+ if (show_address) strcat(content, "\t");
strcat(content, bin_code);
free(bin_code);
@@ -245,13 +250,13 @@ void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
/* Instruction proprement dite */
- buffer2 = g_arch_instruction_get_text(line->instr, line->options->format, ASX_INTEL/*FIXME*/);
+ buffer2 = g_arch_instruction_get_text(line->instr, g_rendering_options_get_format(line->options), ASX_INTEL/*FIXME*/);
- if (line->options->show_address || line->options->show_code) len += strlen("\t");
+ if (show_address || show_code) len += strlen("\t");
len += strlen(buffer2);
content = (char *)realloc(content, len * sizeof(char));
- if (line->options->show_address || line->options->show_code) strcat(content, "\t");
+ if (show_address || show_code) strcat(content, "\t");
strcat(content, buffer2);
free(buffer2);
@@ -262,7 +267,7 @@ void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
content = (char *)realloc(content, len * sizeof(char));
strcat(content, "</tt>");
- pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len - 1);
+ pango_layout_set_markup(G_RENDERING_LINE(line)->layout[rendering], content, len - 1);
free(content);
@@ -283,7 +288,7 @@ void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
* *
******************************************************************************/
-GRenderingLine *g_code_line_new(uint64_t offset, GArchInstruction *instr, const disass_options *options)
+GRenderingLine *g_code_line_new(uint64_t offset, GArchInstruction *instr, const GRenderingOptions *options)
{
GCodeLine *result; /* Structure à retourner */
diff --git a/src/analysis/line_code.h b/src/analysis/line_code.h
index 9c9d8e9..42ac2ff 100644
--- a/src/analysis/line_code.h
+++ b/src/analysis/line_code.h
@@ -52,7 +52,7 @@ typedef struct _GCodeLineClass GCodeLineClass;
GType g_code_line_get_type(void);
/* Crée une ligne de code binaire. */
-GRenderingLine *g_code_line_new(uint64_t, GArchInstruction *, const disass_options *);
+GRenderingLine *g_code_line_new(uint64_t, GArchInstruction *, const GRenderingOptions *);
/* Fournit l'instruction associée à la ligne de code binaire. */
GArchInstruction *g_code_line_get_instruction(const GCodeLine *);
diff --git a/src/analysis/line_comment.c b/src/analysis/line_comment.c
index 331bd19..a39cb11 100644
--- a/src/analysis/line_comment.c
+++ b/src/analysis/line_comment.c
@@ -38,7 +38,7 @@ struct _GCommentLine
GRenderingLine parent; /* Instance parente */
char *comment; /* Texte à afficher */
- const disass_options *options; /* Options de représentation */
+ const GRenderingOptions *options; /* Options de représentation */
};
@@ -58,7 +58,7 @@ static void g_comment_line_class_init(GCommentLineClass *);
static void g_comment_line_init(GCommentLine *);
/* Met à jour la ligne de représentation de commentaires. */
-void g_comment_line_refresh_markup(GCommentLine *, LinesMainOwner);
+void g_comment_line_refresh_markup(GCommentLine *, MainRendering);
@@ -112,8 +112,8 @@ static void g_comment_line_init(GCommentLine *line)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
-* owner = support effectif final des lignes de code. *
+* Paramètres : line = ligne de représentation à actualiser. *
+* rendering = support effectif final des lignes de code. *
* *
* Description : Met à jour la ligne de représentation de commentaires. *
* *
@@ -123,23 +123,28 @@ static void g_comment_line_init(GCommentLine *line)
* *
******************************************************************************/
-void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner)
+void g_comment_line_refresh_markup(GCommentLine *line, MainRendering rendering)
{
+ bool show_address; /* Affichage de l'adresse ? */
+ bool show_code; /* Affichage du code brut ? */
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */
const off_t *max_bin_len; /* Taille de ligne max/globale */
size_t clen; /* Taille du commentaire */
+ show_address = g_rendering_options_has_to_show_address(line->options, rendering);
+ show_code = g_rendering_options_has_to_show_code(line->options, rendering);
+
len = strlen("<tt>") + 1;
content = (char *)calloc(len, sizeof(char));
strcpy(content, "<tt>");
/* Eventuelle adresse virtuelle */
- if (line->options->show_address)
+ if (show_address)
{
- switch (g_arch_processor_get_memory_size(line->options->proc))
+ switch (g_arch_processor_get_memory_size(g_rendering_options_get_processor(line->options)))
{
case MDS_8_BITS:
snprintf(buffer, CODE_BUFFER_LEN,
@@ -176,16 +181,16 @@ void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner)
/* Eventuel code brut (sauté) */
- if (line->options->show_code)
+ if (show_code)
{
- max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[owner];
+ max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[rendering];
- clen = (line->options->show_address ? strlen("\t") : 0);
+ clen = (show_address ? strlen("\t") : 0);
clen += *max_bin_len;
content = (char *)realloc(content, (len + clen) * sizeof(char));
- if (line->options->show_address)
+ if (show_address)
{
strcat(content, "\t");
len += strlen("\t");
@@ -201,14 +206,14 @@ void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner)
/* Commentaire proprement dit */
- clen = (line->options->show_address || line->options->show_code ? strlen("\t") : 0);
+ clen = (show_address || 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)
+ if (show_address || show_code)
{
strcat(content, "\t");
len += strlen("\t");
@@ -225,7 +230,7 @@ void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner)
content = (char *)realloc(content, len * sizeof(char));
strcat(content, "</tt>");
- pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len - 1);
+ pango_layout_set_markup(G_RENDERING_LINE(line)->layout[rendering], content, len - 1);
free(content);
@@ -246,7 +251,7 @@ void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner)
* *
******************************************************************************/
-GRenderingLine *g_comment_line_new(uint64_t offset, const char *comment, const disass_options *options)
+GRenderingLine *g_comment_line_new(uint64_t offset, const char *comment, const GRenderingOptions *options)
{
GCommentLine *result; /* Structure à retourner */
diff --git a/src/analysis/line_comment.h b/src/analysis/line_comment.h
index 7d103f4..09657cb 100644
--- a/src/analysis/line_comment.h
+++ b/src/analysis/line_comment.h
@@ -51,7 +51,7 @@ typedef struct _GCommentLineClass GCommentLineClass;
GType g_comment_line_get_type(void);
/* Crée une ligne de commentaires entière. */
-GRenderingLine *g_comment_line_new(uint64_t, const char *, const disass_options *);
+GRenderingLine *g_comment_line_new(uint64_t, const char *, const GRenderingOptions *);
diff --git a/src/analysis/line_prologue.c b/src/analysis/line_prologue.c
index 16876af..4b83b68 100644
--- a/src/analysis/line_prologue.c
+++ b/src/analysis/line_prologue.c
@@ -57,7 +57,7 @@ static void g_prologue_line_class_init(GPrologueLineClass *);
static void g_prologue_line_init(GPrologueLine *);
/* Met à jour la ligne de représentation de prologue. */
-void g_prologue_line_refresh_markup(GPrologueLine *, LinesMainOwner);
+void g_prologue_line_refresh_markup(GPrologueLine *, MainRendering);
@@ -113,8 +113,8 @@ static void g_prologue_line_init(GPrologueLine *line)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
-* owner = support effectif final des lignes de code. *
+* Paramètres : line = ligne de représentation à actualiser. *
+* rendering = support effectif final des lignes de code. *
* *
* Description : Met à jour la ligne de représentation de prologue. *
* *
@@ -124,7 +124,7 @@ static void g_prologue_line_init(GPrologueLine *line)
* *
******************************************************************************/
-void g_prologue_line_refresh_markup(GPrologueLine *line, LinesMainOwner owner)
+void g_prologue_line_refresh_markup(GPrologueLine *line, MainRendering rendering)
{
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
@@ -137,7 +137,7 @@ void g_prologue_line_refresh_markup(GPrologueLine *line, LinesMainOwner owner)
snprintf(content, len + 1, "<b><span foreground='#003300'>; %s</span></b>", line->comment);
- pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len);
+ pango_layout_set_markup(G_RENDERING_LINE(line)->layout[rendering], content, len);
free(content);
diff --git a/src/analysis/roptions.c b/src/analysis/roptions.c
new file mode 100644
index 0000000..aab8ef7
--- /dev/null
+++ b/src/analysis/roptions.c
@@ -0,0 +1,239 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * roptions.c - options de rendus des lignes de code
+ *
+ * Copyright (C) 2009 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "roptions.h"
+
+
+
+/* Options de représentation (instance) */
+struct _GRenderingOptions
+{
+ exe_format *format; /* Format du contenu bianire */
+ GArchProcessor *proc; /* Architecture utilisée */
+
+ bool show_address[MRD_COUNT]; /* Affichage de l'adresse ? */
+ bool show_code[MRD_COUNT]; /* Affichage du code brut ? */
+
+};
+
+/* Options de représentation (classe) */
+struct _GRenderingOptionsClass
+{
+ GObjectClass parent; /* A laisser en premier */
+
+};
+
+
+/* Initialise la classe des options pour le rendu des lignes. */
+static void g_rendering_options_class_init(GRenderingOptionsClass *);
+
+/* Initialise une instance d'options pour le rendu des lignes. */
+static void g_rendering_options_init(GRenderingOptions *);
+
+
+
+/* Indique le type définit pour une ligne de représentation. */
+G_DEFINE_TYPE(GRenderingOptions, g_rendering_options, G_TYPE_OBJECT);
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe à initialiser. *
+* *
+* Description : Initialise la classe des options pour le rendu des lignes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_rendering_options_class_init(GRenderingOptionsClass *klass)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = instance à initialiser. *
+* *
+* Description : Initialise une instance d'options pour le rendu des lignes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_rendering_options_init(GRenderingOptions *options)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = format du contenu binaire. *
+* proc = architecture utilisée par le binaire. *
+* *
+* Description : Crée un un groupe d'options pour le rendu des lignes. *
+* *
+* Retour : Adresse de la structure mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GRenderingOptions *g_rendering_options_new(exe_format *format, GArchProcessor *proc)
+{
+ GRenderingOptions *result; /* Structure à retourner */
+
+ result = g_object_new(G_TYPE_RENDERING_OPTIONS, NULL);
+
+ result->format = format;
+ result->proc = proc;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = options à consulter. *
+* *
+* Description : Fournit le format du contenu binaire représenté. *
+* *
+* Retour : Format du contenu binaire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+exe_format *g_rendering_options_get_format(const GRenderingOptions *options)
+{
+ return options->format;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = options à consulter. *
+* *
+* Description : Fournit l'architecture du contenu binaire représenté. *
+* *
+* Retour : Architecture utilisée par le binaire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchProcessor *g_rendering_options_get_processor(const GRenderingOptions *options)
+{
+ return options->proc;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = options à mettre à jour. *
+* rendering = type de rendu impliqué. *
+* state = nouvel état de l'option visée. *
+* *
+* Description : Affiche (ou non) les adresses des instructions. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_rendering_options_show_address(GRenderingOptions *options, MainRendering rendering, bool state)
+{
+ options->show_address[rendering] = state;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = options à consulter. *
+* rendering = type de rendu impliqué. *
+* *
+* Description : Indique si les adresses des instructions sont à afficher. *
+* *
+* Retour : Etat courant de l'option visée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_rendering_options_has_to_show_address(const GRenderingOptions *options, MainRendering rendering)
+{
+ return options->show_address[rendering];
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = options à mettre à jour. *
+* rendering = type de rendu impliqué. *
+* state = nouvel état de l'option visée. *
+* *
+* Description : Affiche (ou non) le code des instructions. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_rendering_options_show_code(GRenderingOptions *options, MainRendering rendering, bool state)
+{
+ options->show_code[rendering] = state;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : options = options à consulter. *
+* rendering = type de rendu impliqué. *
+* *
+* Description : Indique si le code des instructions est à afficher. *
+* *
+* Retour : Etat courant de l'option visée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_rendering_options_has_to_show_code(const GRenderingOptions *options, MainRendering rendering)
+{
+ return options->show_code[rendering];
+
+}
diff --git a/src/analysis/roptions.h b/src/analysis/roptions.h
new file mode 100644
index 0000000..184f59a
--- /dev/null
+++ b/src/analysis/roptions.h
@@ -0,0 +1,88 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * roptions.h - prototypes pour les options de rendus des lignes de code
+ *
+ * Copyright (C) 2009 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _ANALYSIS_ROPTIONS_H
+#define _ANALYSIS_ROPTIONS_H
+
+
+#include <glib-object.h>
+#include <stdbool.h>
+
+
+#include "../arch/processor.h"
+#include "../format/exe_format.h"
+
+
+
+/* Support principal de rendu */
+typedef enum _MainRendering
+{
+ MRD_BLOCK, /* Unique bloc de code */
+ MRD_GRAPH, /* Graphique de blocs de code */
+
+ MRD_COUNT
+
+} MainRendering;
+
+
+#define G_TYPE_RENDERING_OPTIONS g_rendering_options_get_type()
+#define G_RENDERING_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_rendering_options_get_type(), GRenderingOptions))
+#define G_IS_RENDERING_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_rendering_options_get_type()))
+#define G_RENDERING_OPTIONS_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_rendering_options_get_type(), GRenderingOptionsIface))
+#define G_RENDERING_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_RENDERING_OPTIONS, GRenderingOptionsClass))
+
+
+/* Options de représentation (instance) */
+typedef struct _GRenderingOptions GRenderingOptions;
+
+/* Options de représentation (classe) */
+typedef struct _GRenderingOptionsClass GRenderingOptionsClass;
+
+
+/* Indique le type défini pour des options de représentation. */
+GType g_rendering_options_get_type(void);
+
+/* Crée un un groupe d'options pour le rendu des lignes. */
+GRenderingOptions *g_rendering_options_new(exe_format *, GArchProcessor *);
+
+/* Fournit le format du contenu binaire représenté. */
+exe_format *g_rendering_options_get_format(const GRenderingOptions *);
+
+/* Fournit l'architecture du contenu binaire représenté. */
+GArchProcessor *g_rendering_options_get_processor(const GRenderingOptions *);
+
+/* Affiche (ou non) les adresses des instructions. */
+void g_rendering_options_show_address(GRenderingOptions *, MainRendering, bool);
+
+/* Indique si les adresses des instructions sont à afficher. */
+bool g_rendering_options_has_to_show_address(const GRenderingOptions *, MainRendering);
+
+/* Affiche (ou non) le code des instructions. */
+void g_rendering_options_show_code(GRenderingOptions *, MainRendering, bool);
+
+/* Indique si le code des instructions est à afficher. */
+bool g_rendering_options_has_to_show_code(const GRenderingOptions *, MainRendering);
+
+
+
+#endif /* _ANALYSIS_ROPTIONS_H */