declashing

git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1148 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
vlm 2006-08-28 02:45:44 +00:00
parent fad6952dff
commit 073a7c746b
7 changed files with 47 additions and 29 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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

View File

@ -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.

View File

@ -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