diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbufferline.c | 24 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 6 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 49 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 5 |
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); |