/* Chrysalide - Outil d'analyse de fichiers binaires * instruction-int.h - prototypes pour la définition interne des instructions décompilées * * Copyright (C) 2010-2013 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 . */ #ifndef _DECOMP_INSTRUCTION_INT_H #define _DECOMP_INSTRUCTION_INT_H #include "instruction.h" #include "../arch/archbase.h" #include "../common/dllist.h" /* Visite un ensemble hiérarchique d'instructions décompilées. */ typedef bool (* dec_instr_visit_fc) (GDecInstruction *, dec_instr_visitor_cb, DecInstrVisitFlags, void *); /* Remplace une instruction décompilée par une autre. */ typedef bool (* dec_instr_replace_fc) (GDecInstruction *, GDecInstruction *, GDecInstruction *); /* Imprime pour l'écran un version humaine d'une instruction. */ typedef GBufferLine * (* dec_instr_print_fc) (const GDecInstruction *, GCodeBuffer *, GBufferLine *, GLangOutput *); /* Définition d'une instruction décompilée (instance) */ struct _GDecInstruction { GObject parent; /* A laisser en premier */ DL_LIST_ITEM(flow); /* Maillon de liste chaînée */ vmpa_t address; /* Position associée */ dec_instr_visit_fc visit; /* Visite des instructions */ dec_instr_replace_fc replace; /* Remplacement à la volée */ dec_instr_print_fc print; /* Impression pour à l'écran */ }; /* Définition d'une instruction décompilée (classe) */ struct _GDecInstructionClass { GObjectClass parent; /* A laisser en premier */ }; #define dinstr_list_last(head) dl_list_last(head, GDecInstruction, flow) #define dinstr_list_add_tail(new, head) dl_list_add_tail(new, head, GDecInstruction, flow) #define dinstr_list_del(item, head) dl_list_del(item, head, GDecInstruction, flow) #define dinstr_list_next_iter(iter, head) dl_list_next_iter(iter, head, GDecInstruction, flow) #define dinstr_list_prev_iter(iter, head) dl_list_prev_iter(iter, head, GDecInstruction, flow) #define dinstr_list_for_each(pos, head) dl_list_for_each(pos, head, GDecInstruction, flow) #endif /* _DECOMP_INSTRUCTION_INT_H */