distinction between an optional member and a member encoded with a pointer
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@302 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index 2a8a540..5bee2ed 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -197,14 +197,17 @@
/*
* MICROPHASE 1: Synchronize decoding.
*/
- ASN_DEBUG("In %s SEQUENCE left %d, edx=%d opt=%d ec=%d",
- td->name, (int)ctx->left,
- edx, elements[edx].optional, td->elements_count);
+ ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d"
+ " opt=%d ec=%d",
+ td->name, (int)ctx->left, edx,
+ elements[edx].flags, elements[edx].optional,
+ td->elements_count);
if(ctx->left == 0 /* No more stuff is expected */
&& (
/* Explicit OPTIONAL specification reaches the end */
- (edx + elements[edx].optional == td->elements_count)
+ (edx + elements[edx].optional
+ == td->elements_count)
||
/* All extensions are optional */
(IN_EXTENSION_GROUP(specs, edx)
@@ -304,7 +307,8 @@
if(!IN_EXTENSION_GROUP(specs, edx)) {
if(elements[edx].tag == (ber_tlv_tag_t)-1
- && elements[edx].optional == 0) {
+ /* FIXME: any support */
+ && (elements[edx].flags & ATF_POINTER) == 0) {
/*
* This must be the ANY type.
*/
@@ -375,8 +379,8 @@
* and also a type of containment (it may be contained
* as pointer or using inline inclusion).
*/
- if(elements[edx].optional) {
- /* Optional member, hereby, a simple pointer */
+ if(elements[edx].flags & ATF_POINTER) {
+ /* Member is a pointer to another structure */
memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset);
} else {
/*
@@ -505,7 +509,7 @@
for(edx = 0; edx < td->elements_count; edx++) {
asn1_TYPE_member_t *elm = &td->elements[edx];
void *memb_ptr;
- if(elm->optional) {
+ if(elm->flags & ATF_POINTER) {
memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
if(!memb_ptr) continue;
} else {
@@ -544,7 +548,7 @@
der_enc_rval_t tmperval;
void *memb_ptr;
- if(elm->optional) {
+ if(elm->flags & ATF_POINTER) {
memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
if(!memb_ptr) continue;
} else {
@@ -589,7 +593,7 @@
asn1_TYPE_member_t *elm = &td->elements[edx];
const void *memb_ptr;
- if(elm->optional) {
+ if(elm->flags & ATF_POINTER) {
memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
if(!memb_ptr) continue;
} else {
@@ -632,7 +636,7 @@
for(edx = 0; edx < td->elements_count; edx++) {
asn1_TYPE_member_t *elm = &td->elements[edx];
void *memb_ptr;
- if(elm->optional) {
+ if(elm->flags & ATF_POINTER) {
memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
if(memb_ptr)
elm->type->free_struct(elm->type, memb_ptr, 0);
@@ -666,7 +670,7 @@
asn1_TYPE_member_t *elm = &td->elements[edx];
const void *memb_ptr;
- if(elm->optional) {
+ if(elm->flags & ATF_POINTER) {
memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
if(!memb_ptr) continue;
} else {