macro for free_struct()

diff --git a/skeletons/ANY.c b/skeletons/ANY.c
index b1e35bf..a96aac0 100644
--- a/skeletons/ANY.c
+++ b/skeletons/ANY.c
@@ -133,7 +133,7 @@
 		return 0;
 	} else {
 		/* Remove possibly partially decoded data. */
-		td->free_struct(td, newst, 0);
+		ASN_STRUCT_FREE(*td, newst);
 		return -1;
 	}
 }
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index 6934a82..79f62e8 100644
--- a/skeletons/GeneralizedTime.c
+++ b/skeletons/GeneralizedTime.c
@@ -218,8 +218,7 @@
 	
 		rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags,
 			cb, app_key);
-		asn_DEF_GeneralizedTime.free_struct(&asn_DEF_GeneralizedTime,
-			gt, 0);
+		ASN_STRUCT_FREE(asn_DEF_GeneralizedTime, gt);
 		return rv;
 	} else {
 		return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags,
diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c
index b974ebf..2f2b32d 100644
--- a/skeletons/NativeInteger.c
+++ b/skeletons/NativeInteger.c
@@ -194,7 +194,7 @@
 		 */
 		rval.consumed = 0;
 	}
-	asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, &st, 1);
+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st);
 	return rval;
 }
 
@@ -248,7 +248,7 @@
 			ASN_DEBUG("NativeInteger %s got value %ld",
 				td->name, *native);
 	}
-	asn_DEF_INTEGER.free_struct(&asn_DEF_INTEGER, &tmpint, 1);
+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
 
 	return rval;
 }
diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c
index 9b30368..3e6c254 100644
--- a/skeletons/NativeReal.c
+++ b/skeletons/NativeReal.c
@@ -152,7 +152,7 @@
 	}
 
 	/* Free possibly allocated members of the temporary structure */
-	asn_DEF_REAL.free_struct(&asn_DEF_REAL, &tmp, 1);
+	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_REAL, &tmp);
 
 	return erval;
 }
@@ -190,7 +190,7 @@
 	} else {
 		rval.consumed = 0;
 	}
-	asn_DEF_REAL.free_struct(&asn_DEF_REAL, st, 0);
+	ASN_STRUCT_FREE(asn_DEF_REAL, st);
 	return rval;
 }
 
diff --git a/skeletons/asn-decoder-template.c b/skeletons/asn-decoder-template.c
index 3225b66..dd0efdc 100644
--- a/skeletons/asn-decoder-template.c
+++ b/skeletons/asn-decoder-template.c
@@ -244,7 +244,7 @@
 			break;
 		}
 
-		pduType->free_struct(pduType, structure, 0);
+		ASN_STRUCT_FREE(*pduType, structure);
 	  }
 	}
 
@@ -425,7 +425,7 @@
 	fclose(fp);
 
 	/* Clean up partially decoded structure */
-	pduType->free_struct(pduType, structure, 0);
+	ASN_STRUCT_FREE(*pduType, structure);
 
 	fprintf(stderr, "%s: "
 		"Decode failed past byte %ld: %s\n",
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index 33cec7e..26fd8dd 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -959,10 +959,10 @@
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
 			if(memb_ptr)
-				elm->type->free_struct(elm->type, memb_ptr, 0);
+				ASN_STRUCT_FREE(*elm->type, memb_ptr);
 		} else {
 			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
-			elm->type->free_struct(elm->type, memb_ptr, 1);
+			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
 		}
 	}
 
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index e4a5b08..80cd6af 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -958,10 +958,10 @@
 		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);
+				ASN_STRUCT_FREE(*elm->type, memb_ptr);
 		} else {
 			memb_ptr = (void *)((char *)sptr + elm->memb_offset);
-			elm->type->free_struct(elm->type, memb_ptr, 1);
+			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
 		}
 	}
 
diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c
index e83abd7..bb99eed 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -924,10 +924,10 @@
 		if(elm->flags & ATF_POINTER) {
 			memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
 			if(memb_ptr)
-				elm->type->free_struct(elm->type, memb_ptr, 0);
+				ASN_STRUCT_FREE(*elm->type, memb_ptr);
 		} else {
 			memb_ptr = (void *)((char *)ptr + elm->memb_offset);
-			elm->type->free_struct(elm->type, memb_ptr, 1);
+			ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
 		}
 	}
 
diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c
index 7ca23a4..bb6d2d3 100644
--- a/skeletons/constr_SET_OF.c
+++ b/skeletons/constr_SET_OF.c
@@ -798,7 +798,7 @@
 		for(i = 0; i < list->count; i++) {
 			void *memb_ptr = list->array[i];
 			if(memb_ptr)
-			elm->type->free_struct(elm->type, memb_ptr, 0);
+			ASN_STRUCT_FREE(*elm->type, memb_ptr);
 		}
 		list->count = 0;	/* No meaningful elements left */
 
@@ -925,7 +925,7 @@
 				ASN_DEBUG("Failed decoding %s of %s (SET OF)",
 					elm->type->name, td->name);
 			}
-			if(ptr) elm->type->free_struct(elm->type, ptr, 0);
+			if(ptr) ASN_STRUCT_FREE(*elm->type, ptr);
 			_ASN_DECODE_FAILED;
 		}
 
diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h
index 37d21f6..70e7882 100644
--- a/skeletons/constr_TYPE.h
+++ b/skeletons/constr_TYPE.h
@@ -52,6 +52,9 @@
 typedef void (asn_struct_free_f)(
 		struct asn_TYPE_descriptor_s *type_descriptor,
 		void *struct_ptr, int free_contents_only);
+#define	ASN_STRUCT_FREE(asn_DEF, ptr)	(asn_DEF).free_struct(&(asn_DEF),ptr,0)
+#define	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr)	\
+					(asn_DEF).free_struct(&(asn_DEF),ptr,1)
 
 /*
  * Print the structure according to its specification.