SIM-115: update simulator to use latest E2SM KPM version 3
[sim/e2-interface.git] / e2sim / asn1c / OBJECT_IDENTIFIER_xer.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 <OBJECT_IDENTIFIER.h>
8
9 static enum xer_pbd_rval
10 OBJECT_IDENTIFIER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr,
11                                    const void *chunk_buf, size_t chunk_size) {
12     OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr;
13     const char *chunk_end = (const char *)chunk_buf + chunk_size;
14     const char *endptr;
15     asn_oid_arc_t s_arcs[10];
16     asn_oid_arc_t *arcs = s_arcs;
17     ssize_t num_arcs;
18     ssize_t ret;
19
20     (void)td;
21
22     num_arcs = OBJECT_IDENTIFIER_parse_arcs(
23         (const char *)chunk_buf, chunk_size, arcs,
24         sizeof(s_arcs) / sizeof(s_arcs[0]), &endptr);
25     if(num_arcs < 0) {
26         /* Expecting more than zero arcs */
27         return XPBD_BROKEN_ENCODING;
28     } else if(num_arcs == 0) {
29         return XPBD_NOT_BODY_IGNORE;
30     }
31     (void)chunk_end;
32     assert(endptr == chunk_end);
33
34     if((size_t)num_arcs > sizeof(s_arcs)/sizeof(s_arcs[0])) {
35         arcs = (asn_oid_arc_t *)MALLOC(num_arcs * sizeof(asn_oid_arc_t));
36         if(!arcs) return XPBD_SYSTEM_FAILURE;
37         ret = OBJECT_IDENTIFIER_parse_arcs((const char *)chunk_buf, chunk_size,
38                                            arcs, num_arcs, &endptr);
39         if(ret != num_arcs)
40             return XPBD_SYSTEM_FAILURE;  /* assert?.. */
41     }
42
43     /*
44      * Convert arcs into BER representation.
45      */
46     ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, num_arcs);
47     if(arcs != s_arcs) FREEMEM(arcs);
48
49     return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED;
50 }
51
52 asn_dec_rval_t
53 OBJECT_IDENTIFIER_decode_xer(const asn_codec_ctx_t *opt_codec_ctx,
54                              const asn_TYPE_descriptor_t *td, void **sptr,
55                              const char *opt_mname, const void *buf_ptr,
56                              size_t size) {
57     return xer_decode_primitive(opt_codec_ctx, td,
58         sptr, sizeof(OBJECT_IDENTIFIER_t), opt_mname,
59             buf_ptr, size, OBJECT_IDENTIFIER__xer_body_decode);
60 }
61
62 asn_enc_rval_t
63 OBJECT_IDENTIFIER_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr,
64                              int ilevel, enum xer_encoder_flags_e flags,
65                              asn_app_consume_bytes_f *cb, void *app_key) {
66     const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr;
67     asn_enc_rval_t er = {0,0,0};
68
69     (void)ilevel;
70     (void)flags;
71
72     if(!st || !st->buf) {
73         ASN__ENCODE_FAILED;
74     }
75
76     er.encoded = OBJECT_IDENTIFIER__dump_body(st, cb, app_key);
77     if(er.encoded < 0) ASN__ENCODE_FAILED;
78
79     ASN__ENCODED_OK(er);
80 }