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)
);