summaryrefslogtreecommitdiff
path: root/src/analysis/line.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/line.c')
-rw-r--r--src/analysis/line.c717
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;
-
-}