LAPDm: When Rx DATA from L1, L1 does not know the SAPI
[osmocom-bb.git] / src / bits.c
1
2 #include <stdint.h>
3
4 #include <osmocom/core/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 % 8 == 7){
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 }
66
67 /* convert unpacked bits to packed bits (extended options but slower),
68  * return length in bytes (max written ofs of output buffer + 1) */
69 int 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) */
87 int 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 }