diff options
-rw-r--r-- | skeletons/INTEGER.c | 12 | ||||
-rw-r--r-- | skeletons/NativeReal.c | 37 | ||||
-rw-r--r-- | skeletons/NativeReal.h | 1 | ||||
-rw-r--r-- | skeletons/REAL.c | 11 | ||||
-rw-r--r-- | skeletons/asn_codecs_prim.c | 17 | ||||
-rw-r--r-- | skeletons/asn_codecs_prim.h | 7 |
6 files changed, 62 insertions, 23 deletions
diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 1037bdd4..e855a4a0 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -180,12 +180,13 @@ INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, * 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 @@ INTEGER__xer_body_decode(INTEGER_t *st, void *chunk_buf, size_t chunk_size) { 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 @@ INTEGER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, 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 @@ asn_long2INTEGER(INTEGER_t *st, long value) { 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 b8a4926d..09d3e2cd 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -28,7 +28,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeReal = { 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 @@ NativeReal_encode_der(asn_TYPE_descriptor_t *td, void *ptr, } + +/* + * 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 b1c58bf4..32dd7f61 100644 --- a/skeletons/NativeReal.h +++ b/skeletons/NativeReal.h @@ -19,6 +19,7 @@ asn_struct_free_f NativeReal_free; 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 ace2f14a..a1608eeb 100644 --- a/skeletons/REAL.c +++ b/skeletons/REAL.c @@ -49,7 +49,7 @@ typedef enum specialRealValue { } 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 @@ REAL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, * 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 @@ REAL__xer_body_decode(REAL_t *st, void *chunk_buf, size_t chunk_size) { /* * 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 @@ REAL_decode_xer(asn_codec_ctx_t *opt_codec_ctx, 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 87914756..e6725b37 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -136,8 +136,8 @@ ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, * 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 @@ xer_decode__unexpected_tag(void *key, void *chunk_buf, size_t chunk_size) { 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 @@ xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { 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 @@ xer_decode__body(void *key, void *chunk_buf, size_t chunk_size, int have_more) { 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 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, * 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 @@ xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, } 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 69ee1069..c235f35b 100644 --- a/skeletons/asn_codecs_prim.h +++ b/skeletons/asn_codecs_prim.h @@ -17,16 +17,15 @@ ber_type_decoder_f ber_decode_primitive; 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) ); |