ENUMERATED_jer.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
3  * All rights reserved.
4  * Redistribution and modifications are permitted subject to BSD license.
5  */
9 
10 struct e2v_key {
11  const char *start;
12  const char *stop;
14  const unsigned int *evmap;
15 };
16 static int
17 ENUMERATED__jer_compar_enum2value(const void *kp, const void *am) {
18  const struct e2v_key *key = (const struct e2v_key *)kp;
19  const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am;
20  const char *ptr, *end, *name;
21 
22  /* Remap the element (sort by different criterion) */
23  el = key->vemap + key->evmap[el - key->vemap];
24 
25  /* Compare strings */
26  for(ptr = key->start, end = key->stop, name = el->enum_name;
27  ptr < end; ptr++, name++) {
28  if(*ptr != *name || !*name)
29  return *(const unsigned char *)ptr - *(const unsigned char *)name;
30  }
31  return name[0] ? -1 : 0;
32 }
33 
34 static const asn_INTEGER_enum_map_t *
35 ENUMERATED_jer_map_enum2value(const asn_INTEGER_specifics_t *specs, const char *lstart,
36  const char *lstop) {
37  const asn_INTEGER_enum_map_t *el_found;
38  int count = specs ? specs->map_count : 0;
39  struct e2v_key key;
40  const char *lp;
41 
42  if(!count) return NULL;
43 
44  /* Guaranteed: assert(lstart < lstop); */
45  /* Figure out the tag name */
46  for(lstart++, lp = lstart; lp < lstop; lp++) {
47  switch(*lp) {
48  case 9: case 10: case 11: case 12: case 13: case 32: /* WSP */
49  case 0x22: /* '"' */
50  break;
51  default:
52  continue;
53  }
54  break;
55  }
56  if(lp == lstop) return NULL; /* No tag found */
57  lstop = lp;
58 
59  key.start = lstart;
60  key.stop = lstop;
61  key.vemap = specs->value2enum;
62  key.evmap = specs->enum2value;
63  el_found = (asn_INTEGER_enum_map_t *)bsearch(&key,
64  specs->value2enum, count, sizeof(specs->value2enum[0]),
66  if(el_found) {
67  /* Remap enum2value into value2enum */
68  el_found = key.vemap + key.evmap[el_found - key.vemap];
69  }
70  return el_found;
71 }
72 
73 static enum jer_pbd_rval
75  const void *chunk_buf, size_t chunk_size) {
76  INTEGER_t *st = (INTEGER_t *)sptr;
77  intmax_t dec_value;
78  const char *lp;
79  const char *lstart = (const char *)chunk_buf;
80  const char *lstop = lstart + chunk_size;
81  int decoded = 0;
82 
83  for (lp = lstart; lp < lstop; ++lp) {
84  if (*lp == 0x22 /* '"' */) {
85  const asn_INTEGER_enum_map_t *el;
87  (const asn_INTEGER_specifics_t *)
88  td->specifics, lstart, lstop);
89  if(el) {
90  ASN_DEBUG("Found \"%s\" => %ld",
91  el->enum_name, el->nat_value);
92  dec_value = el->nat_value;
93  decoded = 1;
94  lp = lstop - 1;
95  continue;
96  }
97  ASN_DEBUG("Unknown identifier for ENUMERATED");
98  } else {
99  continue;
100  }
101  }
102 
103  if (!decoded) {
104  return JPBD_BROKEN_ENCODING;;
105  }
106 
107  /*
108  * Convert the result of parsing of enumeration into a BER representation.
109  */
110  if(asn_imax2INTEGER(st, dec_value)) {
111  ASN_DEBUG("ENUMERATED decode %s conversion failed", td->name);
112  return JPBD_SYSTEM_FAILURE;
113  }
114 
115  return JPBD_BODY_CONSUMED;
116 }
117 
120  const asn_TYPE_descriptor_t *td,
121  const asn_jer_constraints_t *constraints,
122  void **sptr, const void *buf_ptr, size_t size) {
123  return jer_decode_primitive(opt_codec_ctx, td,
124  sptr, sizeof(INTEGER_t),
125  buf_ptr, size, ENUMERATED__jer_body_decode);
126 }
JPBD_BODY_CONSUMED
@ JPBD_BODY_CONSUMED
Definition: asn_codecs_prim.h:61
ASN__PRIMITIVE_TYPE_s
Definition: asn_codecs_prim.h:14
e2v_key::start
const char * start
Definition: ENUMERATED_jer.c:11
jer_pbd_rval
jer_pbd_rval
Definition: asn_codecs_prim.h:56
JPBD_SYSTEM_FAILURE
@ JPBD_SYSTEM_FAILURE
Definition: asn_codecs_prim.h:57
e2v_key::vemap
const asn_INTEGER_enum_map_t * vemap
Definition: ENUMERATED_jer.c:13
asn_jer_constraints_s
Definition: jer_support.h:18
e2v_key::stop
const char * stop
Definition: ENUMERATED_jer.c:12
asn_TYPE_descriptor_s::name
const char * name
Definition: constr_TYPE.h:225
asn_TYPE_descriptor_s
Definition: constr_TYPE.h:224
ENUMERATED.h
e2v_key::evmap
const unsigned int * evmap
Definition: ENUMERATED_jer.c:14
asn_TYPE_descriptor_s::specifics
const void * specifics
Definition: constr_TYPE.h:259
asn_imax2INTEGER
int asn_imax2INTEGER(INTEGER_t *i, intmax_t l)
Definition: INTEGER.c:329
jer_decode_primitive
asn_dec_rval_t jer_decode_primitive(const asn_codec_ctx_t *opt_codec_ctx, const asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, size_t struct_size, const void *buf_ptr, size_t size, jer_primitive_body_decoder_f *prim_body_decoder)
Definition: asn_codecs_prim_jer.c:118
asn_INTEGER_specifics_s::map_count
int map_count
Definition: INTEGER.h:31
ENUMERATED_jer_map_enum2value
static const asn_INTEGER_enum_map_t * ENUMERATED_jer_map_enum2value(const asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop)
Definition: ENUMERATED_jer.c:35
asn_INTEGER_specifics_s
Definition: INTEGER.h:28
asn_INTEGER_enum_map_s::nat_value
long nat_value
Definition: INTEGER.h:22
ENUMERATED_decode_jer
asn_dec_rval_t ENUMERATED_decode_jer(const asn_codec_ctx_t *opt_codec_ctx, const asn_TYPE_descriptor_t *td, const asn_jer_constraints_t *constraints, void **sptr, const void *buf_ptr, size_t size)
Definition: ENUMERATED_jer.c:119
e2v_key
Definition: ENUMERATED_jer.c:10
ENUMERATED__jer_body_decode
static enum jer_pbd_rval ENUMERATED__jer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size)
Definition: ENUMERATED_jer.c:74
asn_INTEGER_enum_map_s::enum_name
const char * enum_name
Definition: INTEGER.h:24
asn_INTEGER_specifics_s::enum2value
const unsigned int * enum2value
Definition: INTEGER.h:30
INTEGER.h
JPBD_BROKEN_ENCODING
@ JPBD_BROKEN_ENCODING
Definition: asn_codecs_prim.h:59
key
static void ssize_t void * key
Definition: asn_internal.h:96
asn_internal.h
asn_codec_ctx_s
Definition: asn_codecs.h:23
asn_dec_rval_s
Definition: asn_codecs.h:86
ENUMERATED__jer_compar_enum2value
static int ENUMERATED__jer_compar_enum2value(const void *kp, const void *am)
Definition: ENUMERATED_jer.c:17
asn_INTEGER_specifics_s::value2enum
const asn_INTEGER_enum_map_t * value2enum
Definition: INTEGER.h:29
asn_INTEGER_enum_map_s
Definition: INTEGER.h:21


etsi_its_vam_ts_coding
Author(s): Jean-Pierre Busch , Guido Küppers , Lennart Reiher
autogenerated on Sun May 18 2025 02:30:55