2 * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
4 * Redistribution and modifications are permitted subject to BSD license.
6 #include <asn_internal.h>
7 #include <OCTET_STRING.h>
8 #include <BIT_STRING.h> /* for .bits_unused member */
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];
23 if(!st || (!st->buf && st->size))
29 * Dump the contents of the buffer in hexadecimal.
33 for(i = 0; buf < end; buf++, i++) {
34 if(!(i % 16) && (i || st->size > 16)) {
35 ASN__CALLBACK(scratch, p-scratch);
37 ASN__TEXT_INDENT(1, ilevel);
39 *p++ = h2c[(*buf >> 4) & 0x0F];
40 *p++ = h2c[*buf & 0x0F];
44 p--; /* Remove the tail space */
45 ASN__CALLBACK3("\"", 1, scratch, p-scratch, "\"", 1); /* Dump the rest */
47 ASN__TEXT_INDENT(1, ilevel-1);
55 static const struct OCTET_STRING__jer_escape_table_s {
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/> */
98 OSXET("\046\141\155\160\073"), /* & */
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"), /* < */
105 OSXET("\046\147\164\073"), /* > */
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 };
115 uint8_t *ss; /* Sequence start */
116 ssize_t encoded_len = 0;
118 (void)ilevel; /* Unused argument */
119 (void)flags; /* Unused argument */
121 if(!st || (!st->buf && st->size))
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 */
131 * Escape certain characters: X.680/11.15
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)
139 encoded_len += (buf - ss) + s_len;
144 encoded_len += (buf - ss);
145 if((buf - ss) && cb(ss, buf - ss, app_key) < 0)
148 er.encoded = encoded_len;