endian: Be able to detect endian on GNU and BSD

On GNU __BYTE_ORDER and __LITTLE_ENDIAN is defined and
the include is "endian.h" on FreeBSD it is "sys/endian.h"
and LITTLE_ENDIAN/_LITTLE_ENDIAN and BYTE_ORDER/_BYTE_ORDER
is defined.

Create a header file that defines OSMO_IS_LITTLE_ENDIAN
and OSMO_IS_BIG_ENDIAN and can be used as

 #if OSMO_IS_LITTLE_ENDIAN
   do_little_endian
 #elif OSMO_IS_BIG_ENDIAN
   do_big_endian
 #else
   #error "Unknown endian"
 #endif
This commit is contained in:
Holger Hans Peter Freyther 2015-03-22 09:03:42 +01:00
parent 789334640f
commit 249a81b7ff
2 changed files with 39 additions and 0 deletions

View File

@ -14,6 +14,7 @@ nobase_include_HEADERS = \
osmocom/core/crc64gen.h \
osmocom/core/crc8gen.h \
osmocom/core/crcgen.h \
osmocom/core/endian.h \
osmocom/core/defs.h \
osmocom/core/gsmtap.h \
osmocom/core/gsmtap_util.h \

View File

@ -0,0 +1,38 @@
#pragma once
/**
* GNU and FreeBSD have various ways to express the
* endianess but none of them is similiar enough. This
* will create two defines that allows to decide on the
* endian. The following will be defined to either 0 or
* 1 at the end of the file.
*
* OSMO_IS_LITTLE_ENDIAN
* OSMO_IS_BIG_ENDIAN
*
*/
#if defined(__FreeBSD__)
#include <sys/endian.h>
#if BYTE_ORDER == LITTLE_ENDIAN
#define OSMO_IS_LITTLE_ENDIAN 1
#define OSMO_IS_BIG_ENDIAN 0
#elif BYTE_ORDER == BIG_ENDIAN
#define OSMO_IS_LITTLE_ENDIAN 0
#define OSMO_IS_BIG_ENDIAN 1
#else
#error "Unknown endian"
#endif
#else
#include <endian.h>
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define OSMO_IS_LITTLE_ENDIAN 1
#define OSMO_IS_BIG_ENDIAN 0
#elif __BYTE_ORDER == __BIG_ENDIAN
#define OSMO_IS_LITTLE_ENDIAN 0
#define OSMO_IS_BIG_ENDIAN 1
#else
#error "Unknown endian"
#endif
#endif