From c455057e634b30c3214a49db009bad5fd0c631ff Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 9 Jan 2013 21:54:28 +0000
Subject: Fixed immediates output by defining a default column for rendering
 codes.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@321 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                          | 15 +++++++++++++++
 src/analysis/decomp/decompiler.c   |  2 +-
 src/analysis/disass/disassembler.c |  2 +-
 src/arch/immediate.c               |  2 +-
 src/glibext/gbufferline.c          |  8 +++++++-
 src/glibext/gbufferline.h          |  7 ++++---
 src/glibext/gcodebuffer.c          | 12 ++++++++----
 src/glibext/gcodebuffer.h          |  2 +-
 8 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index bc68fcf..b081ee7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 13-01-09  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/analysis/decomp/decompiler.c:
+	* src/analysis/disass/disassembler.c:
+	Setup the buffers with the right values.
+
+	* src/arch/immediate.c:
+	Update code.
+
+	* src/glibext/gbufferline.c:
+	* src/glibext/gbufferline.h:
+	* src/glibext/gcodebuffer.c:
+	* src/glibext/gcodebuffer.h:
+	Fix immediates output by defining a default column for rendering codes.
+
+13-01-09  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/analysis/block.c:
 	* src/analysis/block.h:
 	* src/analysis/block-int.h:
