26 #define __NO_STRING_INLINES 29 #define LELY_UTIL_ENDIAN_INLINE extern inline 34 static inline void bitcpy(
35 unsigned char *dst,
unsigned char src,
unsigned char mask);
38 bcpybe(
void *dst,
int dstbit,
const void *src,
int srcbit,
size_t n)
46 unsigned char *dp = dst;
47 dp += dstbit / CHAR_BIT;
54 const unsigned char *sp = src;
55 sp += srcbit / CHAR_BIT;
62 unsigned char first = UCHAR_MAX >> dstbit;
63 unsigned char last = ~(UCHAR_MAX >> ((dstbit + n) % CHAR_BIT));
65 int shift = dstbit - srcbit;
67 int right = shift & (CHAR_BIT - 1);
68 int left = -shift & (CHAR_BIT - 1);
70 if (dstbit + n <= CHAR_BIT) {
74 bitcpy(dp, *sp >> right, first);
75 }
else if (srcbit + n <= CHAR_BIT) {
76 bitcpy(dp, *sp << left, first);
78 bitcpy(dp, *sp << left | sp[1] >> right, first);
81 unsigned char b = *sp++;
83 bitcpy(dp, b >> right, first);
85 bitcpy(dp, b << left | *sp >> right, first);
89 n -= CHAR_BIT - dstbit;
94 *dp++ = b << left | *sp >> right;
100 bitcpy(dp, b << left, last);
102 bitcpy(dp, b << left | *sp >> right,
107 if (dstbit + n <= CHAR_BIT) {
110 bitcpy(dp, *sp, first);
113 bitcpy(dp++, *sp++, first);
114 n -= CHAR_BIT - dstbit;
122 bitcpy(dp, *sp, last);
128 bcpyle(
void *dst,
int dstbit,
const void *src,
int srcbit,
size_t n)
136 unsigned char *dp = dst;
137 dp += dstbit / CHAR_BIT;
144 const unsigned char *sp = src;
145 sp += srcbit / CHAR_BIT;
152 unsigned char first = UCHAR_MAX << dstbit;
153 unsigned char last = ~(UCHAR_MAX << ((dstbit + n) % CHAR_BIT));
155 int shift = dstbit - srcbit;
157 int right = -shift & (CHAR_BIT - 1);
158 int left = shift & (CHAR_BIT - 1);
160 if (dstbit + n <= CHAR_BIT) {
164 bitcpy(dp, *sp << left, first);
165 }
else if (srcbit + n <= CHAR_BIT) {
166 bitcpy(dp, *sp >> right, first);
168 bitcpy(dp, *sp >> right | sp[1] << left, first);
171 unsigned char b = *sp++;
173 bitcpy(dp, b << left, first);
175 bitcpy(dp, b >> right | *sp << left, first);
179 n -= CHAR_BIT - dstbit;
181 int m = n % CHAR_BIT;
184 *dp++ = b >> right | *sp << left;
190 bitcpy(dp, b >> right, last);
192 bitcpy(dp, b >> right | *sp << left,
197 if (dstbit + n <= CHAR_BIT) {
200 bitcpy(dp, *sp, first);
203 bitcpy(dp++, *sp++, first);
204 n -= CHAR_BIT - dstbit;
212 bitcpy(dp, *sp, last);
218 bitcpy(
unsigned char *dst,
unsigned char src,
unsigned char mask)
220 *dst = ((src ^ *dst) & mask) ^ *dst;
void bcpyle(void *dst, int dstbit, const void *src, int srcbit, size_t n)
Copies n bits from a source to a destination buffer.
This header file is part of the utilities library; it contains the byte order (endianness) function d...
This is the internal header file of the utilities library.
void bcpybe(void *dst, int dstbit, const void *src, int srcbit, size_t n)
Copies n bits from a source to a destination buffer.