diff options
Diffstat (limited to 'src/glibext/generators/prologue.c')
-rw-r--r-- | src/glibext/generators/prologue.c | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/src/glibext/generators/prologue.c b/src/glibext/generators/prologue.c new file mode 100644 index 0000000..7a4fea5 --- /dev/null +++ b/src/glibext/generators/prologue.c @@ -0,0 +1,359 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * prologue.c - génération à la volée de lignes d'introduction + * + * Copyright (C) 2016 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "prologue.h" + + +#include <assert.h> +#include <malloc.h> + + +#include "../gbufferline.h" +#include "../linegen-int.h" +#include "../linesegment.h" + + + +/* Tampon pour générateur de lignes en prologue (instance) */ +struct _GIntroGenerator +{ + GObject parent; /* A laisser en premier */ + + char **text; /* Lignes brutes à représenter */ + size_t count; /* Quantité de ces lignes */ + +}; + +/* Tampon pour générateur de lignes en prologue (classe) */ +struct _GIntroGeneratorClass +{ + GObjectClass parent; /* A laisser en premier */ + +}; + + +/* Procède à l'initialisation d'une classe de générateur. */ +static void g_intro_generator_class_init(GIntroGeneratorClass *); + +/* Procède à l'initialisation d'un générateur de lignes d'intro. */ +static void g_intro_generator_init(GIntroGenerator *); + +/* Procède à l'initialisation de l'interface de génération. */ +static void g_intro_generator_interface_init(GLineGeneratorInterface *); + +/* Supprime toutes les références externes. */ +static void g_intro_generator_dispose(GIntroGenerator *); + +/* Procède à la libération totale de la mémoire. */ +static void g_intro_generator_finalize(GIntroGenerator *); + +/* Indique le nombre de ligne prêtes à être générées. */ +static size_t g_intro_generator_count_lines(const GIntroGenerator *); + +/* Retrouve l'emplacement correspondant à une position donnée. */ +static void g_intro_generator_compute_addr(const GIntroGenerator *, gint, vmpa2t *, size_t, size_t); + +/* Détermine si le conteneur s'inscrit dans une plage donnée. */ +static int g_intro_generator_contains_addr(const GIntroGenerator *, const vmpa2t *, size_t, size_t); + +/* Renseigne sur les propriétés liées à un générateur. */ +static BufferLineFlags g_intro_generator_get_flags(const GIntroGenerator *, size_t, size_t); + +/* Imprime dans une ligne de rendu le contenu représenté. */ +static void g_intro_generator_print(GIntroGenerator *, GBufferLine *, size_t, size_t); + + + +/* Détermine le type du générateur de lignes d'introduction à la volée. */ +G_DEFINE_TYPE_WITH_CODE(GIntroGenerator, g_intro_generator, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_LINE_GENERATOR, g_intro_generator_interface_init)); + + +/****************************************************************************** +* * +* Paramètres : class = classe de composant GLib à initialiser. * +* * +* Description : Procède à l'initialisation d'une classe de générateur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_intro_generator_class_init(GIntroGeneratorClass *class) +{ + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(class); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_intro_generator_dispose; + object->finalize = (GObjectFinalizeFunc)g_intro_generator_finalize; + +} + + +/****************************************************************************** +* * +* Paramètres : generator = composant GLib à initialiser. * +* * +* Description : Procède à l'initialisation d'un générateur de lignes d'intro.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_intro_generator_init(GIntroGenerator *generator) +{ + generator->text = NULL; + generator->count = 0; + +} + + +/****************************************************************************** +* * +* Paramètres : iface = interface GLib à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de génération. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_intro_generator_interface_init(GLineGeneratorInterface *iface) +{ + iface->count = (linegen_count_lines_fc)g_intro_generator_count_lines; + iface->compute = (linegen_compute_fc)g_intro_generator_compute_addr; + iface->contains = (linegen_contains_fc)g_intro_generator_contains_addr; + iface->get_flags = (linegen_get_flags_fc)g_intro_generator_get_flags; + iface->print = (linegen_print_fc)g_intro_generator_print; + +} + + +/****************************************************************************** +* * +* Paramètres : generator = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_intro_generator_dispose(GIntroGenerator *generator) +{ + G_OBJECT_CLASS(g_intro_generator_parent_class)->dispose(G_OBJECT(generator)); + +} + + +/****************************************************************************** +* * +* Paramètres : generator = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_intro_generator_finalize(GIntroGenerator *generator) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < generator->count; i++) + free(generator->text[i]); + + if (generator->text != NULL) + free(generator->text); + + G_OBJECT_CLASS(g_intro_generator_parent_class)->finalize(G_OBJECT(generator)); + +} + + +/****************************************************************************** +* * +* Paramètres : lang = trauducteur pour l'impression finale. * +* text = tableau de lignes à conserver. * +* count = taille du tableau fourni. * +* * +* Description : Crée un nouveau générateur de lignes d'introduction. * +* * +* Retour : Composant GLib créé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GIntroGenerator *g_intro_generator_new(const GCodingLanguage *lang, char **text, size_t count) +{ + GIntroGenerator *result; /* Composant à retourner */ + + result = g_object_new(G_TYPE_INTRO_GENERATOR, NULL); + + result->text = text; + result->count = count; + + g_coding_language_encapsulate_comments(lang, &result->text, &result->count); + + result->text = (char **)realloc(result->text, ++result->count * sizeof(char *)); + + result->text[result->count - 1] = NULL; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : generator = 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_intro_generator_count_lines(const GIntroGenerator *generator) +{ + return generator->count; + +} + + +/****************************************************************************** +* * +* Paramètres : generator = 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 : - * +* * +******************************************************************************/ + +static void g_intro_generator_compute_addr(const GIntroGenerator *generator, gint x, vmpa2t *addr, size_t index, size_t repeat) +{ + init_vmpa(addr, 0, 0); + +} + + +/****************************************************************************** +* * +* Paramètres : generator = 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_intro_generator_contains_addr(const GIntroGenerator *generator, const vmpa2t *addr, size_t index, size_t repeat) +{ + /** + * Les lignes générées sont purement artificielles et sans attache. + * Elles n'existent donc pas. + */ + + return 1; + +} + + +/****************************************************************************** +* * +* Paramètres : generator = 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_intro_generator_get_flags(const GIntroGenerator *generator, size_t index, size_t repeat) +{ + return BLF_NONE; + +} + + +/****************************************************************************** +* * +* Paramètres : generator = 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_intro_generator_print(GIntroGenerator *generator, GBufferLine *line, size_t index, size_t repeat) +{ + assert(repeat < generator->count); + + if ((repeat + 1) != generator->count) + { + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); + + g_buffer_line_append_text(line, BLC_PHYSICAL, SL(generator->text[repeat]), RTT_COMMENT, NULL); + + if (repeat == 0) + g_buffer_line_add_flag(line, BLF_WIDTH_MANAGER); + + } + +} |