proper XER encoding of native enumerated type

diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c
index 2579153..e4e52d4 100644
--- a/skeletons/INTEGER.c
+++ b/skeletons/INTEGER.c
@@ -6,7 +6,6 @@
 #include <asn_internal.h>
 #include <INTEGER.h>
 #include <asn_codecs_prim.h>	/* Encoder and decoder of a primitive type */
-#include <assert.h>
 #include <errno.h>
 
 /*
@@ -93,8 +92,7 @@
 	return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key);
 }
 
-static const asn_INTEGER_enum_map_t *INTEGER__map_value2enum(asn_INTEGER_specifics_t *specs, long value);
-static const asn_INTEGER_enum_map_t *INTEGER__map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop);
+static const asn_INTEGER_enum_map_t *INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop);
 
 /*
  * INTEGER specific human-readable output.
@@ -139,7 +137,7 @@
 				accum = (accum << 8) | *buf;
 		}
 
-		el = INTEGER__map_value2enum(specs, accum);
+		el = INTEGER_map_value2enum(specs, accum);
 		if(el) {
 			scrsize = el->enum_len + 32;
 			scr = (char *)alloca(scrsize);
@@ -240,7 +238,7 @@
 }
 
 static const asn_INTEGER_enum_map_t *
-INTEGER__map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) {
+INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) {
 	asn_INTEGER_enum_map_t *el_found;
 	int count = specs ? specs->map_count : 0;
 	struct e2v_key key;
@@ -287,8 +285,8 @@
 	else return 1;
 }
 
-static const asn_INTEGER_enum_map_t *
-INTEGER__map_value2enum(asn_INTEGER_specifics_t *specs, long value) {
+const asn_INTEGER_enum_map_t *
+INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value) {
 	int count = specs ? specs->map_count : 0;
 	if(!count) return 0;
 	return (asn_INTEGER_enum_map_t *)bsearch(&value, specs->value2enum,
@@ -366,7 +364,7 @@
 		case 0x3c:	/* '<' */
 			if(state == ST_SKIPSPACE) {
 				const asn_INTEGER_enum_map_t *el;
-				el = INTEGER__map_enum2value(
+				el = INTEGER_map_enum2value(
 					(asn_INTEGER_specifics_t *)
 					td->specifics, lstart, lstop);
 				if(el) {
diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c
index 8a52485..fb77e06 100644
--- a/skeletons/NativeEnumerated.c
+++ b/skeletons/NativeEnumerated.c
@@ -27,7 +27,7 @@
 	NativeInteger_decode_ber,
 	NativeInteger_encode_der,
 	NativeInteger_decode_xer,
-	NativeInteger_encode_xer,
+	NativeEnumerated_encode_xer,
 	0, /* Use generic outmost tag fetcher */
 	asn_DEF_NativeEnumerated_tags,
 	sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
@@ -37,3 +37,35 @@
 	0	/* No specifics */
 };
 
+asn_enc_rval_t
+NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
+        int ilevel, enum xer_encoder_flags_e flags,
+                asn_app_consume_bytes_f *cb, void *app_key) {
+	asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
+        asn_enc_rval_t er;
+        const long *native = (const long *)sptr;
+	const asn_INTEGER_enum_map_t *el;
+
+        (void)ilevel;
+        (void)flags;
+
+        if(!native) _ASN_ENCODE_FAILED;
+
+	el = INTEGER_map_value2enum(specs, *native);
+	if(el) {
+		size_t srcsize = el->enum_len + 5;
+		char *src = (char *)alloca(srcsize);
+
+		er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
+		assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
+		if(cb(src, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED;
+		return er;
+	} else {
+		ASN_DEBUG("ASN.1 forbids dealing with "
+			"unknown value of ENUMERATED type");
+		_ASN_ENCODE_FAILED;
+	}
+
+        return er;
+}
+
diff --git a/skeletons/NativeEnumerated.h b/skeletons/NativeEnumerated.h
index 2e6e1d0..16f1bfd 100644
--- a/skeletons/NativeEnumerated.h
+++ b/skeletons/NativeEnumerated.h
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2004, 2005 Lev Walkin <vlm@lionet.info>. All rights reserved.
  * Redistribution and modifications are permitted subject to BSD license.
  */
 /*
@@ -16,4 +16,6 @@
 
 extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated;
 
+xer_type_encoder_f NativeEnumerated_encode_xer;
+
 #endif	/* _NativeEnumerated_H_ */