more words on circular references

diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c
index 2d72fca..e578ccb 100644
--- a/skeletons/constr_SET_OF.c
+++ b/skeletons/constr_SET_OF.c
@@ -71,7 +71,7 @@
 	 * Bring closer parts of structure description.
 	 */
 	asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics;
-	asn_TYPE_member_t *element = td->elements;	/* Single one */
+	asn_TYPE_member_t *elm = td->elements;	/* Single one */
 
 	/*
 	 * Parts of the structure being constructed.
@@ -181,8 +181,8 @@
 		}
 
 		/* Outmost tag may be unknown and cannot be fetched/compared */
-		if(element->tag != (ber_tlv_tag_t)-1) {
-		    if(BER_TAGS_EQUAL(tlv_tag, element->tag)) {
+		if(elm->tag != (ber_tlv_tag_t)-1) {
+		    if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) {
 			/*
 			 * The new list member of expected type has arrived.
 			 */
@@ -190,7 +190,7 @@
 			ASN_DEBUG("Unexpected tag %s fixed SET OF %s",
 				ber_tlv_tag_string(tlv_tag), td->name);
 			ASN_DEBUG("%s SET OF has tag %s",
-				td->name, ber_tlv_tag_string(element->tag));
+				td->name, ber_tlv_tag_string(elm->tag));
 			RETURN(RC_FAIL);
 		    }
 		}
@@ -204,10 +204,10 @@
 		/*
 		 * Invoke the member fetch routine according to member's type
 		 */
