Endian defines fix for macOS

It seems `__BYTE_ORDER`/`__LITTLE_ENDIAN`/`__BIG_ENDIAN` aren't defined
on macOS, so `if __BYTE_ORDER == __BIG_ENDIAN` was true which made macOS
take the big endian path *twice* (which cancelled out the big endian
conversion).

This makes util/endian.hpp define __LITTLE_ENDIAN__ or __BIG_ENDIAN__
everywhere, and errors if it can't be set.
pull/1078/head
Jason Rhinelander 4 years ago
parent 9283aac4b6
commit 3be7eb789b

@ -14,10 +14,10 @@
// anything not win32
struct ip_header
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
#ifdef __LITTLE_ENDIAN__
unsigned int ihl : 4;
unsigned int version : 4;
#elif __BYTE_ORDER == __BIG_ENDIAN
#elif defined(__BIG_ENDIAN__)
unsigned int version : 4;
unsigned int ihl : 4;
#else

@ -94,6 +94,16 @@ be64toh(uint64_t big64);
#endif
#if !defined(__LITTLE_ENDIAN__) && defined(__BYTE_ORDER) \
&& defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN
#define __LITTLE_ENDIAN__
#elif !defined(__BIG_ENDIAN__) && defined(__BYTE_ORDER) \
&& defined(__BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN
#define __BIG_ENDIAN__
#elif !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
#error "Error: don't know which endian this is"
#endif
inline uint16_t
buf16toh(const void *buf)
{
@ -193,7 +203,7 @@ htole64buf(void *buf, uint64_t big64)
inline absl::uint128
ntoh128(absl::uint128 i)
{
#if __BYTE_ORDER == __BIG_ENDIAN
#ifdef __BIG_ENDIAN__
return i;
#else
const auto loSwapped = htobe64(absl::Uint128Low64(i));

Loading…
Cancel
Save