ccRTP 2.1.2
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
brg_endian.h
Go to the documentation of this file.
1 /*
2  ---------------------------------------------------------------------------
3  Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. All rights reserved.
4 
5  LICENSE TERMS
6 
7  The free distribution and use of this software in both source and binary
8  form is allowed (with or without changes) provided that:
9 
10  1. distributions of this source code include the above copyright
11  notice, this list of conditions and the following disclaimer;
12 
13  2. distributions in binary form include the above copyright
14  notice, this list of conditions and the following disclaimer
15  in the documentation and/or other associated materials;
16 
17  3. the copyright holder's name is not used to endorse products
18  built using this software without specific written permission.
19 
20  ALTERNATIVELY, provided that this notice is retained in full, this product
21  may be distributed under the terms of the GNU General Public License (GPL),
22  in which case the provisions of the GPL apply INSTEAD OF those given above.
23 
24  DISCLAIMER
25 
26  This software is provided 'as is' with no explicit or implied warranties
27  in respect of its properties, including, but not limited to, correctness
28  and/or fitness for purpose.
29  ---------------------------------------------------------------------------
30  Issue 20/10/2006
31 */
32 
33 #ifndef BRG_ENDIAN_H
34 #define BRG_ENDIAN_H
35 
36 #define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */
37 #define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */
38 
39 /* Include files where endian defines and byteswap functions may reside */
40 #if defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )
41 # include <sys/endian.h>
42 #elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \
43  defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
44 # include <machine/endian.h>
45 #elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
46 # if !defined( __MINGW32__ ) && !defined(AVR)
47 # include <endian.h>
48 # if !defined( __BEOS__ )
49 # include <byteswap.h>
50 # endif
51 # endif
52 #endif
53 
54 /* Now attempt to set the define for platform byte order using any */
55 /* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */
56 /* seem to encompass most endian symbol definitions */
57 
58 #if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )
59 # if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN
60 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
61 # elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN
62 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
63 # endif
64 #elif defined( BIG_ENDIAN )
65 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
66 #elif defined( LITTLE_ENDIAN )
67 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
68 #endif
69 
70 #if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )
71 # if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN
72 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
73 # elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN
74 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
75 # endif
76 #elif defined( _BIG_ENDIAN )
77 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
78 #elif defined( _LITTLE_ENDIAN )
79 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
80 #endif
81 
82 #if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )
83 # if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN
84 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
85 # elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN
86 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
87 # endif
88 #elif defined( __BIG_ENDIAN )
89 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
90 #elif defined( __LITTLE_ENDIAN )
91 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
92 #endif
93 
94 #if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )
95 # if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__
96 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
97 # elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__
98 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
99 # endif
100 #elif defined( __BIG_ENDIAN__ )
101 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
102 #elif defined( __LITTLE_ENDIAN__ )
103 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
104 #endif
105 
106 /* if the platform byte order could not be determined, then try to */
107 /* set this define using common machine defines */
108 #if !defined(PLATFORM_BYTE_ORDER)
109 
110 #if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \
111  defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \
112  defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \
113  defined( vax ) || defined( vms ) || defined( VMS ) || \
114  defined( __VMS ) || defined( _M_X64 ) || defined( AVR )
115 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
116 
117 #elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \
118  defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \
119  defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \
120  defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \
121  defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \
122  defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \
123  defined( THINK_C ) || defined( __VMCMS__ )
124 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
125 
126 #elif 0 /* **** EDIT HERE IF NECESSARY **** */
127 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
128 #elif 0 /* **** EDIT HERE IF NECESSARY **** */
129 # define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
130 #else
131 # error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order
132 #endif
133 #endif
134 
135 /* special handler for IA64, which may be either endianness (?) */
136 /* here we assume little-endian, but this may need to be changed */
137 #if defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
138 # define PLATFORM_MUST_ALIGN (1)
139 #ifndef PLATFORM_BYTE_ORDER
140 # define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
141 #endif
142 #endif
143 
144 #ifndef PLATFORM_MUST_ALIGN
145 # define PLATFORM_MUST_ALIGN (0)
146 #endif
147 
148 #endif /* ifndef BRG_ENDIAN_H */