/*! * \file portable_endian.h * \license https://creativecommons.org/publicdomain/zero/1.0/ * * Original author: * - Mathias Panzenböck (https://gist.github.com/panzi/6856583) * Related resources: * - https://en.wikipedia.org/wiki/Endianness * - https://sourceforge.net/p/predef/wiki/Endianness/ * - http://stackoverflow.com/questions/2100331/c-macro-definition-to-determine-big-endian-or-little-endian-machine */ #ifndef PORTABLE_ENDIAN_H #define PORTABLE_ENDIAN_H /* ************************************************************************** */ #if defined(__linux__) || defined(__CYGWIN__) #include #elif defined(__APPLE__) #include #define htobe16(x) OSSwapHostToBigInt16(x) #define htole16(x) OSSwapHostToLittleInt16(x) #define be16toh(x) OSSwapBigToHostInt16(x) #define le16toh(x) OSSwapLittleToHostInt16(x) #define htobe32(x) OSSwapHostToBigInt32(x) #define htole32(x) OSSwapHostToLittleInt32(x) #define be32toh(x) OSSwapBigToHostInt32(x) #define le32toh(x) OSSwapLittleToHostInt32(x) #define htobe64(x) OSSwapHostToBigInt64(x) #define htole64(x) OSSwapHostToLittleInt64(x) #define be64toh(x) OSSwapBigToHostInt64(x) #define le64toh(x) OSSwapLittleToHostInt64(x) #define __BYTE_ORDER BYTE_ORDER #define __BIG_ENDIAN BIG_ENDIAN #define __LITTLE_ENDIAN LITTLE_ENDIAN #define __PDP_ENDIAN PDP_ENDIAN #elif defined(__OpenBSD__) || defined(__FreeBSD__) #include #elif defined(__NetBSD__) || defined(__DragonFly__) #include #define be16toh(x) betoh16(x) #define le16toh(x) letoh16(x) #define be32toh(x) betoh32(x) #define le32toh(x) letoh32(x) #define be64toh(x) betoh64(x) #define le64toh(x) letoh64(x) #elif defined(__sun) #include #define htobe16(x) BE_16(x) #define htole16(x) LE_16(x) #define be16toh(x) BE_IN16(x) #define le16toh(x) LE_IN16(x) #define htobe32(x) BE_32(x) #define htole32(x) LE_32(x) #define be32toh(x) BE_IN32(x) #define le32toh(x) LE_IN32(x) #define htobe64(x) BE_64(x) #define htole64(x) LE_64(x) #define be64toh(x) BE_IN64(x) #define le64toh(x) LE_IN64(x) #elif defined(_WIN16) || defined(_WIN32) || defined(_WIN64) #include #ifdef __MINGW32__ #include #elif _MSC_VER // Windows doesn't provide any way to detect endianness through macros. // We force little endian because while there may be some NT kernel version // running on big endian (?), there is no known version of BE Windows... #define LITTLE_ENDIAN 1234 #define BIG_ENDIAN 4321 #define PDP_ENDIAN 3412 #define BYTE_ORDER LITTLE_ENDIAN #endif #define htobe16(x) htons(x) #define htole16(x) (x) #define be16toh(x) ntohs(x) #define le16toh(x) (x) #define htobe32(x) htonl(x) #define htole32(x) (x) #define be32toh(x) ntohl(x) #define le32toh(x) (x) #define htobe64(x) htonll(x) #define htole64(x) (x) #define be64toh(x) ntohll(x) #define le64toh(x) (x) #define __BYTE_ORDER BYTE_ORDER #define __BIG_ENDIAN BIG_ENDIAN #define __LITTLE_ENDIAN LITTLE_ENDIAN #define __PDP_ENDIAN PDP_ENDIAN #else #error platform not supported #endif /* ************************************************************************** */ #endif // PORTABLE_ENDIAN_H