summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-01-21 14:34:53 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-01-21 14:34:53 (GMT)
commit01f20dc6887fc1d45e026306a4364c9e7b256250 (patch)
tree8df6f067fa8f5bd9adf79bf845218f0b2e005257 /src/glibext
parentbd2e3f356103988001956db8588c501cd94e240f (diff)
Enabled the buffer scan again and updated its code.
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gcodebuffer.c188
-rw-r--r--src/glibext/gcodebuffer.h8
2 files changed, 97 insertions, 99 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 5644552..e00b127 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -53,8 +53,10 @@ typedef struct _GBufferScan
GCodeBuffer *buffer; /* Tampon à manipuler */
- vmpa_t start; /* Début du parcours ou 0 */
- vmpa_t end; /* Fin du parcours ou VMPA_MAX */
+ vmpa2t start; /* Début du parcours */
+ bool has_start; /* Validité des données #1 */
+ vmpa2t end; /* Fin du parcours */
+ bool has_end; /* Validité des données #2 */
char *message; /* Message de progression */
@@ -80,8 +82,14 @@ static void g_buffer_scan_class_init(GBufferScanClass *);
/* Initialise une tâche d'exportation différée. */
static void g_buffer_scan_init(GBufferScan *);
+/* Supprime toutes les références externes. */
+static void g_buffer_scan_dispose(GBufferScan *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_buffer_scan_finalize(GBufferScan *);
+
/* Crée une tâche d'exportation différée. */
-static GBufferScan *g_buffer_scan_new(GCodeBuffer *, vmpa_t, vmpa_t, const char *, process_line_fc, void *);
+static GBufferScan *g_buffer_scan_new(GCodeBuffer *, const vmpa2t *, const vmpa2t *, const char *, process_line_fc, void *);
/* Assure l'exportation en différé. */
static void g_buffer_scan_process(GBufferScan *, GtkExtStatusBar *);
@@ -244,8 +252,14 @@ G_DEFINE_TYPE(GBufferScan, g_buffer_scan, G_TYPE_DELAYED_WORK);
static void g_buffer_scan_class_init(GBufferScanClass *klass)
{
+ GObjectClass *object; /* Autre version de la classe */
GDelayedWorkClass *work; /* Version en classe parente */
+ object = G_OBJECT_CLASS(klass);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_buffer_scan_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_buffer_scan_finalize;
+
work = G_DELAYED_WORK_CLASS(klass);
work->run = (run_task_fc)g_buffer_scan_process;
@@ -255,7 +269,7 @@ static void g_buffer_scan_class_init(GBufferScanClass *klass)
/******************************************************************************
* *
-* Paramètres : disass = instance à initialiser. *
+* Paramètres : scan = instance à initialiser. *
* *
* Description : Initialise une tâche d'exportation différée. *
* *
@@ -265,7 +279,7 @@ static void g_buffer_scan_class_init(GBufferScanClass *klass)
* *
******************************************************************************/
-static void g_buffer_scan_init(GBufferScan *disass)
+static void g_buffer_scan_init(GBufferScan *scan)
{
}
@@ -273,9 +287,51 @@ static void g_buffer_scan_init(GBufferScan *disass)
/******************************************************************************
* *
+* Paramètres : scan = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_buffer_scan_dispose(GBufferScan *scan)
+{
+ g_object_unref(G_OBJECT(scan->buffer));
+
+ G_OBJECT_CLASS(g_buffer_scan_parent_class)->dispose(G_OBJECT(scan));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : scan = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_buffer_scan_finalize(GBufferScan *scan)
+{
+ free(scan->message);
+
+ G_OBJECT_CLASS(g_buffer_scan_parent_class)->finalize(G_OBJECT(scan));
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : buffer = tampon à manipuler. *
-* start = première adresse visée ou 0. *
-* end = dernière adresse visée ou VMPA_MAX. *
+* start = première adresse visée ou NULL. *
+* end = dernière adresse visée ou NULL. *
* message = message à afficher lors de la progression. *
* process = fonction assurant le traitement effectif. *
* data = données utilisateur à faire suivre. *
@@ -288,7 +344,7 @@ static void g_buffer_scan_init(GBufferScan *disass)
* *
******************************************************************************/
-static GBufferScan *g_buffer_scan_new(GCodeBuffer *buffer, vmpa_t start, vmpa_t end, const char *message, process_line_fc process, void *data)
+static GBufferScan *g_buffer_scan_new(GCodeBuffer *buffer, const vmpa2t *start, const vmpa2t *end, const char *message, process_line_fc process, void *data)
{
GBufferScan *result; /* Tâche à retourner */
@@ -297,8 +353,15 @@ static GBufferScan *g_buffer_scan_new(GCodeBuffer *buffer, vmpa_t start, vmpa_t
result->buffer = buffer;
g_object_ref(G_OBJECT(buffer));
- result->start = start;
- result->end = end;
+ result->has_start = (start != NULL);
+
+ if (result->has_start)
+ copy_vmpa(&result->start, start);
+
+ result->has_end = (end != NULL);
+
+ if (result->has_end)
+ copy_vmpa(&result->end, end);
result->message = strdup(message);
@@ -328,17 +391,24 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
size_t first; /* Première ligne visée */
size_t last; /* Dernière ligne visée + 1 */
GBufferLine **lines; /* Liste des lignes à traiter */
- bstatus_id_t id; /* Identifiant de statut */
+ //bstatus_id_t id; /* Identifiant de statut */
size_t i; /* Boucle de parcours */
/* TODO : lock scan->buffer->lines */
- first = g_code_buffer_get_index_from_address(scan->buffer, scan->start, true);
- last = g_code_buffer_get_index_from_address(scan->buffer, scan->end, false);
+ if (scan->has_start)
+ first = g_code_buffer_get_index_from_address(scan->buffer, &scan->start, true);
+ else
+ first = 0;
+
+ if (scan->has_end)
+ last = g_code_buffer_get_index_from_address(scan->buffer, &scan->end, false);
+ else
+ last = scan->buffer->used - 1;
lines = scan->buffer->lines;
- id = gtk_extended_status_bar_push(statusbar, scan->message, true);
+ //id = gtk_extended_status_bar_push(statusbar, scan->message, true);
if (scan->buffer->used > 0)
for (i = first; i <= last; i++)
@@ -346,17 +416,16 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
if (!scan->process(scan->buffer, lines[i], scan->user_data))
break;
+ /*
gtk_extended_status_bar_update_activity(statusbar, id,
(i - first) * 1.0 / (last - first));
+ */
}
/* TODO : unlock scan->buffer->lines */
- gtk_extended_status_bar_remove(statusbar, id);
-
- /* Avertit le commanditaire... */
- scan->process(scan->buffer, NULL, scan->user_data);
+ //gtk_extended_status_bar_remove(statusbar, id);
}
@@ -1100,15 +1169,18 @@ void g_code_buffer_dec_indentation(GCodeBuffer *buffer)
* *
******************************************************************************/
-void g_buffer_code_scan(GCodeBuffer *buffer, vmpa_t start, vmpa_t end, const char *message, process_line_fc process, void *data)
+GDelayedWork *g_buffer_code_scan(GCodeBuffer *buffer, const vmpa2t *start, const vmpa2t *end, const char *message, process_line_fc process, void *data)
{
- GBufferScan *scan; /* Procédure de parcours */
+ GBufferScan *result; /* Procédure à créer / renvoyer*/
GWorkQueue *queue; /* Gestionnaire de différés */
- scan = g_buffer_scan_new(buffer, start, end, message, process, data);
+ result = g_buffer_scan_new(buffer, start, end, message, process, data);
+ g_object_ref(G_OBJECT(result));
queue = get_work_queue();
- g_work_queue_schedule_work(queue, G_DELAYED_WORK(scan), DEFAULT_WORK_GROUP);
+ g_work_queue_schedule_work(queue, G_DELAYED_WORK(result), DEFAULT_WORK_GROUP);
+
+ return G_DELAYED_WORK(result);
}
@@ -2172,78 +2244,6 @@ 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. *
* addr = adresse où retrouver la ligne recherchée. *
* flags = propriétés à vérifier en tout ou partie. *
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 5cde79c..517cdce 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -28,6 +28,7 @@
#include <glib-object.h>
+#include "delayed.h"
#include "gbufferline.h"
@@ -84,8 +85,8 @@ void g_code_buffer_dec_indentation(GCodeBuffer *);
/* Traitement d'une ligne parcourue. */
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 *) __attribute__ ((deprecated));
+/* Lance un parcours des différentes lignes du tampon de code. */
+GDelayedWork *g_buffer_code_scan(GCodeBuffer *, const vmpa2t *, const vmpa2t *, const char *, process_line_fc, void *);
@@ -155,9 +156,6 @@ bool g_buffer_view_highlight_segments(GBufferView *, gint, gint, const bool *);
/* 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 *, const gint *);
-/* Exporte le contenu du tampon de code désassemblé. */
-void g_buffer_view_export(const GBufferView *, buffer_export_context *, BufferExportType, const bool *);
-
/* Retrouve une ligne au sein d'un tampon avec une adresse. */
GBufferLine *g_buffer_view_find_line_by_addr(const GBufferView *, const vmpa2t *, BufferLineFlags, size_t *);