summaryrefslogtreecommitdiff
path: root/src/decomp/instruction.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2013-01-27 00:43:59 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2013-01-27 00:43:59 (GMT)
commit7f35f8d2f211fdf087252ede7665e9c81f35cdc7 (patch)
treed1c88366bc73e51db38ef982897e95950405bf52 /src/decomp/instruction.c
parent2050b07c42c15738662dd9b3c5841694b64ab2a3 (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/instruction.c')
-rw-r--r--src/decomp/instruction.c58
1 files changed, 46 insertions, 12 deletions
diff --git a/src/decomp/instruction.c b/src/decomp/instruction.c
index 2d42e71..3a9917a 100644
--- a/src/decomp/instruction.c
+++ b/src/decomp/instruction.c
@@ -79,29 +79,63 @@ static void g_dec_instruction_init(GDecInstruction *instr)
/******************************************************************************
* *
-* Paramètres : instr = première instruction à venir visiter. *
-* process = procédure à appeler à chaque instruction visitée. *
-* data = données quelconques associées au visiteur. *
-* order = précise le sens de la visite. *
+* Paramètres : instr = 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 : - *
+* Retour : true si le parcours a été jusqu'à son terme, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_dec_instruction_visit(GDecInstruction *instr, dec_instr_visitor_cb callback, DecInstrVisitFlags flags, void *data)
+{
+ bool result; /* Bilan à retourner */
+
+ result = true;
+
+ if (flags & DVF_ENTER)
+ result = callback(instr, DVF_ENTER, data);
+
+ if (result && instr->visit)
+ result = instr->visit(instr, callback, flags, data);
+
+ if (result && (flags & DVF_EXIT))
+ result = callback(instr, DVF_EXIT, data);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : instr = 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 : - *
* *
******************************************************************************/
-void g_dec_instruction_visit(GDecInstruction *instr, process_decomp_fc process, void *data, bool order)
+bool g_dec_instruction_replace(GDecInstruction *instr, GDecInstruction *old, GDecInstruction *new)
{
- if (order)
- process(instr, data);
+ bool result; /* Bilan à retourner */
- if (instr->visit)
- instr->visit(instr, process, data, order);
+ if (instr->replace != NULL)
+ result = instr->replace(instr, old, new);
+ else
+ result = false;
- if (!order)
- process(instr, data);
+ return result;
}