summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-01-15 14:57:19 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-01-15 14:57:19 (GMT)
commite28ba4839188307f94293af4e29ed6e774c0a499 (patch)
tree2b3ce4dd609f5fe03fcfc3641c9723b39205079b /src/glibext
parent0a028b306093746324eabdb94881083f9b7e61c1 (diff)
Exported disassembled content in plain text or HTML format properly.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@455 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbufferline.c136
-rw-r--r--src/glibext/gbufferline.h2
-rw-r--r--src/glibext/gbuffersegment.c130
-rw-r--r--src/glibext/gbuffersegment.h51
-rw-r--r--src/glibext/gcodebuffer.c72
-rw-r--r--src/glibext/gcodebuffer.h5
6 files changed, 364 insertions, 32 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 6b5ab18..54f5fb6 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -51,7 +51,6 @@ typedef struct _buffer_line_column
} buffer_line_column;
-
/* Réinitialise une colonne de ligne. */
static void reset_column(buffer_line_column *);
@@ -71,11 +70,14 @@ static GBufferSegment *get_segment_at(const buffer_line_column *, gint *, GdkScr
static GBufferSegment *find_near_segment(const buffer_line_column *, GBufferSegment *, GdkScrollDirection, bool *);
/* Met en surbrillance des segments similaires. */
-GSList *highlight_all_same_segments(const buffer_line_column *, GSList *, const GBufferSegment *);
+static GSList *highlight_all_same_segments(const buffer_line_column *, GSList *, const GBufferSegment *);
/* Imprime le contenu d'une colonne de ligne de texte. */
static void draw_segments_of_column(buffer_line_column *, cairo_t *, gint, gint);
+/* Exporte la ligne de texte représentée. */
+static void export_segments_of_column(buffer_line_column *, buffer_export_context *, BufferExportType, int);
+
/* ---------------------------- GESTION DE LINE COMPLETE ---------------------------- */
@@ -313,7 +315,7 @@ static GBufferSegment *find_near_segment(const buffer_line_column *column, GBuff
* *
******************************************************************************/
-GSList *highlight_all_same_segments(const buffer_line_column *column, GSList *list, const GBufferSegment *ref)
+static GSList *highlight_all_same_segments(const buffer_line_column *column, GSList *list, const GBufferSegment *ref)
{
size_t i; /* Boucle de parcours */
@@ -347,8 +349,8 @@ GSList *highlight_all_same_segments(const buffer_line_column *column, GSList *li
static void draw_segments_of_column(buffer_line_column *column, cairo_t *cairo, gint x_init, gint y)
{
- gint x;
- size_t i;
+ gint x; /* Abscisse d'impression */
+ size_t i; /* Boucle de parcours */
x = x_init;
@@ -358,6 +360,59 @@ static void draw_segments_of_column(buffer_line_column *column, cairo_t *cairo,
}
+/******************************************************************************
+* *
+* Paramètres : column = colonne de ligne de texte à manipuler. *
+* ctx = éléments à disposition pour l'exportation. *
+* type = type d'exportation attendue. *
+* span = fusion de colonnes au sein des cellules ? *
+* *
+* Description : Exporte la ligne de texte représentée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void export_segments_of_column(buffer_line_column *column, buffer_export_context *ctx, BufferExportType type, int span)
+{
+ size_t i; /* Boucle de parcours */
+
+ switch (type)
+ {
+ case BET_HTML:
+ switch (span)
+ {
+ case 0:
+ break;
+ case 1:
+ dprintf(ctx->fd, "\t\t<TD>");
+ break;
+ default:
+ if (span > 0) dprintf(ctx->fd, "\t\t<TD colspan=\"%d\">", span);
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ for (i = 0; i < column->count; i++)
+ g_buffer_segment_export(column->segments[i], ctx, type);
+
+ switch (type)
+ {
+ case BET_HTML:
+ if (span < 0 || span == 1) dprintf(ctx->fd, "</TD>\n");
+ break;
+ default:
+ break;
+ }
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* GESTION DE LINE COMPLETE */
@@ -1117,16 +1172,12 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
}
-
/******************************************************************************
* *
* Paramètres : line = ligne de texte à manipuler. *
-* fd = flux ouvert en écriture. *
+* ctx = éléments à disposition pour l'exportation. *
* type = type d'exportation attendue. *
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
-* content = indique si le gros du contenu doit être affiché. *
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Exporte la ligne de texte représentée. *
* *
@@ -1136,19 +1187,70 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
* *
******************************************************************************/
-void g_buffer_line_export(GBufferLine *line, int fd, BufferExportType type, bool phys, bool virt, bool code, bool content)
+void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferExportType type, const bool *display)
{
BufferLineColumn i; /* Boucle de parcours */
+ int col_span; /* Fusion de colonnes ? */
+
+ switch (type)
+ {
+ case BET_HTML:
+ dprintf(ctx->fd, "\t<TR>\n");
+ break;
+ default:
+ break;
+ }
for (i = 0; i < BLC_COUNT; i++)
{
- if (i == BLC_PHYSICAL && !phys) continue;
- if (i == BLC_VIRTUAL && !virt) continue;
- if (i == BLC_BINARY && !code) continue;
- if (!(i == BLC_PHYSICAL || i == BLC_VIRTUAL || i == BLC_BINARY) && !content) continue;
+ if (i < BLC_DISPLAY && !display[i]) continue;
+
+ switch (type)
+ {
+ case BET_TEXT:
+ if (i > 0) dprintf(ctx->fd, ctx->sep);
+ break;
+ default:
+ break;
+ }
+
+ /**
+ * Pour la signification des différentes valeurs assignées,
+ * se référer au code de export_segments_of_column().
+ *
+ * En gros :
+ * - 1 = rien de spécial.
+ * - >1 = il s'agit de la première cellule fusionnée de la ligne.
+ * - 0 = fusion déjà faite, on ne peut que rajouter du contenu dedans.
+ * - <1 = il s'agit de la dernière cellule fusionnée de la ligne.
+ *
+ * On considère qu'une fusion ne peut pas se réaliser sur la dernière
+ * cellule uniquement (ce qui a du sens : c'est inutile).
+ */
- dprintf(fd, "TODO\n");
+ if (i < line->merge_start)
+ col_span = 1;
+ else if (i == line->merge_start)
+ col_span = BLC_COUNT - i;
+
+ else
+ col_span = ((i + 1) == BLC_COUNT ? -1 : 0);
+
+ export_segments_of_column(&line->columns[i], ctx, type, col_span);
+
+ }
+
+ switch (type)
+ {
+ case BET_TEXT:
+ dprintf(ctx->fd, "\n");
+ break;
+ case BET_HTML:
+ dprintf(ctx->fd, "</TR>\n");
+ break;
+ default:
+ break;
}
}
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index f6ee171..9b35f0b 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -130,7 +130,7 @@ void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn);
void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, const bool *);
/* Exporte la ligne de texte représentée. */
-void g_buffer_line_export(GBufferLine *, int, BufferExportType, bool, bool, bool, bool);
+void g_buffer_line_export(GBufferLine *, buffer_export_context *, BufferExportType, const bool *);
diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c
index 3d9e5a9..1ebb543 100644
--- a/src/glibext/gbuffersegment.c
+++ b/src/glibext/gbuffersegment.c
@@ -200,7 +200,7 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class)
void define_rendering_pattern(GtkStyleContext *ctx, const char *name, rendering_pattern_t *pattern)
{
- GdkRGBA *tmp_color;
+ GdkRGBA *tmp_color; /* Description d'une couleur */
PangoFontDescription *font_desc; /* Description d'une police */
gtk_style_context_save(ctx);
@@ -219,10 +219,10 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class)
case PANGO_STYLE_NORMAL:
pattern->slant = CAIRO_FONT_SLANT_NORMAL;
break;
- case PANGO_STYLE_OBLIQUE:
+ case PANGO_STYLE_ITALIC:
pattern->slant = CAIRO_FONT_SLANT_ITALIC;
break;
- case PANGO_STYLE_ITALIC:
+ case PANGO_STYLE_OBLIQUE:
pattern->slant = CAIRO_FONT_SLANT_OBLIQUE;
break;
}
@@ -303,7 +303,7 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si
result = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL);
- result->text = strdup(text);
+ result->text = strndup(text, length);
result->hash = fnv_64a_hash(text);
class = G_BUFFER_SEGMENT_GET_CLASS(result);
@@ -640,3 +640,125 @@ void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gin
*x += segment->x_advance;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = éléments à disposition pour l'exportation. *
+* type = type d'exportation attendue. *
+* *
+* Description : Exporte tous les styles utilisés par des segments. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_segment_export_style(buffer_export_context *ctx, BufferExportType type)
+{
+ GBufferSegment *dummy; /* Segment servant de sujet */
+ GBufferSegmentClass *class; /* Classe des segments */
+ size_t i; /* Boucle de parcours */
+ const rendering_pattern_t *pattern; /* Modèle à transcrire */
+
+ dummy = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL);
+ class = G_BUFFER_SEGMENT_GET_CLASS(dummy);
+
+ for (i = 0; i < RTT_COUNT; i++)
+ {
+ pattern = &class->patterns[i];
+
+ switch (type)
+ {
+ case BET_HTML:
+
+ dprintf(ctx->fd, ".%s {\n", _segment_names[i]);
+
+ if (pattern->foreground.has_color)
+ dprintf(ctx->fd, "\tcolor: #%02hhx%02hhx%02hhx;\n",
+ (unsigned char)(pattern->foreground.color.red * 255),
+ (unsigned char)(pattern->foreground.color.green * 255),
+ (unsigned char)(pattern->foreground.color.blue * 255));
+
+ switch (pattern->slant)
+ {
+ case CAIRO_FONT_SLANT_ITALIC:
+ dprintf(ctx->fd, "\tfont-style: italic;\n");
+ break;
+ case CAIRO_FONT_SLANT_OBLIQUE:
+ dprintf(ctx->fd, "\tfont-style: oblique;\n");
+ break;
+ default:
+ dprintf(ctx->fd, "\tfont-style: normal;\n");
+ break;
+ }
+
+ switch (pattern->weight)
+ {
+ case CAIRO_FONT_WEIGHT_BOLD:
+ dprintf(ctx->fd, "\tfont-weight: bold;\n");
+ break;
+ default:
+ dprintf(ctx->fd, "\tfont-weight: normal;\n");
+ break;
+ }
+
+ dprintf(ctx->fd, "}\n");
+
+ break;
+
+ default:
+ break;
+
+ }
+
+ }
+
+ g_object_unref(G_OBJECT(dummy));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : segment = fragment de texte à manipuler. *
+* ctx = éléments à disposition pour l'exportation. *
+* type = type d'exportation attendue. *
+* *
+* Description : Exporte le fragment de texte représenté. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_segment_export(const GBufferSegment *segment, buffer_export_context *ctx, BufferExportType type)
+{
+ GBufferSegmentClass *class; /* Classe des segments */
+ size_t index; /* Indice du modèle de rendu */
+
+ switch (type)
+ {
+ case BET_HTML:
+ class = G_BUFFER_SEGMENT_GET_CLASS(segment);
+ index = (segment->pattern - class->patterns);
+ dprintf(ctx->fd, "<SPAN class=\"%s\">", _segment_names[index]);
+ break;
+ default:
+ break;
+ }
+
+ dprintf(ctx->fd, "%s", segment->text);
+
+ switch (type)
+ {
+ case BET_HTML:
+ dprintf(ctx->fd, "</SPAN>");
+ break;
+ default:
+ break;
+ }
+
+}
diff --git a/src/glibext/gbuffersegment.h b/src/glibext/gbuffersegment.h
index f5cd4b2..10ae374 100644
--- a/src/glibext/gbuffersegment.h
+++ b/src/glibext/gbuffersegment.h
@@ -91,15 +91,6 @@ typedef enum _SegRenderingStyle
} SegRenderingStyle;
-/* Types d'exportation */
-typedef enum _BufferExportType
-{
- BET_TEXT,
-
- BET_COUNT
-
-} BufferExportType;
-
/* Fragment de caractères aux propriétés communes (instance) */
typedef struct _GBufferSegment GBufferSegment;
@@ -136,6 +127,48 @@ void g_buffer_segment_set_style(GBufferSegment *, SegRenderingStyle);
/* Imprime le fragment de texte représenté. */
void g_buffer_segment_draw(GBufferSegment *, cairo_t *, gint *, gint);
+/* Types d'exportation */
+typedef enum _BufferExportType
+{
+ BET_TEXT, /* Exportation en texte brut */
+ BET_HTML, /* Exportation en HTML */
+
+ BET_COUNT
+
+} BufferExportType;
+
+/* Elements sur lesquels une exportation peut s'appuyer */
+typedef struct _buffer_export_context
+{
+ union
+ {
+ int fd; /* Flux ouvert en écriture */
+
+ };
+
+ union
+ {
+ /* BET_TEXT */
+ const char *sep; /* Séparation entre colonnes */
+
+ /* BET_HTML */
+ struct
+ {
+ const char *font_name; /* Police d'impression */
+ const char *bg_color; /* Fond du tableau HTML */
+
+ };
+
+ };
+
+} buffer_export_context;
+
+/* Exporte tous les styles utilisés par des segments. */
+void g_buffer_segment_export_style(buffer_export_context *, BufferExportType);
+
+/* Exporte le fragment de texte représenté. */
+void g_buffer_segment_export(const GBufferSegment *, buffer_export_context *, BufferExportType);
+
#endif /* _GLIBEXT_GBUFFERSEGMENT_H */
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index eab418e..d13c9d6 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -1572,6 +1572,78 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint
/******************************************************************************
* *
+* Paramètres : view = visualisation à représenter. *
+* ctx = éléments à disposition pour l'exportation. *
+* type = type d'exportation attendue. *
+* display = règles d'affichage des colonnes modulables. *
+* *
+* Description : Exporte le contenu du tampon de code désassemblé. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_view_export(const GBufferView *view, buffer_export_context *ctx, BufferExportType type, const bool *display)
+{
+ size_t start; /* Première ligne visée */
+ size_t end; /* Dernière ligne avant limite */
+ GBufferLine **lines; /* Liste des lignes à traiter */
+ size_t i; /* Boucle de parcours */
+
+ start = g_code_buffer_get_index_from_address(view->buffer, view->start, true);
+ end = g_code_buffer_get_index_from_address(view->buffer, view->end, false);
+
+ lines = view->buffer->lines;
+
+ switch (type)
+ {
+ case BET_HTML:
+ dprintf(ctx->fd, "<HTML>\n");
+ dprintf(ctx->fd, "<HEAD>\n");
+ dprintf(ctx->fd, "\t<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n");
+ dprintf(ctx->fd, "</HEAD>\n");
+ dprintf(ctx->fd, "<BODY>\n");
+ dprintf(ctx->fd, "<STYLE type=\"text/css\">\n");
+ dprintf(ctx->fd, "TABLE {\n");
+ dprintf(ctx->fd, "\tbackground-color: %s;\n", ctx->bg_color);
+ dprintf(ctx->fd, "\tborder: 0px;\n");
+ dprintf(ctx->fd, "\tfont-family: %s;\n", ctx->font_name);
+ dprintf(ctx->fd, "}\n");
+ dprintf(ctx->fd, "TD {\n");
+ dprintf(ctx->fd, "\tborder: 0px;\n");
+ dprintf(ctx->fd, "\tpadding-left: 8px;\n");
+ dprintf(ctx->fd, "\tpadding-right: 8px;\n");
+ dprintf(ctx->fd, "}\n");
+ g_buffer_segment_export_style(ctx, type);
+ dprintf(ctx->fd, "</STYLE>\n");
+ dprintf(ctx->fd, "<TABLE>\n");
+ break;
+ default:
+ break;
+ }
+
+ if (view->buffer->used > 0)
+ for (i = start; i <= end; i++)
+ g_buffer_line_export(lines[i], ctx, type, display);
+
+ switch (type)
+ {
+ case BET_HTML:
+ dprintf(ctx->fd, "</TABLE>\n");
+ dprintf(ctx->fd, "</BODY>\n");
+ dprintf(ctx->fd, "</HTML>\n");
+ break;
+ default:
+ break;
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = visualisation à consulter. *
* y = ordonnée comprise dans la ligne recherchée. *
* idx = indice de la ligne trouvée ou NULL. [OUT] *
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index ece7c59..62b725c 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -82,7 +82,7 @@ void g_code_buffer_dec_indentation(GCodeBuffer *);
typedef bool (* process_line_fc) (GCodeBuffer *, GBufferLine *, void *);
/* Exporte dans un fichier le tampon de code désassemblé. */
-void g_buffer_code_scan(GCodeBuffer *, vmpa_t, vmpa_t, const char *, process_line_fc, void *);
+void g_buffer_code_scan(GCodeBuffer *, vmpa_t, vmpa_t, const char *, process_line_fc, void *) __attribute__ ((deprecated));
@@ -143,6 +143,9 @@ void g_buffer_view_highlight_segments(GBufferView *, gint, gint);
/* Imprime la visualisation du tampon de code désassemblé. */
void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, const bool *);
+/* Exporte le contenu du tampon de code désassemblé. */
+void g_buffer_view_export(const GBufferView *, buffer_export_context *, BufferExportType, const bool *);
+
/* Fournit la ligne présente à une ordonnée donnée. */
GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *);