xref: /trunk/main/sal/inc/osl/endian.h (revision 9eab2a37)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _OSL_ENDIAN_H_
25 #define _OSL_ENDIAN_H_
26 
27 #include <sal/types.h>
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 /** Determine the platform byte order as _BIG_ENDIAN, _LITTLE_ENDIAN, ...
34  */
35 #ifdef _WIN32
36 #	if defined(_M_IX86)
37 #		define _LITTLE_ENDIAN
38 #	elif defined(_M_MRX000)
39 #		define _LITTLE_ENDIAN
40 #	elif defined(_M_ALPHA)
41 #		define _LITTLE_ENDIAN
42 #	elif defined(_M_PPC)
43 #		define _LITTLE_ENDIAN
44 #	endif
45 #endif
46 
47 #ifdef LINUX
48 #	include <endian.h>
49 #	if __BYTE_ORDER == __LITTLE_ENDIAN
50 #           ifndef _LITTLE_ENDIAN
51 #		define _LITTLE_ENDIAN
52 #           endif
53 #	elif __BYTE_ORDER == __BIG_ENDIAN
54 #           ifndef _BIG_ENDIAN
55 #		define _BIG_ENDIAN
56 #           endif
57 #	elif __BYTE_ORDER == __PDP_ENDIAN
58 #		define _PDP_ENDIAN
59 #	endif
60 #endif
61 
62 #ifdef NETBSD
63 #   include <machine/endian.h>
64 #   if BYTE_ORDER == LITTLE_ENDIAN
65 #   	define _LITTLE_ENDIAN
66 #   elif BYTE_ORDER == BIG_ENDIAN
67 #   	define _BIG_ENDIAN
68 #   elif BYTE_ORDER == PDP_ENDIAN
69 #   	define _PDP_ENDIAN
70 #   endif
71 #endif
72 
73 #ifdef FREEBSD
74 #   include <sys/param.h>
75 #   include <machine/endian.h>
76 #if __FreeBSD_version < 500000
77 #   if BYTE_ORDER == LITTLE_ENDIAN
78 #   	define _LITTLE_ENDIAN
79 #   elif BYTE_ORDER == BIG_ENDIAN
80 #   	define _BIG_ENDIAN
81 #   elif BYTE_ORDER == PDP_ENDIAN
82 #   	define _PDP_ENDIAN
83 #   endif
84 #endif
85 #endif
86 
87 #ifdef SCO
88 #   include <sys/types.h>
89 #   include <sys/byteorder.h>
90 #   if BYTE_ORDER == LITTLE_ENDIAN
91 #   	define _LITTLE_ENDIAN
92 #   elif BYTE_ORDER == BIG_ENDIAN
93 #   	define _BIG_ENDIAN
94 #   elif BYTE_ORDER == PDP_ENDIAN
95 #   	define _PDP_ENDIAN
96 #   endif
97 #endif
98 
99 #ifdef AIX
100 #	include <sys/machine.h>
101 #   if BYTE_ORDER == LITTLE_ENDIAN
102 #   	define _LITTLE_ENDIAN
103 #   elif BYTE_ORDER == BIG_ENDIAN
104 #   	define _BIG_ENDIAN
105 #   elif BYTE_ORDER == PDP_ENDIAN
106 #   	define _PDP_ENDIAN
107 #   endif
108 #endif
109 
110 #ifdef HPUX
111 #	include <machine/param.h>
112 #endif
113 
114 #ifdef _WIN16
115 #	define	_LITTLE_ENDIAN
116 #endif
117 
118 #ifdef OS2
119 #	include <machine/endian.h>
120 #endif
121 
122 #ifdef SOLARIS
123 #	include <sys/isa_defs.h>
124 #endif
125 
126 #ifdef MACOSX
127 #	include <machine/endian.h>
128 #	if BYTE_ORDER == LITTLE_ENDIAN
129 #		ifndef _LITTLE_ENDIAN
130 #		define _LITTLE_ENDIAN
131 #		endif
132 #	elif BYTE_ORDER == BIG_ENDIAN
133 #		ifndef _BIG_ENDIAN
134 #		define _BIG_ENDIAN
135 #		endif
136 #	elif BYTE_ORDER == PDP_ENDIAN
137 #		ifndef _PDP_ENDIAN
138 #		define _PDP_ENDIAN
139 #		endif
140 #	endif
141 #endif
142 
143 /** Check supported platform.
144  */
145 #if !defined(_WIN32)  && !defined(_WIN16) && !defined(OS2)   && \
146     !defined(LINUX)   && !defined(NETBSD) && !defined(SCO)   && \
147 	!defined(AIX)     && !defined(HPUX)   && \
148 	!defined(SOLARIS) && !defined(MACOSX) && !defined(FREEBSD)
149 #	error "Target platform not specified !"
150 #endif
151 
152 
153 /** Define the determined byte order as OSL_BIGENDIAN or OSL_LITENDIAN.
154  */
155 #if defined _LITTLE_ENDIAN
156 #	define OSL_LITENDIAN
157 #elif defined _BIG_ENDIAN
158 #	define OSL_BIGENDIAN
159 #else
160 #	error undetermined endianess
161 #endif
162 
163 
164 /** Define macros for byte order manipulation.
165  */
166 #ifndef OSL_MAKEBYTE
167 #	define OSL_MAKEBYTE(nl, nh)    ((sal_uInt8)(((nl) & 0x0F) | (((nh) & 0x0F) << 4)))
168 #endif
169 #ifndef OSL_LONIBBLE
170 #	define OSL_LONIBBLE(b)         ((sal_uInt8)((b) & 0x0F))
171 #endif
172 #ifndef OSL_HINIBBLE
173 #	define OSL_HINIBBLE(b)         ((sal_uInt8)(((b) >> 4) & 0x0F))
174 #endif
175 
176 #ifndef OSL_MAKEWORD
177 #	define OSL_MAKEWORD(bl, bh)    ((sal_uInt16)((bl) & 0xFF) | (((sal_uInt16)(bh) & 0xFF) << 8))
178 #endif
179 #ifndef OSL_LOBYTE
180 #	define OSL_LOBYTE(w)           ((sal_uInt8)((sal_uInt16)(w) & 0xFF))
181 #endif
182 #ifndef OSL_HIBYTE
183 #	define OSL_HIBYTE(w)           ((sal_uInt8)(((sal_uInt16)(w) >> 8) & 0xFF))
184 #endif
185 
186 #ifndef OSL_MAKEDWORD
187 #	define OSL_MAKEDWORD(wl, wh)   ((sal_uInt32)((wl) & 0xFFFF) | (((sal_uInt32)(wh) & 0xFFFF) << 16))
188 #endif
189 #ifndef OSL_LOWORD
190 #	define OSL_LOWORD(d)           ((sal_uInt16)((sal_uInt32)(d) & 0xFFFF))
191 #endif
192 #ifndef OSL_HIWORD
193 #	define OSL_HIWORD(d)           ((sal_uInt16)(((sal_uInt32)(d) >> 16) & 0xFFFF))
194 #endif
195 
196 
197 /** Define macros for swapping between host and network byte order.
198  */
199 #ifdef OSL_BIGENDIAN
200 #ifndef OSL_NETWORD
201 #	define OSL_NETWORD(w)          (sal_uInt16)(w)
202 #endif
203 #ifndef OSL_NETDWORD
204 #	define OSL_NETDWORD(d)         (sal_uInt32)(d)
205 #endif
206 #else  /* OSL_LITENDIAN */
207 #ifndef OSL_NETWORD
208 #	define OSL_NETWORD(w)          OSL_MAKEWORD(OSL_HIBYTE(w),OSL_LOBYTE(w))
209 #endif
210 #ifndef OSL_NETDWORD
211 #	define OSL_NETDWORD(d)         OSL_MAKEDWORD(OSL_NETWORD(OSL_HIWORD(d)),OSL_NETWORD(OSL_LOWORD(d)))
212 #endif
213 #endif /* OSL_BIGENDIAN */
214 
215 
216 /** Define macros for swapping between byte orders.
217  */
218 #ifndef OSL_SWAPWORD
219 #	define OSL_SWAPWORD(w)         OSL_MAKEWORD(OSL_HIBYTE(w),OSL_LOBYTE(w))
220 #endif
221 #ifndef OSL_SWAPDWORD
222 #	define OSL_SWAPDWORD(d)        OSL_MAKEDWORD(OSL_SWAPWORD(OSL_HIWORD(d)),OSL_SWAPWORD(OSL_LOWORD(d)))
223 #endif
224 
225 
226 #ifdef __cplusplus
227 }
228 #endif
229 
230 #endif /*_OSL_ENDIAN_H_ */
231 
232