[BITS] introduce new packed/unpacked bit conversion routines
[osmocom-bb.git] / src / bits.c
1
2 #include <stdint.h>
3
4 #include <osmocore/bits.h>
5
6 /* convert unpacked bits to packed bits, return length in bytes */
7 int 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
18                 if (i > 0 && i % 8 == 0) {
19                         *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 */
31 int 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 }