27 #define __NO_STRING_INLINES
30 #define LELY_UTIL_ENDIAN_INLINE extern inline
35 static inline void bitcpy(
36 uint_least8_t *dst, uint_least8_t src, uint_least8_t mask);
39 bcpybe(uint_least8_t *dst,
int dstbit,
const uint_least8_t *src,
int srcbit,
62 uint_least8_t first = 0xff >> dstbit;
63 uint_least8_t last = ~(0xff >> ((dstbit + n) % 8)) & 0xff;
65 int shift = dstbit - srcbit;
67 int right = shift & (8 - 1);
68 int left = -shift & (8 - 1);
70 if (dstbit + n <= 8) {
74 bitcpy(dst, *src >> right, first);
75 }
else if (srcbit + n <= 8) {
76 bitcpy(dst, *src << left, first);
78 bitcpy(dst, *src << left | src[1] >> right,
82 uint_least8_t b = *src++ & 0xff;
84 bitcpy(dst, b >> right, first);
86 bitcpy(dst, b << left | *src >> right, first);
94 *dst++ = (b << left | *src >> right) & 0xff;
99 bitcpy(dst, b << left | *src >> right, last);
102 if (dstbit + n <= 8) {
105 bitcpy(dst, *src, first);
108 bitcpy(dst++, *src++, first);
114 *dst++ = *src++ & 0xff;
117 bitcpy(dst, *src, last);
123 bcpyle(uint_least8_t *dst,
int dstbit,
const uint_least8_t *src,
int srcbit,
146 uint_least8_t first = (0xff << dstbit) & 0xff;
147 uint_least8_t last = ~(0xff << ((dstbit + n) % 8)) & 0xff;
149 int shift = dstbit - srcbit;
151 int right = -shift & (8 - 1);
152 int left = shift & (8 - 1);
154 if (dstbit + n <= 8) {
158 bitcpy(dst, *src << left, first);
159 }
else if (srcbit + n <= 8) {
160 bitcpy(dst, *src >> right, first);
162 bitcpy(dst, *src >> right | src[1] << left,
166 uint_least8_t b = *src++ & 0xff;
168 bitcpy(dst, b << left, first);
170 bitcpy(dst, b >> right | *src << left, first);
178 *dst++ = (b >> right | *src << left) & 0xff;
183 bitcpy(dst, b >> right | *src << left, last);
186 if (dstbit + n <= 8) {
189 bitcpy(dst, *src, first);
192 bitcpy(dst++, *src++, first);
198 *dst++ = *src++ & 0xff;
201 bitcpy(dst, *src, last);
207 bitcpy(uint_least8_t *dst, uint_least8_t src, uint_least8_t mask)
209 *dst = (((src ^ *dst) & mask) ^ *dst) & 0xff;