blob: fcdf5cc31f1cc35fc7a8845e64c3206de44f8c7a [file] [log] [blame]
Harald Welte2230c132011-01-19 10:10:16 +01001
2#include <stdint.h>
3
4#include <osmocore/bits.h>
5
6/* convert unpacked bits to packed bits, return length in bytes */
7int osmo_ubit2pbit(pbit_t *out, const ubit_t *in, unsigned int num_bits)
8{
9 unsigned int i;
10 uint8_t curbyte = 0;
11 pbit_t *outptr = out;
12
13 for (i = 0; i < num_bits; i++) {
14 uint8_t bitnum = 7 - (i % 8);
15
16 curbyte |= (in[i] << bitnum);
17
Christian Vogelc7f84e92011-01-22 22:48:37 +010018 if(i % 8 == 7){
Harald Welte2230c132011-01-19 10:10:16 +010019 *outptr++ = curbyte;
20 curbyte = 0;
21 }
22 }
23 /* we have a non-modulo-8 bitcount */
24 if (i % 8)
25 *outptr++ = curbyte;
26
27 return outptr - out;
28}
29
30/* convert packed bits to unpacked bits, return length in bytes */
31int osmo_pbit2ubit(ubit_t *out, const pbit_t *in, unsigned int num_bits)
32{
33 unsigned int i;
34 ubit_t *cur = out;
35 ubit_t *limit = out + num_bits;
36
37 for (i = 0; i < (num_bits/8)+1; i++) {
38 pbit_t byte = in[i];
39 *cur++ = (byte >> 7) & 1;
40 if (cur >= limit)
41 break;
42 *cur++ = (byte >> 6) & 1;
43 if (cur >= limit)
44 break;
45 *cur++ = (byte >> 5) & 1;
46 if (cur >= limit)
47 break;
48 *cur++ = (byte >> 4) & 1;
49 if (cur >= limit)
50 break;
51 *cur++ = (byte >> 3) & 1;
52 if (cur >= limit)
53 break;
54 *cur++ = (byte >> 2) & 1;
55 if (cur >= limit)
56 break;
57 *cur++ = (byte >> 1) & 1;
58 if (cur >= limit)
59 break;
60 *cur++ = (byte >> 0) & 1;
61 if (cur >= limit)
62 break;
63 }
64 return cur - out;
65}
Sylvain Munautaeb10772011-01-21 12:22:30 +010066
67/* convert unpacked bits to packed bits (extended options but slower),
68 * return length in bytes (max written ofs of output buffer + 1) */
69int osmo_ubit2pbit_ext(pbit_t *out, unsigned int out_ofs,
70 const ubit_t *in, unsigned int in_ofs,
71 unsigned int num_bits, int lsb_mode)
72{
73 int i, op, bn;
74 for (i=0; i<num_bits; i++) {
75 op = out_ofs + i;
76 bn = lsb_mode ? (op&7) : (7-(op&7));
77 if (in[in_ofs+i])
78 out[op>>3] |= 1 << bn;
79 else
80 out[op>>3] &= ~(1 << bn);
81 }
82 return ((out_ofs + num_bits - 1) >> 3) + 1;
83}
84
85/* convert packed bits to unpacked bits (extended options but slower),
86 * return length in bytes (max written ofs of output buffer + 1) */
87int osmo_pbit2ubit_ext(ubit_t *out, unsigned int out_ofs,
88 const pbit_t *in, unsigned int in_ofs,
89 unsigned int num_bits, int lsb_mode)
90{
91 int i, ip, bn;
92 for (i=0; i<num_bits; i++) {
93 ip = in_ofs + i;
94 bn = lsb_mode ? (ip&7) : (7-(ip&7));
95 out[out_ofs+i] = !!(in[ip>>3] & (1<<bn));
96 }
97 return out_ofs + num_bits;
98}