1 // "License": Public Domain 2 // I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like. 3 4 #ifndef PORTABLE_ENDIAN_H__ 5 #define PORTABLE_ENDIAN_H__ 6 7 #if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__) 8 9 # define __WINDOWS__ 10 11 #endif 12 13 #if defined(__linux__) || defined(__CYGWIN__) 14 15 # include <endian.h> 16 17 #elif defined(__APPLE__) 18 19 # include <libkern/OSByteOrder.h> 20 21 # define htobe16(x) OSSwapHostToBigInt16(x) 22 # define htole16(x) OSSwapHostToLittleInt16(x) 23 # define be16toh(x) OSSwapBigToHostInt16(x) 24 # define le16toh(x) OSSwapLittleToHostInt16(x) 25 26 # define htobe32(x) OSSwapHostToBigInt32(x) 27 # define htole32(x) OSSwapHostToLittleInt32(x) 28 # define be32toh(x) OSSwapBigToHostInt32(x) 29 # define le32toh(x) OSSwapLittleToHostInt32(x) 30 31 # define htobe64(x) OSSwapHostToBigInt64(x) 32 # define htole64(x) OSSwapHostToLittleInt64(x) 33 # define be64toh(x) OSSwapBigToHostInt64(x) 34 # define le64toh(x) OSSwapLittleToHostInt64(x) 35 36 # define __BYTE_ORDER BYTE_ORDER 37 # define __BIG_ENDIAN BIG_ENDIAN 38 # define __LITTLE_ENDIAN LITTLE_ENDIAN 39 # define __PDP_ENDIAN PDP_ENDIAN 40 41 #elif defined(__OpenBSD__) 42 43 # include <sys/endian.h> 44 45 #elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) 46 47 # include <sys/endian.h> 48 49 # define be16toh(x) betoh16(x) 50 # define le16toh(x) letoh16(x) 51 52 # define be32toh(x) betoh32(x) 53 # define le32toh(x) letoh32(x) 54 55 # define be64toh(x) betoh64(x) 56 # define le64toh(x) letoh64(x) 57 58 #elif defined(__WINDOWS__) 59 60 # include <winsock2.h> 61 # include <sys/param.h> 62 63 # if BYTE_ORDER == LITTLE_ENDIAN 64 65 # define htobe16(x) htons(x) 66 # define htole16(x) (x) 67 # define be16toh(x) ntohs(x) 68 # define le16toh(x) (x) 69 70 # define htobe32(x) htonl(x) 71 # define htole32(x) (x) 72 # define be32toh(x) ntohl(x) 73 # define le32toh(x) (x) 74 75 # define htobe64(x) htonll(x) 76 # define htole64(x) (x) 77 # define be64toh(x) ntohll(x) 78 # define le64toh(x) (x) 79 80 # elif BYTE_ORDER == BIG_ENDIAN 81 82 /* that would be xbox 360 */ 83 # define htobe16(x) (x) 84 # define htole16(x) __builtin_bswap16(x) 85 # define be16toh(x) (x) 86 # define le16toh(x) __builtin_bswap16(x) 87 88 # define htobe32(x) (x) 89 # define htole32(x) __builtin_bswap32(x) 90 # define be32toh(x) (x) 91 # define le32toh(x) __builtin_bswap32(x) 92 93 # define htobe64(x) (x) 94 # define htole64(x) __builtin_bswap64(x) 95 # define be64toh(x) (x) 96 # define le64toh(x) __builtin_bswap64(x) 97 98 # else 99 100 # error byte order not supported 101 102 # endif 103 104 # define __BYTE_ORDER BYTE_ORDER 105 # define __BIG_ENDIAN BIG_ENDIAN 106 # define __LITTLE_ENDIAN LITTLE_ENDIAN 107 # define __PDP_ENDIAN PDP_ENDIAN 108 109 #else 110 111 # error platform not supported 112 113 #endif 114 115 #endif 116