SIM-115: update simulator to use latest E2SM KPM version 3
[sim/e2-interface.git] / e2sim / asn1c / constr_CHOICE_jer.c
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  */
6 #include <asn_internal.h>
7 #include <constr_CHOICE.h>
8
9 /*
10  * Return a standardized complex structure.
11  */
12 #undef RETURN
13 #define RETURN(_code)                     \
14     do {                                  \
15         rval.code = _code;                \
16         rval.consumed = consumed_myself;  \
17         return rval;                      \
18     } while(0)
19
20 #undef JER_ADVANCE
21 #define JER_ADVANCE(num_bytes)                                    \
22     do {                                                          \
23         size_t num = num_bytes;                                   \
24         buf_ptr = (const void *)(((const char *)buf_ptr) + num);  \
25         size -= num;                                              \
26         consumed_myself += num;                                   \
27     } while(0)
28
29 asn_enc_rval_t
30 CHOICE_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
31                   enum jer_encoder_flags_e flags, asn_app_consume_bytes_f *cb,
32                   void *app_key) {
33     const asn_CHOICE_specifics_t *specs =
34         (const asn_CHOICE_specifics_t *)td->specifics;
35     asn_enc_rval_t er = {0,0,0};
36     unsigned present = 0;
37
38     if(!sptr)
39         ASN__ENCODE_FAILED;
40
41     /*
42      * Figure out which CHOICE element is encoded.
43      */
44     present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size);
45
46     if(present == 0 || present > td->elements_count) {
47         ASN__ENCODE_FAILED;
48     } else {
49         asn_enc_rval_t tmper = {0,0,0};
50         asn_TYPE_member_t *elm = &td->elements[present-1];
51         const void *memb_ptr = NULL;
52         const char *mname = elm->name;
53         unsigned int mlen = strlen(mname);
54
55         if(elm->flags & ATF_POINTER) {
56             memb_ptr =
57                 *(const void *const *)((const char *)sptr + elm->memb_offset);
58             if(!memb_ptr) ASN__ENCODE_FAILED;
59         } else {
60             memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
61         }
62
63         er.encoded = 0;
64
65         ASN__CALLBACK3("{\n\"", 3, mname, mlen, "\": ", 2);
66
67         tmper = elm->type->op->jer_encoder(elm->type, memb_ptr,
68                                            ilevel + 1, flags, cb, app_key);
69         if(tmper.encoded == -1) return tmper;
70         er.encoded += tmper.encoded;
71
72         ASN__CALLBACK("}", 1);
73         //        ASN__CALLBACK3("</", 2, mname, mlen, ">", 1);
74     }
75
76     ASN__ENCODED_OK(er);
77 cb_failed:
78     ASN__ENCODE_FAILED;
79 }