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 <BIT_STRING.h>
9 static const char *_bit_pattern[16] = {
10 "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
11 "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
15 BIT_STRING_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr,
16 int ilevel, enum xer_encoder_flags_e flags,
17 asn_app_consume_bytes_f *cb, void *app_key) {
18 asn_enc_rval_t er = {0, 0, 0};
21 char *scend = scratch + (sizeof(scratch) - 10);
22 const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
23 int xcan = (flags & XER_F_CANONICAL);
33 end = buf + st->size - 1; /* Last byte is special */
38 for(; buf < end; buf++) {
40 int nline = xcan?0:(((buf - st->buf) % 8) == 0);
41 if(p >= scend || nline) {
42 ASN__CALLBACK(scratch, p - scratch);
44 if(nline) ASN__TEXT_INDENT(1, ilevel);
46 memcpy(p + 0, _bit_pattern[v >> 4], 4);
47 memcpy(p + 4, _bit_pattern[v & 0x0f], 4);
51 if(!xcan && ((buf - st->buf) % 8) == 0)
52 ASN__TEXT_INDENT(1, ilevel);
53 ASN__CALLBACK(scratch, p - scratch);
58 int ubits = st->bits_unused;
60 for(i = 7; i >= ubits; i--)
61 *p++ = (v & (1 << i)) ? 0x31 : 0x30;
62 ASN__CALLBACK(scratch, p - scratch);
65 if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1);