summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r--src/glibext/gcodebuffer.c175
1 files changed, 144 insertions, 31 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index aec3303..4ffc15a 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -121,6 +121,9 @@ static void g_code_buffer_class_init(GCodeBufferClass *);
static void g_code_buffer_init(GCodeBuffer *);
/* Convertit une adresse en indice de ligne. */
+static size_t _g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t);
+
+/* Convertit une adresse en indice de ligne. */
static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t);
@@ -292,15 +295,16 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
id = gtk_extended_status_bar_push(statusbar, scan->message, true);
- for (i = first; i <= last; i++)
- {
- if (!scan->process(scan->buffer, lines[i], scan->user_data))
- break;
+ if (scan->buffer->used > 0)
+ for (i = first; i <= last; i++)
+ {
+ 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));
+ gtk_extended_status_bar_update_activity(statusbar, id,
+ (i - first) * 1.0 / (last - first));
- }
+ }
/* TODO : unlock scan->buffer->lines */
@@ -380,6 +384,7 @@ GCodeBuffer *g_code_buffer_new(void)
}
+
/******************************************************************************
* *
* Paramètres : buffer = composant GTK à mettre à jour. *
@@ -393,17 +398,48 @@ GCodeBuffer *g_code_buffer_new(void)
* *
******************************************************************************/
-static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr)
+static size_t _g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr)
{
size_t result; /* Indice à retourner */
if (addr == VMPA_MAX)
return (buffer->used > 0 ? buffer->used - 1 : 0);
+ /* TODO : coder un parcours plus optimal ! */
+
for (result = 0; result < buffer->used; result++)
if (g_buffer_line_get_address(buffer->lines[result]) == addr)
break;
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : buffer = composant GTK à mettre à jour. *
+* addr = adresse où va se situer la ligne. *
+* *
+* Description : Convertit une adresse en indice de ligne. *
+* *
+* Retour : Indice de l'adresse trouvée, ou 0 en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr)
+{
+ size_t result; /* Indice à retourner */
+
+ result = _g_code_buffer_get_index_from_address(buffer, addr);
+
+ /**
+ * Par commodités, on évite certaines instructions en cas d'échec dans les
+ * fonctions d'appels : la condition des boucles utilisant l'indice retourné (0)
+ * fait son office directement !
+ */
if (result == buffer->used)
result = 0;
@@ -419,7 +455,7 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t a
* *
* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. *
* *
-* Retour : - *
+* Retour : Nouvelle ligne vierge à écrire. *
* *
* Remarques : - *
* *
@@ -451,6 +487,82 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, vmpa_t addr)
/******************************************************************************
* *
* Paramètres : buffer = composant GTK à mettre à jour. *
+* addr = adresse où va se situer la ligne. *
+* before = emplacement de l'insertion. *
+* *
+* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. *
+* *
+* Retour : Nouvelle ligne vierge à écrire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBufferLine *g_code_buffer_insert_at(GCodeBuffer *buffer, vmpa_t addr, bool before)
+{
+ GBufferLine *result; /* Instance à retourner */
+ size_t index; /* Indice de la ligne visée */
+
+ index = _g_code_buffer_get_index_from_address(buffer, addr);
+ if (index == buffer->used) return NULL;
+
+ if (buffer->used == buffer->count)
+ {
+ buffer->count += LINE_ALLOC_BULK;
+ buffer->lines = (GBufferLine **)realloc(buffer->lines,
+ buffer->count * sizeof(GBufferLine *));
+ }
+
+ if (before)
+ {
+ memmove(&buffer->lines[index + 1], &buffer->lines[index],
+ sizeof(GBufferLine *) * (buffer->used - index));
+
+ buffer->used++;
+
+ result = g_buffer_line_new(addr);
+ buffer->lines[index] = result;
+
+ }
+
+
+ else
+ /* FIXME */
+ ;
+
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : buffer = composant GTK à mettre à jour. *
+* line = point d'insertion. *
+* *
+* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. *
+* *
+* Retour : Nouvelle ligne vierge à écrire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line)
+{
+
+ /* FIXME */
+
+ return NULL;
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : buffer = composant GTK à mettre à jour. *
* addr = adresse où retrouver la ligne recherchée. *
* *
* Description : Retrouve une ligne au sein d'un tampon avec une adresse. *
@@ -464,15 +576,14 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, vmpa_t addr)
GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, vmpa_t addr)
{
GBufferLine *result; /* Instance à retourner */
- size_t i; /* Boucle de parcours */
+ size_t index; /* Indice de la ligne visée */
- result = NULL;
+ index = _g_code_buffer_get_index_from_address(buffer, addr);
- /* TODO : coder un parcours plus optimal ! */
-
- for (i = 0; i < buffer->used && result == NULL; i++)
- if (g_buffer_line_get_address(buffer->lines[i]) == addr)
- result = buffer->lines[i];
+ if (index == buffer->used)
+ result = NULL;
+ else
+ result = buffer->lines[index];
return result;
@@ -749,12 +860,13 @@ static void g_buffer_view_compute_required_widths(GBufferView *view)
view->left_margin = 2 * view->line_height;
view->left_text = 2.5 * view->line_height;
- for (i = first; i <= last; i++)
- for (j = 0; j < BLC_COUNT; j++)
- {
- width = g_buffer_line_get_width(lines[i], j);
- view->max_widths[j] = MAX(view->max_widths[j], width);
- }
+ if (view->buffer->used > 0)
+ for (i = first; i <= last; i++)
+ for (j = 0; j < BLC_COUNT; j++)
+ {
+ width = g_buffer_line_get_width(lines[i], j);
+ view->max_widths[j] = MAX(view->max_widths[j], width);
+ }
}
@@ -1086,19 +1198,20 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, vmpa_t addr, gint
first = g_code_buffer_get_index_from_address(view->buffer, view->start);
last = g_code_buffer_get_index_from_address(view->buffer, view->end);
- for (i = first; i <= last; i++)
- {
- current = g_buffer_line_get_address(view->buffer->lines[i]);
+ if (view->buffer->used > 0)
+ for (i = first; i <= last; i++)
+ {
+ current = g_buffer_line_get_address(view->buffer->lines[i]);
- if (current == addr)
- break;
+ if (current == addr)
+ break;
- if (current > addr)
- return false;
+ if (current > addr)
+ return false;
- *y += lheight;
+ *y += lheight;
- }
+ }
return (current == addr);