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__)
40#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__)
56#define LELY_LITTLE_ENDIAN 1
64#if !LELY_BIG_ENDIAN && !LELY_LITTLE_ENDIAN
65#error Unable to determine byte order or byte order is not supported.
74LELY_UTIL_ENDIAN_INLINE uint_least16_t
htobe16(uint_least16_t x);
79LELY_UTIL_ENDIAN_INLINE uint_least16_t
betoh16(uint_least16_t x);
84LELY_UTIL_ENDIAN_INLINE uint_least16_t
htole16(uint_least16_t x);
89LELY_UTIL_ENDIAN_INLINE uint_least16_t
letoh16(uint_least16_t x);
94LELY_UTIL_ENDIAN_INLINE uint_least32_t
htobe32(uint_least32_t x);
99LELY_UTIL_ENDIAN_INLINE uint_least32_t
betoh32(uint_least32_t x);
104LELY_UTIL_ENDIAN_INLINE uint_least32_t
htole32(uint_least32_t x);
109LELY_UTIL_ENDIAN_INLINE uint_least32_t
letoh32(uint_least32_t x);
114LELY_UTIL_ENDIAN_INLINE uint_least64_t
htobe64(uint_least64_t x);
119LELY_UTIL_ENDIAN_INLINE uint_least64_t
betoh64(uint_least64_t x);
124LELY_UTIL_ENDIAN_INLINE uint_least64_t
htole64(uint_least64_t x);
129LELY_UTIL_ENDIAN_INLINE uint_least64_t
letoh64(uint_least64_t x);
133LELY_UTIL_ENDIAN_INLINE
void stbe_i16(
void *ptr, int_least16_t x);
136LELY_UTIL_ENDIAN_INLINE int_least16_t
ldbe_i16(
const void *ptr);
139LELY_UTIL_ENDIAN_INLINE
void stbe_u16(
void *ptr, uint_least16_t x);
142LELY_UTIL_ENDIAN_INLINE uint_least16_t
ldbe_u16(
const void *ptr);
145LELY_UTIL_ENDIAN_INLINE
void stle_i16(
void *ptr, int_least16_t x);
148LELY_UTIL_ENDIAN_INLINE int_least16_t
ldle_i16(
const void *ptr);
151LELY_UTIL_ENDIAN_INLINE
void stle_u16(
void *ptr, uint_least16_t x);
154LELY_UTIL_ENDIAN_INLINE uint_least16_t
ldle_u16(
const void *ptr);
157LELY_UTIL_ENDIAN_INLINE
void stbe_i32(
void *ptr, int_least32_t x);
160LELY_UTIL_ENDIAN_INLINE int_least32_t
ldbe_i32(
const void *ptr);
163LELY_UTIL_ENDIAN_INLINE
void stbe_u32(
void *ptr, uint_least32_t x);
166LELY_UTIL_ENDIAN_INLINE uint_least32_t
ldbe_u32(
const void *ptr);
169LELY_UTIL_ENDIAN_INLINE
void stle_i32(
void *ptr, int_least32_t x);
172LELY_UTIL_ENDIAN_INLINE int_least32_t
ldle_i32(
const void *ptr);
175LELY_UTIL_ENDIAN_INLINE
void stle_u32(
void *ptr, uint_least32_t x);
178LELY_UTIL_ENDIAN_INLINE uint_least32_t
ldle_u32(
const void *ptr);
181LELY_UTIL_ENDIAN_INLINE
void stbe_i64(
void *ptr, int_least64_t x);
184LELY_UTIL_ENDIAN_INLINE int_least64_t
ldbe_i64(
const void *ptr);
187LELY_UTIL_ENDIAN_INLINE
void stbe_u64(
void *ptr, uint_least64_t x);
190LELY_UTIL_ENDIAN_INLINE uint_least64_t
ldbe_u64(
const void *ptr);
193LELY_UTIL_ENDIAN_INLINE
void stle_i64(
void *ptr, int_least64_t x);
196LELY_UTIL_ENDIAN_INLINE int_least64_t
ldle_i64(
const void *ptr);
199LELY_UTIL_ENDIAN_INLINE
void stle_u64(
void *ptr, uint_least64_t x);
202LELY_UTIL_ENDIAN_INLINE uint_least64_t
ldle_u64(
const void *ptr);
204#ifdef LELY_FLT16_TYPE
210LELY_UTIL_ENDIAN_INLINE
void stbe_flt16(
void *ptr, flt16_t x);
216LELY_UTIL_ENDIAN_INLINE flt16_t ldbe_flt16(
const void *ptr);
222LELY_UTIL_ENDIAN_INLINE
void stle_flt16(
void *ptr, flt16_t x);
228LELY_UTIL_ENDIAN_INLINE flt16_t ldle_flt16(
const void *ptr);
232#ifdef LELY_FLT32_TYPE
238LELY_UTIL_ENDIAN_INLINE
void stbe_flt32(
void *ptr, flt32_t x);
244LELY_UTIL_ENDIAN_INLINE flt32_t ldbe_flt32(
const void *ptr);
250LELY_UTIL_ENDIAN_INLINE
void stle_flt32(
void *ptr, flt32_t x);
256LELY_UTIL_ENDIAN_INLINE flt32_t ldle_flt32(
const void *ptr);
260#ifdef LELY_FLT64_TYPE
266LELY_UTIL_ENDIAN_INLINE
void stbe_flt64(
void *ptr, flt64_t x);
272LELY_UTIL_ENDIAN_INLINE flt64_t ldbe_flt64(
const void *ptr);
278LELY_UTIL_ENDIAN_INLINE
void stle_flt64(
void *ptr, flt64_t x);
284LELY_UTIL_ENDIAN_INLINE flt64_t ldle_flt64(
const void *ptr);
299void bcpybe(
void *dst,
int dstbit,
const void *src,
int srcbit,
size_t n);
312void bcpyle(
void *dst,
int dstbit,
const void *src,
int srcbit,
size_t n);
318 x &= UINT16_C(0xffff);
321#elif LELY_LITTLE_ENDIAN
339 x &= UINT16_C(0xffff);
342#elif LELY_LITTLE_ENDIAN
360 x &= UINT32_C(0xffffffff);
363#elif LELY_LITTLE_ENDIAN
381 x &= UINT32_C(0xffffffff);
384#elif LELY_LITTLE_ENDIAN
402 x &= UINT64_C(0xffffffffffffffff);
405#elif LELY_LITTLE_ENDIAN
423 x &= UINT64_C(0xffffffffffffffff);
426#elif LELY_LITTLE_ENDIAN
456 memcpy(ptr, &x,
sizeof(x));
462 uint_least16_t x = 0;
463 memcpy(&x, ptr,
sizeof(x));
483 memcpy(ptr, &x,
sizeof(x));
489 uint_least16_t x = 0;
490 memcpy(&x, ptr,
sizeof(x));
510 memcpy(ptr, &x,
sizeof(x));
516 uint_least32_t x = 0;
517 memcpy(&x, ptr,
sizeof(x));
537 memcpy(ptr, &x,
sizeof(x));
543 uint_least32_t x = 0;
544 memcpy(&x, ptr,
sizeof(x));
564 memcpy(ptr, &x,
sizeof(x));
570 uint_least64_t x = 0;
571 memcpy(&x, ptr,
sizeof(x));
591 memcpy(ptr, &x,
sizeof(x));
597 uint_least64_t x = 0;
598 memcpy(&x, ptr,
sizeof(x));
602#ifdef LELY_FLT16_TYPE
605stbe_flt16(
void *ptr, flt16_t x)
607 uint_least16_t tmp = 0;
608 memcpy(&tmp, &x,
sizeof(x));
613ldbe_flt16(
const void *ptr)
617 memcpy(&x, &tmp,
sizeof(x));
622stle_flt16(
void *ptr, flt16_t x)
624 uint_least16_t tmp = 0;
625 memcpy(&tmp, &x,
sizeof(x));
630ldle_flt16(
const void *ptr)
634 memcpy(&x, &tmp,
sizeof(x));
640#ifdef LELY_FLT32_TYPE
643stbe_flt32(
void *ptr, flt32_t x)
645 uint_least32_t tmp = 0;
646 memcpy(&tmp, &x,
sizeof(x));
651ldbe_flt32(
const void *ptr)
655 memcpy(&x, &tmp,
sizeof(x));
660stle_flt32(
void *ptr, flt32_t x)
662 uint_least32_t tmp = 0;
663 memcpy(&tmp, &x,
sizeof(x));
668ldle_flt32(
const void *ptr)
672 memcpy(&x, &tmp,
sizeof(x));
678#ifdef LELY_FLT64_TYPE
681stbe_flt64(
void *ptr, flt64_t x)
683 uint_least64_t tmp = 0;
684 memcpy(&tmp, &x,
sizeof(x));
689ldbe_flt64(
const void *ptr)
693 memcpy(&x, &tmp,
sizeof(x));
698stle_flt64(
void *ptr, flt64_t x)
700 uint_least64_t tmp = 0;
701 memcpy(&tmp, &x,
sizeof(x));
706ldle_flt64(
const void *ptr)
710 memcpy(&x, &tmp,
sizeof(x));
This header file is part of the utilities library; it contains the bit function definitions.
uint_least64_t bswap64(uint_least64_t x)
Reverses the byte order of the 64-bit unsigned integer x.
uint_least16_t bswap16(uint_least16_t x)
Reverses the byte order of the 16-bit unsigned integer x.
uint_least32_t bswap32(uint_least32_t x)
Reverses the byte order of the 32-bit unsigned integer x.
uint_least16_t betoh16(uint_least16_t x)
Converts a 16-bit unsigned integer from big-endian to host byte order.
void stbe_u64(void *ptr, uint_least64_t x)
Stores a 64-bit unsigned integer in big-endian byte order.
uint_least32_t betoh32(uint_least32_t x)
Converts a 32-bit unsigned integer from big-endian to host byte order.
int_least64_t ldbe_i64(const void *ptr)
Loads a 64-bit signed integer in 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_least16_t htole16(uint_least16_t x)
Converts a 16-bit unsigned integer from host to little-endian byte order.
void stle_u16(void *ptr, uint_least16_t x)
Stores a 16-bit unsigned integer in little-endian byte order.
void stle_i32(void *ptr, int_least32_t x)
Stores a 32-bit signed 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_least32_t ldbe_i32(const void *ptr)
Loads a 32-bit signed 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.
void stbe_u16(void *ptr, uint_least16_t x)
Stores a 16-bit unsigned integer in big-endian byte order.
void stbe_u32(void *ptr, uint_least32_t x)
Stores a 32-bit unsigned integer in big-endian byte order.
void stbe_i16(void *ptr, int_least16_t x)
Stores a 16-bit signed integer in big-endian byte order.
uint_least32_t letoh32(uint_least32_t x)
Converts a 32-bit unsigned integer from little-endian to host 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_least16_t htobe16(uint_least16_t x)
Converts a 16-bit unsigned integer from host to big-endian byte order.
void stbe_i32(void *ptr, int_least32_t x)
Stores 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_least64_t letoh64(uint_least64_t x)
Converts a 64-bit unsigned integer from little-endian to host 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.
int_least16_t ldle_i16(const void *ptr)
Loads a 16-bit signed integer in little-endian byte order.
int_least64_t ldle_i64(const void *ptr)
Loads a 64-bit signed 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.
void stle_u64(void *ptr, uint_least64_t x)
Stores a 64-bit unsigned integer in little-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 ldbe_u32(const void *ptr)
Loads a 32-bit unsigned integer in big-endian byte order.
uint_least32_t ldle_u32(const void *ptr)
Loads a 32-bit unsigned integer in little-endian byte order.
uint_least64_t htobe64(uint_least64_t x)
Converts a 64-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.
void stle_i64(void *ptr, int_least64_t x)
Stores a 64-bit signed integer in little-endian byte order.
void stle_i16(void *ptr, int_least16_t x)
Stores a 16-bit signed integer in little-endian byte order.
int_least16_t ldbe_i16(const void *ptr)
Loads a 16-bit signed integer in big-endian byte order.
uint_least64_t ldbe_u64(const void *ptr)
Loads a 64-bit unsigned integer in big-endian byte order.
uint_least16_t letoh16(uint_least16_t x)
Converts a 16-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.
uint_least16_t ldle_u16(const void *ptr)
Loads a 16-bit unsigned 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.
This header file is part of the utilities library; it contains the IEEE 754 floating-point format typ...
This header file is part of the C11 and POSIX compatibility library; it includes <string....