X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fstdendian.h;h=9ab0fb5944dcec8769abcde388d9edf1433d4786;hb=0d86e9eb15e495c3a3ca806844f8264235ecf3ff;hp=d4190968560a96cfa5b6e7a44ea67a01edd879f0;hpb=81ce8bb7067b08bfb8c7e00a8f3c1f5b44e57c13;p=collectd.git diff --git a/src/stdendian.h b/src/stdendian.h index d4190968..9ab0fb59 100644 --- a/src/stdendian.h +++ b/src/stdendian.h @@ -35,15 +35,18 @@ * uint64_t le64toh(uint64_t x); * * The header defines the following macro for OpenCL compatibility - * https://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/preprocessorDirectives.html + * + https://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/preprocessorDirectives.html * * __ENDIAN_LITTLE__ if BYTE_ORDER == LITTLE_ENDIAN then this * macro is present for OpenCL compatibility * * The implementation provides a uniform interface to endian macros using only - * system headers on recent Linux, Darwin, FreeBSD, Solaris and Windows systems. + * system headers on recent Linux, Darwin, FreeBSD, Solaris and Windows + systems. * - * This approach is intended to avoid the need for preflight configure scripts. + * This approach is intended to avoid the need for preflight configure + scripts. * An alternative approach would be to test compiler CPU architecture marcros. * * This header has had *limited* testing on recent C11/C++11 compilers and is @@ -62,82 +65,99 @@ /* Linux / GLIBC */ #if defined(__linux__) || defined(__GLIBC__) -#include #include -#define __ENDIAN_DEFINED 1 -#define __BSWAP_DEFINED 1 -#define __HOSTSWAP_DEFINED 1 -#define _BYTE_ORDER __BYTE_ORDER -#define _LITTLE_ENDIAN __LITTLE_ENDIAN -#define _BIG_ENDIAN __BIG_ENDIAN -#define bswap16(x) bswap_16(x) -#define bswap32(x) bswap_32(x) -#define bswap64(x) bswap_64(x) +#include +#define __ENDIAN_DEFINED 1 +#define __BSWAP_DEFINED 1 +#define __HOSTSWAP_DEFINED 1 +#define _BYTE_ORDER __BYTE_ORDER +#define _LITTLE_ENDIAN __LITTLE_ENDIAN +#define _BIG_ENDIAN __BIG_ENDIAN +#define bswap16(x) bswap_16(x) +#define bswap32(x) bswap_32(x) +#define bswap64(x) bswap_64(x) #endif /* __linux__ || __GLIBC__ */ /* BSD */ -#if defined(__FreeBSD__) || defined(__NetBSD__) || \ - defined(__DragonFly__) || defined(__OpenBSD__) +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ + defined(__OpenBSD__) #include -#define __ENDIAN_DEFINED 1 -#define __BSWAP_DEFINED 1 -#define __HOSTSWAP_DEFINED 1 +#define __ENDIAN_DEFINED 1 +#define __BSWAP_DEFINED 1 +#define __HOSTSWAP_DEFINED 1 #endif /* BSD */ /* Solaris */ -#if defined (sun) -#include +#if defined(sun) #include -#define bswap16(x) BSWAP_16(x) -#define bswap32(x) BSWAP_32(x) -#define bswap64(x) BSWAP_64(x) +#include +#define bswap16(x) BSWAP_16(x) +#define bswap32(x) BSWAP_32(x) +#define bswap64(x) BSWAP_64(x) /* sun headers don't set a value for _LITTLE_ENDIAN or _BIG_ENDIAN */ #if defined(_LITTLE_ENDIAN) #undef _LITTLE_ENDIAN -#define _LITTLE_ENDIAN 1234 -#define _BIG_ENDIAN 4321 -#define _BYTE_ORDER _LITTLE_ENDIAN +#define _LITTLE_ENDIAN 1234 +#define _BIG_ENDIAN 4321 +#define _BYTE_ORDER _LITTLE_ENDIAN #elif defined(_BIG_ENDIAN) #undef _BIG_ENDIAN -#define _LITTLE_ENDIAN 1234 -#define _BIG_ENDIAN 4321 -#define _BYTE_ORDER _BIG_ENDIAN +#define _LITTLE_ENDIAN 1234 +#define _BIG_ENDIAN 4321 +#define _BYTE_ORDER _BIG_ENDIAN #endif -#define __ENDIAN_DEFINED 1 +#define __ENDIAN_DEFINED 1 #endif /* sun */ +/* AIX */ +#if defined(_AIX) +#include +#if BYTE_ORDER == LITTLE_ENDIAN +#define _LITTLE_ENDIAN 1234 +#define _BIG_ENDIAN 4321 +#define _BYTE_ORDER _LITTLE_ENDIAN +#elif BYTE_ORDER == BIG_ENDIAN +#define _LITTLE_ENDIAN 1234 +#define _BIG_ENDIAN 4321 +#define _BYTE_ORDER _BIG_ENDIAN +#else +#error Could not determine CPU byte order for AIX +#endif +#define __ENDIAN_DEFINED 1 +#endif /* AIX */ + /* Windows */ #if defined(_WIN32) || defined(_MSC_VER) /* assumes all Microsoft targets are little endian */ -#define _LITTLE_ENDIAN 1234 -#define _BIG_ENDIAN 4321 -#define _BYTE_ORDER _LITTLE_ENDIAN -#define __ENDIAN_DEFINED 1 +#define _LITTLE_ENDIAN 1234 +#define _BIG_ENDIAN 4321 +#define _BYTE_ORDER _LITTLE_ENDIAN +#define __ENDIAN_DEFINED 1 #endif /* _MSC_VER */ /* OS X */ #if defined(__APPLE__) #include -#define _BYTE_ORDER BYTE_ORDER -#define _LITTLE_ENDIAN LITTLE_ENDIAN -#define _BIG_ENDIAN BIG_ENDIAN -#define __ENDIAN_DEFINED 1 +#define _BYTE_ORDER BYTE_ORDER +#define _LITTLE_ENDIAN LITTLE_ENDIAN +#define _BIG_ENDIAN BIG_ENDIAN +#define __ENDIAN_DEFINED 1 #endif /* __APPLE__ */ /* OpenCL */ -#if defined (__OPENCL_VERSION__) -#define _LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 -#if defined (__ENDIAN_LITTLE__) -#define _BYTE_ORDER _LITTLE_ENDIAN +#if defined(__OPENCL_VERSION__) +#define _LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#if defined(__ENDIAN_LITTLE__) +#define _BYTE_ORDER _LITTLE_ENDIAN #else -#define _BYTE_ORDER _BIG_ENDIAN +#define _BYTE_ORDER _BIG_ENDIAN #endif -#define bswap16(x) as_ushort(as_uchar2(ushort(x)).s1s0) -#define bswap32(x) as_uint(as_uchar4(uint(x)).s3s2s1s0) -#define bswap64(x) as_ulong(as_uchar8(ulong(x)).s7s6s5s4s3s2s1s0) -#define __ENDIAN_DEFINED 1 -#define __BSWAP_DEFINED 1 +#define bswap16(x) as_ushort(as_uchar2(ushort(x)).s1s0) +#define bswap32(x) as_uint(as_uchar4(uint(x)).s3s2s1s0) +#define bswap64(x) as_ulong(as_uchar8(ulong(x)).s7s6s5s4s3s2s1s0) +#define __ENDIAN_DEFINED 1 +#define __BSWAP_DEFINED 1 #endif /* Unknown */ @@ -158,8 +178,8 @@ /* OpenCL compatibility - define __ENDIAN_LITTLE__ on little endian systems */ #if _BYTE_ORDER == _LITTLE_ENDIAN -#if !defined (__ENDIAN_LITTLE__) -#define __ENDIAN_LITTLE__ 1 +#if !defined(__ENDIAN_LITTLE__) +#define __ENDIAN_LITTLE__ 1 #endif #endif @@ -167,12 +187,13 @@ #if !__BSWAP_DEFINED #ifndef bswap16 -/* handle missing __builtin_bswap16 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52624 */ +/* handle missing __builtin_bswap16 + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52624 */ #if defined __GNUC__ -/* define bswap16(x) __builtin_bswap16(x) */ +#define bswap16(x) __builtin_bswap16(x) #else -#define bswap16(x) ((uint16_t)((((uint16_t) (x) & 0xff00) >> 8) | \ - (((uint16_t) (x) & 0x00ff) << 8))) +#define bswap16(x) \ + ((uint16_t)((((uint16_t)(x)&0xff00) >> 8) | (((uint16_t)(x)&0x00ff) << 8))) #endif #endif @@ -180,10 +201,10 @@ #if defined __GNUC__ #define bswap32(x) __builtin_bswap32(x) #else -#define bswap32(x) ((uint32_t)((((uint32_t) (x) & 0xff000000) >> 24) | \ - (((uint32_t) (x) & 0x00ff0000) >> 8) | \ - (((uint32_t) (x) & 0x0000ff00) << 8) | \ - (((uint32_t) (x) & 0x000000ff) << 24))) +#define bswap32(x) \ + ((uint32_t)( \ + (((uint32_t)(x)&0xff000000) >> 24) | (((uint32_t)(x)&0x00ff0000) >> 8) | \ + (((uint32_t)(x)&0x0000ff00) << 8) | (((uint32_t)(x)&0x000000ff) << 24))) #endif #endif @@ -191,14 +212,15 @@ #if defined __GNUC__ #define bswap64(x) __builtin_bswap64(x) #else -#define bswap64(x) ((uint64_t)((((uint64_t) (x) & 0xff00000000000000ull) >> 56) | \ - (((uint64_t) (x) & 0x00ff000000000000ull) >> 40) | \ - (((uint64_t) (x) & 0x0000ff0000000000ull) >> 24) | \ - (((uint64_t) (x) & 0x000000ff00000000ull) >> 8) | \ - (((uint64_t) (x) & 0x00000000ff000000ull) << 8) | \ - (((uint64_t) (x) & 0x0000000000ff0000ull) << 24) | \ - (((uint64_t) (x) & 0x000000000000ff00ull) << 40) | \ - (((uint64_t) (x) & 0x00000000000000ffull) << 56))) +#define bswap64(x) \ + ((uint64_t)((((uint64_t)(x)&0xff00000000000000ull) >> 56) | \ + (((uint64_t)(x)&0x00ff000000000000ull) >> 40) | \ + (((uint64_t)(x)&0x0000ff0000000000ull) >> 24) | \ + (((uint64_t)(x)&0x000000ff00000000ull) >> 8) | \ + (((uint64_t)(x)&0x00000000ff000000ull) << 8) | \ + (((uint64_t)(x)&0x0000000000ff0000ull) << 24) | \ + (((uint64_t)(x)&0x000000000000ff00ull) << 40) | \ + (((uint64_t)(x)&0x00000000000000ffull) << 56))) #endif #endif @@ -206,37 +228,35 @@ /* Host swap macros */ #ifndef __HOSTSWAP_DEFINED -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define htobe16(x) bswap16((x)) -#define htole16(x) ((uint16_t)(x)) -#define be16toh(x) bswap16((x)) -#define le16toh(x) ((uint16_t)(x)) +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define htobe16(x) bswap16((x)) +#define htole16(x) ((uint16_t)(x)) +#define be16toh(x) bswap16((x)) +#define le16toh(x) ((uint16_t)(x)) -#define htobe32(x) bswap32((x)) -#define htole32(x) ((uint32_t)(x)) -#define be32toh(x) bswap32((x)) -#define le32toh(x) ((uint32_t)(x)) +#define htobe32(x) bswap32((x)) +#define htole32(x) ((uint32_t)(x)) +#define be32toh(x) bswap32((x)) +#define le32toh(x) ((uint32_t)(x)) -#define htobe64(x) bswap64((x)) -#define htole64(x) ((uint64_t)(x)) -#define be64toh(x) bswap64((x)) -#define le64toh(x) ((uint64_t)(x)) -#elif __BYTE_ORDER == __BIG_ENDIAN -#define htobe16(x) ((uint16_t)(x)) -#define htole16(x) bswap16((x)) -#define be16toh(x) ((uint16_t)(x)) -#define le16toh(x) bswap16((x)) +#define htobe64(x) bswap64((x)) +#define htole64(x) ((uint64_t)(x)) +#define be64toh(x) bswap64((x)) +#define le64toh(x) ((uint64_t)(x)) +#elif _BYTE_ORDER == _BIG_ENDIAN +#define htobe16(x) ((uint16_t)(x)) +#define htole16(x) bswap16((x)) +#define be16toh(x) ((uint16_t)(x)) +#define le16toh(x) bswap16((x)) -#define htobe32(x) ((uint32_t)(x)) -#define htole32(x) bswap32((x)) -#define be32toh(x) ((uint32_t)(x)) -#define le64toh(x) bswap64((x)) +#define htobe32(x) ((uint32_t)(x)) +#define htole32(x) bswap32((x)) +#define be32toh(x) ((uint32_t)(x)) +#define le64toh(x) bswap64((x)) -#define htobe64(x) ((uint64_t)(x)) -#define htole64(x) bswap64((x)) -#define be64toh(x) ((uint64_t)(x)) -#define le32toh(x) bswap32((x)) +#define htobe64(x) ((uint64_t)(x)) +#define htole64(x) bswap64((x)) +#define be64toh(x) ((uint64_t)(x)) +#define le32toh(x) bswap32((x)) #endif #endif - -