diff options
Diffstat (limited to 'tools/d2c/rules.c')
-rw-r--r-- | tools/d2c/rules.c | 96 |
1 files changed, 67 insertions, 29 deletions
diff --git a/tools/d2c/rules.c b/tools/d2c/rules.c index 73ec965..6f2e075 100644 --- a/tools/d2c/rules.c +++ b/tools/d2c/rules.c @@ -30,6 +30,7 @@ #include "helpers.h" +#include "qckcall.h" @@ -79,8 +80,7 @@ static bool write_cond_expr(const cond_expr *, int, const coding_bits *); typedef struct _extra_rule { cond_expr *expr; /* Expression de déclenchement */ - CondActionType action; /* Conséquence d'une validation*/ - char *details; /* Eventuel complément d'info. */ + rule_action action; /* Conséquence d'une validation*/ } extra_rule; @@ -320,12 +320,31 @@ decoding_rules *create_decoding_rules(void) void delete_decoding_rules(decoding_rules *rules) { size_t i; /* Boucle de parcours */ + extra_rule *rule; /* Règle à traiter */ for (i = 0; i < rules->extra_count; i++) { - delete_cond_expr(rules->extra[i].expr); - if (rules->extra[i].details) - free(rules->extra[i].details); + rule = &rules->extra[i]; + + if (rule->expr != NULL) + delete_cond_expr(rule->expr); + + switch (rule->action.type) + { + case CAT_SEE: + free(rule->action.details); + break; + + case CAT_UNPREDICTABLE: + break; + + case CAT_CALL: + free(rule->action.callee); + delete_arg_list(rule->action.args); + break; + + } + } if (rules->extra != NULL) @@ -341,7 +360,6 @@ void delete_decoding_rules(decoding_rules *rules) * Paramètres : rules = ensemble de règles à compléter. * * expr = représentation d'expression à conserver. * * action = conséquence associée à la règle. * -* details = éventuel complément d'informations. * * * * Description : Ajoute une règle complète à la définition d'un codage. * * * @@ -351,7 +369,7 @@ void delete_decoding_rules(decoding_rules *rules) * * ******************************************************************************/ -void register_conditional_rule(decoding_rules *rules, cond_expr *expr, CondActionType action, const char *details) +void register_conditional_rule(decoding_rules *rules, cond_expr *expr, const rule_action *action) { extra_rule *rule; /* Nouvelle prise en compte */ @@ -360,8 +378,7 @@ void register_conditional_rule(decoding_rules *rules, cond_expr *expr, CondActio rule = &rules->extra[rules->extra_count - 1]; rule->expr = expr; - rule->action = action; - rule->details = (details != NULL ? make_callable(details, false) : NULL); + rule->action = *action; } @@ -369,10 +386,13 @@ void register_conditional_rule(decoding_rules *rules, cond_expr *expr, CondActio /****************************************************************************** * * * Paramètres : rules = ensemble de règles à consulter. * +* filter = filtre sur les règles à effectivement imprimer. * * fd = descripteur d'un flux ouvert en écriture. * * arch = architecture visée par l'opération. * * subarch = sous-catégorie de cette même architecture. * * bits = gestionnaire des bits d'encodage. * +* list = liste de l'ensemble des fonctions de conversion. * +* pp = pré-processeur pour les échanges de chaînes. * * exit = exprime le besoin d'une voie de sortie. [OUT] * * * * Description : Traduit en code les éventuelles règles présentes. * @@ -383,40 +403,39 @@ void register_conditional_rule(decoding_rules *rules, cond_expr *expr, CondActio * * ******************************************************************************/ -bool write_decoding_rules(decoding_rules *rules, int fd, const char *arch, const char *subarch, const coding_bits *bits, bool *exit) +bool write_decoding_rules(decoding_rules *rules, CondActionType filter, int fd, const char *arch, const char *subarch, const coding_bits *bits, const conv_list *list, const pre_processor *pp, bool *exit) { bool result; /* Bilan à remonter */ const extra_rule *rule; /* Règle en cours d'écriture */ size_t i; /* Boucle de parcours */ + const char *callable; /* Fonction à appeler */ result = true; - *exit = false; - for (i = 0; i < rules->extra_count; i++) { rule = &rules->extra[i]; - dprintf(fd, "\t\tif "); + if (rule->action.type != filter) + continue; - result = write_cond_expr(rule->expr, fd, bits); - if (!result) break; + if (rule->expr != NULL) + { + dprintf(fd, "\t\tif "); - dprintf(fd, "\n"); - dprintf(fd, "\t\t{\n"); + result = write_cond_expr(rule->expr, fd, bits); + if (!result) break; - switch (rule->action) + dprintf(fd, "\n"); + dprintf(fd, "\t\t{\n"); + + } + + switch (rule->action.type) { case CAT_SEE: - if (rule->details == NULL) - { - fprintf(stderr, "Error: directive 'see' must provide additional details.\n"); - result = false; - goto wcsr_exit; - } - - dprintf(fd, "\t\t\tinstr = %s_read_%sinstr_%s", arch, subarch, rule->details); + dprintf(fd, "\t\t\tinstr = %s_read_%sinstr_%s", arch, subarch, rule->action.details); /* TODO : adapter les paramètres d'appel selon le 'coder' */ dprintf(fd, "(_raw);\n"); @@ -429,16 +448,35 @@ bool write_decoding_rules(decoding_rules *rules, int fd, const char *arch, const case CAT_UNPREDICTABLE: break; + case CAT_CALL: + + callable = find_macro(pp, rule->action.callee); + + if (callable == NULL) + callable = rule->action.callee; + + if (rule->expr != NULL) + dprintf(fd, "\t"); + + result = call_instr_func(callable, rule->action.args, fd, bits, list, pp); + + if (rule->expr != NULL) + dprintf(fd, "\t"); + + dprintf(fd, "\t\t\tgoto quick_exit;\n"); + + *exit = true; + break; + } - dprintf(fd, "\t\t}\n"); + if (rule->expr != NULL) + dprintf(fd, "\t\t}\n"); dprintf(fd, "\n"); } - wcsr_exit: - return result; } |