aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix/asn1fix.c
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-03-04 09:02:27 +0000
committerLev Walkin <vlm@lionet.info>2005-03-04 09:02:27 +0000
commit1dec58051f7685fac25aac07cacedefec119e630 (patch)
treea43da3ec922aaa69d8cbd85cbb8230bb536fef8d /libasn1fix/asn1fix.c
parentb59d94c97057b36617ddbf86b01d2a77316a9d75 (diff)
unique index for maintaining dependencies
Diffstat (limited to 'libasn1fix/asn1fix.c')
-rw-r--r--libasn1fix/asn1fix.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c
index 22cd3671..cce1b7e2 100644
--- a/libasn1fix/asn1fix.c
+++ b/libasn1fix/asn1fix.c
@@ -14,6 +14,7 @@ static int asn1f_fix_constructed(arg_t *arg); /* For SEQUENCE/SET/CHOICE */
static int asn1f_resolve_constraints(arg_t *arg); /* For subtype constraints */
static int asn1f_check_constraints(arg_t *arg); /* For subtype constraints */
static int asn1f_check_duplicate(arg_t *arg);
+static int asn1f_apply_unique_index(arg_t *arg);
arg_t a1f_replace_me_with_proper_interface_arg;
@@ -274,6 +275,13 @@ asn1f_fix_module__phase_2(arg_t *arg) {
ret = asn1f_recurse_expr(arg, asn1f_check_constraints);
RET2RVAL(ret, rvalue);
+ /*
+ * Uniquely tag each inner type.
+ */
+ asn1f_apply_unique_index(0);
+ ret = asn1f_recurse_expr(arg, asn1f_apply_unique_index);
+ RET2RVAL(ret, rvalue);
+
assert(arg->expr == expr);
}
@@ -429,6 +437,25 @@ asn1f_check_duplicate(arg_t *arg) {
return 0;
}
+static int
+asn1f_apply_unique_index(arg_t *arg) {
+ static int unique_index;
+ if(!arg) { unique_index = 0; return 0; }
+
+ switch(arg->expr->expr_type) {
+ case ASN_BASIC_ENUMERATED:
+ break;
+ default:
+ if(arg->expr->expr_type & ASN_CONSTR_MASK)
+ break;
+ return 0;
+ }
+
+ arg->expr->_type_unique_index = ++unique_index;
+
+ return 0;
+}
+
/*
* Print everything to stderr
*/