src/core/endian_func.hpp
author rubidium
Sun, 25 May 2008 19:17:03 +0000
changeset 9354 845e07db4549
parent 9111 48ce04029fe4
child 9543 a60fb4bacc66
permissions -rw-r--r--
(svn r13251) -Codechange: rename _patches to _settings as that is more logic.
-Codechange: move all Settings into substructs of _settings in a way that they are logically grouped.
8113
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
     1
/* $Id$ */
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
     2
9111
48ce04029fe4 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 8135
diff changeset
     3
/** @file endian_func.hpp Function to handling different endian machines. */
8113
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
     4
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
     5
#ifndef ENDIAN_FUNC_H
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
     6
#define ENDIAN_FUNC_H
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
     7
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
     8
#include "bitmath_func.hpp"
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
     9
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    10
#if defined(ARM) || defined(__arm__) || defined(__alpha__)
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    11
	#define OTTD_ALIGNMENT
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    12
#endif
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    13
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    14
/* Windows has always LITTLE_ENDIAN */
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    15
#if defined(WIN32) || defined(__OS2__) || defined(WIN64)
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    16
	#define TTD_LITTLE_ENDIAN
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    17
#elif !defined(TESTING)
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    18
	/* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    19
	#if defined(STRGEN)
8135
2373c1e0e9bc (svn r11697) -Fix [FS#1585]: strgen did not (always) compile properly.
rubidium
parents: 8133
diff changeset
    20
		#include "endian_host.h"
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    21
	#else
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    22
		#include "endian_target.h"
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    23
	#endif
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    24
#endif /* WIN32 || __OS2__ || WIN64 */
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    25
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    26
/* Setup alignment and conversion macros */
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    27
#if defined(TTD_BIG_ENDIAN)
8133
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    28
	#define FROM_BE16(x) (x)
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    29
	#define FROM_BE32(x) (x)
8133
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    30
	#define TO_BE16(x)   (x)
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    31
	#define TO_BE32(x)   (x)
8133
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    32
	#define TO_BE32X(x)  (x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    33
	#define FROM_LE16(x) BSWAP16(x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    34
	#define FROM_LE32(x) BSWAP32(x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    35
	#define TO_LE16(x)   BSWAP16(x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    36
	#define TO_LE32(x)   BSWAP32(x)
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    37
	#define TO_LE32X(x)  BSWAP32(x)
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    38
#else
8133
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    39
	#define FROM_BE16(x) BSWAP16(x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    40
	#define FROM_BE32(x) BSWAP32(x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    41
	#define TO_BE16(x)   BSWAP16(x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    42
	#define TO_BE32(x)   BSWAP32(x)
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    43
	#define TO_BE32X(x)  BSWAP32(x)
8133
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    44
	#define FROM_LE16(x) (x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    45
	#define FROM_LE32(x) (x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    46
	#define TO_LE16(x)   (x)
3ab8eaf85ca0 (svn r11695) -Codechange: Converted the md5 algorithm to OOP
skidd13
parents: 8132
diff changeset
    47
	#define TO_LE32(x)   (x)
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    48
	#define TO_LE32X(x)  (x)
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    49
#endif /* TTD_BIG_ENDIAN */
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    50
8113
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    51
static inline uint16 ReadLE16Aligned(const void *x)
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    52
{
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    53
	return FROM_LE16(*(const uint16*)x);
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    54
}
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    55
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    56
static inline uint16 ReadLE16Unaligned(const void *x)
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    57
{
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    58
#ifdef OTTD_ALIGNMENT
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    59
	return ((const byte*)x)[0] | ((const byte*)x)[1] << 8;
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    60
#else
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    61
	return FROM_LE16(*(const uint16*)x);
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    62
#endif
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    63
}
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
diff changeset
    64
8132
f4c7a8e4f25a (svn r11694) -Codechange: move more endianness related stuff to endian_func.hpp.
rubidium
parents: 8113
diff changeset
    65
#endif /* ENDIAN_FUNC_HPP */