summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-04-11 16:39:38 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-04-11 16:39:38 (GMT)
commit30258fa96ad48eed68924f259ec5464fc4fd8094 (patch)
tree6187f2ddbee31de8bcd1b4b6e930a38f858f922c /src/analysis
parent929150f18d23d82e8390bd98e31b1edb34bc09f1 (diff)
Provided a faster than GTK display buffer.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@150 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/exporter-int.h10
-rw-r--r--src/analysis/exporter.c92
-rw-r--r--src/analysis/exporter.h8
-rw-r--r--src/analysis/line_code.c84
4 files changed, 190 insertions, 4 deletions
diff --git a/src/analysis/exporter-int.h b/src/analysis/exporter-int.h
index 3218bcf..421770e 100644
--- a/src/analysis/exporter-int.h
+++ b/src/analysis/exporter-int.h
@@ -33,6 +33,9 @@
typedef void (* add_text_fc) (GContentExporter *, GRenderingOptions *, MainRendering, FILE *);
/* Ajoute à un texte GTK le contenu de la ligne de rendu. */
+typedef void (* export_buffer_fc) (GContentExporter *, GBufferLine *, GRenderingOptions *);
+
+/* 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]);
/* Traduit une instruction en version humainement lisible. */
@@ -46,6 +49,7 @@ struct _GContentExporter
GObject parent; /* A laisser en premier */
add_text_fc add_text; /* Remplissage simple */
+ export_buffer_fc export_buffer; /* Constitution du texte GTK */
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... */
@@ -58,6 +62,9 @@ struct _GContentExporterClass
{
GObjectClass parent; /* A laisser en premier */
+ PangoContext *context; /* Contexte graphique Pango */
+ PangoAttrList *attribs[RTT_COUNT]; /* Décorateurs pour tampons */
+
GtkTextTag *tags[RTT_COUNT]; /* Décorateurs pour les textes */
};
@@ -66,6 +73,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 tampon de code via l'instance spécifiée. */
+void g_content_exporter_insert_into_buffer(GContentExporter *, GBufferLine *, BufferLineColumn, 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 e1e9160..5820fd6 100644
--- a/src/analysis/exporter.c
+++ b/src/analysis/exporter.c
@@ -46,9 +46,49 @@ G_DEFINE_TYPE(GContentExporter, g_content_exporter, G_TYPE_OBJECT);
static void g_content_exporter_class_init(GContentExporterClass *klass)
{
+ GdkScreen *screen; /* Ecran pour GDK */
+ PangoFontDescription *font_desc; /* Police de caractère */
GtkTextTagTable *table; /* Seule table globale valable */
GtkTextTag *tag;
+ /* Exportation vers un tampon de code */
+
+ screen = gdk_screen_get_default();
+
+ font_desc = pango_font_description_from_string("mono 10");
+
+ klass->context = gdk_pango_context_get_for_screen(screen);
+
+ pango_context_set_font_description(klass->context, font_desc);
+ pango_context_set_base_dir(klass->context, PANGO_DIRECTION_LTR);
+ pango_context_set_language(klass->context, gtk_get_default_language());
+
+ klass->attribs[RTT_RAW] = pango_attr_list_new();
+
+ klass->attribs[RTT_COMMENT] = pango_attr_list_new();
+
+ klass->attribs[RTT_RAW_CODE] = pango_attr_list_new();
+
+ klass->attribs[RTT_INSTRUCTION] = pango_attr_list_new();
+
+ klass->attribs[RTT_IMMEDIATE] = pango_attr_list_new();
+
+ klass->attribs[RTT_REGISTER] = pango_attr_list_new();
+
+ klass->attribs[RTT_HOOK] = pango_attr_list_new();
+
+ klass->attribs[RTT_SIGNS] = pango_attr_list_new();
+
+ klass->attribs[RTT_LTGT] = pango_attr_list_new();
+
+ klass->attribs[RTT_SEGMENT] = pango_attr_list_new();
+
+ klass->attribs[RTT_STRING] = pango_attr_list_new();
+
+ klass->attribs[RTT_VAR_NAME] = pango_attr_list_new();
+
+
+
/* Décorateurs GTK */
table = get_gtk_tag_table();
@@ -207,6 +247,36 @@ void g_content_exporter_insert_text(GContentExporter *exporter, FILE *stream, co
/******************************************************************************
* *
* Paramètres : exporter = instance sachant exporter son contenu. *
+* buffer = espace où placer ledit contenu. *
+* column = colonne de la ligne visée par l'insertion. *
+* text = texte à insérer dans l'existant. *
+* length = taille du texte à traiter. *
+* type = type de décorateur à utiliser. *
+* *
+* Description : Ajoute du texte à un tampon de code via l'instance spécifiée.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_content_exporter_insert_into_buffer(GContentExporter *exporter, GBufferLine *buffer, BufferLineColumn column, const char *text, size_t length, RenderingTagType type)
+{
+ GContentExporterClass *class; /* Stockage de briques de base */
+ GBufferSegment *segment; /* Portion de texte à ajouter */
+
+ class = G_CONTENT_EXPORTER_GET_CLASS(exporter);
+
+ segment = g_buffer_segment_new(class->context, class->attribs[type], text, length);
+ g_buffer_line_add_segment(buffer, column, segment);
+
+}
+
+
+/******************************************************************************
+* *
+* 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. *
@@ -260,6 +330,28 @@ void g_content_exporter_add_text(GContentExporter *exporter, GRenderingOptions *
/******************************************************************************
* *
+* Paramètres : exporter = instance sachant exporter son contenu. *
+* line = espace où placer ledit contenu. *
+* options = options de rendu. *
+* *
+* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_content_exporter_to_buffer(GContentExporter *exporter, GBufferLine *line, GRenderingOptions *options)
+{
+ if (exporter->export_buffer != NULL)
+ exporter->export_buffer(exporter, line, options);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : exporter = instance sachant exporter son contenu. *
* rendering = support effectif final des lignes de code. *
* buffer = zone de texte à venir compléter. *
diff --git a/src/analysis/exporter.h b/src/analysis/exporter.h
index 524d800..297fd99 100644
--- a/src/analysis/exporter.h
+++ b/src/analysis/exporter.h
@@ -31,11 +31,14 @@
#include "roptions.h"
+#include "../glibext/gbufferline.h"
/* Types de partie de rendu */
typedef enum _RenderingTagType
{
+ RTT_RAW, /* Contenu brut */
+
RTT_COMMENT, /* Commentaire */
RTT_RAW_CODE, /* Code binaire brut */
@@ -59,7 +62,7 @@ typedef enum _RenderingTagType
} RenderingTagType;
-#define RTT_NONE RTT_COUNT
+#define RTT_NONE RTT_RAW /* TODO : remme */
#define G_TYPE_CONTENT_EXPORTER g_content_exporter_get_type()
@@ -89,6 +92,9 @@ GtkTextTagTable *_get_gtk_tag_table(GtkTextTagTable *);
/* Ajoute du texte simple à un fichier ouvert en écriture. */
void g_content_exporter_add_text(GContentExporter *, GRenderingOptions *, MainRendering, FILE *);
+/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
+void g_content_exporter_to_buffer(GContentExporter *, GBufferLine *, GRenderingOptions *);
+
/* 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 7c80074..4761522 100644
--- a/src/analysis/line_code.c
+++ b/src/analysis/line_code.c
@@ -61,6 +61,9 @@ 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 tampon GLib le contenu de l'instance spécifiée. */
+static void g_code_line_to_buffer(GCodeLine *, GBufferLine *, GRenderingOptions *);
+
/* 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]);
@@ -109,6 +112,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->export_buffer = (export_buffer_fc)g_code_line_to_buffer;
exporter_parent->add_to_gtk_buffer = (add_to_gtk_buffer_fc)g_code_line_add_to_gtk_buffer;
line_parent = G_RENDERING_LINE(line);
@@ -121,7 +125,7 @@ static void g_code_line_init(GCodeLine *line)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
+* Paramètres : line = ligne de représentation à représenter. *
* options = options de rendu. *
* rendering = support effectif final des lignes de code. *
* stream = flux ouvert en écriture. *
@@ -184,7 +188,7 @@ static void g_code_line_add_text(GCodeLine *line, GRenderingOptions *options, Ma
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);
@@ -212,6 +216,80 @@ static void g_code_line_add_text(GCodeLine *line, GRenderingOptions *options, Ma
/******************************************************************************
* *
+* Paramètres : line = ligne de représentation à représenter. *
+* buffer = espace où placer ledit contenu. *
+* options = options de rendu. *
+* *
+* Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_code_line_to_buffer(GCodeLine *line, GBufferLine *buffer, GRenderingOptions *options)
+{
+ GContentExporter *exporter; /* Autre vision de la ligne #1 */
+ GRenderingLine *basic; /* Autre vision de la ligne #2 */
+ 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);
+ basic = G_RENDERING_LINE(line);
+
+ /* Eventuelle adresse virtuelle ou physique */
+
+ msize = g_arch_processor_get_memory_size(g_rendering_options_get_processor(line->options));
+
+ len = vmpa_to_string(G_RENDERING_LINE(line)->offset, msize, address);
+
+ g_content_exporter_insert_into_buffer(exporter, buffer, BLC_ADDRESS, address, len, RTT_RAW);
+
+ /* Eventuel code brut */
+
+ content = g_binary_format_get_content(G_BIN_FORMAT(g_rendering_options_get_format(line->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_into_buffer(exporter, buffer, BLC_BINARY,
+ bin_code, bin_len * 3 - 1, RTT_RAW_CODE);
+
+ free(bin_code);
+
+ /* Instruction proprement dite */
+
+ g_content_exporter_to_buffer(G_CONTENT_EXPORTER(line->instr), buffer, options);
+
+ /* Commentaire ? */
+
+ if (basic->comment != NULL)
+ {
+ g_content_exporter_insert_into_buffer(exporter, buffer, BLC_COMMENTS, "; ", 2, RTT_COMMENT);
+ g_content_exporter_insert_into_buffer(exporter, buffer, BLC_COMMENTS,
+ basic->comment, strlen(basic->comment), 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. *
@@ -282,7 +360,7 @@ static void g_code_line_add_to_gtk_buffer(GCodeLine *line, MainRendering renderi
else
snprintf(&bin_code[i * (2 + 1)], 3, "%02hhx", content[bin_offset + i]);
}
-
+
g_content_exporter_insert_with_gtk_tag(exporter, buffer, iter,
bin_code, bin_len * 3 - 1, RTT_RAW_CODE);