allow local cleanup


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@476 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/xer_encoder.c b/skeletons/xer_encoder.c
index 3c97a8f..d3f04d6 100644
--- a/skeletons/xer_encoder.c
+++ b/skeletons/xer_encoder.c
@@ -19,12 +19,7 @@
 	size_t mlen;
 	int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2;
 
-	if(!td || !sptr) {
-		er.encoded = -1;
-		er.failed_type = td;
-		er.structure_ptr = sptr;
-		return er;
-	}
+	if(!td || !sptr) goto cb_failed;
 
 	mname = td->name;
 	mlen = strlen(mname);
@@ -34,11 +29,13 @@
 	tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key);
 	if(tmper.encoded == -1) return tmper;
 
-	_ASN_CALLBACK3("</", xcan, mname, mlen, ">\n",xcan);
+	_ASN_CALLBACK3("</", 2, mname, mlen, ">\n", xcan);
 
-	er.encoded = 2 + (2 * xcan) + (2 * mlen) + tmper.encoded;
+	er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded;
 
 	return er;
+cb_failed:
+	_ASN_ENCODE_FAILED;
 }
 
 /*