1#ifndef _ENDIAN_H 2#define _ENDIAN_H 3 4#include <features.h> 5 6#define __NEED_uint16_t 7#define __NEED_uint32_t 8#define __NEED_uint64_t 9 10#include <bits/alltypes.h> 11 12#define __BIG_ENDIAN 4321 13#define __LITTLE_ENDIAN 1234 14#define __PDP_ENDIAN 3412 15 16#define BIG_ENDIAN __BIG_ENDIAN 17#define LITTLE_ENDIAN __LITTLE_ENDIAN 18#define PDP_ENDIAN __PDP_ENDIAN 19#define BYTE_ORDER __BYTE_ORDER 20 21#include <stdint.h> 22 23static __inline uint16_t __bswap16(uint16_t __x) 24{ 25 return __x<<8 | __x>>8; 26} 27 28static __inline uint32_t __bswap32(uint32_t __x) 29{ 30 return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24; 31} 32 33static __inline uint64_t __bswap64(uint64_t __x) 34{ 35 return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32); 36} 37 38#if __BYTE_ORDER == __LITTLE_ENDIAN 39#define htobe16(x) __bswap16(x) 40#define be16toh(x) __bswap16(x) 41#define htobe32(x) __bswap32(x) 42#define be32toh(x) __bswap32(x) 43#define htobe64(x) __bswap64(x) 44#define be64toh(x) __bswap64(x) 45#define htole16(x) (uint16_t)(x) 46#define le16toh(x) (uint16_t)(x) 47#define htole32(x) (uint32_t)(x) 48#define le32toh(x) (uint32_t)(x) 49#define htole64(x) (uint64_t)(x) 50#define le64toh(x) (uint64_t)(x) 51#else 52#define htobe16(x) (uint16_t)(x) 53#define be16toh(x) (uint16_t)(x) 54#define htobe32(x) (uint32_t)(x) 55#define be32toh(x) (uint32_t)(x) 56#define htobe64(x) (uint64_t)(x) 57#define be64toh(x) (uint64_t)(x) 58#define htole16(x) __bswap16(x) 59#define le16toh(x) __bswap16(x) 60#define htole32(x) __bswap32(x) 61#define le32toh(x) __bswap32(x) 62#define htole64(x) __bswap64(x) 63#define le64toh(x) __bswap64(x) 64#endif 65 66#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 67#if __BYTE_ORDER == __LITTLE_ENDIAN 68#define betoh16(x) __bswap16(x) 69#define betoh32(x) __bswap32(x) 70#define betoh64(x) __bswap64(x) 71#define letoh16(x) (uint16_t)(x) 72#define letoh32(x) (uint32_t)(x) 73#define letoh64(x) (uint64_t)(x) 74#else 75#define betoh16(x) (uint16_t)(x) 76#define betoh32(x) (uint32_t)(x) 77#define betoh64(x) (uint64_t)(x) 78#define letoh16(x) __bswap16(x) 79#define letoh32(x) __bswap32(x) 80#define letoh64(x) __bswap64(x) 81#endif 82#endif 83 84static __inline uint32_t 85be32dec(const void *pp) 86{ 87 uint8_t const *p = (uint8_t const *)pp; 88 89 return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 90} 91 92static __inline void 93be32enc(void *pp, uint32_t u) 94{ 95 uint8_t *p = (uint8_t *)pp; 96 97 p[0] = (u >> 24) & 0xff; 98 p[1] = (u >> 16) & 0xff; 99 p[2] = (u >> 8) & 0xff; 100 p[3] = u & 0xff; 101} 102 103static __inline void 104be64enc(void *pp, uint64_t u) 105{ 106 uint8_t *p = (uint8_t *)pp; 107 108 be32enc(p, (uint32_t)(u >> 32)); 109 be32enc(p + 4, (uint32_t)(u & 0xffffffffU)); 110} 111 112#endif 113