User:Monster Iestyn/Source Code Documentation/endian.h
Appearance
| Online link | GitHub entry |
|---|---|
| File type | C header file |
| #include guard | __ENDIAN__
|
This header file detects the endianness of the processor that SRB2 is compiled with, and defines the appropriate macro for it (see below). Other files in SRB2's source code that include endian.h can then use these macros to determine whether to compile big-endian or little-endian specific code. (However, this is only done in m_swap.h and md5.h as of the latest release of SRB2.)
Includes
<sys/endian.h>: FreeBSD only
Macros
| Macro | Description |
|---|---|
SRB2_LITTLE_ENDIAN
|
Defined if Little-endian; undefined otherwise |
SRB2_BIG_ENDIAN
|
Defined if Big-endian; undefined otherwise |
Example usage:
#if SRB2_BIG_ENDIAN
// Big-endian specific code
#else
// Little-endian specific code
#endif
Detection
In order to define either of the two endianness macros, endian.h has to detect the endianness of the processor itself. The method of endianness detection used depends on the operating system or compiler used when compiling SRB2:
- On FreeBSD, the value of the macro
_BYTE_ORDERis checked – here,_BIG_ENDIANand_LITTLE_ENDIANare constants to compare_BYTE_ORDERto, rather than flags._BYTE_ORDER == _BIG_ENDIAN→SRB2_BIG_ENDIANis defined_BYTE_ORDER != _BIG_ENDIAN→SRB2_LITTLE_ENDIANis defined
- If the macro
__BYTE_ORDER__is defined, the value of it is checked – in particular, this macro is provided by compilers such as GCC (from GCC 4.6 onwards) or Clang. Possible values for this macro are:__ORDER_LITTLE_ENDIAN__,__ORDER_BIG_ENDIAN__or__ORDER_PDP_ENDIAN__[1].__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__→SRB2_BIG_ENDIANis defined__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__→SRB2_LITTLE_ENDIANis defined
- Otherwise, if the two cases above do not apply, the compiler checks if
_BIG_ENDIANis defined or not:_BIG_ENDIANis defined →SRB2_BIG_ENDIANis defined_BIG_ENDIANis not defined →SRB2_LITTLE_ENDIANis defined