diff options
Diffstat (limited to 'src/format/symbol.c')
-rw-r--r-- | src/format/symbol.c | 221 |
1 files changed, 220 insertions, 1 deletions
diff --git a/src/format/symbol.c b/src/format/symbol.c index 97ff114..82321c2 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -28,6 +28,12 @@ #include <string.h> +#include "../glibext/linegen-int.h" + + + +/* --------------------- FONCTIONNALITES BASIQUES POUR SYMBOLES --------------------- */ + /* Symbole d'exécutable (instance) */ struct _GBinSymbol @@ -64,6 +70,9 @@ static void g_binary_symbol_class_init(GBinSymbolClass *); /* Initialise une instance de symbole d'exécutable. */ static void g_binary_symbol_init(GBinSymbol *); +/* Procède à l'initialisation de l'interface de génération. */ +static void g_binary_symbol_interface_init(GLineGeneratorInterface *); + /* Supprime toutes les références externes. */ static void g_binary_symbol_dispose(GBinSymbol *); @@ -72,8 +81,34 @@ static void g_binary_symbol_finalize(GBinSymbol *); +/* ------------------------ OFFRE DE CAPACITES DE GENERATION ------------------------ */ + + +/* Indique le nombre de ligne prêtes à être générées. */ +static size_t g_binary_symbol_count_lines(const GBinSymbol *); + +/* Retrouve l'emplacement correspondant à une position donnée. */ +static void g_binary_symbol_compute_addr(const GBinSymbol *, gint, vmpa2t *, size_t, size_t); + +/* Détermine si le conteneur s'inscrit dans une plage donnée. */ +static int g_binary_symbol_contains_addr(const GBinSymbol *, const vmpa2t *, size_t, size_t); + +/* Renseigne sur les propriétés liées à un générateur. */ +static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *, size_t, size_t); + +/* Imprime dans une ligne de rendu le contenu représenté. */ +static void g_binary_symbol_print(GBinSymbol *, GBufferLine *, size_t, size_t); + + + +/* ---------------------------------------------------------------------------------- */ +/* FONCTIONNALITES BASIQUES POUR SYMBOLES */ +/* ---------------------------------------------------------------------------------- */ + + /* Indique le type défini pour un symbole d'exécutable. */ -G_DEFINE_TYPE(GBinSymbol, g_binary_symbol, G_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_CODE(GBinSymbol, g_binary_symbol, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_LINE_GENERATOR, g_binary_symbol_interface_init)); /****************************************************************************** @@ -120,6 +155,29 @@ static void g_binary_symbol_init(GBinSymbol *symbol) /****************************************************************************** * * +* Paramètres : iface = interface GLib à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de génération. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_binary_symbol_interface_init(GLineGeneratorInterface *iface) +{ + iface->count = (linegen_count_lines_fc)g_binary_symbol_count_lines; + iface->compute = (linegen_compute_fc)g_binary_symbol_compute_addr; + iface->contains = (linegen_contains_fc)g_binary_symbol_contains_addr; + iface->get_flags = (linegen_get_flags_fc)g_binary_symbol_get_flags; + iface->print = (linegen_print_fc)g_binary_symbol_print; + +} + + +/****************************************************************************** +* * * Paramètres : symbol = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * @@ -665,3 +723,164 @@ GDbComment *g_binary_symbol_get_comment(const GBinSymbol *symbol) return symbol->comment; } + + + +/* ---------------------------------------------------------------------------------- */ +/* OFFRE DE CAPACITES DE GENERATION */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : symbol = générateur à consulter pour futur usage. * +* * +* Description : Détermine si un symbole pour faire office de générateur. * +* * +* Retour : Instance de générateur si les capacités sont là. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GLineGenerator *g_binary_symbol_produce_label(GBinSymbol *symbol) +{ + GLineGenerator *result; /* Instance à retourner */ + const char *label; /* Etiquette à insérer */ + + label = g_binary_symbol_get_label(symbol); + + result = (label != NULL ? G_LINE_GENERATOR(symbol) : NULL); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = générateur à consulter. * +* * +* Description : Indique le nombre de ligne prêtes à être générées. * +* * +* Retour : Nombre de lignes devant apparaître au final. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static size_t g_binary_symbol_count_lines(const GBinSymbol *symbol) +{ + return 1; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = générateur à consulter. * +* x = position géographique sur la ligne concernée. * +* addr = position en mémoire à analyser. * +* index = indice de cette même ligne dans le tampon global. * +* repeat = indice d'utilisations successives du générateur. * +* * +* Description : Retrouve l'emplacement correspondant à une position donnée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_symbol_compute_addr(const GBinSymbol *symbol, gint x, vmpa2t *addr, size_t index, size_t repeat) +{ + const mrange_t *range; /* Emplacement à manipuler */ + + range = g_binary_symbol_get_range(symbol); + + copy_vmpa(addr, get_mrange_addr(range)); + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = générateur à consulter. * +* addr = position en mémoire à analyser. * +* index = indice de cette même ligne dans le tampon global. * +* repeat = indice d'utilisations successives du générateur. * +* * +* Description : Détermine si le conteneur s'inscrit dans une plage donnée. * +* * +* Retour : Bilan de la détermination, utilisable en comparaisons. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int g_binary_symbol_contains_addr(const GBinSymbol *symbol, const vmpa2t *addr, size_t index, size_t repeat) +{ + int result; /* Conclusion à retourner */ + const mrange_t *range; /* Emplacement à manipuler */ + + range = g_binary_symbol_get_range(symbol); + + result = cmp_mrange_with_vmpa(range, addr); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = générateur à consulter. * +* index = indice de cette même ligne dans le tampon global. * +* repeat = indice d'utilisations successives du générateur. * +* * +* Description : Renseigne sur les propriétés liées à un générateur. * +* * +* Retour : Propriétés particulières associées. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *symbol, size_t index, size_t repeat) +{ + return BLF_IS_LABEL; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = générateur à utiliser pour l'impression. * +* line = ligne de rendu à compléter. * +* index = indice de cette même ligne dans le tampon global. * +* repeat = indice d'utilisations successives du générateur. * +* * +* Description : Imprime dans une ligne de rendu le contenu représenté. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_binary_symbol_print(GBinSymbol *symbol, GBufferLine *line, size_t index, size_t repeat) +{ + const mrange_t *range; /* Emplacement à manipuler */ + const char *label; /* Etiquette à insérer */ + + range = g_binary_symbol_get_range(symbol); + + g_buffer_line_fill_vmpa(line, get_mrange_addr(range), MDS_32_BITS_UNSIGNED, MDS_32_BITS_UNSIGNED); + + label = g_binary_symbol_get_label(symbol); + + g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD); + g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, SL(label), RTT_LABEL, NULL); + g_buffer_line_append_text(line, BLC_ASSEMBLY_HEAD, ":", 1, RTT_PUNCT, NULL); + +} |