diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2013-01-27 00:43:59 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2013-01-27 00:43:59 (GMT) |
commit | 7f35f8d2f211fdf087252ede7665e9c81f35cdc7 (patch) | |
tree | d1c88366bc73e51db38ef982897e95950405bf52 /src/decomp/expr/cond.c | |
parent | 2050b07c42c15738662dd9b3c5841694b64ab2a3 (diff) |
Implemented the first steps for visiting or replacing items in decompiled instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@331 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/decomp/expr/cond.c')
-rw-r--r-- | src/decomp/expr/cond.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/decomp/expr/cond.c b/src/decomp/expr/cond.c index 4a9b63b..d96f483 100644 --- a/src/decomp/expr/cond.c +++ b/src/decomp/expr/cond.c @@ -55,6 +55,12 @@ static void g_cond_expression_class_init(GCondExpressionClass *); /* Initialise une instance de condition binaire quelconque. */ static void g_cond_expression_init(GCondExpression *); +/* Visite un ensemble hiérarchique d'instructions décompilées. */ +static bool g_cond_expression_visit(GCondExpression *, dec_instr_visitor_cb, DecInstrVisitFlags, void *); + +/* Remplace une instruction décompilée par une autre. */ +static bool g_cond_expression_replace(GCondExpression *, GDecInstruction *, GDecInstruction *); + /* Imprime pour l'écran un version humaine d'une expression. */ static GBufferLine *g_cond_expression_print(const GCondExpression *, GCodeBuffer *, GBufferLine *, GLangOutput *); @@ -100,6 +106,8 @@ static void g_cond_expression_init(GCondExpression *expr) instr = G_DEC_INSTRUCTION(expr); + instr->visit = (dec_instr_visit_fc)g_cond_expression_visit; + instr->replace = (dec_instr_replace_fc)g_cond_expression_replace; instr->print = (dec_instr_print_fc)g_cond_expression_print; } @@ -136,6 +144,82 @@ GDecInstruction *g_cond_expression_new(GDecExpression *a, CompSignType sign, GDe /****************************************************************************** * * +* Paramètres : expr = première instruction à venir visiter. * +* callback = procédure à appeler à chaque instruction visitée. * +* flags = moments des appels à réaliser en retour. * +* data = données quelconques associées au visiteur. * +* * +* Description : Visite un ensemble hiérarchique d'instructions décompilées. * +* * +* Retour : true si le parcours a été jusqu'à son terme, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_cond_expression_visit(GCondExpression *expr, dec_instr_visitor_cb callback, DecInstrVisitFlags flags, void *data) +{ + bool result; /* Bilan à retourner */ + + result = g_dec_instruction_visit(G_DEC_INSTRUCTION(expr->a), callback, flags, data); + + if (result) + result = g_dec_instruction_visit(G_DEC_INSTRUCTION(expr->b), callback, flags, data); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : expr = première instruction à venir ausculter. * +* old = instruction décompilée à venir remplacer. * +* new = instruction décompilée à utiliser dorénavant. * +* * +* Description : Remplace une instruction décompilée par une autre. * +* * +* Retour : true si un remplacement a été effectué, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_cond_expression_replace(GCondExpression *expr, GDecInstruction *old, GDecInstruction *new) +{ + bool result; /* Bilan à retourner */ + + if (expr->a == G_DEC_EXPRESSION(old)) + { + g_object_unref(G_OBJECT(expr->a)); + g_object_ref(G_OBJECT(new)); + expr->a = G_DEC_EXPRESSION(new); + + result = true; + + } + else + result = g_dec_instruction_replace(G_DEC_INSTRUCTION(expr->a), old, new); + + if (expr->b == G_DEC_EXPRESSION(old)) + { + g_object_unref(G_OBJECT(expr->b)); + g_object_ref(G_OBJECT(new)); + expr->b = G_DEC_EXPRESSION(new); + + result = true; + + } + else + result |= g_dec_instruction_replace(G_DEC_INSTRUCTION(expr->b), old, new); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : expr = expression à transcrire en version humaine. * * buffer = tampon où doit se réaliser l'insertion. * * line = ligne d'impression prête à emploi ou NULL. * |