diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/operands/immediate.c | 5 | ||||
| -rw-r--r-- | src/arch/operands/target.c | 13 | ||||
| -rw-r--r-- | src/glibext/bufferline.c | 51 | ||||
| -rw-r--r-- | src/glibext/bufferline.h | 12 | ||||
| -rw-r--r-- | src/glibext/gdisplayoptions.c | 34 | ||||
| -rw-r--r-- | src/glibext/gdisplayoptions.h | 5 | ||||
| -rw-r--r-- | src/gui/dialogs/export_disass.c | 37 | 
7 files changed, 91 insertions, 66 deletions
| diff --git a/src/arch/operands/immediate.c b/src/arch/operands/immediate.c index 769826b..746bcae 100644 --- a/src/arch/operands/immediate.c +++ b/src/arch/operands/immediate.c @@ -45,6 +45,7 @@  #include "../../core/logs.h"  #include "../../format/format.h"  #include "../../glibext/objhole.h" +#include "../../gtkext/gtkblockdisplay.h" @@ -1351,7 +1352,7 @@ static void g_imm_operand_print(const GImmOperand *operand, GBufferLine *line)      len = g_imm_operand_to_string(operand, value); -    g_buffer_line_append_text(line, BLC_MAIN, value, len, RTT_IMMEDIATE, G_OBJECT(operand)); +    g_buffer_line_append_text(line, DLC_ASSEMBLY, value, len, RTT_IMMEDIATE, G_OBJECT(operand));  } @@ -1940,7 +1941,7 @@ static void g_known_imm_operand_print(const GKnownImmOperand *operand, GBufferLi      len = strlen(operand->alt_text); -    g_buffer_line_append_text(line, BLC_MAIN, operand->alt_text, len, RTT_IMMEDIATE, G_OBJECT(operand)); +    g_buffer_line_append_text(line, DLC_ASSEMBLY, operand->alt_text, len, RTT_IMMEDIATE, G_OBJECT(operand));  } diff --git a/src/arch/operands/target.c b/src/arch/operands/target.c index d921200..9b93548 100644 --- a/src/arch/operands/target.c +++ b/src/arch/operands/target.c @@ -40,6 +40,7 @@  #include "../../format/format.h"  #include "../../format/strsym.h"  #include "../../glibext/gbinarycursor.h" +#include "../../gtkext/gtkblockdisplay.h" @@ -301,20 +302,20 @@ static void g_target_operand_print(const GTargetOperand *operand, GBufferLine *l      if (operand->symbol != NULL && label != NULL)      {          if (operand->diff > 0) -            g_buffer_line_append_text(line, BLC_MAIN, "<", 1, RTT_LTGT, NULL); +            g_buffer_line_append_text(line, DLC_ASSEMBLY, "<", 1, RTT_LTGT, NULL); -        g_buffer_line_append_text(line, BLC_MAIN, label, strlen(label), RTT_LABEL, G_OBJECT(operand)); +        g_buffer_line_append_text(line, DLC_ASSEMBLY, label, strlen(label), RTT_LABEL, G_OBJECT(operand));          if (operand->diff > 0)          { -            g_buffer_line_append_text(line, BLC_MAIN, "+", 1, RTT_SIGNS, G_OBJECT(operand)); +            g_buffer_line_append_text(line, DLC_ASSEMBLY, "+", 1, RTT_SIGNS, G_OBJECT(operand));              init_vmpa(&tmp, operand->diff, VMPA_NO_VIRTUAL);              vmpa2_phys_to_string(&tmp, MDS_4_BITS, value, &len); -            g_buffer_line_append_text(line, BLC_MAIN, value, len, RTT_LABEL, G_OBJECT(operand)); +            g_buffer_line_append_text(line, DLC_ASSEMBLY, value, len, RTT_LABEL, G_OBJECT(operand)); -            g_buffer_line_append_text(line, BLC_MAIN, ">", 1, RTT_LTGT, NULL); +            g_buffer_line_append_text(line, DLC_ASSEMBLY, ">", 1, RTT_LTGT, NULL);          } @@ -323,7 +324,7 @@ static void g_target_operand_print(const GTargetOperand *operand, GBufferLine *l      {          vmpa2_to_string(&operand->addr, operand->size, value, &len); -        g_buffer_line_append_text(line, BLC_MAIN, value, len, RTT_LABEL, G_OBJECT(operand)); +        g_buffer_line_append_text(line, DLC_ASSEMBLY, value, len, RTT_LABEL, G_OBJECT(operand));      } diff --git a/src/glibext/bufferline.c b/src/glibext/bufferline.c index 5eec1db..ec1176b 100644 --- a/src/glibext/bufferline.c +++ b/src/glibext/bufferline.c @@ -33,6 +33,7 @@  #include "linecolumn.h"  #include "../common/extstr.h"  #include "../core/paths.h" +#include "../gtkext/gtkblockdisplay.h" @@ -55,8 +56,7 @@ struct _GBufferLine      line_column *columns;                   /* Répartition du texte        */      size_t col_count;                       /* Nombre de colonnes présentes*/ -    BufferLineColumn merge_start;           /* Début de la zone globale    */ -    BufferLineColumn last_used;             /* Dernière colonne utilisée   */ +    size_t merge_start;                     /* Début de la zone globale    */      BufferLineFlags flags;                  /* Drapeaux particuliers       */ @@ -178,7 +178,6 @@ static void g_buffer_line_init(GBufferLine *line)      line->columns = NULL;      line->col_count = 0;      line->merge_start = -1; -    line->last_used = -1;  } @@ -503,19 +502,9 @@ void g_buffer_line_append_text(GBufferLine *line, size_t column, const char *tex      size_t index;                           /* Indice d'insertion          */      content_origin *origin;                 /* Définition d'une origine    */ +    assert(column < line->col_count);      assert(length > 0); -    if (column == -1) -        column = BLC_LAST_USED; - -    if (column == BLC_MAIN) -        column = BLC_ASSEMBLY;//line->main_column; - -    if (column == BLC_LAST_USED) -        column = line->last_used; -    else -        line->last_used = column; -      index = append_text_to_line_column(&line->columns[column], text, length, type);      if (creator != NULL) @@ -720,10 +709,7 @@ BufferLineColumn g_buffer_line_get_merge_start(const GBufferLine *line)  void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start)  { -    if (start == BLC_LAST_USED) -        line->merge_start = line->last_used; -    else -        line->merge_start = start; +    line->merge_start = start;  } @@ -801,10 +787,11 @@ void g_buffer_line_remove_flag(GBufferLine *line, BufferLineFlags flag)  /******************************************************************************  *                                                                             * -*  Paramètres  : line    = ligne de texte à manipuler.                        * -*                ctx     = éléments à disposition pour l'exportation.         * -*                type    = type d'exportation attendue.                       * -*                display = règles d'affichage des colonnes modulables.        * +*  Paramètres  : line      = ligne de texte à manipuler.                      * +*                ctx       = éléments à disposition pour l'exportation.       * +*                type      = type d'exportation attendue.                     * +*                col_count = quantité de colonnes existantes au total.        * +*                options   = règles d'affichage des colonnes modulables.      *  *                                                                             *  *  Description : Exporte la ligne de texte représentée.                       *  *                                                                             * @@ -814,9 +801,10 @@ void g_buffer_line_remove_flag(GBufferLine *line, BufferLineFlags flag)  *                                                                             *  ******************************************************************************/ -void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferExportType type, const bool *display) +void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferExportType type, const GDisplayOptions *options)  { -    BufferLineColumn i;                     /* Boucle de parcours          */ +    size_t opt_count;                       /* Qté de colonnes en option   */ +    size_t i;                               /* Boucle de parcours          */      int col_span;                           /* Fusion de colonnes ?        */      switch (type) @@ -828,9 +816,16 @@ void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferE              break;      } -    for (i = 0; i < BLC_COUNT; i++) +    opt_count = g_display_options_count(options); +    assert(opt_count < line->col_count); + +    for (i = 0; i < line->col_count; i++)      { -        if (i < BLC_DISPLAY && !display[i]) continue; +        if (i < opt_count) +        { +            if (!g_display_options_get(options, i)) +                continue; +        }          switch (type)          { @@ -859,10 +854,10 @@ void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferE              col_span = 1;          else if (i == line->merge_start) -            col_span = BLC_COUNT - i; +            col_span = line->col_count - i;          else -            col_span = ((i + 1) == BLC_COUNT ? -1 : 0); +            col_span = ((i + 1) == line->col_count ? -1 : 0);          export_line_column_segments(&line->columns[i], ctx, type, col_span); diff --git a/src/glibext/bufferline.h b/src/glibext/bufferline.h index 0e20b37..319f9b7 100644 --- a/src/glibext/bufferline.h +++ b/src/glibext/bufferline.h @@ -65,18 +65,8 @@ typedef enum _BufferLineColumn      BLC_COUNT, -    BLC_LAST_USED,                          /* Dernière colonne utilisée   */ -    BLC_INVALID,                            /* Valeur de non-initialisation*/ -    BLC_MAIN                                /* Colonne principale (cf. imm)*/ -  } BufferLineColumn; -/* Première colonne de l'ensemble */ -#define BLC_FIRST BLC_PHYSICAL - -/* Première colonne toujours affichée */ -#define BLC_DISPLAY BLC_ASSEMBLY_LABEL -  /* Confort pour l'insertion de texte */  #define SL(str) str, strlen(str) @@ -149,7 +139,7 @@ BufferLineFlags g_buffer_line_get_flags(const GBufferLine *);  void g_buffer_line_remove_flag(GBufferLine *, BufferLineFlags);  /* Exporte la ligne de texte représentée. */ -void g_buffer_line_export(GBufferLine *, buffer_export_context *, BufferExportType, const bool *); +void g_buffer_line_export(GBufferLine *, buffer_export_context *, BufferExportType, const GDisplayOptions *); diff --git a/src/glibext/gdisplayoptions.c b/src/glibext/gdisplayoptions.c index c0fa614..a8f835b 100644 --- a/src/glibext/gdisplayoptions.c +++ b/src/glibext/gdisplayoptions.c @@ -189,7 +189,7 @@ static void g_display_options_finalize(GDisplayOptions *options)  *                                                                             *  *  Paramètres  : -                                                            *  *                                                                             * -*  Description : Crée un un groupe d'options pour le rendu des lignes.        * +*  Description : Crée un groupe d'options pour le rendu des lignes.           *  *                                                                             *  *  Retour      : Adresse de la structure mise en place.                       *  *                                                                             * @@ -199,7 +199,7 @@ static void g_display_options_finalize(GDisplayOptions *options)  GDisplayOptions *g_display_options_new(void)  { -    GDisplayOptions *result;              /* Structure à retourner       */ +    GDisplayOptions *result;                /* Structure à retourner       */      result = g_object_new(G_TYPE_DISPLAY_OPTIONS, NULL); @@ -210,6 +210,36 @@ GDisplayOptions *g_display_options_new(void)  /******************************************************************************  *                                                                             * +*  Paramètres  : template = modèle de groupe à copier.                        * +*                                                                             * +*  Description : Copie un groupe d'options pour le rendu des lignes.          * +*                                                                             * +*  Retour      : Adresse de la structure mise en place.                       * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +GDisplayOptions *g_display_options_dup(const GDisplayOptions *template) +{ +    GDisplayOptions *result;                /* Structure à retourner       */ +    size_t count;                           /* Nombre d'options à copier   */ +    size_t i;                               /* Boucle de parcours          */ + +    result = g_display_options_new(); + +    count = g_display_options_count(template); + +    for (i = 0; i < count; i++) +        g_display_options_add(result, template->names[i], template->values[i]); + +    return result; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : options = options à consulter.                               *  *                                                                             *  *  Description : Dénombre la quantité d'options représentées.                 * diff --git a/src/glibext/gdisplayoptions.h b/src/glibext/gdisplayoptions.h index 7549897..1a30e81 100644 --- a/src/glibext/gdisplayoptions.h +++ b/src/glibext/gdisplayoptions.h @@ -48,9 +48,12 @@ typedef struct _GDisplayOptionsClass GDisplayOptionsClass;  /* Indique le type défini pour des options de représentation. */  GType g_display_options_get_type(void); -/* Crée un un groupe d'options pour le rendu des lignes. */ +/* Crée un groupe d'options pour le rendu des lignes. */  GDisplayOptions *g_display_options_new(void); +/* Copie un groupe d'options pour le rendu des lignes. */ +GDisplayOptions *g_display_options_dup(const GDisplayOptions *); +  /* Dénombre la quantité d'options représentées. */  size_t g_display_options_count(const GDisplayOptions *); diff --git a/src/gui/dialogs/export_disass.c b/src/gui/dialogs/export_disass.c index 314b9cf..c15dcbc 100644 --- a/src/gui/dialogs/export_disass.c +++ b/src/gui/dialogs/export_disass.c @@ -41,6 +41,7 @@  #include "../../core/queue.h"  #include "../../glibext/seq.h"  #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkblockdisplay.h" @@ -60,14 +61,14 @@ typedef struct _export_info_t      buffer_export_context *ctx;             /* Contexte d'exportation      */      BufferExportType type;                  /* Type d'exportation menée    */ -    bool display[BLC_COUNT];                /* Paramètres d'affichage      */ +    GDisplayOptions *options;               /* Paramètres d'affichage      */      activity_id_t msg;                      /* Message de progression      */  } export_info_t;  /* Lance l'exportation d'un contenu binaire comme demandé. */ -static void start_binary_export(GBufferCache *, buffer_export_context *, BufferExportType, const bool *); +static void start_binary_export(GBufferCache *, buffer_export_context *, BufferExportType, GDisplayOptions *);  /* Réalise l'exportation d'une ligne particulière. */  static void export_one_binary_line(const export_info_t *, size_t, GtkStatusStack *, activity_id_t); @@ -211,8 +212,9 @@ static void export_assistant_close(GtkAssistant *assistant, GObject *ref)      GtkEntry *entry;                        /* Zone de saisie              */      const gchar *filename;                  /* Chemin d'accès du fichier   */      GtkToggleButton *checkbutton;           /* Coche à retrouver           */ -    bool display[BLC_DISPLAY];              /* Affichage à garantir        */      GLoadedBinary *binary;                  /* Binaire chargé à parcourir  */ +    GDisplayOptions *template;              /* Options courantes           */ +    GDisplayOptions *options;               /* Options d'affichage         */      GBufferCache *cache;                    /* Tampon de code à traiter    */      GObject *support;                       /* Support interne à supprimer */ @@ -236,14 +238,20 @@ static void export_assistant_close(GtkAssistant *assistant, GObject *ref)      /* Eléments à afficher */ +    binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); + +    template = g_loaded_content_get_display_options(G_LOADED_CONTENT(binary), BVW_BLOCK); +    options = g_display_options_dup(template); +    g_object_unref(G_OBJECT(template)); +      checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "physical_off")); -    display[BLC_PHYSICAL] = gtk_toggle_button_get_active(checkbutton); +    g_display_options_set(options, BLC_PHYSICAL, gtk_toggle_button_get_active(checkbutton));      checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr")); -    display[BLC_VIRTUAL] = gtk_toggle_button_get_active(checkbutton); +    g_display_options_set(options, BLC_VIRTUAL, gtk_toggle_button_get_active(checkbutton));      checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code")); -    display[BLC_BINARY] = gtk_toggle_button_get_active(checkbutton); +    g_display_options_set(options, BLC_BINARY, gtk_toggle_button_get_active(checkbutton));      /* Options éventuelles */ @@ -275,11 +283,9 @@ static void export_assistant_close(GtkAssistant *assistant, GObject *ref)      /* Programmation de la tâche */ -    binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); -      cache = g_loaded_binary_get_disassembly_cache(binary); -    start_binary_export(cache, &ctx, type, display); +    start_binary_export(cache, &ctx, type, options);      g_object_unref(G_OBJECT(cache)); @@ -301,7 +307,7 @@ static void export_assistant_close(GtkAssistant *assistant, GObject *ref)  *  Paramètres  : cache    = tampon de données à utiliser.                     *  *                template = paramètres dont s'inspirer pour l'exportation.    *  *                type     = type d'exportation attendue.                      * -*                display  = règles d'affichage des colonnes modulables.       * +*                options  = règles d'affichage des colonnes modulables.       *  *                                                                             *  *  Description : Lance l'exportation d'un contenu binaire comme demandé.      *  *                                                                             * @@ -311,10 +317,9 @@ static void export_assistant_close(GtkAssistant *assistant, GObject *ref)  *                                                                             *  ******************************************************************************/ -static void start_binary_export(GBufferCache *cache, buffer_export_context *template, BufferExportType type, const bool *display) +static void start_binary_export(GBufferCache *cache, buffer_export_context *template, BufferExportType type, GDisplayOptions *options)  {      export_info_t *info;                    /* Infos à faire circuler      */ -    BufferLineColumn i;                     /* Boucle de parcours          */      GWorkQueue *queue;                      /* Gestionnaire de différés    */      size_t count;                           /* Quantité de lignes à traiter*/      GSeqWork *work;                         /* Tâche de chargement à lancer*/ @@ -347,9 +352,7 @@ static void start_binary_export(GBufferCache *cache, buffer_export_context *temp      }      info->type = type; - -    for (i = 0; i < BLC_DISPLAY; i++) -        info->display[i] = display[i]; +    info->options = options;      /* Données exportées initiales */ @@ -421,7 +424,7 @@ static void export_one_binary_line(const export_info_t *info, size_t i, GtkStatu      line = g_buffer_cache_find_line_by_index(info->cache, i); -    g_buffer_line_export(line, info->ctx, info->type, info->display); +    g_buffer_line_export(line, info->ctx, info->type, info->options);      g_object_unref(G_OBJECT(line)); @@ -463,6 +466,8 @@ static void on_binary_export_completed(GSeqWork *work, export_info_t *info)      g_buffer_cache_unlock(info->cache);      g_object_unref(G_OBJECT(info->cache)); +    g_object_unref(G_OBJECT(info->options)); +      close(info->ctx->fd);      switch (info->type) | 