diff --git a/src/analysis/decomp/decompiler.c b/src/analysis/decomp/decompiler.c
index 47c379d..fff654f 100644
--- a/src/analysis/decomp/decompiler.c
+++ b/src/analysis/decomp/decompiler.c
@@ -216,7 +216,7 @@ GCodeBuffer *decompile_all_from_file(const GLoadedBinary *binary, const char *fi
     GCodeBuffer *result;                    /* Tampon constitué à renvoyer */
     GExeFormat *format;                     /* Format du binaire fourni    */
 
-    result = g_code_buffer_new();
+    result = g_code_buffer_new(BLC_ASSEMBLY_HEAD);
 
 
     build_decomp_prologue(result, filename);
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c
index e7c972d..8f1d3f1 100644
--- a/src/analysis/disass/disassembler.c
+++ b/src/analysis/disass/disassembler.c
@@ -402,7 +402,7 @@ void disassemble_binary(GLoadedBinary *binary, GBinPart **parts, size_t parts_co
     GDelayedDisassembly *disass;            /* Désassemblage à mener       */
     GWorkQueue *queue;                      /* Gestionnaire de différés    */
 
-    *buffer = g_code_buffer_new();
+    *buffer = g_code_buffer_new(BLC_ASSEMBLY);
 
     data = g_loaded_binary_get_data(binary, &length);
     build_disass_prologue(*buffer, g_loaded_binary_get_filename(binary, true), data, length);
diff --git a/src/arch/immediate.c b/src/arch/immediate.c
index e8f0212..19c86b2 100644
--- a/src/arch/immediate.c
+++ b/src/arch/immediate.c
@@ -729,7 +729,7 @@ static void g_imm_operand_print(const GImmOperand *operand, GBufferLine *line, A
 
     len = g_imm_operand_to_string(operand, syntax, value);
 
-    g_buffer_line_insert_text(line, BLC_ASSEMBLY, value, len, RTT_IMMEDIATE);
+    g_buffer_line_insert_text(line, BLC_MAIN, value, len, RTT_IMMEDIATE);
 
 }
 
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 9dc970b..95d6126 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -80,6 +80,7 @@ struct _GBufferLine
     GObject parent;                         /* A laisser en premier        */
 
     vmpa_t addr;                            /* Adresse geographique        */
+    BufferLineColumn main_column;           /* Colonne principale          */
 
     buffer_line_column columns[BLC_COUNT];  /* Répartition du texte        */
     BufferLineColumn merge_start;           /* Début de la zone globale    */
@@ -483,6 +484,7 @@ static void g_buffer_line_init(GBufferLine *line)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : addr = adresse 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.      *
 *                                                                             *
@@ -492,13 +494,14 @@ static void g_buffer_line_init(GBufferLine *line)
 *                                                                             *
 ******************************************************************************/
 
-GBufferLine *g_buffer_line_new(vmpa_t addr)
+GBufferLine *g_buffer_line_new(vmpa_t addr, BufferLineColumn main)
 {
     GBufferLine *result;                    /* Composant à retourner       */
 
     result = g_object_new(G_TYPE_BUFFER_LINE, NULL);
 
     result->addr = addr;
+    result->main_column = main;
 
     return result;
 
@@ -625,6 +628,9 @@ void g_buffer_line_insert_text(GBufferLine *line, BufferLineColumn column, const
     GBufferLineClass *class;                /* Stockage de briques de base */ 
     GBufferSegment *segment;                /* Portion de texte à ajouter  */
 
+    if (column == BLC_MAIN)
+        column = line->main_column;
+
     if (column == BLC_LAST_USED)
         column = line->last_used;
     else
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 9afff58..6eb4e27 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -62,7 +62,8 @@ typedef enum _BufferLineColumn
     BLC_COUNT,
 
     BLC_LAST_USED,                          /* Dernière colonne utilisée   */
-    BLC_INVALID                             /* Valeur de non-initialisation*/
+    BLC_INVALID,                            /* Valeur de non-initialisation*/
+    BLC_MAIN                                /* Colonne principale (cf. imm)*/
 
 } BufferLineColumn;
 
@@ -120,13 +121,13 @@ typedef void (* buffer_line_draw_fc) (GBufferLine *, GdkDrawable *, GdkGC *, gin
 GType g_buffer_line_get_type(void);
 
 /* Crée une nouvelle représentation de fragments de texte. */
-GBufferLine *g_buffer_line_new(vmpa_t);
+GBufferLine *g_buffer_line_new(vmpa_t, BufferLineColumn);
 
 /* Indique l'adresse à laquelle se situe la ligne. */
 vmpa_t g_buffer_line_get_address(const GBufferLine *);
 
 /* Ajoute un fragment de texte à une colonne de ligne. */
-void g_buffer_line_add_segment(GBufferLine *, BufferLineColumn, GBufferSegment *);
+void g_buffer_line_add_segment(GBufferLine *, BufferLineColumn, GBufferSegment *) __attribute__ ((deprecated));
 
 /* Donne le segment présent à une abscisse donnée. */
 GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *, const gint [BLC_COUNT], gint);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 22bdcd8..e81966e 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -94,6 +94,8 @@ struct _GCodeBuffer
 {
     GObject parent;                         /* A laisser en premier        */
 
+    BufferLineColumn main_column;           /* Colonne principale          */
+
     GBufferLine **lines;                    /* Liste des lignes intégrées  */
     size_t count;                           /* Quantité en cache           */
     size_t used;                            /* Quantité utilisée           */
@@ -372,7 +374,7 @@ static void g_code_buffer_init(GCodeBuffer *buffer)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : -                                                            *
+*  Paramètres  : main = colonne à référencer comme étant la principale.       *
 *                                                                             *
 *  Description : Crée un nouveau composant de tampon pour code désassemblé.   *
 *                                                                             *
@@ -382,12 +384,14 @@ static void g_code_buffer_init(GCodeBuffer *buffer)
 *                                                                             *
 ******************************************************************************/
 
-GCodeBuffer *g_code_buffer_new(void)
+GCodeBuffer *g_code_buffer_new(BufferLineColumn main)
 {
     GCodeBuffer *result;                    /* Composant à retourner       */
 
     result = g_object_new(G_TYPE_CODE_BUFFER, NULL);
 
+    result->main_column = main;
+
     return result;
 
 }
@@ -488,7 +492,7 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, vmpa_t addr)
                                                 buffer->count * sizeof(GBufferLine *));
     }
 
-    result = g_buffer_line_new(addr);
+    result = g_buffer_line_new(addr, buffer->main_column);
     buffer->lines[buffer->used++] = result;
 
     for (i = 0; i < buffer->indent; i++)
@@ -535,7 +539,7 @@ GBufferLine *g_code_buffer_insert_at(GCodeBuffer *buffer, vmpa_t addr, bool befo
 
         buffer->used++;
 
-        result = g_buffer_line_new(addr);
+        result = g_buffer_line_new(addr, buffer->main_column);
         buffer->lines[index] = result;
 
     }
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 725bd1f..fc4bc66 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -54,7 +54,7 @@ typedef struct _GCodeBufferClass GCodeBufferClass;
 GType g_code_buffer_get_type(void);
 
 /* Crée un nouveau composant de tampon pour code désassemblé. */
-GCodeBuffer *g_code_buffer_new(void);
+GCodeBuffer *g_code_buffer_new(BufferLineColumn);
 
 /* FIXME */
 #define g_code_buffer_append_new_line_fixme(b) g_code_buffer_append_new_line(b, 0ull)
-- 
cgit v0.11.2-87-g4458