blob: fb77e06da50ca8eba4e2b673e31dc455b9191707 [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001/*-
2 * Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
3 * Redistribution and modifications are permitted subject to BSD license.
4 */
5/*
6 * Please read the NativeInteger.h for the explanation wrt. differences between
7 * INTEGER and NativeInteger.
8 * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
9 * implementation deals with the standard (machine-specific) representation
10 * of them instead of using the platform-independent buffer.
11 */
vlm39ba4c42004-09-22 16:06:28 +000012#include <asn_internal.h>
vlmfa67ddc2004-06-03 03:38:44 +000013#include <NativeEnumerated.h>
14
15/*
16 * NativeEnumerated basic type description.
17 */
vlmef6355b2004-09-29 13:26:15 +000018static ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = {
vlmfa67ddc2004-06-03 03:38:44 +000019 (ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
20};
vlmef6355b2004-09-29 13:26:15 +000021asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = {
vlmfa67ddc2004-06-03 03:38:44 +000022 "ENUMERATED", /* The ASN.1 type is still ENUMERATED */
vlm9de248e2004-10-20 15:50:55 +000023 "ENUMERATED",
vlm39ba4c42004-09-22 16:06:28 +000024 NativeInteger_free,
25 NativeInteger_print,
vlmfa67ddc2004-06-03 03:38:44 +000026 asn_generic_no_constraint,
27 NativeInteger_decode_ber,
28 NativeInteger_encode_der,
vlmd52f9b52004-10-21 14:13:48 +000029 NativeInteger_decode_xer,
vlm75fddcc2005-03-29 17:19:53 +000030 NativeEnumerated_encode_xer,
vlmfa67ddc2004-06-03 03:38:44 +000031 0, /* Use generic outmost tag fetcher */
vlmef6355b2004-09-29 13:26:15 +000032 asn_DEF_NativeEnumerated_tags,
33 sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
34 asn_DEF_NativeEnumerated_tags, /* Same as above */
35 sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
vlme413c122004-08-20 13:23:42 +000036 0, 0, /* No members */
vlmb42843a2004-06-05 08:17:50 +000037 0 /* No specifics */
vlmfa67ddc2004-06-03 03:38:44 +000038};
vlme413c122004-08-20 13:23:42 +000039
vlm75fddcc2005-03-29 17:19:53 +000040asn_enc_rval_t
41NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
42 int ilevel, enum xer_encoder_flags_e flags,
43 asn_app_consume_bytes_f *cb, void *app_key) {
44 asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
45 asn_enc_rval_t er;
46 const long *native = (const long *)sptr;
47 const asn_INTEGER_enum_map_t *el;
48
49 (void)ilevel;
50 (void)flags;
51
52 if(!native) _ASN_ENCODE_FAILED;
53
54 el = INTEGER_map_value2enum(specs, *native);
55 if(el) {
56 size_t srcsize = el->enum_len + 5;
57 char *src = (char *)alloca(srcsize);
58
59 er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
60 assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
61 if(cb(src, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED;
62 return er;
63 } else {
64 ASN_DEBUG("ASN.1 forbids dealing with "
65 "unknown value of ENUMERATED type");
66 _ASN_ENCODE_FAILED;
67 }
68
69 return er;
70}
71