File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / iperf / src / portable_endian.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:36:46 2021 UTC (3 years, 3 months ago) by misho
Branches: iperf, MAIN
CVS tags: v3_3_9, HEAD
iperf 3.3.9

    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(__CYGWIN__)
   14: 
   15: #	include <endian.h>
   16: 
   17: #elif defined(HAVE_ENDIAN_H)
   18: #	include <endian.h>
   19: 
   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: 
   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: 
   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: 
   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>