diff options
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 90 |
1 files changed, 84 insertions, 6 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index d13c9d6..afad0f4 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -127,6 +127,9 @@ static void g_code_buffer_init(GCodeBuffer *); static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *, const vmpa2t *, bool); /* Convertit une adresse en indice de ligne. */ +static size_t _g_code_buffer_get_index_from_address_new(const GCodeBuffer *, const vmpa2t *, bool); + +/* Convertit une adresse en indice de ligne. */ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, const vmpa2t *, bool); @@ -419,6 +422,66 @@ static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, c return (first ? 0 : buffer->used - 1); +#if 0 + + for (result = 0; result < buffer->used; result++) + if (g_buffer_line_get_address(buffer->lines[result]) == addr) + break; + + if (!first) + for (; result < (buffer->used - 1); result++) + if (g_buffer_line_get_address(buffer->lines[result + 1]) != addr) + break; + +#endif + + return result; + +} + +/****************************************************************************** +* * +* Paramètres : buffer = composant GTK à mettre à jour. * +* addr = adresse où va se situer la ligne. * +* first = indique si on l'arrête à la première ou la dernière.* +* * +* 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_new(const GCodeBuffer *buffer, const vmpa2t *addr, bool first) +{ + size_t result; /* Indice à retourner */ + const mrange_t *range; /* Couverture d'une ligne */ + + + for (result = 0; result < buffer->used; result++) + { + range = g_buffer_line_get_range(buffer->lines[result]); + + if (mrange_contains_addr(range, addr)) + { + printf(":: STOP :: %x + %u // %x\n", + range->addr.virtual, range->length, addr->virtual); + break; + } + + } + +#if 0 + + size_t result; /* Indice à retourner */ + + if (addr == VMPA_MAX) + return (buffer->used > 0 ? buffer->used - 1 : 0); + + /* TODO : coder un parcours plus optimal ! */ + + return (first ? 0 : buffer->used - 1); #if 0 @@ -433,6 +496,8 @@ static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, c #endif +#endif + return result; } @@ -596,18 +661,31 @@ GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line) * * ******************************************************************************/ -GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, vmpa_t addr) +GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vmpa2t *addr) { GBufferLine *result; /* Instance à retourner */ size_t index; /* Indice de la ligne visée */ - index = _g_code_buffer_get_index_from_address(buffer, addr, true); + index = _g_code_buffer_get_index_from_address_new(buffer, addr, true); if (index == buffer->used) result = NULL; else + { result = buffer->lines[index]; + while ((g_buffer_line_get_flags(result) & BLF_HAS_CODE) == 0) + { + if ((index + 1) == buffer->used) break; + + result = buffer->lines[++index]; + + } + + g_object_ref(G_OBJECT(result)); + + } + return result; } @@ -1109,7 +1187,7 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, x - tmp_x, tmp_x, g_buffer_segment_get_caret_position(segment, tmp_x), g_buffer_segment_get_width(segment)); - printf(" '%s'\n", g_buffer_segment_get_text(segment)); + printf(" '%s'\n", g_buffer_segment_get_text(segment, false)); caret->x = (x - tmp_x) + g_buffer_segment_get_caret_position(segment, tmp_x); @@ -1167,7 +1245,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line if (segment == NULL) return false; - printf(" ====== FIRST SEG :: %p ('%s')\n", segment, g_buffer_segment_get_text(segment)); + printf(" ====== FIRST SEG :: %p ('%s')\n", segment, g_buffer_segment_get_text(segment, false)); @@ -1190,7 +1268,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line segment = g_buffer_line_find_near_segment(line, segment, view->max_widths, display, dir, &offset); - printf(" ====== NEAR SEG :: %p ('%s')\n", segment, segment ? g_buffer_segment_get_text(segment) : NULL); + printf(" ====== NEAR SEG :: %p ('%s')\n", segment, segment ? g_buffer_segment_get_text(segment, false) : NULL); if (segment != NULL) { @@ -1484,7 +1562,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y) if (segment == NULL) return; - printf("text :: '%s'\n", g_buffer_segment_get_text(segment)); + printf("text :: '%s'\n", g_buffer_segment_get_text(segment, false)); if (view->highlighted != NULL) |