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: 20/12/2007
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 /* Include files where endian defines and byteswap functions may reside */
28 #if defined( __sun )
29 #  include <sys/isa_defs.h>
30 #elif defined( __DragonFly__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )
31 #  include <sys/endian.h>
32 #elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \
33       defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
34 #  include <machine/endian.h>
35 #elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
36 #  if !defined( __MINGW32__ ) && !defined( _AIX )
37 #    include <endian.h>
38 #    if !defined( __BEOS__ )
39 #      include <byteswap.h>
40 #    endif
41 #  endif
42 #endif
43 
44 /* Now attempt to set the define for platform byte order using any  */
45 /* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which  */
46 /* seem to encompass most endian symbol definitions                 */
47 
48 #if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )
49 #  if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN
50 #    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
51 #  elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN
52 #    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
53 #  endif
54 #elif defined( BIG_ENDIAN )
55 #  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
56 #elif defined( LITTLE_ENDIAN )
57 #  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
58 #endif
59 
60 #if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )
61 #  if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN
62 #    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
63 #  elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN
64 #    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
65 #  endif
66 #elif defined( _BIG_ENDIAN )
67 #  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
68 #elif defined( _LITTLE_ENDIAN )
69 #  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
70 #endif
71 
72 #if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )
73 #  if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN
74 #    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
75 #  elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN
76 #    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
77 #  endif
78 #elif defined( __BIG_ENDIAN )
79 #  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
80 #elif defined( __LITTLE_ENDIAN )
81 #  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
82 #endif
83 
84 #if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )
85 #  if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__
86 #    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
87 #  elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__
88 #    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
89 #  endif
90 #elif defined( __BIG_ENDIAN__ )
91 #  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
92 #elif defined( __LITTLE_ENDIAN__ )
93 #  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
94 #endif
95 
96 /*  if the platform byte order could not be determined, then try to */
97 /*  set this define using common machine defines                    */
98 #if !defined(PLATFORM_BYTE_ORDER)
99 
100 #if   defined( __alpha__ ) || defined( __alpha ) || defined( i386 )       || \
101       defined( __i386__ )  || defined( _M_I86 )  || defined( _M_IX86 )    || \
102       defined( __OS2__ )   || defined( sun386 )  || defined( __TURBOC__ ) || \
103       defined( vax )       || defined( vms )     || defined( VMS )        || \
104       defined( __VMS )     || defined( _M_X64 )
105 #  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
106 
107 #elif defined( AMIGA )   || defined( applec )    || defined( __AS400__ )  || \
108       defined( _CRAY )   || defined( __hppa )    || defined( __hp9000 )   || \
109       defined( ibm370 )  || defined( mc68000 )   || defined( m68k )       || \
110       defined( __MRC__ ) || defined( __MVS__ )   || defined( __MWERKS__ ) || \
111       defined( sparc )   || defined( __sparc)    || defined( SYMANTEC_C ) || \
112       defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM )   || \
113       defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX )
114 #  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
115 
116 #elif 0     /* **** EDIT HERE IF NECESSARY **** */
117 #  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
118 #elif 0     /* **** EDIT HERE IF NECESSARY **** */
119 #  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
120 #else
121 #  error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order
122 #endif
123 
124 #endif
125 
126 #endif
127