summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-09-17 21:36:49 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-09-17 21:36:49 (GMT)
commit65768127dea4c2760fe07cf843da7b4ad9e67da5 (patch)
treed0023eb7f378a4118fd074f3f61d5eae02e0882b /src/glibext
parentaf083f8bd6da340214ae392451dde5782fb79039 (diff)
Introduced memory ranges.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@406 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbufferline.c24
-rw-r--r--src/glibext/gbufferline.h6
-rw-r--r--src/glibext/gcodebuffer.c49
-rw-r--r--src/glibext/gcodebuffer.h5
4 files changed, 45 insertions, 39 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index ac6dc23..758dff7 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -80,7 +80,7 @@ struct _GBufferLine
{
GObject parent; /* A laisser en premier */
- const vmpa2t *addr; /* Emplacement geographique */
+ mrange_t range; /* Couverture geographique */
BufferLineColumn main_column; /* Colonne principale */
buffer_line_column columns[BLC_COUNT]; /* Répartition du texte */
@@ -354,8 +354,8 @@ static void g_buffer_line_init(GBufferLine *line)
/******************************************************************************
* *
-* Paramètres : addr = emplacement où va se situer la ligne. *
-* main = colonne à référencer comme étant la principale. *
+* Paramètres : range = emplacement où va se situer la ligne. *
+* main = colonne à référencer comme étant la principale. *
* *
* Description : Crée une nouvelle représentation de fragments de texte. *
* *
@@ -365,13 +365,13 @@ static void g_buffer_line_init(GBufferLine *line)
* *
******************************************************************************/
-GBufferLine *g_buffer_line_new(const vmpa2t *addr, BufferLineColumn main)
+GBufferLine *g_buffer_line_new(const mrange_t *range, BufferLineColumn main)
{
GBufferLine *result; /* Composant à retourner */
result = g_object_new(G_TYPE_BUFFER_LINE, NULL);
- result->addr = addr;
+ copy_mrange(&result->range, range);
result->main_column = main;
return result;
@@ -383,17 +383,17 @@ GBufferLine *g_buffer_line_new(const vmpa2t *addr, BufferLineColumn main)
* *
* Paramètres : line = ligne à venir consulter. *
* *
-* Description : Indique l'adresse à laquelle se situe la ligne. *
+* Description : Indique la zone mémoire où se situe la ligne. *
* *
-* Retour : Adresse mémoire ou physique. *
+* Retour : Emplacement mémoire virtuel ou physique. *
* *
* Remarques : - *
* *
******************************************************************************/
-const vmpa2t *g_buffer_line_get_address(const GBufferLine *line)
+const mrange_t *g_buffer_line_get_range(const GBufferLine *line)
{
- return line->addr;
+ return &line->range;
}
@@ -433,10 +433,10 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor
/* Adresse physique puis virtuelle */
- vmpa2_phys_to_string(line->addr, psize, address, &len);
+ mrange_phys_to_string(&line->range, psize, true, address, &len);
g_buffer_line_insert_text(line, BLC_PHYSICAL, address, len, RTT_RAW);
- vmpa2_virt_to_string(line->addr, vsize, address, &len);
+ mrange_virt_to_string(&line->range, vsize, true, address, &len);
g_buffer_line_insert_text(line, BLC_VIRTUAL, address, len, RTT_RAW);
/* Détermination du réceptacle */
@@ -450,7 +450,7 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor
/* Code brut */
- start = get_phy_addr(line->addr);
+ start = get_phy_addr(get_mrange_addr(&line->range));
end = start + length;
for (i = start, iter = bin_code; i < end; i++, iter += ret)
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 4ca07ca..b96f7a6 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -83,10 +83,10 @@ typedef enum _BufferLineColumn
GType g_buffer_line_get_type(void);
/* Crée une nouvelle représentation de fragments de texte. */
-GBufferLine *g_buffer_line_new(const vmpa2t *, BufferLineColumn);
+GBufferLine *g_buffer_line_new(const mrange_t *, BufferLineColumn);
-/* Indique l'adresse à laquelle se situe la ligne. */
-const vmpa2t *g_buffer_line_get_address(const GBufferLine *);
+/* Indique la zone mémoire où se situe la ligne. */
+const mrange_t *g_buffer_line_get_range(const GBufferLine *);
/* Construit le tronc commun d'une ligne d'instruction. */
void g_buffer_line_fill_for_instr(GBufferLine *, MemoryDataSize, MemoryDataSize, const bin_t *, off_t, bool);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 6a21222..0ac3bb3 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -416,6 +416,11 @@ static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, v
/* TODO : coder un parcours plus optimal ! */
+ 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;
@@ -425,6 +430,8 @@ static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, v
if (g_buffer_line_get_address(buffer->lines[result + 1]) != addr)
break;
+#endif
+
return result;
}
@@ -466,7 +473,7 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t a
/******************************************************************************
* *
* Paramètres : buffer = composant GTK à mettre à jour. *
-* addr = emplacement où va se situer la ligne. *
+* range = emplacement où va se situer la ligne. *
* *
* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. *
* *
@@ -476,7 +483,7 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t a
* *
******************************************************************************/
-GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, const vmpa2t *addr)
+GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, const mrange_t *range)
{
GBufferLine *result; /* Instance à retourner */
size_t i; /* Boucle de parcours */
@@ -488,7 +495,7 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, const vmpa2t *ad
buffer->count * sizeof(GBufferLine *));
}
- result = g_buffer_line_new(addr, buffer->main_column);
+ result = g_buffer_line_new(range, buffer->main_column);
buffer->lines[buffer->used++] = result;
for (i = 0; i < buffer->indent; i++)
@@ -1111,7 +1118,7 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line,
caret->width = 2;
caret->height = view->line_height;
- return g_buffer_line_get_address(line);
+ return NULL;///g_buffer_line_get_address(line);
}
@@ -1303,17 +1310,6 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
line = g_buffer_view_find_line_at(view, y, NULL);
if (line == NULL) return;
-
- do
- {
- vmpa_t addr;
- addr = g_buffer_line_get_address(line);
-
- printf(" ... x2 clic at 0x%08lx\n", addr);
-
- }
- while (0);
-
x -= view->left_text;
if (x < 0) return;
@@ -1463,8 +1459,7 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr
size_t first; /* Première ligne intégrée */
size_t last; /* Dernière ligne intégrée */
size_t i; /* Boucle de parcours */
- const vmpa2t *current; /* Adresse parcourue */
- int ret; /* Bilan d'une comparaison */
+ const mrange_t *range; /* Emplacement parcouru */
result = false;
@@ -1479,11 +1474,21 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr
if (view->buffer->used > 0)
for (i = first; i <= last; i++)
{
- current = g_buffer_line_get_address(view->buffer->lines[i]);
- ret = cmp_vmpa(current, addr);
-
- result = (ret == 0);
- if (ret >= 0) break;
+ /**
+ * Si l'adresse recherchée est plus petite que l'adresse de départ,
+ * on va effectuer un parcours complet pour rien.
+ *
+ * On considère cependant que le seul cas où celà peut arriver
+ * est lorsque que des découpages en blocs sont impliqués.
+ *
+ * Les découpages conduisent alors à la formation de petites zones,
+ * rapides à parcourir.
+ */
+
+ range = g_buffer_line_get_range(view->buffer->lines[i]);
+
+ result = mrange_contains_addr(range, addr);
+ if (result) break;
*y += lheight;
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 5be0084..472d403 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -57,10 +57,11 @@ GType g_code_buffer_get_type(void);
GCodeBuffer *g_code_buffer_new(BufferLineColumn);
/* FIXME */
-#define g_code_buffer_append_new_line_fixme(b) g_code_buffer_append_new_line(b, make_vmpa(VMPA_NO_PHYSICAL, VMPA_NO_VIRTUAL))
+#define g_code_buffer_append_new_line_fixme(b) \
+ g_code_buffer_append_new_line(b, (mrange_t []){ { 0, 0 }, 0 })
/* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */
-GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *, const vmpa2t *);
+GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *, const mrange_t *);
/* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */
GBufferLine *g_code_buffer_insert_at(GCodeBuffer *, vmpa_t, bool);