diff options
Diffstat (limited to 'src/glibext/portion.c')
-rw-r--r-- | src/glibext/portion.c | 963 |
1 files changed, 105 insertions, 858 deletions
diff --git a/src/glibext/portion.c b/src/glibext/portion.c index 12e12fb..e5604b6 100644 --- a/src/glibext/portion.c +++ b/src/glibext/portion.c @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * binportion.c - représentation graphique de portions de binaire + * portion.c - représentation graphique de portions de binaire * - * Copyright (C) 2013-2019 Cyrille Bagard + * Copyright (C) 2013-2024 Cyrille Bagard * * This file is part of Chrysalide. * @@ -21,26 +21,26 @@ */ -#include "gbinportion.h" +#include "portion.h" #include <assert.h> #include <malloc.h> -#include <stdio.h> -#include <stdlib.h> +//#include <stdio.h> +//#include <stdlib.h> #include <string.h> #include <i18n.h> -#include "gbinportion-int.h" -#include "../analysis/human/asm/lang.h" +#include "portion-int.h" +//#include "../analysis/human/asm/lang.h" #include "../common/extstr.h" #include "../common/sort.h" -#include "../core/columns.h" -#include "../glibext/gbinarycursor.h" -#include "../glibext/linegen-int.h" +//#include "../core/columns.h" +//#include "../glibext/gbinarycursor.h" +//#include "../glibext/linegen-int.h" @@ -48,50 +48,16 @@ /* Initialise la classe des portions de données binaires. */ -static void g_binary_portion_class_init(GBinPortionClass *); +static void g_binary_portion_class_init(GBinaryPortionClass *); /* Initialise une instance de portion de données binaires. */ -static void g_binary_portion_init(GBinPortion *); - -/* Procède à l'initialisation de l'interface de génération. */ -static void g_binary_portion_interface_init(GLineGeneratorInterface *); +static void g_binary_portion_init(GBinaryPortion *); /* Supprime toutes les références externes. */ -static void g_binary_portion_dispose(GBinPortion *); +static void g_binary_portion_dispose(GBinaryPortion *); /* Procède à la libération totale de la mémoire. */ -static void g_binary_portion_finalize(GBinPortion *); - -#ifdef INCLUDE_GTK_SUPPORT - -/* Détermine l'aire d'une sous-portion. */ -static bool g_binary_portion_compute_sub_area(const GBinPortion *, phys_t, const GdkRectangle *, GdkRectangle *); - -#endif - - - -/* ------------------------ OFFRE DE CAPACITES DE GENERATION ------------------------ */ - - -/* Indique le nombre de ligne prêtes à être générées. */ -static size_t g_binary_portion_count_lines(const GBinPortion *); - -#ifdef INCLUDE_GTK_SUPPORT - -/* Retrouve l'emplacement correspondant à une position donnée. */ -static void g_binary_portion_compute_cursor(const GBinPortion *, gint, size_t, size_t, GLineCursor **); - -/* Détermine si le conteneur s'inscrit dans une plage donnée. */ -static int g_binary_portion_contain_cursor(const GBinPortion *, size_t, size_t, const GLineCursor *); - -#endif - -/* Renseigne sur les propriétés liées à un générateur. */ -static BufferLineFlags g_binary_portion_get_flags(const GBinPortion *, size_t, size_t); - -/* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_binary_portion_print(GBinPortion *, GBufferLine *, size_t, size_t, const GBinContent *); +static void g_binary_portion_finalize(GBinaryPortion *); @@ -99,20 +65,7 @@ static void g_binary_portion_print(GBinPortion *, GBufferLine *, size_t, size_t, /* Détermine si une portion contient une adresse donnée. */ -static bool g_binary_portion_contains_vmpa(const GBinPortion *, const vmpa2t *); - -#ifdef INCLUDE_GTK_SUPPORT - -/* Recherche la portion présente à une adresse donnée. */ -static GBinPortion *g_binary_portion_find_with_area_at_addr(GBinPortion *, const vmpa2t *, GdkRectangle *); - -/* Détermine si une portion contient une position donnée. */ -static bool g_binary_portion_contains_physical(const GBinPortion *, phys_t); - -/* Détermine si une portion contient une adresse donnée. */ -static bool g_binary_portion_contains_virtual(const GBinPortion *, virt_t); - -#endif +static bool g_binary_portion_contains_vmpa(const GBinaryPortion *, const vmpa2t *); @@ -122,8 +75,7 @@ static bool g_binary_portion_contains_virtual(const GBinPortion *, virt_t); /* Indique le type défini par la GLib pour les portions de données binaires. */ -G_DEFINE_TYPE_WITH_CODE(GBinPortion, g_binary_portion, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE(G_TYPE_LINE_GENERATOR, g_binary_portion_interface_init)); +G_DEFINE_TYPE(GBinaryPortion, g_binary_portion, G_TYPE_OBJECT); /****************************************************************************** @@ -138,7 +90,7 @@ G_DEFINE_TYPE_WITH_CODE(GBinPortion, g_binary_portion, G_TYPE_OBJECT, * * ******************************************************************************/ -static void g_binary_portion_class_init(GBinPortionClass *klass) +static void g_binary_portion_class_init(GBinaryPortionClass *klass) { GObjectClass *object; /* Autre version de la classe */ @@ -163,49 +115,21 @@ static void g_binary_portion_class_init(GBinPortionClass *klass) * * ******************************************************************************/ -static void g_binary_portion_init(GBinPortion *portion) +static void g_binary_portion_init(GBinaryPortion *portion) { vmpa2t dummy; /* Coquille presque vide */ - portion->code = NULL; - -#ifdef INCLUDE_GTK_SUPPORT - portion->icon = NULL; -#endif - portion->desc = NULL; - portion->text = NULL; - portion->lcount = 0; init_vmpa(&dummy, VMPA_NO_PHYSICAL, VMPA_NO_VIRTUAL); init_mrange(&portion->range, &dummy, VMPA_NO_VIRTUAL); portion->continued = false; -} - - -/****************************************************************************** -* * -* Paramètres : iface = interface GLib à initialiser. * -* * -* Description : Procède à l'initialisation de l'interface de génération. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ + portion->rights = PAC_NONE; -static void g_binary_portion_interface_init(GLineGeneratorInterface *iface) -{ - iface->count = (linegen_count_lines_fc)g_binary_portion_count_lines; -#ifdef INCLUDE_GTK_SUPPORT - iface->compute = (linegen_compute_fc)g_binary_portion_compute_cursor; - iface->contain = (linegen_contain_fc)g_binary_portion_contain_cursor; -#endif - iface->get_flags = (linegen_get_flags_fc)g_binary_portion_get_flags; - iface->print = (linegen_print_fc)g_binary_portion_print; + portion->subs = NULL; + portion->count = 0; } @@ -222,7 +146,7 @@ static void g_binary_portion_interface_init(GLineGeneratorInterface *iface) * * ******************************************************************************/ -static void g_binary_portion_dispose(GBinPortion *portion) +static void g_binary_portion_dispose(GBinaryPortion *portion) { size_t i; /* Boucle de parcours */ @@ -246,27 +170,11 @@ static void g_binary_portion_dispose(GBinPortion *portion) * * ******************************************************************************/ -static void g_binary_portion_finalize(GBinPortion *portion) +static void g_binary_portion_finalize(GBinaryPortion *portion) { - size_t i; /* Boucle de parcours */ - - if (portion->code != NULL) - free(portion->code); - -#ifdef INCLUDE_GTK_SUPPORT - if (portion->icon != NULL) - cairo_surface_destroy(portion->icon); -#endif - if (portion->desc != NULL) free(portion->desc); - for (i = 0; i < portion->lcount; i++) - free(portion->text[i]); - - if (portion->text != NULL) - free(portion->text); - if (portion->subs != NULL) free(portion->subs); @@ -277,8 +185,7 @@ static void g_binary_portion_finalize(GBinPortion *portion) /****************************************************************************** * * -* Paramètres : code = désignation humaine de la couleur de fond. * -* addr = emplacement de la section à conserver. * +* Paramètres : addr = emplacement de la section à conserver. * * size = taille de la section à conserver. * * * * Description : Crée une description de partie de code vierge. * @@ -289,15 +196,11 @@ static void g_binary_portion_finalize(GBinPortion *portion) * * ******************************************************************************/ -GBinPortion *g_binary_portion_new(const char *code, const vmpa2t *addr, phys_t size) +GBinaryPortion *g_binary_portion_new(const vmpa2t *addr, phys_t size) { - GBinPortion *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_BIN_PORTION, NULL); + GBinaryPortion *result; /* Structure à retourner */ - result->code = strdup(code); - - init_mrange(&result->range, addr, size); + result = g_object_new(G_TYPE_BINARY_PORTION, NULL); return result; @@ -306,89 +209,60 @@ GBinPortion *g_binary_portion_new(const char *code, const vmpa2t *addr, phys_t s /****************************************************************************** * * -* Paramètres : a = premières informations à consulter. * -* b = secondes informations à consulter. * +* Paramètres : portion = instance à initialiser pleinement. * +* addr = emplacement de la section à conserver. * +* size = taille de la section à conserver. * * * -* Description : Etablit la comparaison ascendante entre deux portions. * +* Description : Met en place une description de partie de code vierge. * * * -* Retour : Bilan : -1 (a < b), 0 (a == b) ou 1 (a > b). * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -int g_binary_portion_compare(const GBinPortion **a, const GBinPortion **b) +bool g_binary_portion_create(GBinaryPortion *portion, const vmpa2t *addr, phys_t size) { - int result; /* Bilan à retourner */ - const vmpa2t *addr_a; /* Adresse de la portion 'a' */ - const vmpa2t *addr_b; /* Adresse de la portion 'b' */ + bool result; /* Bilan à retourner */ - addr_a = get_mrange_addr(&(*a)->range); - addr_b = get_mrange_addr(&(*b)->range); + result = true; - result = cmp_vmpa(addr_a, addr_b); + init_mrange(&portion->range, addr, size); return result; } -#ifdef INCLUDE_GTK_SUPPORT - - /****************************************************************************** * * -* Paramètres : portion = description de partie à mettre à jour. * -* icon = image miniature de représentation à associer. * -* * -* Description : Attribue à la portion une éventuelle image de représentation.* -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_binary_portion_set_icon(GBinPortion *portion, cairo_surface_t *icon) -{ - if (icon != NULL) - portion->icon = cairo_surface_reference(icon); - - else - portion->icon = NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : portion = description de partie à consulter. * +* Paramètres : a = premières informations à consulter. * +* b = secondes informations à consulter. * * * -* Description : Fournit une éventuelle image de représentation de portion. * +* Description : Etablit la comparaison ascendante entre deux portions. * * * -* Retour : Image miniature de représentation associée. * +* Retour : Bilan : -1 (a < b), 0 (a == b) ou 1 (a > b). * * * * Remarques : - * * * ******************************************************************************/ -cairo_surface_t *g_binary_portion_get_icon(const GBinPortion *portion) +int g_binary_portion_compare(const GBinaryPortion **a, const GBinaryPortion **b) { - cairo_surface_t *result; + int result; /* Bilan à retourner */ + const vmpa2t *addr_a; /* Adresse de la portion 'a' */ + const vmpa2t *addr_b; /* Adresse de la portion 'b' */ - result = portion->icon; + addr_a = get_mrange_addr(&(*a)->range); + addr_b = get_mrange_addr(&(*b)->range); - if (result != NULL) - cairo_surface_reference(result); + result = cmp_vmpa(addr_a, addr_b); return result; } -#endif - - /****************************************************************************** * * * Paramètres : portion = description de partie à mettre à jour. * @@ -402,26 +276,11 @@ cairo_surface_t *g_binary_portion_get_icon(const GBinPortion *portion) * * ******************************************************************************/ -void g_binary_portion_set_desc(GBinPortion *portion, const char *desc) +void g_binary_portion_set_desc(GBinaryPortion *portion, const char *desc) { - size_t i; /* Boucle de parcours */ - GCodingLanguage *lang; /* Langage de sortie préféré */ - if (portion->desc != NULL) - { free(portion->desc); - for (i = 0; i < portion->lcount; i++) - free(portion->text[i]); - - if (portion->text != NULL) - { - free(portion->text); - portion->text = NULL; - } - - } - if (desc == NULL) portion->desc = NULL; @@ -432,40 +291,6 @@ void g_binary_portion_set_desc(GBinPortion *portion, const char *desc) if (portion->continued) portion->desc = stradd(portion->desc, _(" (continued)")); - /* Constitution du rendu */ - - portion->text = calloc(5, sizeof(char *)); - portion->lcount = 5; - - portion->text[0] = strdup("======================================================"); - portion->text[1] = strdup(""); - - asprintf(&portion->text[2], "%s (%s%s%s%s)", portion->desc, _("rights: "), - portion->rights & PAC_READ ? "r" : "-", - portion->rights & PAC_WRITE ? "w" : "-", - portion->rights & PAC_EXEC ? "x" : "-"); - - portion->text[3] = strdup(""); - portion->text[4] = strdup("======================================================"); - - /* Ajout de la touche "commentaires" */ - - lang = g_asm_language_new(); - - g_coding_language_encapsulate_comments(lang, &portion->text, &portion->lcount); - - g_object_unref(G_OBJECT(lang)); - - /* Ajout de deux bordures vides */ - - portion->lcount += 2; - portion->text = realloc(portion->text, portion->lcount * sizeof(char *)); - - memmove(&portion->text[1], &portion->text[0], (portion->lcount - 2) * sizeof(char *)); - - portion->text[0] = NULL; - portion->text[portion->lcount - 1] = NULL; - } } @@ -483,7 +308,7 @@ void g_binary_portion_set_desc(GBinPortion *portion, const char *desc) * * ******************************************************************************/ -const char *g_binary_portion_get_desc(const GBinPortion *portion) +const char *g_binary_portion_get_desc(const GBinaryPortion *portion) { return portion->desc; @@ -502,7 +327,7 @@ const char *g_binary_portion_get_desc(const GBinPortion *portion) * * ******************************************************************************/ -const mrange_t *g_binary_portion_get_range(const GBinPortion *portion) +const mrange_t *g_binary_portion_get_range(const GBinaryPortion *portion) { return &portion->range; @@ -521,7 +346,7 @@ const mrange_t *g_binary_portion_get_range(const GBinPortion *portion) * * ******************************************************************************/ -bool g_binary_portion_limit_range(GBinPortion *portion, phys_t max) +bool g_binary_portion_limit_range(GBinaryPortion *portion, phys_t max) { bool result; /* Bilan à retourner */ phys_t current; /* Taille courante */ @@ -552,7 +377,7 @@ bool g_binary_portion_limit_range(GBinPortion *portion, phys_t max) * * ******************************************************************************/ -void g_binary_portion_mark_as_continued(GBinPortion *portion, bool continued) +void g_binary_portion_mark_as_continued(GBinaryPortion *portion, bool continued) { portion->continued = continued; @@ -571,7 +396,7 @@ void g_binary_portion_mark_as_continued(GBinPortion *portion, bool continued) * * ******************************************************************************/ -bool g_binary_portion_is_continuation(const GBinPortion *portion) +bool g_binary_portion_is_continuation(const GBinaryPortion *portion) { return portion->continued; @@ -591,7 +416,7 @@ bool g_binary_portion_is_continuation(const GBinPortion *portion) * * ******************************************************************************/ -void g_binary_portion_set_rights(GBinPortion *portion, PortionAccessRights rights) +void g_binary_portion_set_rights(GBinaryPortion *portion, PortionAccessRights rights) { portion->rights = rights; @@ -610,199 +435,13 @@ void g_binary_portion_set_rights(GBinPortion *portion, PortionAccessRights right * * ******************************************************************************/ -PortionAccessRights g_binary_portion_get_rights(const GBinPortion *portion) +PortionAccessRights g_binary_portion_get_rights(const GBinaryPortion *portion) { return portion->rights; } -#ifdef INCLUDE_GTK_SUPPORT - - -/****************************************************************************** -* * -* Paramètres : portion = description de partie à mettre à jour. * -* tooltip = astuce à compléter. [OUT] * -* * -* Description : Prépare une astuce concernant une portion pour son affichage.* -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_binary_portion_query_tooltip(GBinPortion *portion, GtkTooltip *tooltip) -{ - char *markup; /* Description à construire */ - VMPA_BUFFER(value); /* Traduction en texte */ - - /* Nom */ - - if (portion->desc != NULL) - { - markup = strdup("<b>"); - markup = stradd(markup, portion->desc); - markup = stradd(markup, "</b>\n"); - markup = stradd(markup, "\n"); - - } - else markup = strdup(""); - - markup = stradd(markup, "taille : "); - mrange_length_to_string(&portion->range, MDS_UNDEFINED, value, NULL); - markup = stradd(markup, value); - markup = stradd(markup, "\n"); - - /* Localisation */ - - markup = stradd(markup, "<b>"); - markup = stradd(markup, _("Localisation")); - markup = stradd(markup, "</b>\n"); - - markup = stradd(markup, _("physical: from ")); - - mrange_phys_to_string(&portion->range, MDS_UNDEFINED, true, value, NULL); - markup = stradd(markup, value); - markup = stradd(markup, _(" to ")); - mrange_phys_to_string(&portion->range, MDS_UNDEFINED, false, value, NULL); - markup = stradd(markup, value); - markup = stradd(markup, "\n"); - - markup = stradd(markup, _("memory: from ")); - - mrange_virt_to_string(&portion->range, MDS_UNDEFINED, true, value, NULL); - markup = stradd(markup, value); - markup = stradd(markup, _(" to ")); - mrange_virt_to_string(&portion->range, MDS_UNDEFINED, false, value, NULL); - markup = stradd(markup, value); - - markup = stradd(markup, "\n\n"); - - /* Droits d'accès */ - - markup = stradd(markup, "<b>"); - markup = stradd(markup, _("Rights")); - markup = stradd(markup, "</b>\n"); - - snprintf(value, 2 * VMPA_MAX_SIZE, "%s%s%s", - portion->rights & PAC_READ ? "r" : "-", - portion->rights & PAC_WRITE ? "w" : "-", - portion->rights & PAC_EXEC ? "x" : "-"); - - markup = stradd(markup, value); - - /* Impression finale */ - - gtk_tooltip_set_markup(tooltip, markup); - free(markup); - -} - - -#ifdef INCLUDE_GTK_SUPPORT - - -/****************************************************************************** -* * -* Paramètres : portion = portion mère à consulter. * -* full = taille totale de la couche parente. * -* area = étendue de représentation de la portion mère. * -* sub_area = étendue de représentation de la portion fille. * -* * -* Description : Détermine l'aire d'une sous-portion. * -* * -* Retour : true si la sous-surface a été calculée correctement. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_binary_portion_compute_sub_area(const GBinPortion *portion, phys_t full, const GdkRectangle *area, GdkRectangle *sub_area) -{ - phys_t length; /* Taille de la portion */ - phys_t start; /* Position de départ */ - - length = get_mrange_length(&portion->range); - - /* On saute les portions comme le segment GNU_STACK... */ - if (length == 0) return false; - - start = get_phy_addr(get_mrange_addr(&portion->range)); - - sub_area->y = area->y; - sub_area->height = area->height; - - sub_area->x = area->x + (start * area->width) / full; - sub_area->width = (length * area->width) / full; - - return true; - -} - - -#endif - - -/****************************************************************************** -* * -* Paramètres : portion = description de partie à consulter. * -* context = contexte graphique associé à la procédure. * -* cr = contexte graphique pour le dessin. * -* area = étendue mise à disposition. * -* * -* Description : Représente la portion sur une bande dédiée. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_binary_portion_draw(const GBinPortion *portion, GtkStyleContext *context, cairo_t *cr, const GdkRectangle *area) -{ - phys_t full; /* Espace total représenté */ - size_t i; /* Boucle de parcours */ - GBinPortion *sub; /* Portion incluse à montrer */ - GdkRectangle sub_area; /* Etendue d'une sous-portion */ - - /* Dessin de la portion courante */ - - cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); - - gtk_style_context_save(context); - - if (portion->code != NULL) - gtk_style_context_add_class(context, portion->code); - - gtk_render_background(context, cr, area->x, area->y, area->width, area->height); - - gtk_render_frame(context, cr, area->x, area->y, area->width, area->height); - - gtk_style_context_restore(context); - - /* Dessin des portions contenues */ - - full = get_mrange_length(&portion->range); - - for (i = 0; i < portion->count; i++) - { - sub = portion->subs[i]; - - if (!g_binary_portion_compute_sub_area(sub, full, area, &sub_area)) - continue; - - g_binary_portion_draw(sub, context, cr, &sub_area); - - } - -} - - -#endif - - /****************************************************************************** * * * Paramètres : portion = portion principale à compléter. * @@ -810,14 +449,15 @@ void g_binary_portion_draw(const GBinPortion *portion, GtkStyleContext *context, * * * Description : Procède à l'inclusion d'une portion dans une autre. * * * -* Retour : - * +* Retour : Bilan de l'opération : true si inclusion, false sinon. * * * * Remarques : - * * * ******************************************************************************/ -void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) +bool g_binary_portion_include(GBinaryPortion *portion, GBinaryPortion *sub) { + bool result; /* Bilan à retourner */ bool found; /* Zone d'accueil trouvée ? */ size_t best; /* Meilleur point d'insertion */ size_t missed; /* Indice de zone à déplacer */ @@ -825,11 +465,11 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) vmpa2t end; /* Fin de la zone commune */ phys_t overlapping; /* Taille de la zone commune */ bool continued; /* Suite d'une découpe ? */ - GBinPortion *left_part; /* Partie intégrable */ + GBinaryPortion *left_part; /* Partie intégrable */ vmpa2t start; /* Départ de la seconde partie */ - GBinPortion *right_part; /* Partie restante */ + GBinaryPortion *right_part; /* Partie restante */ - int g_binary_portion_is_included(const GBinPortion **a, const GBinPortion **b) + int g_binary_portion_is_included(const GBinaryPortion **a, const GBinaryPortion **b) { int result; /* Bilan à retourner */ @@ -839,7 +479,7 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) } - found = bsearch_index(&sub, portion->subs, portion->count, sizeof(GBinPortion *), + found = bsearch_index(&sub, portion->subs, portion->count, sizeof(GBinaryPortion *), (__compar_fn_t)g_binary_portion_is_included, &best); if (!found) @@ -879,7 +519,7 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) * */ - int g_binary_portion_track_missed_inclusion(const GBinPortion **a, const GBinPortion **b) + int g_binary_portion_track_missed_inclusion(const GBinaryPortion **a, const GBinaryPortion **b) { int result; /* Bilan à retourner */ @@ -891,14 +531,15 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) do { - found = bsearch_index(&sub, portion->subs, portion->count, sizeof(GBinPortion *), + found = bsearch_index(&sub, portion->subs, portion->count, sizeof(GBinaryPortion *), (__compar_fn_t)g_binary_portion_track_missed_inclusion, &missed); if (found) { - g_binary_portion_include(sub, portion->subs[missed]); + result = g_binary_portion_include(sub, portion->subs[missed]); + assert(result); - portion->subs = _qdelete(portion->subs, &portion->count, sizeof(GBinPortion *), missed); + portion->subs = _qdelete(portion->subs, &portion->count, sizeof(GBinaryPortion *), missed); } @@ -916,7 +557,7 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) * de découper la portion qui déborde. */ - int g_binary_portion_track_partial_inclusion(const GBinPortion **a, const GBinPortion **b) + int g_binary_portion_track_partial_inclusion(const GBinaryPortion **a, const GBinaryPortion **b) { int result; /* Bilan à retourner */ @@ -926,7 +567,7 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) } - found = bsearch_index(&sub, portion->subs, portion->count, sizeof(GBinPortion *), + found = bsearch_index(&sub, portion->subs, portion->count, sizeof(GBinaryPortion *), (__compar_fn_t)g_binary_portion_track_partial_inclusion, &best); if (found) @@ -940,7 +581,7 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) /* Partie contenue */ - left_part = g_binary_portion_new(sub->code, get_mrange_addr(&sub->range), overlapping); + left_part = g_binary_portion_new(get_mrange_addr(&sub->range), overlapping); g_binary_portion_set_desc(left_part, sub->desc); g_binary_portion_mark_as_continued(left_part, continued); @@ -958,7 +599,7 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) copy_vmpa(&start, get_mrange_addr(&sub->range)); advance_vmpa(&start, overlapping); - right_part = g_binary_portion_new(sub->code, &start, get_mrange_length(&sub->range) - overlapping); + right_part = g_binary_portion_new(&start, get_mrange_length(&sub->range) - overlapping); if (!continued) g_binary_portion_mark_as_continued(right_part, true); @@ -972,22 +613,34 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) /* Inclusions des parties */ - g_binary_portion_include(portion, left_part); - g_binary_portion_include(portion, right_part); + result = g_binary_portion_include(portion, left_part); - g_object_unref(G_OBJECT(sub)); + if (result) + result = g_binary_portion_include(portion, right_part); + + unref_object(left_part); + unref_object(right_part); } else - portion->subs = qinsert(portion->subs, &portion->count, sizeof(GBinPortion *), + { + ref_object(sub); + + portion->subs = qinsert(portion->subs, &portion->count, sizeof(GBinaryPortion *), (__compar_fn_t)g_binary_portion_compare, &sub); + result = true; + + } + } /* Poursuite de l'inclusion dans la sous-portion adaptée... */ else - g_binary_portion_include(portion->subs[best], sub); + result = g_binary_portion_include(portion->subs[best], sub); + + return result; } @@ -1006,11 +659,11 @@ void g_binary_portion_include(GBinPortion *portion, GBinPortion *sub) * * ******************************************************************************/ -bool g_binary_portion_visit(GBinPortion *portion, visit_portion_fc visitor, void *data) +bool g_binary_portion_visit(GBinaryPortion *portion, visit_portion_fc visitor, void *data) { bool result; /* Etat à retourner */ - bool visit_portion(GBinPortion *p, GBinPortion *pp) + bool visit_portion(GBinaryPortion *p, GBinaryPortion *pp) { bool ret; /* Etat à retourner */ size_t i; /* Boucle de parcours */ @@ -1043,253 +696,10 @@ bool g_binary_portion_visit(GBinPortion *portion, visit_portion_fc visitor, void /* ---------------------------------------------------------------------------------- */ -/* OFFRE DE CAPACITES DE GENERATION */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : portion = 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_portion_count_lines(const GBinPortion *portion) -{ - return portion->lcount; - -} - - -#ifdef INCLUDE_GTK_SUPPORT - - -/****************************************************************************** -* * -* Paramètres : portion = générateur à consulter. * -* x = position géographique sur la ligne concernée. * -* index = indice de cette même ligne dans le tampon global. * -* repeat = indice d'utilisations successives du générateur. * -* cursor = emplacement à constituer. [OUT] * -* * -* Description : Retrouve l'emplacement correspondant à une position donnée. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_binary_portion_compute_cursor(const GBinPortion *portion, gint x, size_t index, size_t repeat, GLineCursor **cursor) -{ - *cursor = g_binary_cursor_new(); - - g_binary_cursor_update(G_BINARY_CURSOR(*cursor), get_mrange_addr(&portion->range)); - -} - - -/****************************************************************************** -* * -* Paramètres : portion = générateur à consulter. * -* index = indice de cette même ligne dans le tampon global. * -* repeat = indice d'utilisations successives du générateur. * -* cursor = emplacement à analyser. * -* * -* 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_portion_contain_cursor(const GBinPortion *portion, size_t index, size_t repeat, const GLineCursor *cursor) -{ - int result; /* Conclusion à retourner */ - vmpa2t addr; /* Autre emplacement à comparer*/ - - assert(G_IS_BINARY_CURSOR(cursor)); - - g_binary_cursor_retrieve(G_BINARY_CURSOR(cursor), &addr); - - result = cmp_vmpa(&addr, get_mrange_addr(&portion->range)); - - return result; - -} - - -#endif - - -/****************************************************************************** -* * -* Paramètres : portion = 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_portion_get_flags(const GBinPortion *portion, size_t index, size_t repeat) -{ - return (repeat == 0 ? BLF_WIDTH_MANAGER : BLF_NONE); - -} - - -/****************************************************************************** -* * -* Paramètres : portion = 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. * -* content = éventuel contenu binaire brut à imprimer. * -* * -* Description : Imprime dans une ligne de rendu le contenu représenté. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_binary_portion_print(GBinPortion *portion, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) -{ - assert(repeat < portion->lcount); - - g_buffer_line_fill_phys(line, DLC_PHYSICAL, MDS_32_BITS_UNSIGNED, get_mrange_addr(&portion->range)); - - g_buffer_line_fill_virt(line, DLC_VIRTUAL, MDS_32_BITS_UNSIGNED, get_mrange_addr(&portion->range)); - - if (portion->text[repeat] != NULL) - { - g_buffer_line_start_merge_at(line, DLC_ASSEMBLY_LABEL); - - g_buffer_line_append_text(line, DLC_ASSEMBLY_LABEL, SL(portion->text[repeat]), RTT_COMMENT, NULL); - - } - -} - - - -/* ---------------------------------------------------------------------------------- */ /* PARCOURS D'ENSEMBLES DE PORTIONS */ /* ---------------------------------------------------------------------------------- */ -#ifdef INCLUDE_GTK_SUPPORT - - -/****************************************************************************** -* * -* Paramètres : portion = couche de portions à parcourir pour les recherches.* -* * -* Description : Compte le nombre de portions présentes dans une arborescence.* -* * -* Retour : Quantité de portions présentes. * -* * -* Remarques : - * -* * -******************************************************************************/ - -size_t g_binary_portion_count(const GBinPortion *portion) -{ - size_t result; /* Quantité à retourner */ - - - size_t measure_portion_size(const GBinPortion *root) - { - size_t count; /* Nombre de trouvailles */ - size_t i; /* Boucle de parcours */ - - count = 1; - - for (i = 0; i < root->count; i++) - count += measure_portion_size(root->subs[i]); - - return count; - - } - - - result = measure_portion_size(portion); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : portion = couche de portions à parcourir pour les recherches.* -* x = abscisse du point de recherche. * -* area = étendue de portion mère, puis celle trouvée. [OUT] * -* * -* Description : Recherche la portion présente à un point donné. * -* * -* Retour : Portion trouvée à l'endroit indiqué. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GBinPortion *g_binary_portion_find_at_pos(GBinPortion *portion, gint x, GdkRectangle *area) -{ - GBinPortion *result; /* Portion à retourner */ - phys_t full; /* Espace total représenté */ - size_t i; /* Boucle de parcours */ - GBinPortion *sub; /* Portion incluse à traiter */ - GdkRectangle sub_area; /* Etendue d'une sous-portion */ - - result = NULL; - - full = get_mrange_length(&portion->range); - - for (i = 0; i < portion->count && result == NULL; i++) - { - sub = portion->subs[i]; - - if (!g_binary_portion_compute_sub_area(sub, full, area, &sub_area)) - continue; - - if (sub_area.x <= x && x < (sub_area.x + sub_area.width)) - { - result = g_binary_portion_find_at_pos(sub, x, &sub_area); - - if (result != NULL) - *area = sub_area; - - } - - } - - if (result == NULL) - { - result = portion; - g_object_ref(G_OBJECT(result)); - } - - return result; - -} - - -#endif - - /****************************************************************************** * * * Paramètres : portion = portion mère à consulter. * @@ -1303,7 +713,7 @@ GBinPortion *g_binary_portion_find_at_pos(GBinPortion *portion, gint x, GdkRecta * * ******************************************************************************/ -static bool g_binary_portion_contains_vmpa(const GBinPortion *portion, const vmpa2t *addr) +static bool g_binary_portion_contains_vmpa(const GBinaryPortion *portion, const vmpa2t *addr) { bool result; /* Bilan à retourner */ const mrange_t *range; /* Emplacement de portion */ @@ -1338,16 +748,16 @@ static bool g_binary_portion_contains_vmpa(const GBinPortion *portion, const vmp * * ******************************************************************************/ -GBinPortion *g_binary_portion_find_at_addr(GBinPortion *portion, const vmpa2t *addr) +GBinaryPortion *g_binary_portion_find_at_addr(GBinaryPortion *portion, const vmpa2t *addr) { - GBinPortion *result; /* Portion à retourner */ - phys_t full; /* Espace total représenté */ - size_t i; /* Boucle de parcours #1 */ - GBinPortion *sub; /* Portion incluse à traiter */ + GBinaryPortion *result; /* Portion à retourner */ + size_t i; /* Boucle de parcours */ + GBinaryPortion *sub; /* Portion incluse à traiter */ result = NULL; - full = get_mrange_length(&portion->range); + if (!g_binary_portion_contains_vmpa(portion, addr)) + goto done; for (i = 0; i < portion->count && result == NULL; i++) { @@ -1363,65 +773,10 @@ GBinPortion *g_binary_portion_find_at_addr(GBinPortion *portion, const vmpa2t *a if (result == NULL) { result = portion; - g_object_ref(G_OBJECT(result)); + ref_object(result); } - return result; - -} - - -#ifdef INCLUDE_GTK_SUPPORT - - -/****************************************************************************** -* * -* Paramètres : portion = couche de portions à parcourir pour les recherches.* -* addr = adresse du point de recherche. * -* area = étendue de portion mère, puis celle trouvée. [OUT] * -* * -* Description : Recherche la portion présente à une adresse donnée. * -* * -* Retour : Portion trouvée à l'endroit indiqué. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GBinPortion *g_binary_portion_find_with_area_at_addr(GBinPortion *portion, const vmpa2t *addr, GdkRectangle *area) -{ - GBinPortion *result; /* Portion à retourner */ - phys_t full; /* Espace total représenté */ - size_t i; /* Boucle de parcours #1 */ - GBinPortion *sub; /* Portion incluse à traiter */ - GdkRectangle sub_area; /* Etendue d'une sous-portion */ - - result = NULL; - - full = get_mrange_length(&portion->range); - - for (i = 0; i < portion->count && result == NULL; i++) - { - sub = portion->subs[i]; - - if (!g_binary_portion_contains_vmpa(sub, addr)) - continue; - - if (!g_binary_portion_compute_sub_area(sub, full, area, &sub_area)) - continue; - - result = g_binary_portion_find_with_area_at_addr(sub, addr, &sub_area); - - if (result != NULL) - *area = sub_area; - - } - - if (result == NULL) - { - result = portion; - g_object_ref(G_OBJECT(result)); - } + done: return result; @@ -1430,114 +785,6 @@ static GBinPortion *g_binary_portion_find_with_area_at_addr(GBinPortion *portion /****************************************************************************** * * -* Paramètres : root = couche de portions à parcourir pour les recherches. * -* x = abscisse du point de recherche. * -* area = étendue de représentation de la portion mère. * -* addr = adresse correspondante. [OUT] * -* * -* Description : Fournit la position correspondant à une adresse donnée. * -* * -* Retour : Succès de la traduction. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool get_binary_portion_addr_from_pos(GBinPortion *root, gint x, const GdkRectangle *area, vmpa2t *addr) -{ - GdkRectangle owner_area; /* Aire de contenance */ - GBinPortion *owner; /* Conteneur propriétaire */ - - owner_area = *area; - - owner = g_binary_portion_find_at_pos(root, x, &owner_area); - if (owner == NULL) return false; - - copy_vmpa(addr, get_mrange_addr(&owner->range)); - - advance_vmpa(addr, (get_mrange_length(&owner->range) * (x - owner_area.x)) / owner_area.width); - - g_object_unref(G_OBJECT(owner)); - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : root = couche de portions à parcourir pour les recherches. * -* addr = adresse du point de recherche. * -* area = étendue de représentation de la portion mère. * -* x = position correspondante. [OUT] * -* * -* Description : Fournit l'adresse correspondant à une position donnée. * -* * -* Retour : Succès de la traduction. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool get_binary_portion_pos_from_addr(GBinPortion *root, const vmpa2t *addr, const GdkRectangle *area, gint *x) -{ - GdkRectangle owner_area; /* Aire de contenance */ - GBinPortion *owner; /* Conteneur propriétaire */ - phys_t diff; /* Décalage à appliquer */ - - owner_area = *area; - - owner = g_binary_portion_find_with_area_at_addr(root, addr, &owner_area); - if (owner == NULL) return false; - - diff = compute_vmpa_diff(addr, get_mrange_addr(&owner->range)); - - *x = owner_area.x + (diff * owner_area.width) / get_mrange_length(&owner->range); - - g_object_unref(G_OBJECT(owner)); - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : layer = couche de portions à consulter. * -* x = abscisse du point de recherche. * -* y = ordonnée du point de recherche. * -* area = étendue de représentation de la portion mère. * -* tooltip = astuce à compléter. [OUT] * -* * -* Description : Prépare une astuce concernant une portion pour son affichage.* -* * -* Retour : TRUE pour valider l'affichage. * -* * -* Remarques : - * -* * -******************************************************************************/ - -gboolean query_tooltip_for_binary_portion(GBinPortion *root, gint x, gint y, const GdkRectangle *area, GtkTooltip *tooltip) -{ - GBinPortion *selected; /* Portion à décrire ici */ - - selected = g_binary_portion_find_at_pos(root, x, (GdkRectangle []) { *area }); - if (selected == NULL) return FALSE; - - g_binary_portion_query_tooltip(selected, tooltip); - - g_object_unref(G_OBJECT(selected)); - - return TRUE; - -} - - -#endif - - -/****************************************************************************** -* * * Paramètres : portion = portion mère à consulter. * * off = position physique du point de recherche. * * * @@ -1549,7 +796,7 @@ gboolean query_tooltip_for_binary_portion(GBinPortion *root, gint x, gint y, con * * ******************************************************************************/ -static bool g_binary_portion_contains_physical(const GBinPortion *portion, phys_t off) +static bool g_binary_portion_contains_physical(const GBinaryPortion *portion, phys_t off) { bool result; /* Bilan à retourner */ const mrange_t *range; /* Emplacement de portion */ @@ -1583,11 +830,11 @@ static bool g_binary_portion_contains_physical(const GBinPortion *portion, phys_ * * ******************************************************************************/ -bool g_binary_portion_translate_offset_into_vmpa(const GBinPortion *portion, phys_t off, vmpa2t *pos) +bool g_binary_portion_translate_offset_into_vmpa(const GBinaryPortion *portion, phys_t off, vmpa2t *pos) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours #1 */ - GBinPortion *sub; /* Portion incluse à traiter */ + GBinaryPortion *sub; /* Portion incluse à traiter */ const mrange_t *range; /* Emplacement de portion */ const vmpa2t *addr; /* Départ de la portion */ @@ -1643,7 +890,7 @@ bool g_binary_portion_translate_offset_into_vmpa(const GBinPortion *portion, phy * * ******************************************************************************/ -static bool g_binary_portion_contains_virtual(const GBinPortion *portion, virt_t virt) +static bool g_binary_portion_contains_virtual(const GBinaryPortion *portion, virt_t virt) { bool result; /* Bilan à retourner */ const mrange_t *range; /* Emplacement de portion */ @@ -1677,11 +924,11 @@ static bool g_binary_portion_contains_virtual(const GBinPortion *portion, virt_t * * ******************************************************************************/ -bool g_binary_portion_translate_address_into_vmpa(const GBinPortion *portion, virt_t virt, vmpa2t *pos) +bool g_binary_portion_translate_address_into_vmpa(const GBinaryPortion *portion, virt_t virt, vmpa2t *pos) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours #1 */ - GBinPortion *sub; /* Portion incluse à traiter */ + GBinaryPortion *sub; /* Portion incluse à traiter */ const mrange_t *range; /* Emplacement de portion */ const vmpa2t *addr; /* Départ de la portion */ |