-		rval = element->type->ber_decoder(opt_codec_ctx,
-				element->type, &ctx->ptr, ptr, LEFT, 0);
+		rval = elm->type->ber_decoder(opt_codec_ctx,
+				elm->type, &ctx->ptr, ptr, LEFT, 0);
 		ASN_DEBUG("In %s SET OF %s code %d consumed %d",
-			td->name, element->type->name,
+			td->name, elm->type->name,
 			rval.code, (int)rval.consumed);
 		switch(rval.code) {
 		case RC_OK:
@@ -317,6 +317,7 @@
 	size_t computed_size = 0;
 	ssize_t encoding_size = 0;
 	struct _el_buffer *encoded_els;
+	ssize_t eels_count = 0;
 	size_t max_encoded_len = 1;
 	asn_enc_rval_t erval;
 	int ret;
@@ -329,6 +330,7 @@
 	 */
 	for(edx = 0; edx < list->count; edx++) {
 		void *memb_ptr = list->array[edx];
+		if(!memb_ptr) continue;
 		erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0);
 		if(erval.encoded == -1)
 			return erval;
@@ -378,7 +380,9 @@
 	 */
 	for(edx = 0; edx < list->count; edx++) {
 		void *memb_ptr = list->array[edx];
-		struct _el_buffer *encoded_el = &encoded_els[edx];
+		struct _el_buffer *encoded_el = &encoded_els[eels_count];
+
+		if(!memb_ptr) continue;
 
 		/*
 		 * Prepare space for encoding.
@@ -409,19 +413,20 @@
 			return erval;
 		}
 		encoding_size += erval.encoded;
+		eels_count++;
 	}
 
 	/*
 	 * Sort the encoded elements according to their encoding.
 	 */
-	qsort(encoded_els, list->count, sizeof(encoded_els[0]), _el_buf_cmp);
+	qsort(encoded_els, eels_count, sizeof(encoded_els[0]), _el_buf_cmp);
 
 	/*
 	 * Report encoded elements to the application.
 	 * Dispose of temporary sorted members table.
 	 */
 	ret = 0;
-	for(edx = 0; edx < list->count; edx++) {
+	for(edx = 0; edx < eels_count; edx++) {
 		struct _el_buffer *encoded_el = &encoded_els[edx];
 		/* Report encoded chunks to the application */
 		if(ret == 0
@@ -638,11 +643,10 @@
 		asn_app_consume_bytes_f *cb, void *app_key) {
 	asn_enc_rval_t er;
 	asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics;
-	asn_TYPE_member_t *element = td->elements;
+	asn_TYPE_member_t *elm = td->elements;
 	asn_anonymous_set_ *list = _A_SET_FROM_VOID(sptr);
 	const char *mname = specs->as_XMLValueList
-		? 0 : ((*element->name)
-			? element->name : element->type->xml_tag);
+		? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag);
 	size_t mlen = mname ? strlen(mname) : 0;
 	int xcan = (flags & XER_F_CANONICAL);
 	xer_tmp_enc_t *encs = 0;
@@ -680,7 +684,7 @@
 
 		if(!xcan && specs->as_XMLValueList)
 			_i_ASN_TEXT_INDENT(1, ilevel + 1);
-		tmper = element->type->xer_encoder(element->type, memb_ptr,
+		tmper = elm->type->xer_encoder(elm->type, memb_ptr,
 				ilevel + 1, flags, cb, app_key);
 		if(tmper.encoded == -1) {
 			td = tmper.failed_type;
@@ -688,8 +692,8 @@
 			goto cb_failed;
 		}
 		if(tmper.encoded == 0 && specs->as_XMLValueList) {
-			const char *name = (*element->name)
-				? element->name : element->type->xml_tag;
+			const char *name = (*elm->name)
+				? elm->name : elm->type->xml_tag;
 			size_t len = strlen(name);
 			_ASN_CALLBACK3("<", 1, name, len, "/>", 2);
 		}
@@ -741,7 +745,7 @@
 int
 SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
 		asn_app_consume_bytes_f *cb, void *app_key) {
-	asn_TYPE_member_t *element = td->elements;
+	asn_TYPE_member_t *elm = td->elements;
 	const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr);
 	int ret;
 	int i;
@@ -759,7 +763,7 @@
 
 		_i_INDENT(1);
 
-		ret = element->type->print_struct(element->type, memb_ptr,
+		ret = elm->type->print_struct(elm->type, memb_ptr,
 			ilevel + 1, cb, app_key);
 		if(ret) return ret;
 	}
@@ -773,7 +777,7 @@
 void
 SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
 	if(td && ptr) {
-		asn_TYPE_member_t *element = td->elements;
+		asn_TYPE_member_t *elm = td->elements;
 		asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr);
 		int i;
 
@@ -784,7 +788,7 @@
 		for(i = 0; i < list->count; i++) {
 			void *memb_ptr = list->array[i];
 			if(memb_ptr)
-			element->type->free_struct(element->type, memb_ptr, 0);
+			elm->type->free_struct(elm->type, memb_ptr, 0);
 		}
 		list->count = 0;	/* No meaningful elements left */
 
@@ -799,7 +803,7 @@
 int
 SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
 		asn_app_consume_bytes_f *app_errlog, void *app_key) {
-	asn_TYPE_member_t *element = td->elements;
+	asn_TYPE_member_t *elm = td->elements;
 	asn_constr_check_f *constr;
 	const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr);
 	int i;
@@ -811,8 +815,8 @@
 		return -1;
 	}
 
-	constr = element->memb_constraints;
-	if(!constr) constr = element->type->check_constraints;
+	constr = elm->memb_constraints;
+	if(!constr) constr = elm->type->check_constraints;
 
 	/*
 	 * Iterate over the members of an array.
@@ -824,7 +828,7 @@
 
 		if(!memb_ptr) continue;
 
-		ret = constr(element->type, memb_ptr, app_errlog, app_key);
+		ret = constr(elm->type, memb_ptr, app_errlog, app_key);
 		if(ret) return ret;
 	}
 
@@ -832,8 +836,8 @@
 	 * Cannot inherit it eralier:
 	 * need to make sure we get the updated version.
 	 */
-	if(!element->memb_constraints)
-		element->memb_constraints = element->type->check_constraints;
+	if(!elm->memb_constraints)
+		elm->memb_constraints = elm->type->check_constraints;
 
 	return 0;
 }