xref: /AOO41X/main/sal/inc/osl/endian.h (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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