diff options
Diffstat (limited to 'src/analysis/line.c')
| -rw-r--r-- | src/analysis/line.c | 717 | 
1 files changed, 0 insertions, 717 deletions
| diff --git a/src/analysis/line.c b/src/analysis/line.c deleted file mode 100644 index 560b683..0000000 --- a/src/analysis/line.c +++ /dev/null @@ -1,717 +0,0 @@ - -/* OpenIDA - Outil d'analyse de fichiers binaires - * line.c - représentation des lignes de rendu - * - * Copyright (C) 2009-2010 Cyrille Bagard - * - *  This file is part of OpenIDA. - * - *  OpenIDA 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. - * - *  OpenIDA 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 "line.h" - - -#include "line-int.h" - - - -#include <malloc.h> -#include <stdio.h> -#include <string.h> -#include <sys/param.h> - - -#include "line_code.h" -#include "../common/dllist.h" - - - -/* ------------------------ TRAITEMENT INDIVIDUEL DES LIGNES ------------------------ */ - - -/* Initialise la classe des lignes de représentation. */ -static void g_rendering_line_class_init(GRenderingLineClass *); - -/* Initialise une instance de ligne de représentation. */ -static void g_rendering_line_init(GRenderingLine *); - -/* Etablit un lien entre deux lignes de représentation. */ -static void g_rendering_line_add_link_reference(GRenderingLine *, GRenderingLine *); - - - -/* ---------------------------------------------------------------------------------- */ -/*                          TRAITEMENT INDIVIDUEL DES LIGNES                          */ -/* ---------------------------------------------------------------------------------- */ - - -/* Indique le type définit pour une ligne de représentation. */ -G_DEFINE_TYPE(GRenderingLine, g_rendering_line, G_TYPE_CONTENT_EXPORTER); - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : klass = classe à initialiser.                                * -*                                                                             * -*  Description : Initialise la classe des lignes de représentation.           * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void g_rendering_line_class_init(GRenderingLineClass *klass) -{ -    klass->style = gtk_style_new(); - -    g_signal_new("rendering-line-flags-changed", -                 G_TYPE_RENDERING_LINE, -                 G_SIGNAL_RUN_LAST, -                 G_STRUCT_OFFSET(GRenderingLineClass, rendering_line_flags_changed), -                 NULL, NULL, -                 g_cclosure_marshal_VOID__VOID, -                 G_TYPE_NONE, 0, NULL); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = instance à initialiser.                               * -*                                                                             * -*  Description : Initialise une instance de ligne de représentation.          * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void g_rendering_line_init(GRenderingLine *line) -{ -    DL_LIST_ITEM_INIT(&line->link); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Fournit l'adresse physique ou en mémoire d'une ligne.        * -*                                                                             * -*  Retour      : Position physique ou en mémoire associée à la ligne.         * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -vmpa_t get_rendering_line_address(const GRenderingLine *line) -{ -    return line->offset; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Fournit la longueur du code représenté par une ligne.        * -*                                                                             * -*  Retour      : Taille du code représenté (0 si aucun).                      * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -off_t get_rendering_line_length(const GRenderingLine *line) -{ -    return line->length; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Fournit le commentaire associé à la ligne s'il existe.       * -*                                                                             * -*  Retour      : Chaîne de caractères ou NULL.                                * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -const char *get_rendering_line_comment(const GRenderingLine *line) -{ -    return line->comment; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line    = ligne dont les informations sont à consulter.      * -*                comment = nouveau commentaire à insérer ou NULL.             * -*                                                                             * -*  Description : Définit ou supprime un commentaire pour la ligne indiquée.   * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void set_rendering_line_comment(GRenderingLine *line, const char *comment) -{ -    if (line->comment != NULL) -        free(line->comment); - -    if (comment == NULL) line->comment = NULL; -    else line->comment = strdup(comment); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Fournit le type d'une ligne.                                 * -*                                                                             * -*  Retour      : Type de la ligne fournie.                                    * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -RenderingLineType get_rendering_line_type(const GRenderingLine *line) -{ -    return line->type; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à mettre à jour.     * -*                flag = extension d'information à ajouter.                    * -*                                                                             * -*  Description : Ajoute une information supplémentaire à une ligne.           * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_add_flag(GRenderingLine *line, RenderingLineFlag flag) -{ -    line->flags |= flag; - -    g_signal_emit_by_name(line, "rendering-line-flags-changed"); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à mettre à jour.     * -*                flag = extension d'information à retirer.                    * -*                                                                             * -*  Description : Retire une information supplémentaire sur d'une ligne.       * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_remove_flag(GRenderingLine *line, RenderingLineFlag flag) -{ -    line->flags &= ~flag; - -    g_signal_emit_by_name(line, "rendering-line-flags-changed"); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à mettre à jour.     * -*                flag = extension d'information à ajouter ou retirer.         * -*                                                                             * -*  Description : Bascule l'état d'une information sur d'une ligne.            * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_toggle_flag(GRenderingLine *line, RenderingLineFlag flag) -{ -    line->flags = (line->flags & ~flag) | (line->flags ^ flag); - -    g_signal_emit_by_name(line, "rendering-line-flags-changed"); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Fournit les informations supplémentaires d'une ligne.        * -*                                                                             * -*  Retour      : Extensions d'informations courantes.                         * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -RenderingLineFlag g_rendering_line_get_flags(const GRenderingLine *line) -{ -    return line->flags; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                src  = ligne visée par la liaison (côté origine).            * -*                                                                             * -*  Description : Etablit un lien entre deux lignes de représentation.         * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_add_link_reference(GRenderingLine *line, GRenderingLine *src) -{ -    line->from = (GRenderingLine **)realloc(line->from, ++line->from_count * sizeof(GRenderingLine *)); - -    line->from[line->from_count - 1] = src; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                dest = ligne visée par la liaison (côté destination).        * -*                type = type de lien à construire.                            * -*                                                                             * -*  Description : Etablit un lien entre deux lignes de représentation.         * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_link_with(GRenderingLine *line, GRenderingLine *dest, InstructionLinkType type) -{ -    g_rendering_line_add_link_reference(dest, line); - -    line->to_count++; - -    line->to = (GRenderingLine **)realloc(line->to, line->to_count * sizeof(GRenderingLine *)); -    line->links_type = (InstructionLinkType *)realloc(line->links_type, line->to_count * sizeof(InstructionLinkType)); - -    line->to[line->to_count - 1] = dest; -    line->links_type[line->to_count - 1] = type; - - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Indique si la ligne a une ou plusieurs origines.             * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -bool g_rendering_line_has_sources(const GRenderingLine *line) -{ -    return (line->from_count > 0); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line = ligne dont les informations sont à consulter.         * -*                                                                             * -*  Description : Indique si la ligne a une suite autre que la ligne suivante. * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -bool g_rendering_line_has_destinations(const GRenderingLine *line) -{ -    return (line->to_count > 1 || (line->to_count == 1 && line->links_type[0] != ILT_CALL)); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : line   = ligne dont les informations sont à consulter.       * -*                lines  = liste des lignes de destination. [OUT]              * -*                types  = liste des types de liens présents. [OUT]            * -*                                                                             * -*  Description : Fournit la ligne de code de destination du lien de la ligne. * -*                                                                             * -*  Retour      : Ligne à l'autre extrémité du lien.                           * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -size_t g_rendering_line_get_destinations(const GRenderingLine *line, GRenderingLine ***lines, InstructionLinkType **types) -{ -    *lines = line->to; -    *types = line->links_type; - -    return line->to_count; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/*                          TRAITEMENT DES LIGNES PAR GROUPE                          */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes à compléter, ou NULL.                * -*                line  = nouvelle ligne à intégrer à l'ensemble.              * -*                                                                             * -*  Description : Ajoute une ligne à un ensemble existant.                     * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : La ligne est considérée comme étant insérée au bon endroit.  * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_add_to_lines(GRenderingLine **lines, GRenderingLine *line) -{ -    lines_list_add_tail(line, lines); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes à compléter, ou NULL.                * -*                line  = nouvelle ligne à intégrer à l'ensemble.              * -*                first = position de la ligne en cas d'adresse partagée.      * -*                                                                             * -*  Description : Insère une ligne dans un ensemble existant.                  * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_insert_into_lines(GRenderingLine **lines, GRenderingLine *line, bool first) -{ -    GRenderingLine *iter;                   /* Boucle de parcours          */ - -    lines_list_for_each(iter, *lines) -    { -        if (first && iter->offset >= line->offset) break; -        else if (!first) -        { -            /* TODO */; -        } - -    } - -    if (iter == NULL) -        lines_list_add_tail(line, lines); - -    else -    { -        if (first) -            lines_list_add_before(line, lines, iter); -        else -            /* TODO */; -    } - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes à compléter, ou NULL.                * -*                new   = nouvelles lignes à intégrer à l'ensemble.            * -*                                                                             * -*  Description : Insère des lignes dans un ensemble existant.                 * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_insert_lines(GRenderingLine **lines, GRenderingLine **new) -{ -    GRenderingLine *iter;                   /* Boucle de parcours          */ -    GRenderingLine *next;                   /* Ligne suivante à traiter    */ - -    lines_list_for_each_safe(iter, new, next) -    { -        lines_list_del(iter, new); -        g_rendering_line_insert_into_lines(lines, iter, true); -    } - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes à traiter.                           * -*                start = borne inférieure de l'intervalle (incluse).          * -*                end   = borne supérieure de l'intervalle (incluse).          * -*                                                                             * -*  Description : Supprime une série de lignes comprises dans un intervalle.   * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_remove_range(GRenderingLine **lines, vmpa_t start, vmpa_t end) -{ -    GRenderingLine *first;                  /* Première ligne à traiter    */ -    GRenderingLine *last;                   /* Dernière ligne à traiter    */ -    GRenderingLine *iter;                   /* Boucle de parcours          */ -    GRenderingLine *next;                   /* Ligne suivante à traiter    */ - -    first = g_rendering_line_find_by_address(*lines, NULL, start); -    last = g_rendering_line_find_by_address(*lines, NULL, end); - -    for (iter = first; iter != NULL; iter = next) -    { -        next = g_rendering_line_get_next_iter(*lines, iter, last); - -        lines_list_del(iter, lines); -        g_object_unref(G_OBJECT(iter)); - -    } - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines1 = première liste à fusionner.                         * -*                lines2 = seconde liste à intégrer à la première.             * -*                                                                             * -*  Description : Fusionne deux listes de lignes de rendu.                     * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_rendering_line_merge(GRenderingLine **lines1, GRenderingLine **lines2) -{ -    lines_list_merge(lines1, lines2); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes de représentation à actualiser.      * -*              : iter  = position actuelle dans la liste.                     * -*                last  = dernière élément imposé du parcours ou NULL.         * -*                                                                             * -*  Description : Fournit l'élement suivant un autre pour un parcours.         * -*                                                                             * -*  Retour      : Elément suivant ou NULL si aucun.                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRenderingLine *iter, const GRenderingLine *last) -{ -    GRenderingLine *result;                 /* Elément suivant à renvoyer  */ - -    if (iter == NULL) iter = lines; - -    if (iter == last) result = NULL; -    else result = lines_list_next_iter(iter, lines); - -    return result; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes de représentation à actualiser.      * -*              : iter  = position actuelle dans la liste.                     * -*                last  = dernière élément imposé du parcours ou NULL.         * -*                                                                             * -*  Description : Fournit l'élement précédant un autre pour un parcours.       * -*                                                                             * -*  Retour      : Elément suivant ou NULL si aucun.                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GRenderingLine *g_rendering_line_get_prev_iter(GRenderingLine *lines, const GRenderingLine *iter, const GRenderingLine *last) -{ -    GRenderingLine *result;                 /* Elément suivant à renvoyer  */ - -    if (iter == NULL) -    { -        if (last != NULL) iter = last; -        else iter = lines_list_last(lines); -    } - -    if (iter == lines) result = NULL; -    else result = lines_list_prev_iter(iter, lines); - -    return result; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes de représentation à actualiser.      * -*                last  = dernière élément imposé du parcours ou NULL.         * -*                                                                             * -*  Description : Fournit le dernier élément d'une liste de lignes.            * -*                                                                             * -*  Retour      : Dernier élément de la liste.                                 * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GRenderingLine *g_rendering_line_get_last_iter(GRenderingLine *lines, GRenderingLine *last) -{ -    return (last != NULL ? last : lines_list_last(lines)); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : lines = liste de lignes à parcourir.                         * -*                last  = dernière élément imposé du parcours ou NULL.         * -*                addr  = position en mémoire ou physique à chercher.          * -*                                                                             * -*  Description : Recherche une ligne d'après sa position en mémoire/physique. * -*                                                                             * -*  Retour      : Ligne représentant l'adresse donnée, NULL si aucune trouvée. * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GRenderingLine *g_rendering_line_find_by_address(GRenderingLine *lines, const GRenderingLine *last, vmpa_t addr) -{ -    GRenderingLine *result;                 /* Trouvaille à retourner      */ - -    lines_list_for_each(result, lines) -    { -        if (result->offset <= addr && addr < (result->offset + result->length)) break; - -        if (result == last) -        { -            result = NULL; -            break; -        } - -    } - -    return result; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : start = première ligne de l'ensemble à parcourir.            * -*                last  = dernière élément imposé du parcours ou NULL.         * -*                                                                             * -*  Description : Donne la première ligne de code correspondant à une adresse. * -*                                                                             * -*  Retour      : Ligne de code pour l'adresse donnée, NULL si aucune trouvée. * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GRenderingLine *g_rendering_line_loop_for_code(GRenderingLine *start, const GRenderingLine *last) -{ -    GRenderingLine *result;                 /* Trouvaille à retourner      */ -    vmpa_t reference;                       /* Adresse à conserver         */ - -    result = start; -    reference = start->offset; - -    lines_list_for_each(result, start) -    { -        if (G_IS_CODE_LINE(result)) break; - -        if (result->offset != reference) -        { -            result = NULL; -            break; -        } - -        if (result == last) -        { -            result = NULL; -            break; -        } - -    } - -    return result; - -} | 
