aboutsummaryrefslogtreecommitdiff
path: root/src/stage1/zigendian.h
blob: 0a4f6a6ad2c370ae11cebfe827cc6e3ec8fba77a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef ZIG_ENDIAN_H
#define ZIG_ENDIAN_H

// Every OSes seem to define endianness macros in different files.
#if defined(__APPLE__)
  #include <machine/endian.h>
  #define ZIG_BIG_ENDIAN    BIG_ENDIAN
  #define ZIG_LITTLE_ENDIAN LITTLE_ENDIAN
  #define ZIG_BYTE_ORDER    BYTE_ORDER
#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
  #include <sys/endian.h>
  #define ZIG_BIG_ENDIAN    _BIG_ENDIAN
  #define ZIG_LITTLE_ENDIAN _LITTLE_ENDIAN
  #define ZIG_BYTE_ORDER    _BYTE_ORDER
#elif defined(_WIN32) || defined(_WIN64)
  // Assume that Windows installations are always little endian.
  #define ZIG_LITTLE_ENDIAN 1
  #define ZIG_BYTE_ORDER    ZIG_LITTLE_ENDIAN
#else // Linux
  #include <endian.h>
  #define ZIG_BIG_ENDIAN    __BIG_ENDIAN
  #define ZIG_LITTLE_ENDIAN __LITTLE_ENDIAN
  #define ZIG_BYTE_ORDER    __BYTE_ORDER
#endif

#if defined(ZIG_BYTE_ORDER) && ZIG_BYTE_ORDER == ZIG_LITTLE_ENDIAN
  const bool native_is_big_endian = false;
#elif defined(ZIG_BYTE_ORDER) && ZIG_BYTE_ORDER == ZIG_BIG_ENDIAN
  const bool native_is_big_endian = true;
#else
  #error Unsupported endian
#endif

#endif // ZIG_ENDIAN_H