diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index e3b7a0aba97f7a97bafb016d23bf0b181b642861..af4159672b5508810803a3f45405452c962c909f 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -621,12 +621,68 @@ cb_failed: _ASN_ENCODE_FAILED; } +static struct OCTET_STRING__xer_escape_table_s { + char *string; + int size; +} OCTET_STRING__xer_escape_table[] = { +#define OSXET(s) { s, sizeof(s) - 1 } + OSXET("\074\156\165\154\057\076"), /* <nul/> */ + OSXET("\074\163\157\150\057\076"), /* <soh/> */ + OSXET("\074\163\164\170\057\076"), /* <stx/> */ + OSXET("\074\145\164\170\057\076"), /* <etx/> */ + OSXET("\074\145\157\164\057\076"), /* <eot/> */ + OSXET("\074\145\156\161\057\076"), /* <enq/> */ + OSXET("\074\141\143\153\057\076"), /* <ack/> */ + OSXET("\074\142\145\154\057\076"), /* <bel/> */ + OSXET("\074\142\163\057\076"), /* <bs/> */ + OSXET("\011"), /* \t */ + OSXET("\012"), /* \n */ + OSXET("\074\166\164\057\076"), /* <vt/> */ + OSXET("\074\146\146\057\076"), /* <ff/> */ + OSXET("\015"), /* \r */ + OSXET("\074\163\157\057\076"), /* <so/> */ + OSXET("\074\163\151\057\076"), /* <si/> */ + OSXET("\074\144\154\145\057\076"), /* <dle/> */ + OSXET("\074\144\143\061\057\076"), /* <de1/> */ + OSXET("\074\144\143\062\057\076"), /* <de2/> */ + OSXET("\074\144\143\063\057\076"), /* <de3/> */ + OSXET("\074\144\143\064\057\076"), /* <de4/> */ + OSXET("\074\156\141\153\057\076"), /* <nak/> */ + OSXET("\074\163\171\156\057\076"), /* <syn/> */ + OSXET("\074\145\164\142\057\076"), /* <etb/> */ + OSXET("\074\143\141\156\057\076"), /* <can/> */ + OSXET("\074\145\155\057\076"), /* <em/> */ + OSXET("\074\163\165\142\057\076"), /* <sub/> */ + OSXET("\074\145\163\143\057\076"), /* <esc/> */ + OSXET("\074\151\163\064\057\076"), /* <is4/> */ + OSXET("\074\151\163\063\057\076"), /* <is3/> */ + OSXET("\074\151\163\062\057\076"), /* <is2/> */ + OSXET("\074\151\163\061\057\076"), /* <is1/> */ + { 0, 0 }, /* " " */ + { 0, 0 }, /* ! */ + { 0, 0 }, /* \" */ + { 0, 0 }, /* # */ + { 0, 0 }, /* $ */ + { 0, 0 }, /* % */ + OSXET("\046\141\155\160\073"), /* & */ + { 0, 0 }, /* ' */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */ + {0,0},{0,0},{0,0},{0,0}, /* 89:; */ + OSXET("\046\154\164\073"), /* < */ + { 0, 0 }, /* = */ + OSXET("\046\147\164\073"), /* > */ +}; + asn_enc_rval_t OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; asn_enc_rval_t er; + uint8_t *buf, *end; + uint8_t *ss; /* Sequence start */ + ssize_t encoded_len = 0; (void)ilevel; /* Unused argument */ (void)flags; /* Unused argument */ @@ -634,10 +690,32 @@ OCTET_STRING_encode_xer_ascii(asn_TYPE_descriptor_t *td, void *sptr, if(!st || !st->buf) _ASN_ENCODE_FAILED; - if(cb(st->buf, st->size, app_key) < 0) + buf = st->buf; + end = buf + st->size; + for(ss = buf; buf < end; buf++) { + int ch = *buf; + int s_len; /* Special encoding sequence length */ + + /* + * Escape certain characters: X.680/11.15 + */ + if(ch < sizeof(OCTET_STRING__xer_escape_table) + /sizeof(OCTET_STRING__xer_escape_table[0]) + && (s_len = OCTET_STRING__xer_escape_table[ch].size)) { + if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) + || cb(OCTET_STRING__xer_escape_table[ch].string, s_len, + app_key) < 0) + _ASN_ENCODE_FAILED; + encoded_len += (buf - ss) + s_len; + ss = buf + 1; + } + } + + encoded_len += (buf - ss); + if((buf - ss) && cb(ss, buf - ss, app_key) < 0) _ASN_ENCODE_FAILED; - er.encoded = st->size; + er.encoded = encoded_len; return er; }