diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 2579153f6abdd7bb96f0079799ce40dac20c5c00..e4e52d416233c93a58dd75e4b427ea2f53ff16e0 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 @@ INTEGER_encode_der(asn_TYPE_descriptor_t *td, void *sptr, 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 @@ INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_by 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 @@ INTEGER__compar_enum2value(const void *kp, const void *am) { } 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 @@ INTEGER__compar_value2enum(const void *kp, const void *am) { 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 @@ INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun 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 8a524853b7f4710c99713a1616f79024a2a06103..fb77e06da50ca8eba4e2b673e31dc455b9191707 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -27,7 +27,7 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { 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 @@ asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { 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 2e6e1d0acc87cf4b0f25b01aaca978cf58f22a5a..16f1bfdd350471f2855093d708c0f642717c47ba 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_ */