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);  | 
