SIM-115: update simulator to use latest E2SM KPM version 3
[sim/e2-interface.git] / e2sim / asn1c / OCTET_STRING_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 <OCTET_STRING.h>
8 #include <BIT_STRING.h>  /* for .bits_unused member */
9
10 asn_enc_rval_t
11 OCTET_STRING_encode_jer(const asn_TYPE_descriptor_t *td, const void *sptr,
12                         int ilevel, enum jer_encoder_flags_e flags,
13                         asn_app_consume_bytes_f *cb, void *app_key) {
14     const char * const h2c = "0123456789ABCDEF";
15     const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
16     asn_enc_rval_t er = { 0, 0, 0 };
17     char scratch[16 * 3 + 4];
18     char *p = scratch;
19     uint8_t *buf;
20     uint8_t *end;
21     size_t i;
22
23     if(!st || (!st->buf && st->size))
24         ASN__ENCODE_FAILED;
25
26     er.encoded = 0;
27
28     /*
29      * Dump the contents of the buffer in hexadecimal.
30      */
31     buf = st->buf;
32     end = buf + st->size;
33     for(i = 0; buf < end; buf++, i++) {
34       if(!(i % 16) && (i || st->size > 16)) {
35         ASN__CALLBACK(scratch, p-scratch);
36         p = scratch;
37         ASN__TEXT_INDENT(1, ilevel);
38       }
39       *p++ = h2c[(*buf >> 4) & 0x0F];
40       *p++ = h2c[*buf & 0x0F];
41       *p++ = 0x20;
42     }
43     if(p - scratch) {
44       p--;  /* Remove the tail space */
45       ASN__CALLBACK3("\"", 1, scratch, p-scratch, "\"", 1);  /* Dump the rest */
46       if(st->size > 16)
47         ASN__TEXT_INDENT(1, ilevel-1);
48     }
49
50     ASN__ENCODED_OK(er);
51 cb_failed:
52     ASN__ENCODE_FAILED;
53 }
54
55 static const struct OCTET_STRING__jer_escape_table_s {
56     const char *string;
57     int size;
58 } OCTET_STRING__jer_escape_table[] = {
59 #define OSXET(s)        { s, sizeof(s) - 1 }
60     OSXET("\074\156\165\154\057\076"),  /* <nul/> */
61     OSXET("\074\163\157\150\057\076"),  /* <soh/> */
62     OSXET("\074\163\164\170\057\076"),  /* <stx/> */
63     OSXET("\074\145\164\170\057\076"),  /* <etx/> */
64     OSXET("\074\145\157\164\057\076"),  /* <eot/> */
65     OSXET("\074\145\156\161\057\076"),  /* <enq/> */
66     OSXET("\074\141\143\153\057\076"),  /* <ack/> */
67     OSXET("\074\142\145\154\057\076"),  /* <bel/> */
68     OSXET("\074\142\163\057\076"),      /* <bs/> */
69     OSXET("\011"),                      /* \t */
70     OSXET("\012"),                      /* \n */
71     OSXET("\074\166\164\057\076"),      /* <vt/> */
72     OSXET("\074\146\146\057\076"),      /* <ff/> */
73     OSXET("\015"),                      /* \r */
74     OSXET("\074\163\157\057\076"),      /* <so/> */
75     OSXET("\074\163\151\057\076"),      /* <si/> */
76     OSXET("\074\144\154\145\057\076"),  /* <dle/> */
77     OSXET("\074\144\143\061\057\076"),  /* <de1/> */
78     OSXET("\074\144\143\062\057\076"),  /* <de2/> */
79     OSXET("\074\144\143\063\057\076"),  /* <de3/> */
80     OSXET("\074\144\143\064\057\076"),  /* <de4/> */
81     OSXET("\074\156\141\153\057\076"),  /* <nak/> */
82     OSXET("\074\163\171\156\057\076"),  /* <syn/> */
83     OSXET("\074\145\164\142\057\076"),  /* <etb/> */
84     OSXET("\074\143\141\156\057\076"),  /* <can/> */
85     OSXET("\074\145\155\057\076"),      /* <em/> */
86     OSXET("\074\163\165\142\057\076"),  /* <sub/> */
87     OSXET("\074\145\163\143\057\076"),  /* <esc/> */
88     OSXET("\074\151\163\064\057\076"),  /* <is4/> */
89     OSXET("\074\151\163\063\057\076"),  /* <is3/> */
90     OSXET("\074\151\163\062\057\076"),  /* <is2/> */
91     OSXET("\074\151\163\061\057\076"),  /* <is1/> */
92     { 0, 0 },                           /* " " */
93     { 0, 0 },                           /* ! */
94     { 0, 0 },                           /* \" */
95     { 0, 0 },                           /* # */
96     { 0, 0 },                           /* $ */
97     { 0, 0 },                           /* % */
98     OSXET("\046\141\155\160\073"),      /* &amp; */
99     { 0, 0 },                           /* ' */
100     {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},  /* ()*+,-./ */
101     {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},  /* 01234567 */
102     {0,0},{0,0},{0,0},{0,0},            /* 89:; */
103     OSXET("\046\154\164\073"),          /* &lt; */
104     { 0, 0 },                           /* = */
105     OSXET("\046\147\164\073"),          /* &gt; */
106 };
107
108 asn_enc_rval_t
109 OCTET_STRING_encode_jer_utf8(const asn_TYPE_descriptor_t *td, const void *sptr,
110                              int ilevel, enum jer_encoder_flags_e flags,
111                              asn_app_consume_bytes_f *cb, void *app_key) {
112     const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
113     asn_enc_rval_t er = { 0, 0, 0 };
114     uint8_t *buf, *end;
115     uint8_t *ss;  /* Sequence start */
116     ssize_t encoded_len = 0;
117
118     (void)ilevel;  /* Unused argument */
119     (void)flags;  /* Unused argument */
120
121     if(!st || (!st->buf && st->size))
122         ASN__ENCODE_FAILED;
123
124     buf = st->buf;
125     end = buf + st->size;
126     for(ss = buf; buf < end; buf++) {
127         unsigned int ch = *buf;
128         int s_len;      /* Special encoding sequence length */
129
130         /*
131          * Escape certain characters: X.680/11.15
132          */
133         if(ch < sizeof(OCTET_STRING__jer_escape_table)
134             / sizeof(OCTET_STRING__jer_escape_table[0])
135         && (s_len = OCTET_STRING__jer_escape_table[ch].size)) {
136             if(((buf - ss) && cb(ss, buf - ss, app_key) < 0)
137             || cb(OCTET_STRING__jer_escape_table[ch].string, s_len, app_key) < 0)
138                 ASN__ENCODE_FAILED;
139             encoded_len += (buf - ss) + s_len;
140             ss = buf + 1;
141         }
142     }
143
144     encoded_len += (buf - ss);
145     if((buf - ss) && cb(ss, buf - ss, app_key) < 0)
146         ASN__ENCODE_FAILED;
147
148     er.encoded = encoded_len;
149     ASN__ENCODED_OK(er);
150 }
151