Harald Welte | 229e6ab | 2019-03-09 20:19:28 +0100 | [diff] [blame] | 1 | #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 | |
| 10 | const char *asn_type_name(const asn_TYPE_descriptor_t *td) |
| 11 | { |
| 12 | return td->name; |
| 13 | } |
| 14 | |
| 15 | static 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 | |
| 35 | const 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 | |
| 48 | const 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 | } |