brushing up


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@531 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c
index 1037bdd..e855a4a 100644
--- a/skeletons/INTEGER.c
+++ b/skeletons/INTEGER.c
@@ -180,12 +180,13 @@
  * Decode the chunk of XML text encoding INTEGER.
  */
 static ssize_t
-INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) {
+INTEGER__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) {
+	INTEGER_t *st = (INTEGER_t *)sptr;
 	long sign = 1;
 	long value;
 	char *lp;
 	char *lstart = (char *)chunk_buf;
-	char *lstop = chunk_buf + chunk_size;
+	char *lstop = lstart + chunk_size;
 	enum {
 		ST_SKIPSPACE,
 		ST_WAITDIGITS,
@@ -231,7 +232,8 @@
 			if(value < 0) {
 				/* Check whether it is a LONG_MIN */
 				if(sign == -1
-				&& value == ~((unsigned long)-1 >> 1)) {
+				&& (unsigned long)value
+						== ~((unsigned long)-1 >> 1)) {
 					sign = 1;
 				} else {
 					/* Overflow */
@@ -261,7 +263,7 @@
 		void *buf_ptr, size_t size) {
 
 	return xer_decode_primitive(opt_codec_ctx, td,
-		(ASN__PRIMITIVE_TYPE_t **)sptr, opt_mname,
+		sptr, sizeof(INTEGER_t), opt_mname,
 		buf_ptr, size, INTEGER__xer_body_decode);
 }
 
@@ -356,7 +358,7 @@
 		return -1;
 	}
 
-	buf = MALLOC(sizeof(value));
+	buf = (uint8_t *)MALLOC(sizeof(value));
 	if(!buf) return -1;
 
 	pstart = (uint8_t *)&value;
diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c
index b8a4926..09d3e2c 100644
--- a/skeletons/NativeReal.c
+++ b/skeletons/NativeReal.c
@@ -28,7 +28,7 @@
 	asn_generic_no_constraint,
 	NativeReal_decode_ber,
 	NativeReal_encode_der,
-	0,				/* Not implemented yet */
+	NativeReal_decode_xer,
 	NativeReal_encode_xer,
 	0, /* Use generic outmost tag fetcher */
 	asn_DEF_NativeReal_tags,
@@ -143,6 +143,41 @@
 }
 
 
+
+/*
+ * Decode the chunk of XML text encoding REAL.
+ */
+asn_dec_rval_t
+NativeReal_decode_xer(asn_codec_ctx_t *opt_codec_ctx,
+	asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname,
+		void *buf_ptr, size_t size) {
+	asn_dec_rval_t rval;
+	REAL_t *st = 0;
+	double *Dbl = (double *)*sptr;
+
+	if(!Dbl) {
+		(void *)Dbl = *sptr = CALLOC(1, sizeof(double));
+		if(!Dbl) {
+			rval.code = RC_FAIL;
+			rval.consumed = 0;
+			return rval;
+		}
+	}
+
+	rval = REAL_decode_xer(opt_codec_ctx, td, (void **)&st, opt_mname,
+		buf_ptr, size);
+	if(rval.code == RC_OK) {
+		if(asn_REAL2double(st, Dbl)) {
+			rval.code = RC_FAIL;
+			rval.consumed = 0;
+		}
+	} else {
+		rval.consumed = 0;
+	}
+	asn_DEF_REAL.free_struct(&asn_DEF_REAL, st, 0);
+	return rval;
+}
+
 asn_enc_rval_t
 NativeReal_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
 	int ilevel, enum xer_encoder_flags_e flags,
diff --git a/skeletons/NativeReal.h b/skeletons/NativeReal.h
index b1c58bf..32dd7f6 100644
--- a/skeletons/NativeReal.h
+++ b/skeletons/NativeReal.h
@@ -19,6 +19,7 @@
 asn_struct_print_f NativeReal_print;
 ber_type_decoder_f NativeReal_decode_ber;
 der_type_encoder_f NativeReal_encode_der;
+xer_type_decoder_f NativeReal_decode_xer;
 xer_type_encoder_f NativeReal_encode_xer;
 
 #endif	/* ASN_TYPE_NativeReal_H */
diff --git a/skeletons/REAL.c b/skeletons/REAL.c
index ace2f14..a1608ee 100644
--- a/skeletons/REAL.c
+++ b/skeletons/REAL.c
@@ -49,7 +49,7 @@
 } specialRealValue_e;
 static struct specialRealValue_s {
 	char *string;
-	int length;
+	size_t length;
 	double dv;
 } specialRealValue[] = {
 #define	SRV_SET(foo, val)	{ foo, sizeof(foo) - 1, val }
@@ -248,7 +248,8 @@
  * Decode the chunk of XML text encoding REAL.
  */
 static ssize_t
-REAL__xer_body_decode(REAL_t *st, void *chunk_buf, size_t chunk_size) {
+REAL__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) {
+	REAL_t *st = (REAL_t *)sptr;
 	double value;
 	char *xerdata = (char *)chunk_buf;
 	char *endptr = 0;
@@ -280,10 +281,10 @@
 	/*
 	 * Copy chunk into the nul-terminated string, and run strtod.
 	 */
-	b = MALLOC(chunk_size + 1);
+	b = (char *)MALLOC(chunk_size + 1);
 	if(!b) return -1;
 	memcpy(b, chunk_buf, chunk_size);
-	b[chunk_size] = 0;
+	b[chunk_size] = 0;	/* nul-terminate */
 
 	value = strtod(b, &endptr);
 	free(b);
@@ -301,7 +302,7 @@
 		void *buf_ptr, size_t size) {
 
 	return xer_decode_primitive(opt_codec_ctx, td,
-		(ASN__PRIMITIVE_TYPE_t **)sptr, opt_mname,
+		sptr, sizeof(REAL_t), opt_mname,
 		buf_ptr, size, REAL__xer_body_decode);
 }
 
diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c
index 8791475..e6725b3 100644
--- a/skeletons/asn_codecs_prim.c
+++ b/skeletons/asn_codecs_prim.c
@@ -136,8 +136,8 @@
  * Local internal type passed around as an argument.
  */
 struct xdp_arg_s {
-	ASN__PRIMITIVE_TYPE_t *sptr;
-	ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *sptr,
+	void *struct_key;
+	ssize_t (*prim_body_decode)(void *struct_key,
 		void *chunk_buf, size_t chunk_size);
 	int decoded_something;
 	int want_more;
@@ -181,7 +181,7 @@
 		return -1;
 	}
 
-	decoded = arg->prim_body_decode(arg->sptr, chunk_buf, chunk_size);
+	decoded = arg->prim_body_decode(arg->struct_key, chunk_buf, chunk_size);
 	if(decoded < 0) {
 		return -1;
 	} else {
@@ -218,7 +218,7 @@
 		return -1;
 	}
 
-	decoded = arg->prim_body_decode(arg->sptr, chunk_buf, chunk_size);
+	decoded = arg->prim_body_decode(arg->struct_key, chunk_buf, chunk_size);
 	if(decoded < 0) {
 		return -1;
 	} else {
@@ -231,10 +231,11 @@
 asn_dec_rval_t
 xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx,
 	asn_TYPE_descriptor_t *td,
-	ASN__PRIMITIVE_TYPE_t **sptr,
+	void **sptr,
+	size_t struct_size,
 	const char *opt_mname,
 	void *buf_ptr, size_t size,
-	ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *sptr,
+	ssize_t (*prim_body_decode)(void *struct_key,
 		void *chunk_buf, size_t chunk_size)
 ) {
 	const char *xml_tag = opt_mname ? opt_mname : td->xml_tag;
@@ -246,7 +247,7 @@
 	 * Create the structure if does not exist.
 	 */
 	if(!*sptr) {
-		*sptr = CALLOC(1, sizeof(ASN__PRIMITIVE_TYPE_t));
+		*sptr = CALLOC(1, struct_size);
 		if(!*sptr) {
 			asn_dec_rval_t rval;
 			rval.code = RC_FAIL;
@@ -256,7 +257,7 @@
 	}
 
 	memset(&s_ctx, 0, sizeof(s_ctx));
-	s_arg.sptr = *sptr;
+	s_arg.struct_key = *sptr;
 	s_arg.prim_body_decode = prim_body_decode;
 	s_arg.decoded_something = 0;
 	s_arg.want_more = 0;
diff --git a/skeletons/asn_codecs_prim.h b/skeletons/asn_codecs_prim.h
index 69ee106..c235f35 100644
--- a/skeletons/asn_codecs_prim.h
+++ b/skeletons/asn_codecs_prim.h
@@ -17,16 +17,15 @@
 der_type_encoder_f der_encode_primitive;
 
 /*
- * Specific function to decode simple primitive values
- * (INTEGER, ENUMERATED, REAL, OBJECT IDENTIFIER, etc).
+ * Specific function to decode simple primitive types.
  * Also see xer_decode_general() in xer_decoder.h
  */
 asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx,
 	asn_TYPE_descriptor_t *type_descriptor,
-	ASN__PRIMITIVE_TYPE_t **struct_ptr,
+	void **struct_ptr, size_t struct_size,
 	const char *opt_mname,
 	void *buf_ptr, size_t size,
-	ssize_t (*prim_body_decode)(ASN__PRIMITIVE_TYPE_t *struct_ptr,
+	ssize_t (*prim_body_decode)(void *struct_ptr,
 		void *chunk_buf, size_t chunk_size)
 	);