/* Chrysalide - Outil d'analyse de fichiers binaires * options.c - options de rendus des lignes de code * * Copyright (C) 2018-2024 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Chrysalide is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Chrysalide. If not, see . */ #include "options.h" #include #include #include #include "options-int.h" /* Initialise la classe des options pour le rendu des lignes. */ static void g_display_options_class_init(GDisplayOptionsClass *); /* Initialise une instance d'options pour le rendu des lignes. */ static void g_display_options_init(GDisplayOptions *); /* Supprime toutes les références externes. */ static void g_display_options_dispose(GDisplayOptions *); /* Procède à la libération totale de la mémoire. */ static void g_display_options_finalize(GDisplayOptions *); /* Indique le type défini pour une ligne de représentation. */ G_DEFINE_TYPE(GDisplayOptions, g_display_options, G_TYPE_OBJECT); /****************************************************************************** * * * Paramètres : klass = classe à initialiser. * * * * Description : Initialise la classe des options pour le rendu des lignes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_display_options_class_init(GDisplayOptionsClass *klass) { GObjectClass *object; /* Autre version de la classe */ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_display_options_dispose; object->finalize = (GObjectFinalizeFunc)g_display_options_finalize; g_signal_new("state-changed", G_TYPE_DISPLAY_OPTIONS, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GDisplayOptionsClass, state_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } /****************************************************************************** * * * Paramètres : options = instance à initialiser. * * * * Description : Initialise une instance d'options pour le rendu des lignes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_display_options_init(GDisplayOptions *options) { options->names = NULL; options->values = NULL; options->count = 0; } /****************************************************************************** * * * Paramètres : options = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_display_options_dispose(GDisplayOptions *options) { G_OBJECT_CLASS(g_display_options_parent_class)->dispose(G_OBJECT(options)); } /****************************************************************************** * * * Paramètres : options = instance d'objet GLib à traiter. * * * * Description : Procède à la libération totale de la mémoire. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_display_options_finalize(GDisplayOptions *options) { size_t i; /* Boucle de parcours */ for (i = 0; i < options->count; i++) free(options->names[i]); if (options->names != NULL) free(options->names); if (options->values != NULL) free(options->values); G_OBJECT_CLASS(g_display_options_parent_class)->finalize(G_OBJECT(options)); } /****************************************************************************** * * * Paramètres : options = ensemble d'options à initialiser pleinement. * * names = désignation humaine de chaque option d'affichage. * * values = valeur initiale de chacune de ces options. * * count = quantité d'options prises en compte. * * * * Description : Met en place un groupe d'options pour le rendu des lignes. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool g_display_options_create(GDisplayOptions *options, const char **names, const bool *values, size_t count) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours */ result = true; options->names = malloc(count * sizeof(char *)); options->values = malloc(count * sizeof(bool)); options->count = count; for (i = 0; i < count; i++) { options->names[i] = strdup(names[i]); options->values[i] = values[i]; } return result; } /****************************************************************************** * * * Paramètres : options = options à consulter. * * * * Description : Dénombre la quantité d'options représentées. * * * * Retour : Quantité positive ou nulle. * * * * Remarques : - * * * ******************************************************************************/ size_t g_display_options_count(const GDisplayOptions *options) { size_t result; /* Quantité à retourner */ result = options->count; return result; } /****************************************************************************** * * * Paramètres : options = options à consulter. * * index = indice de l'option concernée. * * * * Description : Fournit la désignation d'une option donnée. * * * * Retour : Nom humainement lisible. * * * * Remarques : - * * * ******************************************************************************/ const char *g_display_options_get_name(const GDisplayOptions *options, size_t index) { char *result; /* Désignation à retourner */ assert(index < options->count); if (index < options->count) result = options->names[index]; else result = NULL; return result; } /****************************************************************************** * * * Paramètres : options = options à consulter. * * index = indice de l'option concernée. * * * * Description : Fournit la valeur d'une option donnée. * * * * Retour : Valeur attribuée. * * * * Remarques : - * * * ******************************************************************************/ bool g_display_options_get(const GDisplayOptions *options, size_t index) { bool result; /* Valeur à renvoyer */ assert(index < options->count); if (index < options->count) result = options->values[index]; else result = false; return result; } /****************************************************************************** * * * Paramètres : options = options à mettre à jour. * * index = indice de l'option concernée. * * value = nouvelle valeur à intégrer. * * * * Description : Définit la valeur d'une option donnée. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void g_display_options_set(GDisplayOptions *options, size_t index, bool value) { bool changed; /* Note un changement */ assert(index < options->count); if (index < options->count) { changed = (options->values[index] != value); options->values[index] = value; } else changed = false; if (changed) g_signal_emit_by_name(options, "state-changed"); }