Neels Hofmeyr | 17518fe | 2017-06-20 04:35:06 +0200 | [diff] [blame] | 1 | /*! \file endian.h |
| 2 | * |
Holger Hans Peter Freyther | 249a81b | 2015-03-22 09:03:42 +0100 | [diff] [blame] | 3 | * GNU and FreeBSD have various ways to express the |
| 4 | * endianess but none of them is similiar enough. This |
| 5 | * will create two defines that allows to decide on the |
| 6 | * endian. The following will be defined to either 0 or |
| 7 | * 1 at the end of the file. |
| 8 | * |
| 9 | * OSMO_IS_LITTLE_ENDIAN |
| 10 | * OSMO_IS_BIG_ENDIAN |
| 11 | * |
| 12 | */ |
| 13 | |
Neels Hofmeyr | 17518fe | 2017-06-20 04:35:06 +0200 | [diff] [blame] | 14 | #pragma once |
| 15 | |
Holger Hans Peter Freyther | 249a81b | 2015-03-22 09:03:42 +0100 | [diff] [blame] | 16 | #if defined(__FreeBSD__) |
| 17 | #include <sys/endian.h> |
| 18 | #if BYTE_ORDER == LITTLE_ENDIAN |
| 19 | #define OSMO_IS_LITTLE_ENDIAN 1 |
| 20 | #define OSMO_IS_BIG_ENDIAN 0 |
| 21 | #elif BYTE_ORDER == BIG_ENDIAN |
| 22 | #define OSMO_IS_LITTLE_ENDIAN 0 |
| 23 | #define OSMO_IS_BIG_ENDIAN 1 |
| 24 | #else |
| 25 | #error "Unknown endian" |
| 26 | #endif |
Arran Cudbard-Bell | cc3694b | 2016-05-18 16:02:19 -0400 | [diff] [blame] | 27 | #elif defined(__APPLE__) |
| 28 | #include <machine/endian.h> |
| 29 | #if defined(__DARWIN_LITTLE_ENDIAN) |
| 30 | #define OSMO_IS_LITTLE_ENDIAN 1 |
| 31 | #define OSMO_IS_BIG_ENDIAN 0 |
Beshr Al Nahas | e4c294f | 2016-05-28 14:21:13 +0200 | [diff] [blame] | 32 | #elif defined(__DARWIN_BIG_ENDIAN) |
Arran Cudbard-Bell | cc3694b | 2016-05-18 16:02:19 -0400 | [diff] [blame] | 33 | #define OSMO_IS_LITTLE_ENDIAN 0 |
| 34 | #define OSMO_IS_BIG_ENDIAN 1 |
| 35 | #else |
| 36 | #error "Unknown endian" |
| 37 | #endif |
Harald Welte | 054667f | 2017-05-15 11:44:39 +0200 | [diff] [blame] | 38 | #elif defined(__linux__) |
Holger Hans Peter Freyther | 249a81b | 2015-03-22 09:03:42 +0100 | [diff] [blame] | 39 | #include <endian.h> |
| 40 | #if __BYTE_ORDER == __LITTLE_ENDIAN |
| 41 | #define OSMO_IS_LITTLE_ENDIAN 1 |
| 42 | #define OSMO_IS_BIG_ENDIAN 0 |
| 43 | #elif __BYTE_ORDER == __BIG_ENDIAN |
| 44 | #define OSMO_IS_LITTLE_ENDIAN 0 |
| 45 | #define OSMO_IS_BIG_ENDIAN 1 |
| 46 | #else |
| 47 | #error "Unknown endian" |
| 48 | #endif |
Harald Welte | 054667f | 2017-05-15 11:44:39 +0200 | [diff] [blame] | 49 | #else |
| 50 | /* let's try to rely on the compiler. GCC and CLANG/LLVM seem |
| 51 | * to support this ... */ |
| 52 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| 53 | #define OSMO_IS_LITTLE_ENDIAN 1 |
| 54 | #define OSMO_IS_BIG_ENDIAN 0 |
| 55 | #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
| 56 | #define OSMO_IS_LITTLE_ENDIAN 0 |
| 57 | #define OSMO_IS_BIG_ENDIAN 1 |
| 58 | #else |
| 59 | #error "Unknown endian" |
| 60 | #endif |
Holger Hans Peter Freyther | 249a81b | 2015-03-22 09:03:42 +0100 | [diff] [blame] | 61 | #endif |
| 62 | |