diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-01-28 23:32:25 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-01-28 23:32:25 (GMT) |
commit | 16e0fd9d89ef433848678dfc8dd20426844a2868 (patch) | |
tree | 79075ae02c133cea21ffb555b1086aae833b3aac /tools/d2c/conv.c | |
parent | 66c99d59d6a6d533de0bb65488de8243213bcdea (diff) |
Cleaned, rewritten and improved the whole code of the compiler.
Diffstat (limited to 'tools/d2c/conv.c')
-rw-r--r-- | tools/d2c/conv.c | 518 |
1 files changed, 0 insertions, 518 deletions
diff --git a/tools/d2c/conv.c b/tools/d2c/conv.c deleted file mode 100644 index 3fae6df..0000000 --- a/tools/d2c/conv.c +++ /dev/null @@ -1,518 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * conv.c - substitutions de valeurs depuis un contenu binaire - * - * Copyright (C) 2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 "conv.h" - - -#include <assert.h> -#include <ctype.h> -#include <malloc.h> -#include <stdbool.h> -#include <string.h> - - -#include "helpers.h" -#include "qckcall.h" - - - -/* ---------------------------- CONVERSION DES ARGUMENTS ---------------------------- */ - - -/* Fonction de conversion */ -struct _conv_func -{ - bool declared; /* Expression déjà déclarée ? */ - bool defined; /* Expression déjà définie ? */ - - char *dest; /* Variable de destination */ - - bool is_expr; /* Choix du contenu réel */ - - union - { - arg_expr_t *expr; /* Valeur expressive directe */ - - struct - { - char *name; /* Fonction de conversion */ - arg_list_t *args; /* Liste des arguments */ - - }; - - }; - -}; - - - -/* ---------------------------- ENSEMBLES DE CONVERSIONS ---------------------------- */ - - -/* Liste des fonctions de conversions présentes */ -struct _conv_list -{ - conv_func **functions; /* Fonctions de conversion */ - size_t func_count; /* Nombre de ces fonctions */ - -}; - - - -/* ---------------------------------------------------------------------------------- */ -/* CONVERSION DES ARGUMENTS */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : dest = désignation de la variable de destination. * -* expr = expression dont la valeur est à assigner. * -* * -* Description : Définit une conversion à partir d'une simple expression. * -* * -* Retour : Structure mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -conv_func *make_conv_from_expr(char *dest, arg_expr_t *expr) -{ - conv_func *result; /* Conversion à retourner */ - - result = (conv_func *)calloc(1, sizeof(conv_func)); - - result->dest = make_string_lower(dest); - - result->is_expr = true; - result->expr = expr; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : dest = désignation de la variable de destination. * -* func = nom de la fonction assurant le calcul de valeur. * -* args = argument(s) à fournir à cette fonction. * -* * -* Description : Définit une conversion à partir d'une function à appeler. * -* * -* Retour : Structure mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -conv_func *make_conv_from_func(char *dest, char *func, arg_list_t *args) -{ - conv_func *result; /* Conversion à retourner */ - - result = (conv_func *)calloc(1, sizeof(conv_func)); - - result->dest = make_string_lower(dest); - - result->is_expr = false; - result->name = func; - result->args = args; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : func = éléments de conversion à supprimer de la mémoire. * -* * -* Description : Libère de la mémoire une conversion enregistrée. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void delete_conv_func(conv_func *func) -{ - if (func->is_expr) - delete_arg_expr(func->expr); - - else - { - free(func->name); - delete_arg_list(func->args); - } - - free(func); - -} - - -/****************************************************************************** -* * -* Paramètres : func = fonction de conversion à consulter. * -* * -* Description : Indique la variable de destination d'une conversion. * -* * -* Retour : Désignation humaine de la variable de destination. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *get_conv_dest_name(const conv_func *func) -{ - return func->dest; - -} - - -/****************************************************************************** -* * -* Paramètres : func = fonction de conversion à consulter. * -* * -* Description : Indique la nature d'une conversion : fonction ou expression ?* -* * -* Retour : Indication sur la constitution interne de la conversion. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool is_conv_func_expression(const conv_func *func) -{ - return func->is_expr; - -} - - -/****************************************************************************** -* * -* Paramètres : func = fonction de conversion à consulter. * -* bits = gestionnaire des bits d'encodage. * -* list = liste de l'ensemble des fonctions de conversion. * -* size = taille déterminée avec précision. [OUT] * -* * -* Description : Détermine la taille en bits du résultat d'une fonction. * -* * -* Retour : true si la taille a pu être déterminée, false sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool compute_conv_func_size(const conv_func *func, const coding_bits *bits, const conv_list *list, unsigned int *size) -{ - bool result; /* Bilan à retourner */ - - result = func->is_expr; - - if (result) - result = compute_arg_expr_size(func->expr, bits, list, size); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : func = fonction de conversion à manipuler. * -* bits = gestionnaire des bits d'encodage. * -* list = liste de l'ensemble des fonctions de conversion. * -* * -* Description : Marque les champs utilisés par une fonction de conversion. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool mark_conv_func(conv_func *func, const coding_bits *bits, const conv_list *list) -{ - bool result; /* Bilan à remonter */ - - if (func->is_expr) - result = ensure_arg_expr_content_fully_marked(func->expr, bits, list); - else - result = ensure_arg_list_content_fully_marked(func->args, bits, list); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : func = fonction de conversion à manipuler. * -* fd = descripteur d'un flux ouvert en écriture. * -* bits = gestionnaire des bits d'encodage. * -* list = liste de l'ensemble des fonctions de conversion. * -* wide = taille des mots décodés. * -* * -* Description : Déclare les variables associées à une fonction de conversion.* -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const conv_list *list, unsigned int wide) -{ - bool result; /* Bilan à remonter */ - - /* Si la fonction a déjà été définie lors d'un précédent besoin... */ - if (func->declared) return true; - - if (func->is_expr) - result = ensure_arg_expr_content_fully_declared(func->expr, fd, bits, list, wide); - - else - result = ensure_arg_list_content_fully_declared(func->args, fd, bits, list, wide); - - func->declared = result; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : func = fonction de conversion à manipuler. * -* last = précise si la conversion est la dernière. * -* internal = indique le type de manipulation finale. * -* fd = descripteur d'un flux ouvert en écriture. * -* arch = architecture visée par l'opération globale. * -* bits = gestionnaire des bits d'encodage. * -* list = liste de l'ensemble des fonctions de conversion. * -* pp = pré-processeur pour les échanges de chaînes. * -* * -* Description : Définit les variables associées à une fonction de conversion.* -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool define_conv_func(conv_func *func, bool last, bool internal, int fd, const char *arch, const coding_bits *bits, const conv_list *list, const pre_processor *pp) -{ - bool result; /* Bilan à remonter */ - const char *callable; /* Fonction à appeler */ - - /* Si la fonction a déjà été définie lors d'un précédent besoin... */ - if (func->defined) return true; - - if (func->is_expr) - result = ensure_arg_expr_content_fully_defined(func->expr, fd, arch, bits, list, pp); - else - result = ensure_arg_list_content_fully_defined(func->args, fd, arch, bits, list, pp); - - /* Nom de la fonction effectivement appelée */ - - if (!func->is_expr) - { - callable = find_macro(pp, func->name); - - if (callable == NULL) - callable = func->name; - - } - else callable = NULL; - - if (last && callable == NULL) - { - fprintf(stderr, "Error: expected function to store '%s'.\n", func->dest); - return false; - } - - /* Dernier niveau : la variable de destination est imposée ! */ - if (last) - { - /* Si l'on doit manipuler une propriété d'instructon... */ - if (internal) - result = checked_call_instr_func(callable, func->args, fd, bits, list, pp); - - /* Si on doit constituer un opérande à ajouter... */ - else - { - if (strchr(callable, '(') == NULL) - dprintf(fd, "\t\top = %s(", callable); - else - dprintf(fd, "\t\top = %s", callable); - - result &= define_arg_list(func->args, fd, bits, list); - - dprintf(fd, ");\n"); - - } - - } - - /* On constitue une variable intermédiaire, dont on peut conserver le nom ! */ - else - { - dprintf(fd, "\t\tval_%s = ", func->dest); - - if (func->is_expr) - result &= define_arg_expr(func->expr, fd, bits, list); - - else - { - dprintf(fd, "%s(", callable); - - result = define_arg_list(func->args, fd, bits, list); - - dprintf(fd, ")"); - - } - - dprintf(fd, ";\n"); - - } - - func->defined = result; - - return result; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* ENSEMBLES DE CONVERSIONS */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Crée un nouvelle liste vierge de fonctions de conversion. * -* * -* Retour : Nouvelle structure prête à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -conv_list *create_conv_list(void) -{ - conv_list *result; /* Définition vierge à renvoyer*/ - - result = (conv_list *)calloc(1, sizeof(conv_list)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : list = ensemble de fonctions de conversion à supprimer. * -* * -* Description : Supprime de la mémoire une de fonctions de conversion. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void delete_conv_list(conv_list *list) -{ - size_t i; /* Boucle de parcours */ - - for (i = 0; i < list->func_count; i++) - delete_conv_func(list->functions[i]); - - if (list->functions != NULL) - free(list->functions); - - free(list); - -} - - -/****************************************************************************** -* * -* Paramètres : list = liste de fonctions de conversion à compléter. * -* func = nom de la fonction assurant le calcul de valeur. * -* * -* Description : Enregistre une function de conversion du brut à l'utile. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void register_conversion(conv_list *list, conv_func *func) -{ - list->functions = (conv_func **)realloc(list->functions, ++list->func_count * sizeof(conv_func *)); - - list->functions[list->func_count - 1] = func; - -} - - -/****************************************************************************** -* * -* Paramètres : list = liste de fonctions de conversion à consulter. * -* name = désignation humaine du champ à retrouver. * -* * -* Description : Recherche un résultat précis dans une liste de fonctions. * -* * -* Retour : Structure associée au résulat trouvé ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -conv_func *find_named_conv_in_list(const conv_list *list, const char *name) -{ - conv_func *result; /* Fonction à retourner */ - size_t i; /* Boucle de parcours */ - const char *dest; /* Nom de variable existante */ - - result = NULL; - - for (i = 0; i < list->func_count && result == NULL; i++) - { - dest = get_conv_dest_name(list->functions[i]); - - if (strcmp(dest, name) == 0) - result = list->functions[i]; - - } - - return result; - -} |