diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-04-05 23:12:13 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-04-05 23:12:13 (GMT) |
commit | 40d624af29e752bb4255099ab3f1de64e3c96dd3 (patch) | |
tree | 3491d98e4358f9f8e84825478a3701d7fbb317ce /src/arch | |
parent | fd679be33396b0ba85ba6617b33a66d221026d91 (diff) |
Fixed various bugs in the graph layout.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@504 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/instruction.c | 62 | ||||
-rw-r--r-- | src/arch/instruction.h | 3 |
2 files changed, 65 insertions, 0 deletions
diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 08256d1..475c038 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -624,6 +624,68 @@ void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *des /****************************************************************************** * * * Paramètres : instr = instruction dont les informations sont à consulter. * +* dest = ligne visée par la liaison (côté destination). * +* old = ancien type de lien construit. * +* new = nouveau type de lien à construire. * +* * +* Description : Change la nature d'un lien entre deux instructions. * +* * +* Retour : true pour une mise à jour réussie, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_arch_instruction_change_link(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType old, InstructionLinkType new) +{ + size_t count; /* Raccourci pour la lecture */ + size_t i; /* Boucle de parcours */ + size_t from_idx; /* Indice côté destination */ + size_t to_idx; /* Indice côté source */ + + /* Côté destination */ + + count = dest->from_count; + + for (i = 0; i < count; i++) + if (dest->from[i] == instr && dest->from_types[i] == old) + break; + + if (i == count) + return false; + else + from_idx = i; + + /* Côté point de départ */ + + count = instr->to_count; + + for (i = 0; i < count; i++) + if (instr->to[i] == dest && instr->to_types[i] == old) + break; + + if (i == count) + return false; + else + to_idx = i; + + /* Si les deux extrémités sont raccord... */ + + dest->from_types[from_idx] = new; + + instr->to_types[to_idx] = new; + + return true; + + + /* TODO : si les informations complémentaires restent en place, compléter ! */ + +} + + +/****************************************************************************** +* * +* Paramètres : instr = instruction dont les informations sont à consulter. * * * * Description : Indique si l'instruction a une ou plusieurs origines. * * * diff --git a/src/arch/instruction.h b/src/arch/instruction.h index 0198bb5..9123b6f 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -188,6 +188,9 @@ bool g_arch_instruction_is_return(const GArchInstruction *instr); /* Etablit un lien entre deux instructions. */ void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType, ...); +/* Change la nature d'un lien entre deux instructions. */ +void g_arch_instruction_change_link(GArchInstruction *, GArchInstruction *, InstructionLinkType, InstructionLinkType); + /* Indique si l'instruction a une ou plusieurs origines. */ bool g_arch_instruction_has_sources(const GArchInstruction *); |