mirror of https://gerrit.osmocom.org/asn1c
proper XER encoding of native enumerated type
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@845 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
parent
b9b8be46ae
commit
75fddccc5e
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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_ */
|
||||
|
|
Loading…
Reference in New Issue