From fbfc7bcb2fbf3e377d387396ff4c656b981917ec Mon Sep 17 00:00:00 2001 From: Lev Walkin <vlm@lionet.info> Date: Mon, 28 Aug 2006 02:45:44 +0000 Subject: [PATCH] declashing --- libasn1fix/asn1fix.c | 2 +- libasn1fix/asn1fix_bitstring.c | 16 ++++++++++++---- libasn1fix/asn1fix_enum.c | 2 +- libasn1fix/asn1fix_integer.c | 5 +++-- libasn1fix/asn1fix_misc.c | 25 ++++++++++--------------- libasn1fix/asn1fix_misc.h | 10 ++++------ tests/116-bit-string-SE.asn1 | 16 ++++++++++++++++ 7 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 tests/116-bit-string-SE.asn1 diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 05118682..8d2317f4 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -385,7 +385,7 @@ asn1f_fix_constructed(arg_t *arg) { } /* Check identifier distinctness */ - ret = asn1f_check_unique_expr(arg, NULL); + ret = asn1f_check_unique_expr(arg); RET2RVAL(ret, rvalue); /* Fix extensibility */ diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index f3d5ad73..5f30ea4f 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -32,6 +32,10 @@ asn1f_fix_bit_string(arg_t *arg) { return r_value; } +static int _compare_value(asn1p_expr_t *expr1, asn1p_expr_t *expr2) { + return expr2->value->value.v_integer - expr1->value->value.v_integer; +} + static int asn1f_fix_bit_string_type(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -40,10 +44,6 @@ asn1f_fix_bit_string_type(arg_t *arg) { int ret; TQ_FOR(v, &(expr->members), next) { - /* Check identifier uniqueness as per 21.4 */ - ret = asn1f_check_unique_expr_child(arg, v, 0); - RET2RVAL(ret, r_value); - if(v->expr_type == A1TC_EXTENSIBLE) { FATAL("Extension marker (...) is not allowed " "as a BIT STRING NamedBit at line %d ", @@ -74,6 +74,14 @@ asn1f_fix_bit_string_type(arg_t *arg) { v->_lineno); return -1; } + + /* Check value uniqueness as per 21.4 */ + ret = asn1f_check_unique_expr_child(arg, v, + _compare_value, "value"); + RET2RVAL(ret, r_value); + /* Check identifier uniqueness as per 21.5 */ + ret = asn1f_check_unique_expr_child(arg, v, 0, "identifier"); + RET2RVAL(ret, r_value); } return r_value; diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index cf03914f..570d23ae 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -119,7 +119,7 @@ asn1f_fix_enum(arg_t *arg) { * 1.4 Check that all identifiers before the current one * differs from it. */ - ret = asn1f_check_unique_expr_child(arg, ev, NULL); + ret = asn1f_check_unique_expr_child(arg, ev, 0, "identifier"); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index 0302acd2..a5d0b6e7 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -92,12 +92,13 @@ asn1f_fix_integer(arg_t *arg) { /* * Check that all identifiers are distinct. */ - ret = asn1f_check_unique_expr_child(arg, iv, NULL); + ret = asn1f_check_unique_expr_child(arg, iv, 0, "identifier"); RET2RVAL(ret, rvalue); /* * Check that all values are distinct. */ - ret = asn1f_check_unique_expr_child(arg, iv, _compare_value); + ret = asn1f_check_unique_expr_child(arg, iv, + _compare_value, "value"); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 9e8cc07f..4af0fd8c 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -236,15 +236,14 @@ asn1f_recurse_expr(arg_t *arg, int (*callback)(arg_t *arg)) { * Check that every child of a given expr has unique name or does not have any. */ int -asn1f_check_unique_expr(arg_t *arg, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { +asn1f_check_unique_expr(arg_t *arg) { asn1p_expr_t *expr; int rvalue = 0; TQ_FOR(expr, &(arg->expr->members), next) { if(expr->Identifier) { int ret = asn1f_check_unique_expr_child(arg, expr, - opt_compare); + 0, "identifier"); if(ret) rvalue = -1; } else { /* @@ -263,9 +262,11 @@ asn1f_check_unique_expr(arg_t *arg, */ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b), + const char *opt_property_name) { asn1p_expr_t *expr; - int rvalue = 0; + + if(!opt_property_name) opt_property_name = "property"; assert(child); assert(opt_compare || child->Identifier); @@ -290,26 +291,20 @@ asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, } if(ret == 0) { - char *msg; - msg = opt_compare - ?"Expressions clash" - :"Identifiers name clash"; - FATAL("%s: " + FATAL("Clash detected: " "\"%s\" at line %d has similar %s with " "\"%s\" at line %d", - msg, expr->Identifier, expr->_lineno, - opt_compare?"property":"name", + opt_property_name, child->Identifier, child->_lineno ); - - rvalue = -1; + return -1; } } - return rvalue; + return 0; } int diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h index a90c5bed..6dcd220d 100644 --- a/libasn1fix/asn1fix_misc.h +++ b/libasn1fix/asn1fix_misc.h @@ -11,12 +11,9 @@ int asn1f_recurse_expr(arg_t *arg, int (*f)(arg_t *arg)); /* - * Check that every child of a given expr has unique name or does not have any. - * If opt_compare == NULL, the default comparison of the argument's - * names (identifiers) will be performed. + * Check that every child of a given expr has unique identifier. */ -int asn1f_check_unique_expr(arg_t *arg, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); +int asn1f_check_unique_expr(arg_t *arg); /* * Check that every preceeding child of the given expr is not @@ -25,7 +22,8 @@ int asn1f_check_unique_expr(arg_t *arg, * names (identifiers) will be performed. */ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b), + const char *opt_property_name); /* * Return number of children. diff --git a/tests/116-bit-string-SE.asn1 b/tests/116-bit-string-SE.asn1 new file mode 100644 index 00000000..f5967c04 --- /dev/null +++ b/tests/116-bit-string-SE.asn1 @@ -0,0 +1,16 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .116 + +ModuleBitStringSameValues + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 116 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(1), another(1) } + +END -- GitLab