diff --git a/include/boost/detail/endian.hpp b/include/boost/detail/endian.hpp index 98c870c..3236808 100644 --- a/include/boost/detail/endian.hpp +++ b/include/boost/detail/endian.hpp @@ -28,10 +28,12 @@ #ifndef BOOST_DETAIL_ENDIAN_HPP #define BOOST_DETAIL_ENDIAN_HPP +// +// Special cases come first: +// +#if defined (__GLIBC__) // GNU libc offers the helpful header which defines // __BYTE_ORDER - -#if defined (__GLIBC__) # include # if (__BYTE_ORDER == __LITTLE_ENDIAN) # define BOOST_LITTLE_ENDIAN @@ -43,13 +45,56 @@ # error Unknown machine endianness detected. # endif # define BOOST_BYTE_ORDER __BYTE_ORDER + +#elif defined(__NetBSD__) || defined(__FreeBSD__) || \ + defined(__OpenBSD__) || (__DragonFly__) +// +// BSD has endian.h, see https://svn.boost.org/trac/boost/ticket/6013 +# if defined(__OpenBSD__) +# include +# else +# include +# endif +# if (_BYTE_ORDER == _LITTLE_ENDIAN) +# define BOOST_LITTLE_ENDIAN +# elif (_BYTE_ORDER == _BIG_ENDIAN) +# define BOOST_BIG_ENDIAN +# elif (_BYTE_ORDER == _PDP_ENDIAN) +# define BOOST_PDP_ENDIAN +# else +# error Unknown machine endianness detected. +# endif +# define BOOST_BYTE_ORDER _BYTE_ORDER + +#elif defined( __ANDROID__ ) +// Adroid specific code, see: https://svn.boost.org/trac/boost/ticket/7528 +// Here we can use machine/_types.h, see: +// http://stackoverflow.com/questions/6212951/endianness-of-android-ndk +# include "machine/_types.h" +# ifdef __ARMEB__ +# define BOOST_BIG_ENDIAN +# define BOOST_BYTE_ORDER 4321 +# else +# define BOOST_LITTLE_ENDIAN +# define BOOST_BYTE_ORDER 1234 +# endif // __ARMEB__ + +#elif defined( _XBOX ) +// +// XBox is always big endian?? +// +# define BOOST_BIG_ENDIAN +# define BOOST_BYTE_ORDER 4321 + #elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) || \ defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) || \ + defined(__BIGENDIAN__) && !defined(__LITTLEENDIAN__) || \ defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN) # define BOOST_BIG_ENDIAN # define BOOST_BYTE_ORDER 4321 #elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) || \ defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) || \ + defined(__LITTLEENDIAN__) && !defined(__BIGENDIAN__) || \ defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN) # define BOOST_LITTLE_ENDIAN # define BOOST_BYTE_ORDER 1234 @@ -57,7 +102,7 @@ || defined(_POWER) || defined(__powerpc__) \ || defined(__ppc__) || defined(__hpux) || defined(__hppa) \ || defined(_MIPSEB) || defined(_POWER) \ - || defined(__s390__) + || defined(__s390__) || defined(__ARMEB__) # define BOOST_BIG_ENDIAN # define BOOST_BYTE_ORDER 4321 #elif defined(__i386__) || defined(__alpha__) \ @@ -66,7 +111,9 @@ || defined(_M_ALPHA) || defined(__amd64) \ || defined(__amd64__) || defined(_M_AMD64) \ || defined(__x86_64) || defined(__x86_64__) \ - || defined(_M_X64) || defined(__bfin__) + || defined(_M_X64) || defined(__bfin__) \ + || defined(__ARMEL__) \ + || (defined(_WIN32) && defined(__ARM__) && defined(_MSC_VER)) // ARM Windows CE don't define anything reasonably unique, but there are no big-endian Windows versions # define BOOST_LITTLE_ENDIAN # define BOOST_BYTE_ORDER 1234 @@ -76,3 +123,4 @@ #endif +