diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-11-15 00:34:32 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-11-15 00:34:32 (GMT) |
commit | f7add23a8bcb6d4e0c594ce13fe224829759041c (patch) | |
tree | 4b903cfa3f64bac5c21a270f9fbe2db7d7a6adbf /tools/syntax.c | |
parent | 44e6aa9039585ad95fb9c6f21535d89457563297 (diff) |
Given the d2c compiler its own directory.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@420 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'tools/syntax.c')
-rw-r--r-- | tools/syntax.c | 321 |
1 files changed, 0 insertions, 321 deletions
diff --git a/tools/syntax.c b/tools/syntax.c deleted file mode 100644 index 5fec1a6..0000000 --- a/tools/syntax.c +++ /dev/null @@ -1,321 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * syntax.c - prise en compte d'une syntaxe du langage d'assemblage - * - * 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 "syntax.h" - - -#include <malloc.h> -#include <string.h> - - -#include "helpers.h" - - - -/* Propriétés particulières pour les opérandes */ -typedef enum _SyntaxItemFlags -{ - SIF_NONE = (0 << 0), /* Aucune propriété */ - SIF_DECIMAL = (1 << 0) /* Affichage en décimal */ - -} SyntaxItemFlags; - -/* Elément défini dans une syntaxe */ -typedef struct _syntax_item -{ - char *name; /* Désignation humaine */ - bool internal; /* Enregistrement générique ? */ - SyntaxItemFlags flags; /* Propriétés supplémentaires */ - -} syntax_item; - -/* Syntaxe d'une ligne d'assembleur */ -struct _asm_syntax -{ - syntax_item *items; /* Eléments de la syntaxe */ - size_t items_count; /* Nombre de ces éléments */ - -}; - - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Crée un nouvel indicateur pour l'écriture d'une instruction. * -* * -* Retour : Nouvelle structure prête à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -asm_syntax *create_asm_syntax(void) -{ - asm_syntax *result; /* Définition vierge à renvoyer*/ - - result = (asm_syntax *)calloc(1, sizeof(asm_syntax)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. * -* * -* Description : Supprime de la mémoire un indicateur d'écriture ASM. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void delete_asm_syntax(asm_syntax *syntax) -{ - size_t i; /* Boucle de parcours */ - - for (i = 0; i < syntax->items_count; i++) - free(syntax->items[i].name); - - if (syntax->items != NULL) - free(syntax->items); - - free(syntax); - -} - - -/****************************************************************************** -* * -* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. * -* name = désignation de l'opérande dans la spécification. * -* internal = précise si l'opérand est non générique ou non. * -* * -* Description : Enregistre la présence d'un nouvel opérande dans la syntaxe. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void register_syntax_item(asm_syntax *syntax, char *name, bool internal) -{ - syntax_item *item; /* Nouvelle prise en compte */ - size_t len; /* Taille du nom fourni */ - - syntax->items = (syntax_item *)realloc(syntax->items, ++syntax->items_count * sizeof(syntax_item)); - - item = &syntax->items[syntax->items_count - 1]; - - /* Récupération des drapeaux */ - - item->flags = SIF_NONE; - - for (len = strlen(name); len > 0; len--) - switch (name[0]) - { - case '#': - item->flags |= SIF_DECIMAL; - memmove(name, name + 1, len); - break; - - default: - len = 1; - break; - - } - - item->name = make_string_lower(name); - item->internal = internal; - -} - - -/****************************************************************************** -* * -* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. * -* bits = gestionnaire des bits d'encodage. * -* list = liste de l'ensemble des fonctions de conversion. * -* * -* Description : Marque les champs de bits effectivement utilisés. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool mark_syntax_items(const asm_syntax *syntax, const coding_bits *bits, const conv_list *list) -{ - bool result; /* Bilan à retourner */ - size_t i; /* Boucle de parcours */ - syntax_item *item; /* Lien vers un opérande */ - conv_func *func; /* Fonction de conversion */ - - result = true; - - for (i = 0; i < syntax->items_count && result; i++) - { - item = &syntax->items[i]; - - func = find_named_conv_in_list(list, item->name); - if (func == NULL) - { - fprintf(stderr, "Error: expected conversion for '%s'.\n", item->name); - result = false; - } - - result = mark_conv_func(func, bits, list); - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. * -* 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 C associées aux opérandes de syntaxe. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool declare_syntax_items(const asm_syntax *syntax, int fd, const coding_bits *bits, const conv_list *list, unsigned int wide) -{ - bool result; /* Bilan à retourner */ - bool has_operand; /* Présence d'un opérande */ - size_t i; /* Boucle de parcours */ - syntax_item *item; /* Lien vers un opérande */ - conv_func *func; /* Fonction de conversion */ - - result = true; - - has_operand = false; - - for (i = 0; i < syntax->items_count && result; i++) - { - item = &syntax->items[i]; - - has_operand |= !item->internal; - - func = find_named_conv_in_list(list, item->name); - if (func == NULL) - { - fprintf(stderr, "Error: expected conversion for '%s'.\n", item->name); - result = false; - } - - result &= declare_conv_func(func, fd, bits, list, wide); - - } - - if (has_operand) - dprintf(fd, "\t\tGArchOperand *op;\n"); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. * -* 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 C associées aux opérandes de syntaxe. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool define_syntax_items(const asm_syntax *syntax, int fd, const char *arch, const coding_bits *bits, const conv_list *list, const pre_processor *pp) -{ - bool result; /* Bilan à retourner */ - size_t i; /* Boucle de parcours */ - syntax_item *item; /* Lien vers un opérande */ - conv_func *func; /* Fonction de conversion */ - - result = true; - - for (i = 0; i < syntax->items_count && result; i++) - { - item = &syntax->items[i]; - - func = find_named_conv_in_list(list, item->name); - if (func == NULL) - { - fprintf(stderr, "Error: expected conversion for '%s'.\n", item->name); - result = false; - } - - /* Appel proprement dit */ - - result &= define_conv_func(func, true, item->internal, fd, arch, bits, list, pp); - if (!result) break; - - /* Raccordement : propriété ou opérande ? */ - - if (item->internal) - dprintf(fd, "\t\t\tgoto bad_exit;\n"); - - else - { - dprintf(fd, "\t\tif (op == NULL) goto bad_exit;\n"); - - dprintf(fd, "\n"); - - if (item->flags & SIF_DECIMAL) - dprintf(fd, "\t\tg_imm_operand_set_display(G_IMM_OPERAND(op), IOD_DEC);\n"); - - dprintf(fd, "\t\tg_arch_instruction_attach_extra_operand(instr, op);\n"); - - } - - dprintf(fd, "\n"); - - } - - return result; - -} |