From 75fddccc5ef06f268ba05005bddf82bb26232503 Mon Sep 17 00:00:00 2001 From: vlm Date: Tue, 29 Mar 2005 17:19:53 +0000 Subject: [PATCH] proper XER encoding of native enumerated type git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@845 59561ff5-6e30-0410-9f3c-9617f08c8826 --- skeletons/INTEGER.c | 14 ++++++-------- skeletons/NativeEnumerated.c | 34 +++++++++++++++++++++++++++++++++- skeletons/NativeEnumerated.h | 4 +++- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c index 2579153f..e4e52d41 100644 --- a/skeletons/INTEGER.c +++ b/skeletons/INTEGER.c @@ -6,7 +6,6 @@ #include #include #include /* Encoder and decoder of a primitive type */ -#include #include /* @@ -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 8a524853..fb77e06d 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 2e6e1d0a..16f1bfdd 100644 --- a/skeletons/NativeEnumerated.h +++ b/skeletons/NativeEnumerated.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Copyright (c) 2004, 2005 Lev Walkin . 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_ */