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 {