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