/* * Thanks to Mathias Panzenböck aka panzi * https://gist.github.com/panzi/6856583 */ #ifndef PORTABLE_ENDIAN_H__ #define PORTABLE_ENDIAN_H__ #if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__) # define __WINDOWS__ #endif #if defined(__linux__) || defined(__CYGWIN__) # include #elif defined(__APPLE__) # include # define htobe16 OSSwapHostToBigInt16 # define htole16 OSSwapHostToLittleInt16 # define be16toh OSSwapBigToHostInt16 # define le16toh OSSwapLittleToHostInt16 # define htobe32 OSSwapHostToBigInt32 # define htole32 OSSwapHostToLittleInt32 # define be32toh OSSwapBigToHostInt32 # define le32toh OSSwapLittleToHostInt32 # define htobe64 OSSwapHostToBigInt64 # define htole64 OSSwapHostToLittleInt64 # define be64toh OSSwapBigToHostInt64 # define le64toh OSSwapLittleToHostInt64 # define __BYTE_ORDER BYTE_ORDER # define __BIG_ENDIAN BIG_ENDIAN # define __LITTLE_ENDIAN LITTLE_ENDIAN # define __PDP_ENDIAN PDP_ENDIAN #elif defined(__OpenBSD__) # include #elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) # include # define be16toh betoh16 # define le16toh letoh16 # define be32toh betoh32 # define le32toh letoh32 # define be64toh betoh64 # define le64toh letoh64 #elif defined(__WINDOWS__) # include # if BYTE_ORDER == LITTLE_ENDIAN # define htobe16 htons # define htole16(x) (x) # define be16toh ntohs # define le16toh(x) (x) # define htobe32 htonl # define htole32(x) (x) # define be32toh ntohl # define le32toh(x) (x) # define htobe64 htonll # define htole64(x) (x) # define be64toh ntohll # define le64toh(x) (x) # elif BYTE_ORDER == BIG_ENDIAN /* that would be xbox 360 */ # define htobe16(x) (x) # define htole16(x) __builtin_bswap16(x) # define be16toh(x) (x) # define le16toh(x) __builtin_bswap16(x) # define htobe32(x) (x) # define htole32(x) __builtin_bswap32(x) # define be32toh(x) (x) # define le32toh(x) __builtin_bswap32(x) # define htobe64(x) (x) # define htole64(x) __builtin_bswap64(x) # define be64toh(x) (x) # define le64toh(x) __builtin_bswap64(x) # else # error byte order not supported # endif # define __BYTE_ORDER BYTE_ORDER # define __BIG_ENDIAN BIG_ENDIAN # define __LITTLE_ENDIAN LITTLE_ENDIAN # define __PDP_ENDIAN PDP_ENDIAN #elif defined(__QNXNTO__) # include # define htobe16 ENDIAN_BE16 # define htole16 ENDIAN_LE16 # define htobe32 ENDIAN_BE32 # define htole32 ENDIAN_LE32 # define htobe64 ENDIAN_BE64 # define htole64 ENDIAN_LE64 #elif defined (__vxworks) # include #else # error platform not supported #endif #endif //#ifndef PORTABLE_ENDIAN_H__