aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-09-04 04:44:30 +0000
committerLev Walkin <vlm@lionet.info>2004-09-04 04:44:30 +0000
commit7210fdb898a86e5e5e8b561c82a7a74c0d3ff264 (patch)
tree094adb8cc4c99d3415b84f75d848978888d088e1
parent60b7cffb93461c32948a3f00ba86c91acbc71992 (diff)
support for untagged ANY type
-rw-r--r--skeletons/ber_decoder.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c
index e56cc6a6..b2c08f50 100644
--- a/skeletons/ber_decoder.c
+++ b/skeletons/ber_decoder.c
@@ -95,8 +95,29 @@ ber_check_tags(asn1_TYPE_descriptor_t *td, ber_dec_ctx_t *ctx,
;
ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)",
td->name, (long)size, tag_mode, ctx->step, tagno);
- //assert(td->tags_count >= 1); ?May not be the case for CHOICE!
- assert(tagno < td->tags_count); /* At least one loop */
+ //assert(td->tags_count >= 1); ?May not be the case for CHOICE or ANY.
+
+ if(tagno == td->tags_count) {
+ /*
+ * This must be the _untagged_ ANY type,
+ * which outermost tag isn't known in advance.
+ * Fetch the tag and length separately.
+ */
+ tag_len = ber_fetch_tag(ptr, size, &tlv_tag);
+ switch(tag_len) {
+ case -1: RETURN(RC_FAIL);
+ case 0: RETURN(RC_WMORE);
+ }
+ tlv_constr = BER_TLV_CONSTRUCTED(ptr);
+ len_len = ber_fetch_length(tlv_constr,
+ (char *)ptr + tag_len, size - tag_len, &tlv_len);
+ switch(len_len) {
+ case -1: RETURN(RC_FAIL);
+ case 0: RETURN(RC_WMORE);
+ }
+ } else {
+ assert(tagno < td->tags_count); /* At least one loop */
+ }
for((void)tagno; tagno < td->tags_count; tagno++, ctx->step++) {
/*