change in optionality handling resulted in stricter controls

diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index e49bc1a..b3af333 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -353,8 +353,7 @@
 }
 
 asn_enc_rval_t
-CHOICE_encode_der(asn_TYPE_descriptor_t *td,
-		void *struct_ptr,
+CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
 		int tag_mode, ber_tlv_tag_t tag,
 		asn_app_consume_bytes_f *cb, void *app_key) {
 	asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics;
@@ -367,7 +366,7 @@
 	ASN_DEBUG("%s %s as CHOICE",
 		cb?"Encoding":"Estimating", td->name);
 
-	present = _fetch_present_idx(struct_ptr,
+	present = _fetch_present_idx(sptr,
 		specs->pres_offset, specs->pres_size);
 
 	/*
@@ -380,10 +379,7 @@
 			erval.encoded = 0;
 			return erval;
 		}
-		erval.encoded = -1;
-		erval.failed_type = td;
-		erval.structure_ptr = struct_ptr;
-		return erval;
+		_ASN_ENCODE_FAILED;
 	}
 
 	/*
@@ -391,20 +387,17 @@
 	 */
 	elm = &td->elements[present-1];
 	if(elm->flags & ATF_POINTER) {
-		memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset);
+		memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
 		if(memb_ptr == 0) {
 			if(elm->optional) {
 				erval.encoded = 0;
-			} else {
-				/* Mandatory element absent */
-				erval.encoded = -1;
-				erval.failed_type = td;
-				erval.structure_ptr = struct_ptr;
+				return erval;
 			}
-			return erval;
+			/* Mandatory element absent */
+			_ASN_ENCODE_FAILED;
 		}
 	} else {
-		memb_ptr = (void *)((char *)struct_ptr + elm->memb_offset);
+		memb_ptr = (void *)((char *)sptr + elm->memb_offset);
 	}
 
 	/*
@@ -427,12 +420,8 @@
 		/* Encode CHOICE with parent or my own tag */
 		ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag,
 			cb, app_key);
-		if(ret == -1) {
-			erval.encoded = -1;
-			erval.failed_type = td;
-			erval.structure_ptr = struct_ptr;
-			return erval;
-		}
+		if(ret == -1)
+			_ASN_ENCODE_FAILED;
 		computed_size += ret;
 	}
 
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index aefd94b..7dcb5da 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -506,7 +506,7 @@
  */
 asn_enc_rval_t
 SEQUENCE_encode_der(asn_TYPE_descriptor_t *td,
-	void *ptr, int tag_mode, ber_tlv_tag_t tag,
+	void *sptr, int tag_mode, ber_tlv_tag_t tag,
 	asn_app_consume_bytes_f *cb, void *app_key) {
 	size_t computed_size = 0;
 	asn_enc_rval_t erval;
@@ -523,10 +523,14 @@
 		asn_TYPE_member_t *elm = &td->elements[edx];
 		void *memb_ptr;
 		if(elm->flags & ATF_POINTER) {
-			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
-			if(!memb_ptr) continue;
+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
+			if(!memb_ptr) {
+				if(elm->optional) continue;
+				/* Mandatory element is missing */
+				_ASN_ENCODE_FAILED;
+			}
 		} else {
-			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
 		}
 		erval = elm->type->der_encoder(elm->type, memb_ptr,
 			elm->tag_mode, elm->tag,
@@ -543,12 +547,8 @@
 	 */
 	ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key);
 	ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size);
-	if(ret == -1) {
-		erval.encoded = -1;
-		erval.failed_type = td;
-		erval.structure_ptr = ptr;
-		return erval;
-	}
+	if(ret == -1)
+		_ASN_ENCODE_FAILED;
 	erval.encoded = computed_size + ret;
 
 	if(!cb) return erval;
@@ -562,10 +562,10 @@
 		void *memb_ptr;
 
 		if(elm->flags & ATF_POINTER) {
-			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
+			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
 			if(!memb_ptr) continue;
 		} else {
-			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
+			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
 		}
 		tmperval = elm->type->der_encoder(elm->type, memb_ptr,
 			elm->tag_mode, elm->tag,
@@ -577,14 +577,11 @@
 			edx, elm->name, td->name, (long)tmperval.encoded);
 	}
 
-	if(computed_size != 0) {
+	if(computed_size != 0)
 		/*
 		 * Encoded size is not equal to the computed size.
 		 */
-		erval.encoded = -1;
-		erval.failed_type = td;
-		erval.structure_ptr = ptr;
-	}
+		_ASN_ENCODE_FAILED;
 
 	return erval;
 }
@@ -862,7 +859,12 @@
 
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
-			if(!memb_ptr) continue;	/* OPTIONAL element? */
+			if(!memb_ptr) {
+				if(elm->optional)
+					continue;
+				/* Mandatory element is missing */
+				_ASN_ENCODE_FAILED;
+			}
 		} else {
 			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
 		}
@@ -905,7 +907,11 @@
 
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
-			if(!memb_ptr) continue;
+			if(!memb_ptr) {
+				if(elm->optional) continue;
+				/* Print <absent> line */
+				/* Fall through */
+			}
 		} else {
 			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
 		}
@@ -978,7 +984,14 @@
 
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
-			if(!memb_ptr) continue;
+			if(!memb_ptr) {
+				if(elm->optional)
+					continue;
+				_ASN_ERRLOG(app_errlog, app_key,
+				"%s: mandatory element %s absent (%s:%d)",
+				td->name, elm->name, __FILE__, __LINE__);
+				return -1;
+			}
 		} else {
 			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
 		}
diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c
index a45d7f9..f99d66f 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
+ * All rights reserved.
  * Redistribution and modifications are permitted subject to BSD license.
  */
 #include <asn_internal.h>
@@ -477,6 +478,9 @@
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
 			if(!memb_ptr) {
+				if(!elm->optional)
+					/* Mandatory elements missing */
+					_ASN_ENCODE_FAILED;
 				if(t2m_build_own) {
 					t2m[t2m_count].el_no = edx;
 					t2m[t2m_count].el_tag = 0;
@@ -827,7 +831,12 @@
 
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
-			if(!memb_ptr) continue;	/* OPTIONAL element? */
+			if(!memb_ptr) {
+				if(elm->optional)
+					continue;
+				/* Mandatory element missing */
+				_ASN_ENCODE_FAILED;
+			}
 		} else {
 			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
 		}
@@ -872,7 +881,11 @@
 
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
-			if(!memb_ptr) continue;
+			if(!memb_ptr) {
+				if(elm->optional) continue;
+				/* Print <absent> line */
+				/* Fall through */
+			}
 		} else {
 			memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
 		}