summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-10-16 16:03:28 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-10-16 16:03:28 (GMT)
commit6f9563a0184e36fab8d0c2c38d151827784e331e (patch)
tree2d0e13667bc9efcc0f26c17572c9d38dabd89db7 /src/analysis
parentc7a14e50bd002e3922969e9bae7816753aefb073 (diff)
Properly output routines documentation.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@268 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/disass/output.c2
-rw-r--r--src/analysis/routine.c173
-rw-r--r--src/analysis/routine.h13
-rw-r--r--src/analysis/type.c23
-rw-r--r--src/analysis/type.h7
-rw-r--r--src/analysis/types/basic.c36
-rw-r--r--src/analysis/types/cse-int.h3
-rw-r--r--src/analysis/types/cse.c25
-rw-r--r--src/analysis/types/encaps.c27
-rw-r--r--src/analysis/types/literal.c36
-rw-r--r--src/analysis/types/template.c42
-rw-r--r--src/analysis/variable.c35
-rw-r--r--src/analysis/variable.h3
13 files changed, 358 insertions, 67 deletions
diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c
index 343973f..812b811 100644
--- a/src/analysis/disass/output.c
+++ b/src/analysis/disass/output.c
@@ -75,7 +75,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
if (raddr > iaddr) break;
- g_binary_routine_print_code(routines[i], output, buffer, false);
+ g_binary_routine_output_info(routines[i], output, buffer);
}
diff --git a/src/analysis/routine.c b/src/analysis/routine.c
index c26886f..a21b6e7 100644
--- a/src/analysis/routine.c
+++ b/src/analysis/routine.c
@@ -723,6 +723,90 @@ size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *routine, si
* *
* Paramètres : routine = routine à consulter. *
* *
+* Description : Fournit les instructions natives correspondantes. *
+* *
+* Retour : Ensemble d'instructions décompilées ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *routine)
+{
+ return routine->instr;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à mettre à jour. *
+* instr = série d'instructions à conserver. *
+* *
+* Description : Définit les instructions natives de la routine. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_binary_routine_set_instructions(GBinRoutine *routine, GArchInstruction *instr)
+{
+ if (routine->instr != NULL)
+ g_object_unref(G_OBJECT(routine->instr));
+
+ routine->instr = instr;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à consulter. *
+* *
+* Description : Fournit les instructions décompilées correspondantes. *
+* *
+* Retour : Ensemble d'instructions décompilées ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *routine)
+{
+ return routine->dinstr;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à mettre à jour. *
+* instr = série d'instructions à conserver. *
+* *
+* Description : Définit les instructions décompilées de la routine. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_binary_routine_set_decomp_instructions(GBinRoutine *routine, GDecInstruction *instr)
+{
+ if (routine->dinstr != NULL)
+ g_object_unref(G_OBJECT(routine->dinstr));
+
+ routine->dinstr = instr;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à consulter. *
+* *
* Description : Décrit le prototype de la routine sous forme de caractères. *
* *
* Retour : Chaîne de caractères à libérer de la mémoire. *
@@ -803,84 +887,61 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti
/******************************************************************************
* *
-* Paramètres : routine = routine à consulter. *
+* Paramètres : routine = routine à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
* *
-* Description : Fournit les instructions natives correspondantes. *
+* Description : Procède à l'impression de la description d'une routine. *
* *
-* Retour : Ensemble d'instructions décompilées ou NULL. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *routine)
+void g_binary_routine_output_info(const GBinRoutine *routine, GLangOutput *lang, GCodeBuffer *buffer)
{
- return routine->instr;
+ GBufferLine *line; /* Adresse d'une ligne nouvelle*/
+ const char *name; /* Nom humain de la routine */
+ size_t len; /* Taille de ce nom */
+ size_t i; /* Boucle de parcours */
-}
+ /* Type de retour */
+ line = g_lang_output_start_routine_info(lang, buffer);
-/******************************************************************************
-* *
-* Paramètres : routine = routine à mettre à jour. *
-* instr = série d'instructions à conserver. *
-* *
-* Description : Définit les instructions natives de la routine. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ g_data_type_output(routine->ret_type, lang, line, true, false);
-void g_binary_routine_set_instructions(GBinRoutine *routine, GArchInstruction *instr)
-{
- if (routine->instr != NULL)
- g_object_unref(G_OBJECT(routine->instr));
+ g_buffer_line_insert_text(line, BLC_LAST_USED, " ", 1, RTT_COMMENT);
- routine->instr = instr;
+ /* Nom de la routine */
-}
+ name = g_binary_routine_get_name(routine);
+ if (name != NULL) len = strlen(name);
+ else
+ {
+ name = "???";
+ len = 3;
+ }
+ g_buffer_line_insert_text(line, BLC_LAST_USED, name, len, RTT_COMMENT);
-/******************************************************************************
-* *
-* Paramètres : routine = routine à consulter. *
-* *
-* Description : Fournit les instructions décompilées correspondantes. *
-* *
-* Retour : Ensemble d'instructions décompilées ou NULL. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ /* Arguments éventuels... */
-GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *routine)
-{
- return routine->dinstr;
+ g_buffer_line_insert_text(line, BLC_LAST_USED, "(", 1, RTT_COMMENT);
-}
+ for (i = 0; i < routine->args_count; i++)
+ {
+ if (i > 0)
+ g_buffer_line_insert_text(line, BLC_LAST_USED, ", ", 2, RTT_COMMENT);
+ g_binary_variable_output(routine->args[i], lang, line, true, false);
-/******************************************************************************
-* *
-* Paramètres : routine = routine à mettre à jour. *
-* instr = série d'instructions à conserver. *
-* *
-* Description : Définit les instructions décompilées de la routine. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ }
-void g_binary_routine_set_decomp_instructions(GBinRoutine *routine, GDecInstruction *instr)
-{
- if (routine->dinstr != NULL)
- g_object_unref(G_OBJECT(routine->dinstr));
+ g_buffer_line_insert_text(line, BLC_LAST_USED, ")", 1, RTT_COMMENT);
- routine->dinstr = instr;
+ //g_lang_output_end_routine_prototype(lang, buffer, line);
}
diff --git a/src/analysis/routine.h b/src/analysis/routine.h
index 3622630..a13c460 100644
--- a/src/analysis/routine.h
+++ b/src/analysis/routine.h
@@ -142,11 +142,6 @@ void g_binary_routine_register_if_needed(GBinRoutine *, size_t, bool);
/* Donne l'indice d'une variable dans la liste d'une routine. */
size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *, size_t, bool);
-/* Décrit le prototype de la routine sous forme de caractères. */
-char *_g_binary_routine_to_string(const GBinRoutine *, Routine2StringOptions);
-
-#define g_binary_routine_to_string(r) _g_binary_routine_to_string((r), RSO_ALL)
-
/* Fournit les instructions natives correspondantes. */
GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *);
@@ -159,6 +154,14 @@ GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *);
/* Définit les instructions décompilées de la routine. */
void g_binary_routine_set_decomp_instructions(GBinRoutine *, GDecInstruction *);
+/* Décrit le prototype de la routine sous forme de caractères. */
+char *_g_binary_routine_to_string(const GBinRoutine *, Routine2StringOptions);
+
+#define g_binary_routine_to_string(r) _g_binary_routine_to_string((r), RSO_ALL)
+
+/* Procède à l'impression de la description d'une routine. */
+void g_binary_routine_output_info(const GBinRoutine *, GLangOutput *, GCodeBuffer *);
+
/* Procède à l'impression de la décompilation d'une routine. */
void g_binary_routine_print_code(const GBinRoutine *, GLangOutput *, GCodeBuffer *, bool);
diff --git a/src/analysis/type.c b/src/analysis/type.c
index ef75080..1f8cd0a 100644
--- a/src/analysis/type.c
+++ b/src/analysis/type.c
@@ -205,6 +205,29 @@ char *_g_data_type_to_string(const GDataType *type, bool simple)
/******************************************************************************
* *
+* Paramètres : type = routine à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'un type. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_data_type_output(const GDataType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ type->output(type, lang, line, info, full);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : type = instance à mettre à jour. *
* qualifier = nouveau qualificatif pour la variable. *
* *
diff --git a/src/analysis/type.h b/src/analysis/type.h
index dde256e..5ce94ab 100644
--- a/src/analysis/type.h
+++ b/src/analysis/type.h
@@ -31,6 +31,8 @@
#include "../arch/archbase.h"
+#include "../decomp/output.h"
+#include "../glibext/gbufferline.h"
@@ -74,7 +76,7 @@ void g_data_type_set_namespace(GDataType *, GDataType *);
/* Décrit le type fourni sous forme de caractères. */
char *_g_data_type_to_string(const GDataType *, bool);
-#define g_data_type_to_string(t) _g_data_type_to_string((t), false)
+#define g_data_type_to_string(t) _g_data_type_to_string((t), true)
/* Ajoute un qualificatif à une instance de type. */
void g_data_type_add_qualifier(GDataType *, TypeQualifier);
@@ -82,7 +84,8 @@ void g_data_type_add_qualifier(GDataType *, TypeQualifier);
/* Indique la terminaison de la représentation du type. */
bool g_data_type_is_pointer(const GDataType *, bool);
-
+/* Procède à l'impression de la description d'un type. */
+void g_data_type_output(const GDataType *, GLangOutput *, GBufferLine *, bool, bool);
diff --git a/src/analysis/types/basic.c b/src/analysis/types/basic.c
index 436b04e..f8b3100 100644
--- a/src/analysis/types/basic.c
+++ b/src/analysis/types/basic.c
@@ -24,6 +24,7 @@
#include "basic.h"
+#include <malloc.h>
#include <string.h>
@@ -60,6 +61,9 @@ static GDataType *g_basic_type_dup(const GBasicType *);
/* Décrit le type fourni sous forme de caractères. */
static char *g_basic_type_to_string(const GBasicType *);
+/* Procède à l'impression de la description d'un type. */
+static void g_basic_type_output(const GBasicType *, GLangOutput *, GBufferLine *, bool, bool);
+
/* Indique le type défini pour un type basique. */
@@ -104,6 +108,7 @@ static void g_basic_type_init(GBasicType *type)
data_type->dup = (type_dup_fc)g_basic_type_dup;
data_type->to_string = (type_to_string_fc)g_basic_type_to_string;
+ data_type->output = (output_type_fc)g_basic_type_output;
}
@@ -292,6 +297,37 @@ static char *g_basic_type_to_string(const GBasicType *type)
/******************************************************************************
* *
+* Paramètres : type = type à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'un type. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_basic_type_output(const GBasicType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ char *text; /* Version humaine à imprimer */
+ size_t len; /* Taille de cette version */
+
+ text = g_basic_type_to_string(type);
+ len = strlen(text);
+
+ g_buffer_line_insert_text(line, BLC_LAST_USED, text, len, info ? RTT_COMMENT : RTT_RAW);
+
+ free(text);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : type = type à consulter. *
* *
* Description : Fournit le type de base géré par le type. *
diff --git a/src/analysis/types/cse-int.h b/src/analysis/types/cse-int.h
index 2599329..9ee020f 100644
--- a/src/analysis/types/cse-int.h
+++ b/src/analysis/types/cse-int.h
@@ -51,6 +51,9 @@ struct _GClassEnumTypeClass
/* Décrit le type fourni sous forme de caractères. */
char *g_class_enum_type_to_string(const GClassEnumType *);
+/* Procède à l'impression de la description d'un type. */
+void g_class_enum_type_output(const GClassEnumType *, GLangOutput *, GBufferLine *, bool, bool);
+
#endif /* _ANALYSIS_TYPES_CSE_INT_H */
diff --git a/src/analysis/types/cse.c b/src/analysis/types/cse.c
index 40d726e..4ee03ef 100644
--- a/src/analysis/types/cse.c
+++ b/src/analysis/types/cse.c
@@ -84,6 +84,7 @@ static void g_class_enum_type_init(GClassEnumType *type)
data_type->dup = (type_dup_fc)g_class_enum_type_dup;
data_type->to_string = (type_to_string_fc)g_class_enum_type_to_string;
+ data_type->output = (output_type_fc)g_class_enum_type_output;
}
@@ -151,3 +152,27 @@ char *g_class_enum_type_to_string(const GClassEnumType *type)
return strdup(type->name);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = type à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'un type. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_class_enum_type_output(const GClassEnumType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ g_buffer_line_insert_text(line, BLC_LAST_USED, type->name, strlen(type->name),
+ info ? RTT_COMMENT : RTT_RAW);
+
+}
diff --git a/src/analysis/types/encaps.c b/src/analysis/types/encaps.c
index 492fd46..1d4b6f4 100644
--- a/src/analysis/types/encaps.c
+++ b/src/analysis/types/encaps.c
@@ -61,6 +61,9 @@ static GDataType *g_encapsulated_type_dup(const GEncapsulatedType *);
/* Décrit le type fourni sous forme de caractères. */
static char *g_encapsulated_type_to_string(const GEncapsulatedType *);
+/* Procède à l'impression de la description d'un type. */
+static void g_encapsulated_type_output(const GEncapsulatedType *, GLangOutput *, GBufferLine *, bool, bool);
+
/* Indique le type défini pour un type encapsulé. */
@@ -105,6 +108,7 @@ static void g_encapsulated_type_init(GEncapsulatedType *type)
data_type->dup = (type_dup_fc)g_encapsulated_type_dup;
data_type->to_string = (type_to_string_fc)g_encapsulated_type_to_string;
+ data_type->output = (output_type_fc)g_encapsulated_type_output;
}
@@ -256,6 +260,29 @@ static char *g_encapsulated_type_to_string(const GEncapsulatedType *type)
/******************************************************************************
* *
+* Paramètres : type = type à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'un type. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_encapsulated_type_output(const GEncapsulatedType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ g_buffer_line_insert_text(line, BLC_LAST_USED, "!TODO!", 6, info ? RTT_COMMENT : RTT_RAW);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : type = type à consulter. *
* *
* Description : Fournit le type d'encapsulation gérée par le type. *
diff --git a/src/analysis/types/literal.c b/src/analysis/types/literal.c
index 92c8254..50212ac 100644
--- a/src/analysis/types/literal.c
+++ b/src/analysis/types/literal.c
@@ -24,6 +24,7 @@
#include "literal.h"
+#include <malloc.h>
#include <stdio.h>
#include <string.h>
@@ -63,6 +64,9 @@ static GDataType *g_literal_type_dup(const GLiteralType *);
/* Décrit le type fourni sous forme de caractères. */
static char *g_literal_type_to_string(const GLiteralType *);
+/* Procède à l'impression de la description d'un type. */
+static void g_literal_type_output(const GLiteralType *, GLangOutput *, GBufferLine *, bool, bool);
+
/* Indique le type défini pour un type reposant sur des gabarits. */
@@ -107,6 +111,7 @@ static void g_literal_type_init(GLiteralType *type)
data_type->dup = (type_dup_fc)g_literal_type_dup;
data_type->to_string = (type_to_string_fc)g_literal_type_to_string;
+ data_type->output = (output_type_fc)g_literal_type_output;
}
@@ -203,3 +208,34 @@ static char *g_literal_type_to_string(const GLiteralType *type)
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = type à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'un type. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_literal_type_output(const GLiteralType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ char *text; /* Version humaine à imprimer */
+ size_t len; /* Taille de cette version */
+
+ text = g_literal_type_to_string(type);
+ len = strlen(text);
+
+ g_buffer_line_insert_text(line, BLC_LAST_USED, text, len, info ? RTT_COMMENT : RTT_RAW);
+
+ free(text);
+
+}
diff --git a/src/analysis/types/template.c b/src/analysis/types/template.c
index 29d39bc..f26e038 100644
--- a/src/analysis/types/template.c
+++ b/src/analysis/types/template.c
@@ -64,6 +64,9 @@ static GDataType *g_template_type_dup(const GTemplateType *);
/* Décrit le type fourni sous forme de caractères. */
static char *g_template_type_to_string(const GTemplateType *);
+/* Procède à l'impression de la description d'un type. */
+static void g_template_type_output(const GTemplateType *, GLangOutput *, GBufferLine *, bool, bool);
+
/* Indique le type défini pour un type reposant sur des gabarits. */
@@ -109,6 +112,7 @@ static void g_template_type_init(GTemplateType *type)
data_type->dup = (type_dup_fc)g_template_type_dup;
data_type->to_string = (type_to_string_fc)g_template_type_to_string;
+ data_type->output = (output_type_fc)g_template_type_output;
ce_type = G_CLASS_ENUM_TYPE(type);
@@ -216,6 +220,44 @@ static char *g_template_type_to_string(const GTemplateType *type)
/******************************************************************************
* *
+* Paramètres : type = type à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'un type. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_template_type_output(const GTemplateType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ size_t i; /* Boucle de parcours */
+
+ g_class_enum_type_output(G_CLASS_ENUM_TYPE(type), lang, line, info, full);
+
+ g_buffer_line_insert_text(line, BLC_LAST_USED, "<", 1, info ? RTT_COMMENT : RTT_LTGT);
+
+ for (i = 0; i < type->models_count; i++)
+ {
+ if (i > 0)
+ g_buffer_line_insert_text(line, BLC_LAST_USED, ", ", 2, info ? RTT_COMMENT : RTT_SIGNS);
+
+ g_data_type_output(type->models[i], lang, line, info, full);
+
+ }
+
+ g_buffer_line_insert_text(line, BLC_LAST_USED, ">", 1, info ? RTT_COMMENT : RTT_LTGT);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : type = type à mettre à jour. *
* list = élements du modèle sur lequel doit reposer le type. *
* *
diff --git a/src/analysis/variable.c b/src/analysis/variable.c
index 7ecf793..6a7c145 100644
--- a/src/analysis/variable.c
+++ b/src/analysis/variable.c
@@ -253,12 +253,12 @@ char *g_binary_variable_to_string(const GBinVariable *var, bool simple)
{
char *result; /* Valeur à retourner */
- result = strdup(""); /* FIXME : arg _g_data_type_to_string(var->type, simple);*/
+ result = _g_data_type_to_string(var->type, simple);
if (var->name != NULL)
{
if (!g_data_type_is_pointer(var->type, true))
- /*result = stradd(result, " ")*/;
+ result = stradd(result, " ");
result = stradd(result, var->name);
@@ -269,6 +269,37 @@ char *g_binary_variable_to_string(const GBinVariable *var, bool simple)
}
+/******************************************************************************
+* *
+* Paramètres : var = variable à afficher. *
+* lang = langage à utiliser pour la sortie humaine. *
+* buffer = tampon mis à disposition pour la sortie. *
+* info = nature du cadre de destination. *
+* full = besoin de descriptions étendues ? *
+* *
+* Description : Procède à l'impression de la description d'une variable. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_binary_variable_output(const GBinVariable *var, GLangOutput *lang, GBufferLine *line, bool info, bool full)
+{
+ g_data_type_output(var->type, lang, line, info, full);
+
+ if (var->name != NULL)
+ {
+ if (!g_data_type_is_pointer(var->type, true))
+ g_buffer_line_insert_text(line, BLC_LAST_USED, " ", 1, RTT_COMMENT);
+
+ g_buffer_line_insert_text(line, BLC_LAST_USED, var->name, strlen(var->name), RTT_COMMENT);
+
+ }
+
+}
+
diff --git a/src/analysis/variable.h b/src/analysis/variable.h
index a68eac2..72b95e0 100644
--- a/src/analysis/variable.h
+++ b/src/analysis/variable.h
@@ -76,7 +76,8 @@ void g_binary_variable_set_owner(GBinVariable *, GDataType *);
/* Décrit la variable donnée sous forme de caractères. */
char *g_binary_variable_to_string(const GBinVariable *, bool);
-
+/* Procède à l'impression de la description d'une variable. */
+void g_binary_variable_output(const GBinVariable *, GLangOutput *, GBufferLine *, bool, bool);