diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-04-11 16:39:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-04-11 16:39:38 (GMT) |
commit | 30258fa96ad48eed68924f259ec5464fc4fd8094 (patch) | |
tree | 6187f2ddbee31de8bcd1b4b6e930a38f858f922c /src/analysis | |
parent | 929150f18d23d82e8390bd98e31b1edb34bc09f1 (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.h | 10 | ||||
-rw-r--r-- | src/analysis/exporter.c | 92 | ||||
-rw-r--r-- | src/analysis/exporter.h | 8 | ||||
-rw-r--r-- | src/analysis/line_code.c | 84 |
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); |