aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-07-03 05:31:02 +0000
committerLev Walkin <vlm@lionet.info>2005-07-03 05:31:02 +0000
commit026661996e34894c8a8bc9101a4131a3d9412524 (patch)
tree6f9434f85e49fa045ccb7202b1c3aa8e76905e5d /skeletons
parentb0f3db69c46b29b17e3e9a4fef0029fa146ffaf9 (diff)
better handling of not-yet-present extensions
Diffstat (limited to 'skeletons')
-rw-r--r--skeletons/constr_SEQUENCE.c72
1 files changed, 40 insertions, 32 deletions
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index f5c33da8..aefd94b5 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -764,46 +764,54 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
case XCT_UNKNOWN_OP:
case XCT_UNKNOWN_BO:
- ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d",
- tcv, ctx->phase);
- if(ctx->phase != 1
- || edx >= td->elements_count)
+ ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%d",
+ tcv, ctx->phase, edx);
+ if(ctx->phase != 1) {
break; /* Really unexpected */
+ }
- /*
- * Search which member corresponds to this tag.
- */
- edx_end = edx + elements[edx].optional + 1;
- if(edx_end > td->elements_count)
- edx_end = td->elements_count;
- for(n = edx; n < edx_end; n++) {
- elm = &td->elements[n];
- tcv = xer_check_tag(buf_ptr,ch_size,elm->name);
- switch(tcv) {
- case XCT_BOTH:
- case XCT_OPENING:
- /*
- * Process this member.
- */
- ctx->step = edx = n;
- ctx->phase = 2;
+ if(edx < td->elements_count) {
+ /*
+ * Search which member corresponds to this tag.
+ */
+ edx_end = edx + elements[edx].optional + 1;
+ if(edx_end > td->elements_count)
+ edx_end = td->elements_count;
+ for(n = edx; n < edx_end; n++) {
+ elm = &td->elements[n];
+ tcv = xer_check_tag(buf_ptr,
+ ch_size, elm->name);
+ switch(tcv) {
+ case XCT_BOTH:
+ case XCT_OPENING:
+ /*
+ * Process this member.
+ */
+ ctx->step = edx = n;
+ ctx->phase = 2;
+ break;
+ case XCT_UNKNOWN_OP:
+ case XCT_UNKNOWN_BO:
+ continue;
+ default:
+ n = edx_end;
+ break; /* Phase out */
+ }
break;
- case XCT_UNKNOWN_OP:
- case XCT_UNKNOWN_BO:
- continue;
- default:
- n = edx_end;
- break; /* Phase out */
}
- break;
+ if(n != edx_end)
+ continue;
+ } else {
+ ASN_DEBUG("Out of defined members: %d/%d",
+ edx, td->elements_count);
}
- if(n != edx_end)
- continue;
/* It is expected extension */
if(IN_EXTENSION_GROUP(specs,
- edx + elements[edx].optional)) {
- ASN_DEBUG("Got anticipated extension at %d", edx);
+ edx + (edx < td->elements_count
+ ? elements[edx].optional : 0))) {
+ ASN_DEBUG("Got anticipated extension at %d",
+ edx);
/*
* Check for (XCT_BOTH or XCT_UNKNOWN_BO)
* By using a mask. Only record a pure