22#ifndef LELY_UTIL_ENDIAN_H_
23#define LELY_UTIL_ENDIAN_H_
32#define betoh16 be16toh
33#define letoh16 le16toh
34#define betoh32 be32toh
35#define letoh32 le32toh
36#define betoh64 be64toh
37#define letoh64 le64toh
40#ifndef LELY_UTIL_ENDIAN_INLINE
41#define LELY_UTIL_ENDIAN_INLINE static inline
44#ifndef LELY_BIG_ENDIAN
45#if defined(__BIG_ENDIAN__) || defined(__big_endian__) \
46 || (__GNUC__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) \
47 || defined(__ARMEB__) || defined(__AARCH64EB__) \
48 || defined(__THUMBEB__)
50#define LELY_BIG_ENDIAN 1
55#undef LELY_LITTLE_ENDIAN
58#ifndef LELY_LITTLE_ENDIAN
59#if defined(__LITTLE_ENDIAN__) || defined(__little_endian__) \
60 || (__GNUC__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \
61 || defined(__i386__) || defined(_M_IX86) \
62 || defined(__x86_64__) || defined(_M_AMD64) \
63 || defined(__ARMEL__) || defined(__AARCH64EL__) \
64 || defined(__THUMBEL__)
66#define LELY_LITTLE_ENDIAN 1
74#if !LELY_BIG_ENDIAN && !LELY_LITTLE_ENDIAN
75#error Unable to determine byte order or byte order is not supported.
84LELY_UTIL_ENDIAN_INLINE uint_least16_t
htobe16(uint_least16_t x);
89LELY_UTIL_ENDIAN_INLINE uint_least16_t betoh16(uint_least16_t x);
94LELY_UTIL_ENDIAN_INLINE uint_least16_t
htole16(uint_least16_t x);
99LELY_UTIL_ENDIAN_INLINE uint_least16_t letoh16(uint_least16_t x);
104LELY_UTIL_ENDIAN_INLINE uint_least32_t
htobe32(uint_least32_t x);
109LELY_UTIL_ENDIAN_INLINE uint_least32_t betoh32(uint_least32_t x);
114LELY_UTIL_ENDIAN_INLINE uint_least32_t
htole32(uint_least32_t x);
119LELY_UTIL_ENDIAN_INLINE uint_least32_t letoh32(uint_least32_t x);
124LELY_UTIL_ENDIAN_INLINE uint_least64_t
htobe64(uint_least64_t x);
129LELY_UTIL_ENDIAN_INLINE uint_least64_t betoh64(uint_least64_t x);
134LELY_UTIL_ENDIAN_INLINE uint_least64_t
htole64(uint_least64_t x);
139LELY_UTIL_ENDIAN_INLINE uint_least64_t letoh64(uint_least64_t x);
143LELY_UTIL_ENDIAN_INLINE
void stbe_i16(uint_least8_t dst[2], int_least16_t x);
146LELY_UTIL_ENDIAN_INLINE int_least16_t
ldbe_i16(
const uint_least8_t src[2]);
149LELY_UTIL_ENDIAN_INLINE
void stbe_u16(uint_least8_t dst[2], uint_least16_t x);
152LELY_UTIL_ENDIAN_INLINE uint_least16_t
ldbe_u16(
const uint_least8_t src[2]);
155LELY_UTIL_ENDIAN_INLINE
void stle_i16(uint_least8_t dst[2], int_least16_t x);
158LELY_UTIL_ENDIAN_INLINE int_least16_t
ldle_i16(
const uint_least8_t src[2]);
161LELY_UTIL_ENDIAN_INLINE
void stle_u16(uint_least8_t dst[2], uint_least16_t x);
164LELY_UTIL_ENDIAN_INLINE uint_least16_t
ldle_u16(
const uint_least8_t src[2]);
167LELY_UTIL_ENDIAN_INLINE
void stbe_i32(uint_least8_t dst[4], int_least32_t x);
170LELY_UTIL_ENDIAN_INLINE int_least32_t
ldbe_i32(
const uint_least8_t src[4]);
173LELY_UTIL_ENDIAN_INLINE
void stbe_u32(uint_least8_t dst[4], uint_least32_t x);
176LELY_UTIL_ENDIAN_INLINE uint_least32_t
ldbe_u32(
const uint_least8_t src[4]);
179LELY_UTIL_ENDIAN_INLINE
void stle_i32(uint_least8_t dst[4], int_least32_t x);
182LELY_UTIL_ENDIAN_INLINE int_least32_t
ldle_i32(
const uint_least8_t src[4]);
185LELY_UTIL_ENDIAN_INLINE
void stle_u32(uint_least8_t dst[4], uint_least32_t x);
188LELY_UTIL_ENDIAN_INLINE uint_least32_t
ldle_u32(
const uint_least8_t src[4]);
191LELY_UTIL_ENDIAN_INLINE
void stbe_i64(uint_least8_t dst[8], int_least64_t x);
194LELY_UTIL_ENDIAN_INLINE int_least64_t
ldbe_i64(
const uint_least8_t src[8]);
197LELY_UTIL_ENDIAN_INLINE
void stbe_u64(uint_least8_t dst[8], uint_least64_t x);
200LELY_UTIL_ENDIAN_INLINE uint_least64_t
ldbe_u64(
const uint_least8_t src[8]);
203LELY_UTIL_ENDIAN_INLINE
void stle_i64(uint_least8_t dst[8], int_least64_t x);
206LELY_UTIL_ENDIAN_INLINE int_least64_t
ldle_i64(
const uint_least8_t src[8]);
209LELY_UTIL_ENDIAN_INLINE
void stle_u64(uint_least8_t dst[8], uint_least64_t x);
212LELY_UTIL_ENDIAN_INLINE uint_least64_t
ldle_u64(
const uint_least8_t src[8]);
214#ifdef LELY_FLT16_TYPE
220LELY_UTIL_ENDIAN_INLINE
void stbe_flt16(uint_least8_t dst[2], flt16_t x);
226LELY_UTIL_ENDIAN_INLINE flt16_t ldbe_flt16(
const uint_least8_t src[2]);
232LELY_UTIL_ENDIAN_INLINE
void stle_flt16(uint_least8_t dst[2], flt16_t x);
238LELY_UTIL_ENDIAN_INLINE flt16_t ldle_flt16(
const uint_least8_t src[2]);
242#ifdef LELY_FLT32_TYPE
248LELY_UTIL_ENDIAN_INLINE
void stbe_flt32(uint_least8_t dst[4], flt32_t x);
254LELY_UTIL_ENDIAN_INLINE flt32_t ldbe_flt32(
const uint_least8_t src[4]);
260LELY_UTIL_ENDIAN_INLINE
void stle_flt32(uint_least8_t dst[4], flt32_t x);
266LELY_UTIL_ENDIAN_INLINE flt32_t ldle_flt32(
const uint_least8_t src[4]);
270#ifdef LELY_FLT64_TYPE
276LELY_UTIL_ENDIAN_INLINE
void stbe_flt64(uint_least8_t dst[8], flt64_t x);
282LELY_UTIL_ENDIAN_INLINE flt64_t ldbe_flt64(
const uint_least8_t src[8]);
288LELY_UTIL_ENDIAN_INLINE
void stle_flt64(uint_least8_t dst[8], flt64_t x);
294LELY_UTIL_ENDIAN_INLINE flt64_t ldle_flt64(
const uint_least8_t src[8]);
310void bcpybe(uint_least8_t *dst,
int dstbit,
const uint_least8_t *src,
311 int srcbit,
size_t n);
325void bcpyle(uint_least8_t *dst,
int dstbit,
const uint_least8_t *src,
326 int srcbit,
size_t n);
329LELY_UTIL_ENDIAN_INLINE uint_least16_t
332 x &= UINT16_C(0xffff);
335#elif LELY_LITTLE_ENDIAN
342LELY_UTIL_ENDIAN_INLINE uint_least16_t
343betoh16(uint_least16_t x)
350LELY_UTIL_ENDIAN_INLINE uint_least16_t
353 x &= UINT16_C(0xffff);
356#elif LELY_LITTLE_ENDIAN
363LELY_UTIL_ENDIAN_INLINE uint_least16_t
364letoh16(uint_least16_t x)
371LELY_UTIL_ENDIAN_INLINE uint_least32_t
374 x &= UINT32_C(0xffffffff);
377#elif LELY_LITTLE_ENDIAN
384LELY_UTIL_ENDIAN_INLINE uint_least32_t
385betoh32(uint_least32_t x)
392LELY_UTIL_ENDIAN_INLINE uint_least32_t
395 x &= UINT32_C(0xffffffff);
398#elif LELY_LITTLE_ENDIAN
405LELY_UTIL_ENDIAN_INLINE uint_least32_t
406letoh32(uint_least32_t x)
413LELY_UTIL_ENDIAN_INLINE uint_least64_t
416 x &= UINT64_C(0xffffffffffffffff);
419#elif LELY_LITTLE_ENDIAN
426LELY_UTIL_ENDIAN_INLINE uint_least64_t
427betoh64(uint_least64_t x)
434LELY_UTIL_ENDIAN_INLINE uint_least64_t
437 x &= UINT64_C(0xffffffffffffffff);
440#elif LELY_LITTLE_ENDIAN
447LELY_UTIL_ENDIAN_INLINE uint_least64_t
448letoh64(uint_least64_t x)
454LELY_UTIL_ENDIAN_INLINE
void
460LELY_UTIL_ENDIAN_INLINE int_least16_t
466LELY_UTIL_ENDIAN_INLINE
void
471 memcpy(dst, &x,
sizeof(x));
473 dst[0] = (x >> 8) & 0xff;
478LELY_UTIL_ENDIAN_INLINE uint_least16_t
482 uint_least16_t x = 0;
483 memcpy(&x, src,
sizeof(x));
486 return ((uint_least16_t)(src[0] & 0xff) << 8)
487 | ((uint_least16_t)(src[1] & 0xff));
491LELY_UTIL_ENDIAN_INLINE
void
497LELY_UTIL_ENDIAN_INLINE int_least16_t
503LELY_UTIL_ENDIAN_INLINE
void
508 memcpy(dst, &x,
sizeof(x));
511 dst[1] = (x >> 8) & 0xff;
515LELY_UTIL_ENDIAN_INLINE uint_least16_t
519 uint_least16_t x = 0;
520 memcpy(&x, src,
sizeof(x));
523 return (uint_least16_t)(src[0] & 0xff)
524 | ((uint_least16_t)(src[1] & 0xff) << 8);
528LELY_UTIL_ENDIAN_INLINE
void
534LELY_UTIL_ENDIAN_INLINE int_least32_t
540LELY_UTIL_ENDIAN_INLINE
void
545 memcpy(dst, &x,
sizeof(x));
547 dst[0] = (x >> 24) & 0xff;
548 dst[1] = (x >> 16) & 0xff;
549 dst[2] = (x >> 8) & 0xff;
554LELY_UTIL_ENDIAN_INLINE uint_least32_t
558 uint_least32_t x = 0;
559 memcpy(&x, src,
sizeof(x));
562 return ((uint_least32_t)(src[0] & 0xff) << 24)
563 | ((uint_least32_t)(src[1] & 0xff) << 16)
564 | ((uint_least32_t)(src[2] & 0xff) << 8)
565 | ((uint_least32_t)(src[3] & 0xff));
569LELY_UTIL_ENDIAN_INLINE
void
575LELY_UTIL_ENDIAN_INLINE int_least32_t
581LELY_UTIL_ENDIAN_INLINE
void
586 memcpy(dst, &x,
sizeof(x));
589 dst[1] = (x >> 8) & 0xff;
590 dst[2] = (x >> 16) & 0xff;
591 dst[3] = (x >> 24) & 0xff;
595LELY_UTIL_ENDIAN_INLINE uint_least32_t
599 uint_least32_t x = 0;
600 memcpy(&x, src,
sizeof(x));
603 return (uint_least32_t)(src[0] & 0xff)
604 | ((uint_least32_t)(src[1] & 0xff) << 8)
605 | ((uint_least32_t)(src[2] & 0xff) << 16)
606 | ((uint_least32_t)(src[3] & 0xff) << 24);
610LELY_UTIL_ENDIAN_INLINE
void
616LELY_UTIL_ENDIAN_INLINE int_least64_t
622LELY_UTIL_ENDIAN_INLINE
void
627 memcpy(dst, &x,
sizeof(x));
629 dst[0] = (x >> 56) & 0xff;
630 dst[1] = (x >> 48) & 0xff;
631 dst[2] = (x >> 40) & 0xff;
632 dst[3] = (x >> 32) & 0xff;
633 dst[4] = (x >> 24) & 0xff;
634 dst[5] = (x >> 16) & 0xff;
635 dst[6] = (x >> 8) & 0xff;
640LELY_UTIL_ENDIAN_INLINE uint_least64_t
644 uint_least64_t x = 0;
645 memcpy(&x, src,
sizeof(x));
648 return ((uint_least64_t)(src[0] & 0xff) << 56)
649 | ((uint_least64_t)(src[1] & 0xff) << 48)
650 | ((uint_least64_t)(src[2] & 0xff) << 40)
651 | ((uint_least64_t)(src[3] & 0xff) << 32)
652 | ((uint_least64_t)(src[4] & 0xff) << 24)
653 | ((uint_least64_t)(src[5] & 0xff) << 16)
654 | ((uint_least64_t)(src[6] & 0xff) << 8)
655 | ((uint_least64_t)(src[7] & 0xff));
659LELY_UTIL_ENDIAN_INLINE
void
665LELY_UTIL_ENDIAN_INLINE int_least64_t
671LELY_UTIL_ENDIAN_INLINE
void
676 memcpy(dst, &x,
sizeof(x));
679 dst[1] = (x >> 8) & 0xff;
680 dst[2] = (x >> 16) & 0xff;
681 dst[3] = (x >> 24) & 0xff;
682 dst[4] = (x >> 32) & 0xff;
683 dst[5] = (x >> 40) & 0xff;
684 dst[6] = (x >> 48) & 0xff;
685 dst[7] = (x >> 56) & 0xff;
689LELY_UTIL_ENDIAN_INLINE uint_least64_t
693 uint_least64_t x = 0;
694 memcpy(&x, src,
sizeof(x));
697 return (uint_least64_t)(src[0] & 0xff)
698 | ((uint_least64_t)(src[1] & 0xff) << 8)
699 | ((uint_least64_t)(src[2] & 0xff) << 16)
700 | ((uint_least64_t)(src[3] & 0xff) << 24)
701 | ((uint_least64_t)(src[4] & 0xff) << 32)
702 | ((uint_least64_t)(src[5] & 0xff) << 40)
703 | ((uint_least64_t)(src[6] & 0xff) << 48)
704 | ((uint_least64_t)(src[7] & 0xff) << 56);
708#ifdef LELY_FLT16_TYPE
710LELY_UTIL_ENDIAN_INLINE
void
711stbe_flt16(uint_least8_t dst[2], flt16_t x)
713 uint_least16_t tmp = 0;
714 memcpy(&tmp, &x,
sizeof(x));
718LELY_UTIL_ENDIAN_INLINE flt16_t
719ldbe_flt16(
const uint_least8_t src[2])
723 memcpy(&x, &tmp,
sizeof(x));
727LELY_UTIL_ENDIAN_INLINE
void
728stle_flt16(uint_least8_t dst[2], flt16_t x)
730 uint_least16_t tmp = 0;
731 memcpy(&tmp, &x,
sizeof(x));
735LELY_UTIL_ENDIAN_INLINE flt16_t
736ldle_flt16(
const uint_least8_t src[2])
740 memcpy(&x, &tmp,
sizeof(x));
746#ifdef LELY_FLT32_TYPE
748LELY_UTIL_ENDIAN_INLINE
void
749stbe_flt32(uint_least8_t dst[4], flt32_t x)
751 uint_least32_t tmp = 0;
752 memcpy(&tmp, &x,
sizeof(x));
756LELY_UTIL_ENDIAN_INLINE flt32_t
757ldbe_flt32(
const uint_least8_t src[4])
761 memcpy(&x, &tmp,
sizeof(x));
765LELY_UTIL_ENDIAN_INLINE
void
766stle_flt32(uint_least8_t dst[4], flt32_t x)
768 uint_least32_t tmp = 0;
769 memcpy(&tmp, &x,
sizeof(x));
773LELY_UTIL_ENDIAN_INLINE flt32_t
774ldle_flt32(
const uint_least8_t src[4])
778 memcpy(&x, &tmp,
sizeof(x));
784#ifdef LELY_FLT64_TYPE
786LELY_UTIL_ENDIAN_INLINE
void
787stbe_flt64(uint_least8_t dst[8], flt64_t x)
789 uint_least64_t tmp = 0;
790 memcpy(&tmp, &x,
sizeof(x));
794LELY_UTIL_ENDIAN_INLINE flt64_t
795ldbe_flt64(
const uint_least8_t src[8])
799 memcpy(&x, &tmp,
sizeof(x));
803LELY_UTIL_ENDIAN_INLINE
void
804stle_flt64(uint_least8_t dst[8], flt64_t x)
806 uint_least64_t tmp = 0;
807 memcpy(&tmp, &x,
sizeof(x));
811LELY_UTIL_ENDIAN_INLINE flt64_t
812ldle_flt64(
const uint_least8_t src[8])
816 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.
This header file is part of the utilities library; it contains the byte order (endianness) function d...
void stbe_i64(uint_least8_t dst[8], int_least64_t x)
Stores a 64-bit signed integer in big-endian byte order.
void stbe_i16(uint_least8_t dst[2], int_least16_t x)
Stores a 16-bit signed integer in big-endian byte order.
int_least32_t ldbe_i32(const uint_least8_t src[4])
Loads a 32-bit signed integer in big-endian byte order.
void stle_u64(uint_least8_t dst[8], uint_least64_t x)
Stores a 64-bit unsigned integer in little-endian byte order.
uint_least16_t ldbe_u16(const uint_least8_t src[2])
Loads a 16-bit unsigned integer in big-endian byte order.
uint_least32_t ldbe_u32(const uint_least8_t src[4])
Loads a 32-bit unsigned 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 stbe_i32(uint_least8_t dst[4], int_least32_t x)
Stores a 32-bit signed integer in big-endian byte order.
uint_least32_t ldle_u32(const uint_least8_t src[4])
Loads a 32-bit unsigned integer in little-endian byte order.
uint_least64_t ldbe_u64(const uint_least8_t src[8])
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.
void bcpyle(uint_least8_t *dst, int dstbit, const uint_least8_t *src, int srcbit, size_t n)
Copies n bits from a source to a destination buffer.
void stle_i64(uint_least8_t dst[8], int_least64_t x)
Stores a 64-bit signed integer in little-endian byte order.
int_least64_t ldbe_i64(const uint_least8_t src[8])
Loads a 64-bit signed integer in big-endian byte order.
void stbe_u64(uint_least8_t dst[8], uint_least64_t x)
Stores a 64-bit unsigned integer in big-endian byte order.
void bcpybe(uint_least8_t *dst, int dstbit, const uint_least8_t *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.
int_least32_t ldle_i32(const uint_least8_t src[4])
Loads a 32-bit signed integer in little-endian byte order.
int_least16_t ldle_i16(const uint_least8_t src[2])
Loads a 16-bit signed integer in little-endian byte order.
int_least64_t ldle_i64(const uint_least8_t src[8])
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 stbe_u16(uint_least8_t dst[2], uint_least16_t x)
Stores a 16-bit unsigned integer in big-endian byte order.
uint_least16_t ldle_u16(const uint_least8_t src[2])
Loads a 16-bit unsigned integer in little-endian byte order.
void stle_i16(uint_least8_t dst[2], int_least16_t x)
Stores a 16-bit signed 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 ldle_u64(const uint_least8_t src[8])
Loads a 64-bit unsigned integer in little-endian byte order.
uint_least64_t htole64(uint_least64_t x)
Converts a 64-bit unsigned integer from host to little-endian byte order.
int_least16_t ldbe_i16(const uint_least8_t src[2])
Loads a 16-bit signed integer in big-endian byte order.
void stle_i32(uint_least8_t dst[4], int_least32_t x)
Stores a 32-bit signed integer in little-endian byte order.
void stle_u16(uint_least8_t dst[2], uint_least16_t x)
Stores a 16-bit unsigned integer in little-endian byte order.
void stbe_u32(uint_least8_t dst[4], uint_least32_t x)
Stores a 32-bit unsigned integer in big-endian byte order.
void stle_u32(uint_least8_t dst[4], uint_least32_t x)
Stores a 32-bit unsigned integer in little-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....