blob: 6107b12f4a82be5fb18e09aaf9f2914d741b288f [file] [log] [blame]
Piotr Krysik9e2e8352018-02-27 12:16:25 +01001/*! \file endian.h
2 *
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
14#pragma once
15
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
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
32 #elif defined(__DARWIN_BIG_ENDIAN)
33 #define OSMO_IS_LITTLE_ENDIAN 0
34 #define OSMO_IS_BIG_ENDIAN 1
35 #else
36 #error "Unknown endian"
37 #endif
38#elif defined(__linux__)
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
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
61#endif
62