summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-02-22 11:35:09 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-02-22 11:35:09 (GMT)
commitb639c1f4abca32152bf88f8fd47a9cd114da701b (patch)
tree3c10f78c94e2747f4c22d692d276ae24c1f6a44d /src/glibext/gcodebuffer.c
parentd450f573d94f795d83d09526546d63c81fde2e1d (diff)
Created a dialog box to select an entry point to display.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@476 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r--src/glibext/gcodebuffer.c90
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)