/* Chrysalide - Outil d'analyse de fichiers binaires * def.h - prototypes pour la définition des unités de lecture * * Copyright (C) 2017 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 . */ #ifndef _PLUGINS_FMTP_DEF_H #define _PLUGINS_FMTP_DEF_H #include #include /** * Assurément utile pour les déclarations ou les appels... */ #define __(s) s #define PARSING_DEFS(a) a, ARRAY_SIZE(a) /** * Méthodes de définitions des déclarations. */ /* Définition générale */ typedef struct _fmt_field_def fmt_field_def; /* Eventuel appel préalable */ typedef bool (* get_fdef_value_cb) (const fmt_field_def *, GBinContent *, vmpa2t *, SourceEndian, void *); /* Possibilités pour un champ à commenter */ typedef struct _field_desc_switch { bool is_range; /* Sélection de définition */ union { uint64_t fixed; /* Valeur fixe */ struct { uint64_t lower; /* Borne basse */ uint64_t upper; /* Borne haute */ }; }; const char *desc; /* Description associée */ } field_desc_switch; /* Partie de commentaire */ typedef struct _comment_part { bool is_static; /* Choix du champ textuel */ bool avoid_i18n; /* Pas de traduction ! */ union { const char *static_text; /* Texte alloué statiquement */ char *dynamic_text; /* Texte alloué dynamiquement */ }; } comment_part; /* Type de commentaires associés */ typedef enum _FieldCommentType { FCT_PLAIN, /* Brut et statique */ FCT_SWITCH, /* Eventail des possibles */ FCT_MULTI /* En plusieurs parties */ } FieldCommentType; /* Définition générale */ struct _fmt_field_def { const char *name; /* Nom du champ */ get_fdef_value_cb get_value; /* Obtention de la valeur */ bool is_uleb128; /* Element de type uleb128 */ bool is_leb128; /* Element de type sleb128 */ MemoryDataSize size; /* Taille d'un élément */ size_t repeat; /* Quantité d'éléments présents*/ bool is_padding; /* Simple bourrage ? */ bool has_display_rules; /* Validité des champs suivants*/ const ImmOperandDisplay *disp_rules; /* Règles d'affichage */ size_t disp_count; /* Quantité de ces règles */ FieldCommentType ctype; /* Type de commentaire */ union { const char *plain; /* Commentaire simple */ struct { const field_desc_switch *choices; /* Choix multiples */ size_t ccount; /* Quantité de ces choix */ const char *def_choice; /* Commentaire par défaut */ }; struct { comment_part *parts; /* Parties à considérer */ size_t pcount; /* Quantité de ces parties */ }; } comment; }; /* Règles d'affichage */ #define DISPLAY_RULES(...) \ .has_display_rules = true, \ .disp_rules = (ImmOperandDisplay []) { __VA_ARGS__ }, \ .disp_count = ARRAY_SIZE(((ImmOperandDisplay []) { __VA_ARGS__ })) /* Rédaction des commentaires */ #define PLAIN_COMMENT(txt) \ .ctype = FCT_PLAIN, \ .comment.plain = txt #define SWITCH_COMMENT(array, def) \ .ctype = FCT_SWITCH, \ .comment.choices = array, \ .comment.ccount = ARRAY_SIZE(array), \ .comment.def_choice = def #endif /* _PLUGINS_FMTP_DEF_H */