1 /* 2 --------------------------------------------------------------------------- 3 Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. 4 5 The redistribution and use of this software (with or without changes) 6 is allowed without the payment of fees or royalties provided that: 7 8 source code distributions include the above copyright notice, this 9 list of conditions and the following disclaimer; 10 11 binary distributions include the above copyright notice, this list 12 of conditions and the following disclaimer in their documentation. 13 14 This software is provided 'as is' with no explicit or implied warranties 15 in respect of its operation, including, but not limited to, correctness 16 and fitness for purpose. 17 --------------------------------------------------------------------------- 18 Issue Date: 10/09/2018 19 */ 20 21 #ifndef _BRG_ENDIAN_H 22 #define _BRG_ENDIAN_H 23 24 #define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ 25 #define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ 26 27 /* This is needed when using clang with MSVC to avoid including */ 28 /* endian.h and byteswap.h which are not present on Windows */ 29 #if defined( _MSC_VER ) && defined( __clang__ ) 30 # undef __GNUC__ 31 #endif 32 33 /* Include files where endian defines and byteswap functions may reside */ 34 #if defined( __sun ) 35 # include <sys/isa_defs.h> 36 #elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ ) 37 # include <sys/endian.h> 38 #elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \ 39 defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ ) 40 # include <machine/endian.h> 41 #elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ ) 42 # if !defined( __MINGW32__ ) && !defined( _AIX ) 43 # include <endian.h> 44 # if !defined( __BEOS__ ) 45 # include <byteswap.h> 46 # endif 47 # endif 48 #endif 49 50 /* Now attempt to set the define for platform byte order using any */ 51 /* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, ... */ 52 /* which seem to encompass most endian symbol definitions */ 53 54 #if defined( __ORDER_BIG_ENDIAN__ ) && defined( __ORDER_LITTLE_ENDIAN__ ) 55 # if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 56 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 57 # elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 58 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 59 # endif 60 #elif defined( __ORDER_BIG_ENDIAN__ ) 61 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 62 #elif defined( __ORDER_LITTLE_ENDIAN__ ) 63 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 64 #endif 65 66 #if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN ) 67 # if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN 68 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 69 # elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN 70 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 71 # endif 72 #elif defined( BIG_ENDIAN ) 73 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 74 #elif defined( LITTLE_ENDIAN ) 75 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 76 #endif 77 78 #if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN ) 79 # if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN 80 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 81 # elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN 82 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 83 # endif 84 #elif defined( _BIG_ENDIAN ) 85 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 86 #elif defined( _LITTLE_ENDIAN ) 87 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 88 #endif 89 90 #if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN ) 91 # if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN 92 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 93 # elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN 94 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 95 # endif 96 #elif defined( __BIG_ENDIAN ) 97 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 98 #elif defined( __LITTLE_ENDIAN ) 99 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 100 #endif 101 102 #if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ ) 103 # if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__ 104 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 105 # elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__ 106 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 107 # endif 108 #elif defined( __BIG_ENDIAN__ ) 109 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 110 #elif defined( __LITTLE_ENDIAN__ ) 111 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 112 #endif 113 114 /* if the platform byte order could not be determined, then try to */ 115 /* set this define using common machine defines */ 116 #if !defined(PLATFORM_BYTE_ORDER) 117 118 #if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \ 119 defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \ 120 defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \ 121 defined( vax ) || defined( vms ) || defined( VMS ) || \ 122 defined( __VMS ) || defined( _M_X64 ) || defined( _M_ARM64 ) 123 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 124 125 #elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \ 126 defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \ 127 defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \ 128 defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \ 129 defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \ 130 defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \ 131 defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX ) 132 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 133 134 #elif 0 /* **** EDIT HERE IF NECESSARY **** */ 135 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN 136 #elif 0 /* **** EDIT HERE IF NECESSARY **** */ 137 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN 138 #else 139 # error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order 140 #endif 141 142 #endif 143 144 #endif 145