Rename C++ header files to .hpp
[lttng-tools.git] / src / common / compat / endian.hpp
1 /*
2 * Copyright (C) 2011 David Goulet <dgoulet@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
8 /*
9 * This compat header provides the following defines:
10 *
11 * LITTLE_ENDIAN
12 * BIG_ENDIAN
13 * BYTE_ORDER
14 *
15 * And functions / macros :
16 *
17 * bswap_16()
18 * bswap_32()
19 * bswap_64()
20 *
21 * htobe16()
22 * htole16()
23 * be16toh()
24 * le16toh()
25 *
26 * htobe32()
27 * htole32()
28 * be32toh()
29 * le32toh()
30 *
31 * htobe64()
32 * htole64()
33 * be64toh()
34 * le64toh()
35 */
36
37 #ifndef _COMPAT_ENDIAN_H
38 #define _COMPAT_ENDIAN_H
39
40 #if defined(__linux__) || defined(__CYGWIN__)
41 #include <endian.h>
42 #include <byteswap.h>
43
44 /*
45 * htobe/betoh are not defined for glibc <2.9, so add them
46 * explicitly if they are missing.
47 */
48 #ifdef __USE_BSD
49 /* Conversion interfaces. */
50 # include <byteswap.h>
51
52 # if __BYTE_ORDER == __LITTLE_ENDIAN
53 # ifndef htobe16
54 # define htobe16(x) __bswap_16(x)
55 # endif
56 # ifndef htole16
57 # define htole16(x) (x)
58 # endif
59 # ifndef be16toh
60 # define be16toh(x) __bswap_16(x)
61 # endif
62 # ifndef le16toh
63 # define le16toh(x) (x)
64 # endif
65
66 # ifndef htobe32
67 # define htobe32(x) __bswap_32(x)
68 # endif
69 # ifndef htole32
70 # define htole32(x) (x)
71 # endif
72 # ifndef be32toh
73 # define be32toh(x) __bswap_32(x)
74 # endif
75 # ifndef le32toh
76 # define le32toh(x) (x)
77 # endif
78
79 # ifndef htobe64
80 # define htobe64(x) __bswap_64(x)
81 # endif
82 # ifndef htole64
83 # define htole64(x) (x)
84 # endif
85 # ifndef be64toh
86 # define be64toh(x) __bswap_64(x)
87 # endif
88 # ifndef le64toh
89 # define le64toh(x) (x)
90 # endif
91
92 # else /* __BYTE_ORDER == __LITTLE_ENDIAN */
93 # ifndef htobe16
94 # define htobe16(x) (x)
95 # endif
96 # ifndef htole16
97 # define htole16(x) __bswap_16(x)
98 # endif
99 # ifndef be16toh
100 # define be16toh(x) (x)
101 # endif
102 # ifndef le16toh
103 # define le16toh(x) __bswap_16(x)
104 # endif
105
106 # ifndef htobe32
107 # define htobe32(x) (x)
108 # endif
109 # ifndef htole32
110 # define htole32(x) __bswap_32(x)
111 # endif
112 # ifndef be32toh
113 # define be32toh(x) (x)
114 # endif
115 # ifndef le32toh
116 # define le32toh(x) __bswap_32(x)
117 # endif
118
119 # ifndef htobe64
120 # define htobe64(x) (x)
121 # endif
122 # ifndef htole64
123 # define htole64(x) __bswap_64(x)
124 # endif
125 # ifndef be64toh
126 # define be64toh(x) (x)
127 # endif
128 # ifndef le64toh
129 # define le64toh(x) __bswap_64(x)
130 # endif
131
132 # endif /* __BYTE_ORDER == __LITTLE_ENDIAN */
133 #endif /* __USE_BSD */
134
135 #elif defined(__FreeBSD__)
136 #include <sys/endian.h>
137
138 #define bswap_16(x) bswap16(x)
139 #define bswap_32(x) bswap32(x)
140 #define bswap_64(x) bswap64(x)
141
142 #elif defined(__sun__)
143 #include <sys/byteorder.h>
144 #ifndef __BIG_ENDIAN
145 #define __BIG_ENDIAN 4321
146 #endif /* __BIG_ENDIAN */
147 #ifndef __LITTLE_ENDIAN
148 #define __LITTLE_ENDIAN 1234
149 #endif /* __LITTLE_ENDIAN */
150
151 #ifdef _LITTLE_ENDIAN
152 #define __BYTE_ORDER __LITTLE_ENDIAN
153 #endif /* _LITTLE_ENDIAN */
154 #ifdef _BIG_ENDIAN
155 #define __BYTE_ORDER __BIG_ENDIAN
156 #endif /* _BIG_ENDIAN */
157
158 #define LITTLE_ENDIAN __LITTLE_ENDIAN
159 #define BIG_ENDIAN __BIG_ENDIAN
160 #define BYTE_ORDER __BYTE_ORDER
161
162 #define betoh16(x) BE_16(x)
163 #define letoh16(x) LE_16(x)
164 #define betoh32(x) BE_32(x)
165 #define letoh32(x) LE_32(x)
166 #define betoh64(x) BE_64(x)
167 #define letoh64(x) LE_64(x)
168 #define htobe16(x) BE_16(x)
169 #define be16toh(x) BE_16(x)
170 #define htobe32(x) BE_32(x)
171 #define be32toh(x) BE_32(x)
172 #define htobe64(x) BE_64(x)
173 #define be64toh(x) BE_64(x)
174
175 #elif defined(__APPLE__)
176 # include <machine/endian.h>
177 # include <libkern/OSByteOrder.h>
178
179 # if BYTE_ORDER == LITTLE_ENDIAN
180 # define htobe16(x) OSSwapConstInt16(x)
181 # define htole16(x) (x)
182 # define be16toh(x) OSSwapConstInt16(x)
183 # define le16toh(x) (x)
184
185 # define htobe32(x) OSSwapConstInt32(x)
186 # define htole32(x) (x)
187 # define be32toh(x) OSSwapConstInt32(x)
188 # define le32toh(x) (x)
189
190 # define htobe64(x) OSSwapConstInt64(x)
191 # define htole64(x) (x)
192 # define be64toh(x) OSSwapConstInt64(x)
193 # define le64toh(x) (x)
194
195 # else /* BYTE_ORDER == LITTLE_ENDIAN */
196 # define htobe16(x) (x)
197 # define htole16(x) OSSwapConstInt16(x)
198 # define be16toh(x) (x)
199 # define le16toh(x) OSSwapConstInt16(x)
200
201 # define htobe32(x) (x)
202 # define htole32(x) OSSwapConstInt32(x)
203 # define be32toh(x) (x)
204 # define le32toh(x) OSSwapConstInt32(x)
205
206 # define htobe64(x) (x)
207 # define htole64(x) OSSwapConstInt64(x)
208 # define be64toh(x) (x)
209 # define le64toh(x) OSSwapConstInt64(x)
210 # endif
211
212 #else
213 #error "Please add support for your OS."
214 #endif
215
216 #endif /* _COMPAT_ENDIAN_H */
This page took 0.033049 seconds and 4 git commands to generate.