22 #ifndef LELY_UTIL_ENDIAN_H_ 23 #define LELY_UTIL_ENDIAN_H_ 30 #ifndef LELY_UTIL_ENDIAN_INLINE 31 #define LELY_UTIL_ENDIAN_INLINE static inline 34 #ifndef LELY_BIG_ENDIAN 35 #if defined(__BIG_ENDIAN__) || defined(__big_endian__) \ 36 || (__GNUC__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) \ 37 || defined(__ARMEB__) || defined(__AARCH64EB__) \ 38 || defined(__THUMBEB__) 39 #define LELY_BIG_ENDIAN 1 45 #undef LELY_LITTLE_ENDIAN 48 #ifndef LELY_LITTLE_ENDIAN 49 #if defined(__LITTLE_ENDIAN__) || defined(__little_endian__) \ 50 || (__GNUC__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ 51 || defined(__i386__) || defined(_M_IX86) \ 52 || defined(__x86_64__) || defined(_M_AMD64) \ 53 || defined(__ARMEL__) || defined(__AARCH64EL__) \ 54 || defined(__THUMBEL__) 55 #define LELY_LITTLE_ENDIAN 1 60 #if LELY_LITTLE_ENDIAN 61 #undef LELY_BIG_ENDIAN 64 #if !LELY_BIG_ENDIAN && !LELY_LITTLE_ENDIAN 65 #error Unable to determine byte order or byte order is not supported. 73 LELY_UTIL_ENDIAN_INLINE uint_least16_t
htobe16(uint_least16_t x);
78 LELY_UTIL_ENDIAN_INLINE uint_least16_t
betoh16(uint_least16_t x);
83 LELY_UTIL_ENDIAN_INLINE uint_least16_t
htole16(uint_least16_t x);
88 LELY_UTIL_ENDIAN_INLINE uint_least16_t
letoh16(uint_least16_t x);
93 LELY_UTIL_ENDIAN_INLINE uint_least32_t
htobe32(uint_least32_t x);
98 LELY_UTIL_ENDIAN_INLINE uint_least32_t
betoh32(uint_least32_t x);
103 LELY_UTIL_ENDIAN_INLINE uint_least32_t
htole32(uint_least32_t x);
108 LELY_UTIL_ENDIAN_INLINE uint_least32_t
letoh32(uint_least32_t x);
113 LELY_UTIL_ENDIAN_INLINE uint_least64_t
htobe64(uint_least64_t x);
118 LELY_UTIL_ENDIAN_INLINE uint_least64_t
betoh64(uint_least64_t x);
123 LELY_UTIL_ENDIAN_INLINE uint_least64_t
htole64(uint_least64_t x);
128 LELY_UTIL_ENDIAN_INLINE uint_least64_t
letoh64(uint_least64_t x);
133 LELY_UTIL_ENDIAN_INLINE
void stbe_i16(
void *ptr, int_least16_t x);
136 LELY_UTIL_ENDIAN_INLINE int_least16_t
ldbe_i16(
const void *ptr);
139 LELY_UTIL_ENDIAN_INLINE
void stbe_u16(
void *ptr, uint_least16_t x);
142 LELY_UTIL_ENDIAN_INLINE uint_least16_t
ldbe_u16(
const void *ptr);
145 LELY_UTIL_ENDIAN_INLINE
void stle_i16(
void *ptr, int_least16_t x);
148 LELY_UTIL_ENDIAN_INLINE int_least16_t
ldle_i16(
const void *ptr);
151 LELY_UTIL_ENDIAN_INLINE
void stle_u16(
void *ptr, uint_least16_t x);
154 LELY_UTIL_ENDIAN_INLINE uint_least16_t
ldle_u16(
const void *ptr);
157 LELY_UTIL_ENDIAN_INLINE
void stbe_i32(
void *ptr, int_least32_t x);
160 LELY_UTIL_ENDIAN_INLINE int_least32_t
ldbe_i32(
const void *ptr);
163 LELY_UTIL_ENDIAN_INLINE
void stbe_u32(
void *ptr, uint_least32_t x);
166 LELY_UTIL_ENDIAN_INLINE uint_least32_t
ldbe_u32(
const void *ptr);
169 LELY_UTIL_ENDIAN_INLINE
void stle_i32(
void *ptr, int_least32_t x);
172 LELY_UTIL_ENDIAN_INLINE int_least32_t
ldle_i32(
const void *ptr);
175 LELY_UTIL_ENDIAN_INLINE
void stle_u32(
void *ptr, uint_least32_t x);
178 LELY_UTIL_ENDIAN_INLINE uint_least32_t
ldle_u32(
const void *ptr);
181 LELY_UTIL_ENDIAN_INLINE
void stbe_i64(
void *ptr, int_least64_t x);
184 LELY_UTIL_ENDIAN_INLINE int_least64_t
ldbe_i64(
const void *ptr);
187 LELY_UTIL_ENDIAN_INLINE
void stbe_u64(
void *ptr, uint_least64_t x);
190 LELY_UTIL_ENDIAN_INLINE uint_least64_t
ldbe_u64(
const void *ptr);
193 LELY_UTIL_ENDIAN_INLINE
void stle_i64(
void *ptr, int_least64_t x);
196 LELY_UTIL_ENDIAN_INLINE int_least64_t
ldle_i64(
const void *ptr);
199 LELY_UTIL_ENDIAN_INLINE
void stle_u64(
void *ptr, uint_least64_t x);
202 LELY_UTIL_ENDIAN_INLINE uint_least64_t
ldle_u64(
const void *ptr);
204 #ifdef LELY_FLT16_TYPE 210 LELY_UTIL_ENDIAN_INLINE
void stbe_flt16(
void *ptr, flt16_t x);
216 LELY_UTIL_ENDIAN_INLINE flt16_t ldbe_flt16(
const void *ptr);
222 LELY_UTIL_ENDIAN_INLINE
void stle_flt16(
void *ptr, flt16_t x);
228 LELY_UTIL_ENDIAN_INLINE flt16_t ldle_flt16(
const void *ptr);
230 #endif // LELY_FLT16_TYPE 232 #ifdef LELY_FLT32_TYPE 238 LELY_UTIL_ENDIAN_INLINE
void stbe_flt32(
void *ptr, flt32_t x);
244 LELY_UTIL_ENDIAN_INLINE flt32_t ldbe_flt32(
const void *ptr);
250 LELY_UTIL_ENDIAN_INLINE
void stle_flt32(
void *ptr, flt32_t x);
256 LELY_UTIL_ENDIAN_INLINE flt32_t ldle_flt32(
const void *ptr);
258 #endif // LELY_FLT32_TYPE 260 #ifdef LELY_FLT64_TYPE 266 LELY_UTIL_ENDIAN_INLINE
void stbe_flt64(
void *ptr, flt64_t x);
272 LELY_UTIL_ENDIAN_INLINE flt64_t ldbe_flt64(
const void *ptr);
278 LELY_UTIL_ENDIAN_INLINE
void stle_flt64(
void *ptr, flt64_t x);
284 LELY_UTIL_ENDIAN_INLINE flt64_t ldle_flt64(
const void *ptr);
286 #endif // LELY_FLT64_TYPE 299 void bcpybe(
void *dst,
int dstbit,
const void *src,
int srcbit,
size_t n);
312 void bcpyle(
void *dst,
int dstbit,
const void *src,
int srcbit,
size_t n);
315 inline uint_least16_t
318 x &= UINT16_C(0xffff);
321 #elif LELY_LITTLE_ENDIAN 328 inline uint_least16_t
336 inline uint_least16_t
339 x &= UINT16_C(0xffff);
342 #elif LELY_LITTLE_ENDIAN 349 inline uint_least16_t
357 inline uint_least32_t
360 x &= UINT32_C(0xffffffff);
363 #elif LELY_LITTLE_ENDIAN 370 inline uint_least32_t
378 inline uint_least32_t
381 x &= UINT32_C(0xffffffff);
384 #elif LELY_LITTLE_ENDIAN 391 inline uint_least32_t
399 inline uint_least64_t
402 x &= UINT64_C(0xffffffffffffffff);
405 #elif LELY_LITTLE_ENDIAN 412 inline uint_least64_t
420 inline uint_least64_t
423 x &= UINT64_C(0xffffffffffffffff);
426 #elif LELY_LITTLE_ENDIAN 433 inline uint_least64_t
456 memcpy(ptr, &x,
sizeof(x));
459 inline uint_least16_t
462 uint_least16_t x = 0;
463 memcpy(&x, ptr,
sizeof(x));
483 memcpy(ptr, &x,
sizeof(x));
486 inline uint_least16_t
489 uint_least16_t x = 0;
490 memcpy(&x, ptr,
sizeof(x));
510 memcpy(ptr, &x,
sizeof(x));
513 inline uint_least32_t
516 uint_least32_t x = 0;
517 memcpy(&x, ptr,
sizeof(x));
537 memcpy(ptr, &x,
sizeof(x));
540 inline uint_least32_t
543 uint_least32_t x = 0;
544 memcpy(&x, ptr,
sizeof(x));
564 memcpy(ptr, &x,
sizeof(x));
567 inline uint_least64_t
570 uint_least64_t x = 0;
571 memcpy(&x, ptr,
sizeof(x));
591 memcpy(ptr, &x,
sizeof(x));
594 inline uint_least64_t
597 uint_least64_t x = 0;
598 memcpy(&x, ptr,
sizeof(x));
602 #ifdef LELY_FLT16_TYPE 605 stbe_flt16(
void *ptr, flt16_t x)
607 uint_least16_t tmp = 0;
608 memcpy(&tmp, &x,
sizeof(x));
613 ldbe_flt16(
const void *ptr)
617 memcpy(&x, &tmp,
sizeof(x));
622 stle_flt16(
void *ptr, flt16_t x)
624 uint_least16_t tmp = 0;
625 memcpy(&tmp, &x,
sizeof(x));
630 ldle_flt16(
const void *ptr)
634 memcpy(&x, &tmp,
sizeof(x));
638 #endif // LELY_FLT16_TYPE 640 #ifdef LELY_FLT32_TYPE 643 stbe_flt32(
void *ptr, flt32_t x)
645 uint_least32_t tmp = 0;
646 memcpy(&tmp, &x,
sizeof(x));
651 ldbe_flt32(
const void *ptr)
655 memcpy(&x, &tmp,
sizeof(x));
660 stle_flt32(
void *ptr, flt32_t x)
662 uint_least32_t tmp = 0;
663 memcpy(&tmp, &x,
sizeof(x));
668 ldle_flt32(
const void *ptr)
672 memcpy(&x, &tmp,
sizeof(x));
676 #endif // LELY_FLT32_TYPE 678 #ifdef LELY_FLT64_TYPE 681 stbe_flt64(
void *ptr, flt64_t x)
683 uint_least64_t tmp = 0;
684 memcpy(&tmp, &x,
sizeof(x));
689 ldbe_flt64(
const void *ptr)
693 memcpy(&x, &tmp,
sizeof(x));
698 stle_flt64(
void *ptr, flt64_t x)
700 uint_least64_t tmp = 0;
701 memcpy(&tmp, &x,
sizeof(x));
706 ldle_flt64(
const void *ptr)
710 memcpy(&x, &tmp,
sizeof(x));
714 #endif // LELY_FLT64_TYPE 720 #endif // !LELY_UTIL_ENDIAN_H_ uint_least16_t htole16(uint_least16_t x)
Converts a 16-bit unsigned integer from host to little-endian byte order.
void stbe_u16(void *ptr, uint_least16_t x)
Stores a 16-bit unsigned integer in big-endian byte order.
void stle_u32(void *ptr, uint_least32_t x)
Stores a 32-bit unsigned integer in little-endian byte order.
uint_least32_t betoh32(uint_least32_t x)
Converts a 32-bit unsigned integer from big-endian to host byte order.
void stle_u64(void *ptr, uint_least64_t x)
Stores a 64-bit unsigned integer in little-endian byte order.
This header file is part of the C11 and POSIX compatibility library; it includes <string.h> and defines any missing functionality.
uint_least32_t letoh32(uint_least32_t x)
Converts a 32-bit unsigned integer from little-endian to host byte order.
uint_least64_t ldle_u64(const void *ptr)
Loads a 64-bit unsigned integer in little-endian byte order.
int_least64_t ldbe_i64(const void *ptr)
Loads a 64-bit signed integer in big-endian byte order.
uint_least64_t bswap64(uint_least64_t x)
Reverses the byte order of the 64-bit unsigned integer x.
int_least32_t ldbe_i32(const void *ptr)
Loads a 32-bit signed integer in big-endian byte order.
int_least32_t ldle_i32(const void *ptr)
Loads a 32-bit signed integer in little-endian byte order.
uint_least16_t ldbe_u16(const void *ptr)
Loads a 16-bit unsigned integer in big-endian byte order.
uint_least16_t ldle_u16(const void *ptr)
Loads a 16-bit unsigned integer in little-endian byte order.
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 IEEE 754 floating-point format typ...
uint_least64_t htobe64(uint_least64_t x)
Converts a 64-bit unsigned integer from host to big-endian byte order.
void stbe_i16(void *ptr, int_least16_t x)
Stores a 16-bit signed integer in big-endian byte order.
void stle_i32(void *ptr, int_least32_t x)
Stores a 32-bit signed integer in little-endian byte order.
void stbe_u64(void *ptr, uint_least64_t x)
Stores a 64-bit unsigned integer in big-endian byte order.
void stle_i16(void *ptr, int_least16_t x)
Stores a 16-bit signed integer in little-endian byte order.
uint_least16_t htobe16(uint_least16_t x)
Converts a 16-bit unsigned integer from host to big-endian byte order.
void stbe_i64(void *ptr, int_least64_t x)
Stores a 64-bit signed integer in big-endian byte order.
uint_least32_t ldbe_u32(const void *ptr)
Loads a 32-bit unsigned integer in big-endian byte order.
void stle_u16(void *ptr, uint_least16_t x)
Stores a 16-bit unsigned integer in little-endian byte order.
uint_least64_t betoh64(uint_least64_t x)
Converts a 64-bit unsigned integer from big-endian to host byte order.
int_least16_t ldle_i16(const void *ptr)
Loads a 16-bit signed integer in little-endian byte order.
uint_least64_t ldbe_u64(const void *ptr)
Loads a 64-bit unsigned integer in big-endian byte order.
uint_least32_t htole32(uint_least32_t x)
Converts a 32-bit unsigned integer from host to little-endian byte order.
uint_least16_t letoh16(uint_least16_t x)
Converts a 16-bit unsigned integer from little-endian to host byte order.
void stbe_u32(void *ptr, uint_least32_t x)
Stores a 32-bit unsigned integer in big-endian byte order.
This header file is part of the utilities library; it contains the bit function definitions.
void stle_i64(void *ptr, int_least64_t x)
Stores a 64-bit signed integer in little-endian byte order.
uint_least32_t bswap32(uint_least32_t x)
Reverses the byte order of the 32-bit unsigned integer x.
uint_least16_t bswap16(uint_least16_t x)
Reverses the byte order of the 16-bit unsigned integer x.
void stbe_i32(void *ptr, int_least32_t x)
Stores a 32-bit signed integer in big-endian byte order.
void bcpybe(void *dst, int dstbit, const void *src, int srcbit, size_t n)
Copies n bits from a source to a destination buffer.
uint_least64_t letoh64(uint_least64_t x)
Converts a 64-bit unsigned integer from little-endian to host byte order.
int_least16_t ldbe_i16(const void *ptr)
Loads a 16-bit signed integer in big-endian byte order.
uint_least16_t betoh16(uint_least16_t x)
Converts a 16-bit unsigned integer from big-endian to host byte order.
int_least64_t ldle_i64(const void *ptr)
Loads a 64-bit signed integer in little-endian byte order.
uint_least32_t ldle_u32(const void *ptr)
Loads a 32-bit unsigned integer in little-endian byte order.
uint_least32_t htobe32(uint_least32_t x)
Converts a 32-bit unsigned integer from host to big-endian byte order.
uint_least64_t htole64(uint_least64_t x)
Converts a 64-bit unsigned integer from host to little-endian byte order.