diff options
author | Lev Walkin <vlm@lionet.info> | 2004-09-10 09:37:12 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-09-10 09:37:12 +0000 |
commit | b918973b7100311763a7e2d554fd5bbfdb0121b0 (patch) | |
tree | f86d1387e53a5c55055baa1f5e2ce3f4f62353ce | |
parent | cc93b0f1c5fc5530ab9bdd4e747cd4da939b8a6a (diff) |
more explicit ANY support
-rw-r--r-- | libasn1compiler/asn1c_C.c | 24 | ||||
-rw-r--r-- | skeletons/constr_SEQUENCE.c | 19 | ||||
-rw-r--r-- | skeletons/constr_TYPE.h | 1 | ||||
-rw-r--r-- | tests/42-real-life-OK.asn1.-PR | 2 | ||||
-rw-r--r-- | tests/43-recursion-OK.asn1.-P | 2 | ||||
-rw-r--r-- | tests/44-choice-in-sequence-OK.asn1.-P | 4 | ||||
-rw-r--r-- | tests/60-any-OK.asn1.-P | 145 |
7 files changed, 177 insertions, 20 deletions
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 8755c2a2..00b278b9 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -1200,10 +1200,21 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { static int global_memb_unique; int save_target; arg_t tmp_arg; - struct asn1p_type_tag_s outmost_tag; + struct asn1p_type_tag_s outmost_tag_s; + struct asn1p_type_tag_s *outmost_tag; char *p; + if(asn1f_fetch_outmost_tag(arg->asn, + expr->module, expr, &outmost_tag_s, 1)) { + outmost_tag = 0; + } else { + outmost_tag = &outmost_tag_s; + } + OUT("{ "); + + if(outmost_tag && outmost_tag->tag_value == -1) + OUT("ATF_OPEN_TYPE | "); OUT("%s, ", expr->marker?"ATF_POINTER":"ATF_NOFLAGS"); if((expr->marker & EM_OPTIONAL) == EM_OPTIONAL) { asn1p_expr_t *tv; @@ -1229,12 +1240,15 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { } INDENT(+1); if(C99_MODE) OUT(".tag = "); - if(asn1f_fetch_outmost_tag(arg->asn, - expr->module, expr, &outmost_tag, 0)) { - OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */"); + if(outmost_tag) { + if(outmost_tag->tag_value == -1) + OUT("-1 /* Ambiguous tag (ANY?) */"); + else + _print_tag(arg, outmost_tag); } else { - _print_tag(arg, &outmost_tag); + OUT("-1 /* Ambiguous tag (CHOICE?) */"); } + OUT(",\n"); if(C99_MODE) OUT(".tag_mode = "); if(expr->tag.tag_class) { diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 5bee2ed6..649f53b7 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -257,6 +257,14 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, edx = n; ctx->step = 1 + 2 * edx; /* Remember! */ goto microphase2; + } else if(elements[n].flags & ATF_OPEN_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; } else if(elements[n].tag == (ber_tlv_tag_t)-1) { use_bsearch = 1; break; @@ -304,18 +312,7 @@ SEQUENCE_decode_ber(asn1_TYPE_descriptor_t *td, * or an extension (...), * or an end of the indefinite-length structure. */ - if(!IN_EXTENSION_GROUP(specs, edx)) { - if(elements[edx].tag == (ber_tlv_tag_t)-1 - /* FIXME: any support */ - && (elements[edx].flags & ATF_POINTER) == 0) { - /* - * This must be the ANY type. - */ - ctx->step |= 1; - goto microphase2; - } - ASN_DEBUG("Unexpected tag %s", ber_tlv_tag_string(tlv_tag)); ASN_DEBUG("Expected tag %s (%s)%s", diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 3463c6c0..e072ec53 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -97,6 +97,7 @@ typedef struct asn1_TYPE_member_s { enum asn1_TYPE_flags_e { ATF_NOFLAGS, ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02, /* ANY type, without meaningful tag */ } flags; /* Element's presentation flags */ int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR index 63b696d6..4cdd0392 100644 --- a/tests/42-real-life-OK.asn1.-PR +++ b/tests/42-real-life-OK.asn1.-PR @@ -209,7 +209,7 @@ memb_vparts_2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr, static asn1_TYPE_member_t asn1_MBR_vparts[] = { { ATF_NOFLAGS, 0, 0, - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_VariablePart, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 3ff74e4b..c89e881f 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -218,7 +218,7 @@ typedef struct Choice_1 { static asn1_TYPE_member_t asn1_MBR_or[] = { { ATF_NOFLAGS, 0, 0, - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_Choice_1, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P index 3c6c1523..413ff00d 100644 --- a/tests/44-choice-in-sequence-OK.asn1.-P +++ b/tests/44-choice-in-sequence-OK.asn1.-P @@ -178,7 +178,7 @@ static asn1_TYPE_member_t asn1_MBR_b[] = { .name = "d" }, { ATF_NOFLAGS, 0, offsetof(struct b, choice.e), - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_e, .memb_constraints = 0, /* Defer to actual type */ @@ -235,7 +235,7 @@ static asn1_TYPE_member_t asn1_MBR_T[] = { .name = "a" }, { ATF_NOFLAGS, 0, offsetof(struct T, b), - .tag = -1 /* Ambiguous tag (CHOICE|ANY?) */, + .tag = -1 /* Ambiguous tag (CHOICE?) */, .tag_mode = 0, .type = (void *)&asn1_DEF_b, .memb_constraints = 0, /* Defer to actual type */ diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P new file mode 100644 index 00000000..96098a58 --- /dev/null +++ b/tests/60-any-OK.asn1.-P @@ -0,0 +1,145 @@ + +/*** <<< INCLUDES [T1] >>> ***/ + +#include <INTEGER.h> +#include <ANY.h> +#include <constr_SEQUENCE.h> + +/*** <<< DEPS [T1] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T1; + +/*** <<< TYPE-DECLS [T1] >>> ***/ + + +typedef struct T1 { + INTEGER_t i; + ANY_t any; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T1_t; + +/*** <<< STAT-DEFS [T1] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_T1[] = { + { ATF_NOFLAGS, 0, offsetof(struct T1, i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T1, any), + .tag = -1 /* Ambiguous tag (ANY?) */, + .tag_mode = 0, + .type = (void *)&asn1_DEF_ANY, + .memb_constraints = 0, /* Defer to actual type */ + .name = "any" + }, +}; +static ber_tlv_tag_t asn1_DEF_T1_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T1_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T1_specs = { + sizeof(struct T1), + offsetof(struct T1, _ber_dec_ctx), + asn1_DEF_T1_tag2el, + 1, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T1 = { + "T1", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T1_tags, + sizeof(asn1_DEF_T1_tags) + /sizeof(asn1_DEF_T1_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_T1, + 2, /* Elements count */ + &asn1_DEF_T1_specs /* Additional specs */ +}; + + +/*** <<< INCLUDES [T2] >>> ***/ + +#include <INTEGER.h> +#include <ANY.h> +#include <constr_SEQUENCE.h> + +/*** <<< DEPS [T2] >>> ***/ + +extern asn1_TYPE_descriptor_t asn1_DEF_T2; + +/*** <<< TYPE-DECLS [T2] >>> ***/ + + +typedef struct T2 { + INTEGER_t i; + ANY_t *any /* OPTIONAL */; + + /* Context for parsing across buffer boundaries */ + ber_dec_ctx_t _ber_dec_ctx; +} T2_t; + +/*** <<< STAT-DEFS [T2] >>> ***/ + +static asn1_TYPE_member_t asn1_MBR_T2[] = { + { ATF_NOFLAGS, 0, offsetof(struct T2, i), + .tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + .tag_mode = 0, + .type = (void *)&asn1_DEF_INTEGER, + .memb_constraints = 0, /* Defer to actual type */ + .name = "i" + }, + { ATF_POINTER, 1, offsetof(struct T2, any), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = (void *)&asn1_DEF_ANY, + .memb_constraints = 0, /* Defer to actual type */ + .name = "any" + }, +}; +static ber_tlv_tag_t asn1_DEF_T2_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 20 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* any at 21 */ +}; +static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = { + sizeof(struct T2), + offsetof(struct T2, _ber_dec_ctx), + asn1_DEF_T2_tag2el, + 2, /* Count of tags in the map */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn1_TYPE_descriptor_t asn1_DEF_T2 = { + "T2", + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_print, + SEQUENCE_free, + 0, /* Use generic outmost tag fetcher */ + asn1_DEF_T2_tags, + sizeof(asn1_DEF_T2_tags) + /sizeof(asn1_DEF_T2_tags[0]), /* 1 */ + 1, /* Tags to skip */ + 1, /* Whether CONSTRUCTED */ + asn1_MBR_T2, + 2, /* Elements count */ + &asn1_DEF_T2_specs /* Additional specs */ +}; + |