more distinction
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@664 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index d7352c6..1430946 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -623,6 +623,7 @@
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
int xer_state; /* XER low level parsing context */
int edx; /* Element index */
+ int edx_end;
/*
* Create the target structure if it is not present already.
@@ -649,6 +650,7 @@
ssize_t ch_size; /* Chunk size */
xer_check_tag_e tcv; /* Tag check value */
asn_TYPE_member_t *elm;
+ int n;
/*
* Go inside the inner member of a sequence.
@@ -740,9 +742,8 @@
continue;
}
/* Fall through */
- case XCT_UNEXPECTED: {
- int edx_end;
- int n;
+ case XCT_UNKNOWN_OP:
+ case XCT_UNKNOWN_BO:
ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d",
tcv, ctx->phase);
@@ -754,6 +755,8 @@
* 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);
@@ -766,18 +769,29 @@
ctx->step = edx = n;
ctx->phase = 2;
break;
- case XCT_UNEXPECTED:
+ case XCT_UNKNOWN_OP:
+ case XCT_UNKNOWN_BO:
continue;
- case XCT_CLOSING:
default:
n = edx_end;
break; /* Phase out */
}
break;
}
- if(n == edx_end) break;
- continue;
- }
+ 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, "
+ "but NOT IMPLEMENTED YET", edx);
+ /*
+ * TODO: implement skipping of extensions
+ */
+ }
+
+ /* Fall through */
default:
break;
}