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