aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2017-08-23 04:44:18 -0700
committerLev Walkin <vlm@lionet.info>2017-08-23 04:44:18 -0700
commitf75b874253c1441e5dff5d28c17ac0cd64ab417d (patch)
tree9baaedb937f710eb52f340e83798fcd894c8d3c7 /libasn1fix
parent9ded96c6b2ab9bb153137dd286420076b2034d29 (diff)
specialization fix, tested on value specialization
Diffstat (limited to 'libasn1fix')
-rw-r--r--libasn1fix/asn1fix_param.c47
1 files changed, 4 insertions, 43 deletions
diff --git a/libasn1fix/asn1fix_param.c b/libasn1fix/asn1fix_param.c
index a8c992b7..904da434 100644
--- a/libasn1fix/asn1fix_param.c
+++ b/libasn1fix/asn1fix_param.c
@@ -9,7 +9,7 @@ typedef struct resolver_arg {
} resolver_arg_t;
static asn1p_expr_t *resolve_expr(asn1p_expr_t *, void *resolver_arg);
-static int compare_specializations(arg_t *, asn1p_expr_t *a, asn1p_expr_t *b);
+static int compare_specializations(const asn1p_expr_t *a, const asn1p_expr_t *b);
static asn1p_expr_t *find_target_specialization_byref(resolver_arg_t *rarg, asn1p_ref_t *ref);
static asn1p_expr_t *find_target_specialization_bystr(resolver_arg_t *rarg, char *str);
@@ -37,7 +37,7 @@ asn1f_parameterization_fork(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *rhs_ps
for(npspecs = 0;
npspecs < expr->specializations.pspecs_count;
npspecs++) {
- if(compare_specializations(arg, rhs_pspecs,
+ if(compare_specializations(rhs_pspecs,
expr->specializations.pspec[npspecs].rhs_pspecs) == 0) {
DEBUG("Reused parameterization for %s",
expr->Identifier);
@@ -89,47 +89,8 @@ asn1f_parameterization_fork(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *rhs_ps
}
static int
-compare_specializations(arg_t *arg, asn1p_expr_t *a, asn1p_expr_t *b) {
- asn1p_expr_t *ac = TQ_FIRST(&a->members);
- asn1p_expr_t *bc = TQ_FIRST(&b->members);
-
- for(;ac && bc; ac = TQ_NEXT(ac, next), bc = TQ_NEXT(bc, next)) {
- retry:
- if(ac == bc) continue;
- if(ac->meta_type != bc->meta_type) break;
- if(ac->expr_type != bc->expr_type) break;
- /* Maybe different object sets */
- if(ac->constraints && bc->constraints
- && ac->constraints->containedSubtype
- && bc->constraints->containedSubtype
- && ac->constraints->containedSubtype->type == ATV_REFERENCED
- && bc->constraints->containedSubtype->type == ATV_REFERENCED
- && strcmp(ac->constraints->containedSubtype->value.reference->components[0].name,
- bc->constraints->containedSubtype->value.reference->components[0].name))
- break;
- if(!ac->reference && !bc->reference)
- continue;
-
- if(ac->reference) {
- ac = WITH_MODULE(
- ac->module,
- asn1f_lookup_symbol(arg, ac->rhs_pspecs, ac->reference));
- if(!ac) break;
- }
- if(bc->reference) {
- bc = WITH_MODULE(
- bc->module,
- asn1f_lookup_symbol(arg, bc->rhs_pspecs, bc->reference));
- if(!bc) break;
- }
- goto retry;
- }
-
- if(ac || bc)
- /* Specializations do not match: different size option sets */
- return -1;
-
- return 0;
+compare_specializations(const asn1p_expr_t *a, const asn1p_expr_t *b) {
+ return asn1p_expr_compare(a, b);
}
static asn1p_expr_t *