diff options
Diffstat (limited to 'tools/d2c/encoding.c')
-rw-r--r-- | tools/d2c/encoding.c | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/tools/d2c/encoding.c b/tools/d2c/encoding.c index f8b72d9..9fbf0df 100644 --- a/tools/d2c/encoding.c +++ b/tools/d2c/encoding.c @@ -187,10 +187,14 @@ bool has_encoding_spec_prefix(const encoding_spec *spec, const char *prefix) char *build_encoding_spec_prefix(const encoding_spec *spec) { char *result; /* Chaîne à retourner */ + int ret; /* Recette de construction */ assert(spec->lprefix); - asprintf(&result, "%s%u", spec->lprefix, spec->index); + ret = asprintf(&result, "%s%u", spec->lprefix, spec->index); + + if (ret == -1) + result = NULL; return result; @@ -328,6 +332,7 @@ bool write_encoding_spec_raw_disass(const encoding_spec *spec, int fd, const cha disass_assert *dassert; /* Eventuelles conditions */ char *suffix; /* Complément d'identifiant */ char *sid; /* Base de sous-identifiant */ + int ret; /* Bilan d'une construction */ size_t i; /* Boucle de parcours */ bool op_decl; /* Suivi des déclaration #1 */ bool imm_decl; /* Suivi des déclaration #2 */ @@ -365,7 +370,7 @@ bool write_encoding_spec_raw_disass(const encoding_spec *spec, int fd, const cha } if (!result) - goto wesrd_exit; + goto exit; /* Déclarations préalables */ @@ -375,23 +380,23 @@ bool write_encoding_spec_raw_disass(const encoding_spec *spec, int fd, const cha result = mark_syntax_items(spec->syntaxes[i], spec->bits); if (!result) - goto wesrd_exit; + goto exit; result = declare_used_bits_fields(spec->bits, fd); - if (!result) goto wesrd_exit; + if (!result) goto exit; if (openbar) { result = declare_encoding_syntax(spec->syntaxes[0], fd, spec->bits); - if (!result) goto wesrd_exit; + if (!result) goto exit; } dprintf(fd, "\n"); /* Vérification que le décodage est possible */ - result &= check_bits_correctness(spec->bits, fd); - if (!result) goto wesrd_exit; + result = check_bits_correctness(spec->bits, fd); + if (!result) goto exit; dprintf(fd, "\n"); @@ -406,15 +411,20 @@ bool write_encoding_spec_raw_disass(const encoding_spec *spec, int fd, const cha /* Définition des champs bruts */ result = define_used_bits_fields(spec->bits, fd); - if (!result) goto wesrd_exit; + if (!result) goto exit; suffix = build_encoding_spec_prefix(spec); + if (suffix == NULL) goto exit; + make_string_upper(suffix); - asprintf(&sid, "%s_%s", id, suffix); + ret = asprintf(&sid, "%s_%s", id, suffix); free(suffix); + if (ret == -1) + goto exit; + for (i = 0; i < spec->syntax_count && result; i++) { if (spec->syntax_count > 1) @@ -426,11 +436,14 @@ bool write_encoding_spec_raw_disass(const encoding_spec *spec, int fd, const cha free(sid); if (!result) - goto wesrd_exit; + goto exit; /* Encodage en dernier lieu */ - asprintf(&encoding_fc, "g_%s_instruction_set_encoding", arch); + ret = asprintf(&encoding_fc, "g_%s_instruction_set_encoding", arch); + + if (ret == -1) + goto exit; cast = build_cast_if_needed(encoding_fc); @@ -463,7 +476,7 @@ bool write_encoding_spec_raw_disass(const encoding_spec *spec, int fd, const cha } - wesrd_exit: + exit: return result; @@ -581,9 +594,11 @@ bool write_encoding_spec_keywords(const encoding_spec *spec, int fd, const char asm_pattern *pattern; /* Définition d'assemblage */ const char *keyword; /* Mot clef principal */ - result = true; - suffix = build_encoding_spec_prefix(spec); + + result = (suffix != NULL); + if (!result) goto exit; + make_string_upper(suffix); for (i = 0; i < spec->syntax_count; i++) @@ -607,6 +622,8 @@ bool write_encoding_spec_keywords(const encoding_spec *spec, int fd, const char free(suffix); + exit: + return result; } @@ -634,9 +651,11 @@ bool write_encoding_spec_subid(const encoding_spec *spec, int fd, const char *na instr_id *subid; /* Sous-identifiant de syntaxe */ unsigned int idval; /* Identifiant unique attribué */ - result = true; - suffix = build_encoding_spec_prefix(spec); + + result = (suffix != NULL); + if (!result) goto exit; + make_string_upper(suffix); for (i = 0; i < spec->syntax_count; i++) @@ -653,6 +672,8 @@ bool write_encoding_spec_subid(const encoding_spec *spec, int fd, const char *na free(suffix); + exit: + return result; } @@ -687,6 +708,10 @@ bool write_encoding_spec_hooks(const encoding_spec *spec, int fd, const char *na if (refine) { suffix = build_encoding_spec_prefix(spec); + + result = (suffix != NULL); + if (!result) goto exit; + make_string_upper(suffix); for (i = 0; i < spec->syntax_count; i++) @@ -730,6 +755,8 @@ bool write_encoding_spec_hooks(const encoding_spec *spec, int fd, const char *na } + exit: + return result; } |