Annotation of embedaddon/iperf/src/portable_endian.h, revision 1.1
1.1 ! misho 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: // GLIBC / Linux with endian(3) support, which was added in glibc 2.9.
! 14: // Intended to support CentOS 6 and newer.
! 15: #if defined(__linux__) && \
! 16: ((__GLIBC__ > 3) || \
! 17: (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9))
! 18:
! 19: # include <endian.h>
! 20:
! 21: #elif defined(__CYGWIN__)
! 22:
! 23: # include <endian.h>
! 24:
! 25: #elif defined(__APPLE__)
! 26:
! 27: # include <libkern/OSByteOrder.h>
! 28:
! 29: # define htobe16(x) OSSwapHostToBigInt16(x)
! 30: # define htole16(x) OSSwapHostToLittleInt16(x)
! 31: # define be16toh(x) OSSwapBigToHostInt16(x)
! 32: # define le16toh(x) OSSwapLittleToHostInt16(x)
! 33:
! 34: # define htobe32(x) OSSwapHostToBigInt32(x)
! 35: # define htole32(x) OSSwapHostToLittleInt32(x)
! 36: # define be32toh(x) OSSwapBigToHostInt32(x)
! 37: # define le32toh(x) OSSwapLittleToHostInt32(x)
! 38:
! 39: # define htobe64(x) OSSwapHostToBigInt64(x)
! 40: # define htole64(x) OSSwapHostToLittleInt64(x)
! 41: # define be64toh(x) OSSwapBigToHostInt64(x)
! 42: # define le64toh(x) OSSwapLittleToHostInt64(x)
! 43:
! 44: # define __BYTE_ORDER BYTE_ORDER
! 45: # define __BIG_ENDIAN BIG_ENDIAN
! 46: # define __LITTLE_ENDIAN LITTLE_ENDIAN
! 47: # define __PDP_ENDIAN PDP_ENDIAN
! 48:
! 49: #elif defined(__OpenBSD__)
! 50:
! 51: # include <sys/endian.h>
! 52:
! 53: # define be16toh(x) betoh16(x)
! 54: # define le16toh(x) letoh16(x)
! 55:
! 56: # define be32toh(x) betoh32(x)
! 57: # define le32toh(x) letoh32(x)
! 58:
! 59: # define be64toh(x) betoh64(x)
! 60: # define le64toh(x) letoh64(x)
! 61:
! 62: #elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
! 63:
! 64: # include <sys/endian.h>
! 65:
! 66: #elif defined(__sun) && defined(__SVR4)
! 67:
! 68: # include <sys/types.h>
! 69: # include <netinet/in.h>
! 70: # include <inttypes.h>
! 71:
! 72: # define be64toh(x) ntohll(x)
! 73: # define htobe64(x) htonll(x)
! 74:
! 75: #elif defined(__WINDOWS__)
! 76:
! 77: # include <winsock2.h>
! 78: # include <sys/param.h>
! 79:
! 80: # if BYTE_ORDER == LITTLE_ENDIAN
! 81:
! 82: # define htobe16(x) htons(x)
! 83: # define htole16(x) (x)
! 84: # define be16toh(x) ntohs(x)
! 85: # define le16toh(x) (x)
! 86:
! 87: # define htobe32(x) htonl(x)
! 88: # define htole32(x) (x)
! 89: # define be32toh(x) ntohl(x)
! 90: # define le32toh(x) (x)
! 91:
! 92: # define htobe64(x) htonll(x)
! 93: # define htole64(x) (x)
! 94: # define be64toh(x) ntohll(x)
! 95: # define le64toh(x) (x)
! 96:
! 97: # elif BYTE_ORDER == BIG_ENDIAN
! 98:
! 99: /* that would be xbox 360 */
! 100: # define htobe16(x) (x)
! 101: # define htole16(x) __builtin_bswap16(x)
! 102: # define be16toh(x) (x)
! 103: # define le16toh(x) __builtin_bswap16(x)
! 104:
! 105: # define htobe32(x) (x)
! 106: # define htole32(x) __builtin_bswap32(x)
! 107: # define be32toh(x) (x)
! 108: # define le32toh(x) __builtin_bswap32(x)
! 109:
! 110: # define htobe64(x) (x)
! 111: # define htole64(x) __builtin_bswap64(x)
! 112: # define be64toh(x) (x)
! 113: # define le64toh(x) __builtin_bswap64(x)
! 114:
! 115: # else
! 116:
! 117: # error byte order not supported
! 118:
! 119: # endif
! 120:
! 121: # define __BYTE_ORDER BYTE_ORDER
! 122: # define __BIG_ENDIAN BIG_ENDIAN
! 123: # define __LITTLE_ENDIAN LITTLE_ENDIAN
! 124: # define __PDP_ENDIAN PDP_ENDIAN
! 125:
! 126: #else
! 127:
! 128: // Unsupported platforms.
! 129: // Intended to support CentOS 5 but hopefully not too far from
! 130: // the truth because we use the homebrew htonll, et al. implementations
! 131: // that were originally the sole implementation of this functionality
! 132: // in iperf 3.0.
! 133: # warning platform not supported
! 134: # include <endian.h>
! 135: #if BYTE_ORDER == BIG_ENDIAN
! 136: #define HTONLL(n) (n)
! 137: #define NTOHLL(n) (n)
! 138: #else
! 139: #define HTONLL(n) ((((unsigned long long)(n) & 0xFF) << 56) | \
! 140: (((unsigned long long)(n) & 0xFF00) << 40) | \
! 141: (((unsigned long long)(n) & 0xFF0000) << 24) | \
! 142: (((unsigned long long)(n) & 0xFF000000) << 8) | \
! 143: (((unsigned long long)(n) & 0xFF00000000) >> 8) | \
! 144: (((unsigned long long)(n) & 0xFF0000000000) >> 24) | \
! 145: (((unsigned long long)(n) & 0xFF000000000000) >> 40) | \
! 146: (((unsigned long long)(n) & 0xFF00000000000000) >> 56))
! 147:
! 148: #define NTOHLL(n) ((((unsigned long long)(n) & 0xFF) << 56) | \
! 149: (((unsigned long long)(n) & 0xFF00) << 40) | \
! 150: (((unsigned long long)(n) & 0xFF0000) << 24) | \
! 151: (((unsigned long long)(n) & 0xFF000000) << 8) | \
! 152: (((unsigned long long)(n) & 0xFF00000000) >> 8) | \
! 153: (((unsigned long long)(n) & 0xFF0000000000) >> 24) | \
! 154: (((unsigned long long)(n) & 0xFF000000000000) >> 40) | \
! 155: (((unsigned long long)(n) & 0xFF00000000000000) >> 56))
! 156: #endif
! 157:
! 158: #define htobe64(n) HTONLL(n)
! 159: #define be64toh(n) NTOHLL(n)
! 160:
! 161: #endif
! 162:
! 163: #endif
! 164:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>