diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gcodebuffer.c | 133 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 4 |
2 files changed, 120 insertions, 17 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index ac6e807..b504473 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -24,8 +24,8 @@ #include "gcodebuffer.h" -#include <limits.h> #include <malloc.h> +#include <stdlib.h> #include <string.h> @@ -143,8 +143,8 @@ struct _GBufferView GObject parent; /* A laisser en premier */ GCodeBuffer *buffer; /* Tampon de code visualisé */ - vmpa_t start; /* Première ligne intégrée */ - vmpa_t end; /* Dernière ligne intégrée */ + vmpa2t *start; /* Première ligne intégrée */ + vmpa2t *end; /* Dernière ligne intégrée */ size_t first_index; /* Indice de la première ligne */ gint line_height; /* Hauteur maximale des lignes */ @@ -512,7 +512,7 @@ static size_t _g_code_buffer_get_index_from_address_new(const GCodeBuffer *buffe * * * Description : Convertit une adresse en indice de ligne. * * * -* Retour : Indice de l'adresse trouvée, ou 0 en cas d'échec. * +* Retour : Indice de l'adresse trouvée, ou le nombre de lignes sinon. * * * * Remarques : - * * * @@ -521,6 +521,108 @@ static size_t _g_code_buffer_get_index_from_address_new(const GCodeBuffer *buffe static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, const vmpa2t *addr, bool first) { size_t result; /* Indice à retourner */ + GBufferLine **found; /* Renvoi vers une trouvaille */ + const mrange_t *range; /* Couverture d'une ligne */ + + /** + * Si aucune adresse (ie. aucune limite ?) n'est précisée, on se base sur + * la direction pour trouver le bon indice. + */ + + if (addr == NULL) + result = (first ? 0 : buffer->used - 1); + + /** + * Sinon on parcourt méthodiquement toutes les lignes ! + */ + + else + { + +#if 0 + int cmp_addr_and_line(const vmpa2t *addr, const GBufferLine **line) + { + int status; /* Bilan d'une comparaison */ + const mrange_t *lrange; /* Couverture d'une ligne */ + + lrange = g_buffer_line_get_range(*line); + + if (mrange_contains_addr(lrange, addr)) + status = 0; + + else + { + if (cmp_vmpa(addr, get_mrange_addr(lrange)) < 0) + status = -1; + else + status = 1; + } + + return status; + + } + + found = bsearch(addr, buffer->lines, buffer->used, sizeof(GBufferLine *), + (__compar_fn_t)cmp_addr_and_line); +#endif + + + + + found = NULL; + + + + for (result = 0; result < buffer->used; result++) + { + range = g_buffer_line_get_range(buffer->lines[result]); + + if (mrange_contains_addr(range, addr)) + { + found = &buffer->lines[result]; + break; + } + + } + + + if (found == NULL) + result = buffer->used; + + else + { + result = found - buffer->lines; + + //printf(" [index] [B] 0x%08x -> %zu\n", (unsigned int)addr->virtual, result); + + if (first) + for (; result > 0; result--) + { + range = g_buffer_line_get_range(buffer->lines[result - 1]); + if (!mrange_contains_addr(range, addr)) break; + } + + else + for (; (result + 1) < buffer->used; result++) + { + range = g_buffer_line_get_range(buffer->lines[result + 1]); + if (!mrange_contains_addr(range, addr)) break; + } + + //printf(" [A] 0x%08x -> %zu\n", (unsigned int)addr->virtual, result); + + } + + } + + return result; + + + + + +#if 0 + size_t result; /* Indice à retourner */ result = _g_code_buffer_get_index_from_address(buffer, addr, first); @@ -533,7 +635,7 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, const vm result = 0; return result; - +#endif } @@ -671,6 +773,7 @@ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vm if (index == buffer->used) result = NULL; + else { result = buffer->lines[index]; @@ -844,8 +947,8 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer) g_object_ref(G_OBJECT(buffer)); result->buffer = buffer; - result->start = 0; - result->end = VMPA_MAX; + result->start = NULL; + result->end = NULL; return result; @@ -866,10 +969,10 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer) * * ******************************************************************************/ -void g_buffer_view_restrict(GBufferView *view, vmpa_t start, vmpa_t end) +void g_buffer_view_restrict(GBufferView *view, const vmpa2t *start, const vmpa2t *end) { - view->start = start; - view->end = end; + view->start = dup_vmpa(start); + view->end = dup_vmpa(end); } @@ -888,10 +991,10 @@ void g_buffer_view_restrict(GBufferView *view, vmpa_t start, vmpa_t end) * * ******************************************************************************/ -void g_buffer_view_get_restrictions(GBufferView *view, vmpa_t *start, vmpa_t *end) +void g_buffer_view_get_restrictions(GBufferView *view, vmpa2t *start, vmpa2t *end) { - if (start != NULL) *start = view->start; - if (end != NULL) *end = view->end; + if (start != NULL) copy_vmpa(start, view->start); + if (end != NULL) copy_vmpa(end, view->end); } @@ -1081,7 +1184,7 @@ gint g_buffer_view_get_width(GBufferView *view, const bool *display) gint full_width; /* Calcul selon les fusions */ BufferLineColumn i; /* Boucle de parcours */ - if (!WIDTHS_CACHED(view)) + //if (!WIDTHS_CACHED(view)) g_buffer_view_compute_required_widths(view, display); result = view->left_text; @@ -1685,7 +1788,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y) first = g_code_buffer_get_index_from_address(view->buffer, view->start, true); last = g_code_buffer_get_index_from_address(view->buffer, view->end, false); - for (i = first; i < last; i++) + for (i = first; i <= last; i++) view->highlighted = g_buffer_line_highlight_all_same_segments(view->buffer->lines[i], view->highlighted, segment); diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index e607b9c..cb17821 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -111,10 +111,10 @@ GType g_buffer_view_get_type(void); GBufferView *g_buffer_view_new(GCodeBuffer *); /* Restreint le champ d'application de l'affichage. */ -void g_buffer_view_restrict(GBufferView *, vmpa_t, vmpa_t); +void g_buffer_view_restrict(GBufferView *, const vmpa2t *, const vmpa2t *); /* Indique le champ d'application de l'affichage. */ -void g_buffer_view_get_restrictions(GBufferView *, vmpa_t *, vmpa_t *); +void g_buffer_view_get_restrictions(GBufferView *, vmpa2t *, vmpa2t *); /* Fournit le tampon de code lié à un visualisateur donné. */ GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *); |