summaryrefslogtreecommitdiff
path: root/tools/d2c/rules.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/d2c/rules.c')
-rw-r--r--tools/d2c/rules.c96
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;
}