rubidium@8113: /* $Id$ */ rubidium@8113: rubidium@9111: /** @file endian_func.hpp Function to handling different endian machines. */ rubidium@8113: rubidium@8113: #ifndef ENDIAN_FUNC_H rubidium@8113: #define ENDIAN_FUNC_H rubidium@8113: rubidium@8132: #include "bitmath_func.hpp" rubidium@8132: rubidium@8132: #if defined(ARM) || defined(__arm__) || defined(__alpha__) rubidium@8132: #define OTTD_ALIGNMENT rubidium@8132: #endif rubidium@8132: rubidium@8132: /* Windows has always LITTLE_ENDIAN */ rubidium@8132: #if defined(WIN32) || defined(__OS2__) || defined(WIN64) rubidium@8132: #define TTD_LITTLE_ENDIAN rubidium@8132: #elif !defined(TESTING) rubidium@8132: /* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */ rubidium@8132: #if defined(STRGEN) rubidium@8135: #include "endian_host.h" rubidium@8132: #else rubidium@8132: #include "endian_target.h" rubidium@8132: #endif rubidium@8132: #endif /* WIN32 || __OS2__ || WIN64 */ rubidium@8132: rubidium@8132: /* Setup alignment and conversion macros */ rubidium@8132: #if defined(TTD_BIG_ENDIAN) skidd13@8133: #define FROM_BE16(x) (x) rubidium@8132: #define FROM_BE32(x) (x) skidd13@8133: #define TO_BE16(x) (x) rubidium@8132: #define TO_BE32(x) (x) skidd13@8133: #define TO_BE32X(x) (x) skidd13@8133: #define FROM_LE16(x) BSWAP16(x) skidd13@8133: #define FROM_LE32(x) BSWAP32(x) skidd13@8133: #define TO_LE16(x) BSWAP16(x) skidd13@8133: #define TO_LE32(x) BSWAP32(x) rubidium@8132: #define TO_LE32X(x) BSWAP32(x) rubidium@8132: #else skidd13@8133: #define FROM_BE16(x) BSWAP16(x) skidd13@8133: #define FROM_BE32(x) BSWAP32(x) skidd13@8133: #define TO_BE16(x) BSWAP16(x) skidd13@8133: #define TO_BE32(x) BSWAP32(x) rubidium@8132: #define TO_BE32X(x) BSWAP32(x) skidd13@8133: #define FROM_LE16(x) (x) skidd13@8133: #define FROM_LE32(x) (x) skidd13@8133: #define TO_LE16(x) (x) skidd13@8133: #define TO_LE32(x) (x) rubidium@8132: #define TO_LE32X(x) (x) rubidium@8132: #endif /* TTD_BIG_ENDIAN */ rubidium@8132: rubidium@8113: static inline uint16 ReadLE16Aligned(const void *x) rubidium@8113: { rubidium@8113: return FROM_LE16(*(const uint16*)x); rubidium@8113: } rubidium@8113: rubidium@8113: static inline uint16 ReadLE16Unaligned(const void *x) rubidium@8113: { rubidium@8113: #ifdef OTTD_ALIGNMENT rubidium@8113: return ((const byte*)x)[0] | ((const byte*)x)[1] << 8; rubidium@8113: #else rubidium@8113: return FROM_LE16(*(const uint16*)x); rubidium@8113: #endif rubidium@8113: } rubidium@8113: rubidium@8132: #endif /* ENDIAN_FUNC_HPP */