blob: ea3f5a693e64c506eb51b38d6e4526a9e171c6d6 [file] [log] [blame]
Harald Welte229e6ab2019-03-09 20:19:28 +01001#include <assert.h>
2
3#include <asn_application.h>
4#include <constr_TYPE.h>
5#include <constr_CHOICE.h>
6#include <INTEGER.h>
7
8#include "asn1c_helpers.h"
9
10const char *asn_type_name(const asn_TYPE_descriptor_t *td)
11{
12 return td->name;
13}
14
15static int
16_fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) {
17 const void *present_ptr;
18 int present;
19
20 present_ptr = ((const char *)struct_ptr) + pres_offset;
21
22 switch(pres_size) {
23 case sizeof(int): present = *(const int *)present_ptr; break;
24 case sizeof(short): present = *(const short *)present_ptr; break;
25 case sizeof(char): present = *(const char *)present_ptr; break;
26 default:
27 /* ANSI C mandates enum to be equivalent to integer */
28 assert(pres_size != sizeof(int));
29 return 0; /* If not aborted, pass back safe value */
30 }
31
32 return present;
33}
34
35const char *asn_choice_name(const asn_TYPE_descriptor_t *td, const void *sptr)
36{
37 const asn_CHOICE_specifics_t *cspec = td->specifics;
38 int present = _fetch_present_idx(sptr, cspec->pres_offset, cspec->pres_size);
39 const asn_TYPE_member_t *elm;
40
41 if (present < 0 || present >= td->elements_count)
42 return "<invalid>";
43
44 elm = &td->elements[present-1];
45 return elm->name;
46}
47
48const char *asn_enum_name(const asn_TYPE_descriptor_t *td, int data)
49{
50 const asn_INTEGER_specifics_t *ispec = td->specifics;
51
52 if (data < 0 || data >= ispec->map_count)
53 return "<invalid>";
54
55 return ispec->value2enum[data].enum_name;
56
57}