26 #ifndef MHD_BITHELPERS_H
27 #define MHD_BITHELPERS_H 1
31 #if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
32 defined(__OPTIMIZE__)))
37 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN || _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
44 # define __has_builtin(x) 0
48 #ifdef MHD_HAVE___BUILTIN_BSWAP32
49 #define _MHD_BYTES_SWAP32(value32) \
50 ((uint32_t) __builtin_bswap32 ((uint32_t) value32))
51 #elif defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
52 defined(__OPTIMIZE__)))
55 #pragma intrinsic(_byteswap_ulong)
57 #define _MHD_BYTES_SWAP32(value32) \
58 ((uint32_t) _byteswap_ulong ((uint32_t) value32))
59 #elif __has_builtin (__builtin_bswap32)
60 #define _MHD_BYTES_SWAP32(value32) \
61 ((uint32_t) __builtin_bswap32 ((uint32_t) value32))
63 #define _MHD_BYTES_SWAP32(value32) \
64 ( (((uint32_t) (value32)) << 24) \
65 | ((((uint32_t) (value32)) & ((uint32_t) 0x0000FF00)) << 8) \
66 | ((((uint32_t) (value32)) & ((uint32_t) 0x00FF0000)) >> 8) \
67 | (((uint32_t) (value32)) >> 24) )
70 #ifdef MHD_HAVE___BUILTIN_BSWAP64
71 #define _MHD_BYTES_SWAP64(value64) \
72 ((uint64_t) __builtin_bswap64 ((uint64_t) value64))
73 #elif defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
74 defined(__OPTIMIZE__)))
77 #pragma intrinsic(_byteswap_uint64)
79 #define _MHD_BYTES_SWAP64(value64) \
80 ((uint64_t) _byteswap_uint64 ((uint64_t) value64))
81 #elif __has_builtin (__builtin_bswap64)
82 #define _MHD_BYTES_SWAP64(value64) \
83 ((uint64_t) __builtin_bswap64 ((uint64_t) value64))
85 #define _MHD_BYTES_SWAP64(value64) \
86 ( (((uint64_t) (value64)) << 56) \
87 | ((((uint64_t) (value64)) & ((uint64_t) 0x000000000000FF00)) << 40) \
88 | ((((uint64_t) (value64)) & ((uint64_t) 0x0000000000FF0000)) << 24) \
89 | ((((uint64_t) (value64)) & ((uint64_t) 0x00000000FF000000)) << 8) \
90 | ((((uint64_t) (value64)) & ((uint64_t) 0x000000FF00000000)) >> 8) \
91 | ((((uint64_t) (value64)) & ((uint64_t) 0x0000FF0000000000)) >> 24) \
92 | ((((uint64_t) (value64)) & ((uint64_t) 0x00FF000000000000)) >> 40) \
93 | (((uint64_t) (value64)) >> 56) )
102 #define _MHD_PUT_64BIT_LE_SLOW(addr, value64) do { \
103 ((uint8_t*) (addr))[0] = (uint8_t) ((uint64_t) (value64)); \
104 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 8); \
105 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 16); \
106 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 24); \
107 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 32); \
108 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 40); \
109 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 48); \
110 ((uint8_t*) (addr))[7] = (uint8_t) (((uint64_t) (value64)) >> 56); \
112 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
113 #define _MHD_PUT_64BIT_LE(addr, value64) \
114 ((*(uint64_t*) (addr)) = (uint64_t) (value64))
115 #elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
116 #define _MHD_PUT_64BIT_LE(addr, value64) \
117 ((*(uint64_t*) (addr)) = _MHD_BYTES_SWAP64 (value64))
120 #define _MHD_PUT_64BIT_LE(addr, value64) do { \
121 ((uint8_t*) (addr))[0] = (uint8_t) ((uint64_t) (value64)); \
122 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 8); \
123 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 16); \
124 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 24); \
125 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 32); \
126 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 40); \
127 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 48); \
128 ((uint8_t*) (addr))[7] = (uint8_t) (((uint64_t) (value64)) >> 56); \
131 #define _MHD_PUT_64BIT_LE_UNALIGNED 1
135 _MHD_static_inline
void
138 #ifndef _MHD_PUT_64BIT_LE_UNALIGNED
151 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
152 #define _MHD_PUT_32BIT_LE(addr,value32) \
153 ((*(uint32_t*) (addr)) = (uint32_t) (value32))
154 #elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
155 #define _MHD_PUT_32BIT_LE(addr, value32) \
156 ((*(uint32_t*) (addr)) = _MHD_BYTES_SWAP32 (value32))
159 #define _MHD_PUT_32BIT_LE(addr, value32) do { \
160 ((uint8_t*) (addr))[0] = (uint8_t) ((uint32_t) (value32)); \
161 ((uint8_t*) (addr))[1] = (uint8_t) (((uint32_t) (value32)) >> 8); \
162 ((uint8_t*) (addr))[2] = (uint8_t) (((uint32_t) (value32)) >> 16); \
163 ((uint8_t*) (addr))[3] = (uint8_t) (((uint32_t) (value32)) >> 24); \
166 #define _MHD_PUT_32BIT_LE_UNALIGNED 1
173 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
174 #define _MHD_GET_32BIT_LE(addr) \
175 (*(const uint32_t*) (addr))
176 #elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
177 #define _MHD_GET_32BIT_LE(addr) \
178 _MHD_BYTES_SWAP32 (*(const uint32_t*) (addr))
181 #define _MHD_GET_32BIT_LE(addr) \
182 ( ( (uint32_t) (((const uint8_t*) addr)[0])) \
183 | (((uint32_t) (((const uint8_t*) addr)[1])) << 8) \
184 | (((uint32_t) (((const uint8_t*) addr)[2])) << 16) \
185 | (((uint32_t) (((const uint8_t*) addr)[3])) << 24) )
187 #define _MHD_GET_32BIT_LE_UNALIGNED 1
196 #define _MHD_PUT_64BIT_BE_SLOW(addr, value64) do { \
197 ((uint8_t*) (addr))[7] = (uint8_t) ((uint64_t) (value64)); \
198 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 8); \
199 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 16); \
200 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 24); \
201 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 32); \
202 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 40); \
203 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 48); \
204 ((uint8_t*) (addr))[0] = (uint8_t) (((uint64_t) (value64)) >> 56); \
206 #if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
207 #define _MHD_PUT_64BIT_BE(addr, value64) \
208 ((*(uint64_t*) (addr)) = (uint64_t) (value64))
209 #elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
210 #define _MHD_PUT_64BIT_BE(addr, value64) \
211 ((*(uint64_t*) (addr)) = _MHD_BYTES_SWAP64 (value64))
214 #define _MHD_PUT_64BIT_BE(addr, value64) _MHD_PUT_64BIT_BE_SLOW(addr, value64)
216 #define _MHD_PUT_64BIT_BE_UNALIGNED 1
220 _MHD_static_inline
void
223 #ifndef _MHD_PUT_64BIT_BE_UNALIGNED
236 #if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
237 #define _MHD_PUT_32BIT_BE(addr, value32) \
238 ((*(uint32_t*) (addr)) = (uint32_t) (value32))
239 #elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
240 #define _MHD_PUT_32BIT_BE(addr, value32) \
241 ((*(uint32_t*) (addr)) = _MHD_BYTES_SWAP32 (value32))
244 #define _MHD_PUT_32BIT_BE(addr, value32) do { \
245 ((uint8_t*) (addr))[3] = (uint8_t) ((uint32_t) (value32)); \
246 ((uint8_t*) (addr))[2] = (uint8_t) (((uint32_t) (value32)) >> 8); \
247 ((uint8_t*) (addr))[1] = (uint8_t) (((uint32_t) (value32)) >> 16); \
248 ((uint8_t*) (addr))[0] = (uint8_t) (((uint32_t) (value32)) >> 24); \
251 #define _MHD_PUT_32BIT_BE_UNALIGNED 1
258 #if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
259 #define _MHD_GET_32BIT_BE(addr) \
260 (*(const uint32_t*) (addr))
261 #elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
262 #define _MHD_GET_32BIT_BE(addr) \
263 _MHD_BYTES_SWAP32 (*(const uint32_t*) (addr))
266 #define _MHD_GET_32BIT_BE(addr) \
267 ( (((uint32_t) (((const uint8_t*) addr)[0])) << 24) \
268 | (((uint32_t) (((const uint8_t*) addr)[1])) << 16) \
269 | (((uint32_t) (((const uint8_t*) addr)[2])) << 8) \
270 | ((uint32_t) (((const uint8_t*) addr)[3])) )
272 #define _MHD_GET_32BIT_BE_UNALIGNED 1
280 #if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
281 defined(__OPTIMIZE__)))
284 #pragma intrinsic(_rotr)
286 #define _MHD_ROTR32(value32, bits) \
287 ((uint32_t) _rotr ((uint32_t) (value32),(bits)))
288 #elif __has_builtin (__builtin_rotateright32)
289 #define _MHD_ROTR32(value32, bits) \
290 ((uint32_t) __builtin_rotateright32 ((value32), (bits)))
292 _MHD_static_inline uint32_t
297 return (value32 >> bits) | (value32 << (32 - bits));
308 #if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
309 defined(__OPTIMIZE__)))
312 #pragma intrinsic(_rotl)
314 #define _MHD_ROTL32(value32, bits) \
315 ((uint32_t) _rotl ((uint32_t) (value32),(bits)))
316 #elif __has_builtin (__builtin_rotateleft32)
317 #define _MHD_ROTL32(value32, bits) \
318 ((uint32_t) __builtin_rotateleft32 ((value32), (bits)))
320 _MHD_static_inline uint32_t
325 return (value32 << bits) | (value32 >> (32 - bits));
#define _MHD_UINT64_ALIGN
#define _MHD_PUT_64BIT_BE(addr, value64)
#define _MHD_PUT_64BIT_LE_SLOW(addr, value64)
_MHD_static_inline uint32_t _MHD_ROTR32(uint32_t value32, int bits)
_MHD_static_inline void _MHD_PUT_64BIT_BE_SAFE(void *dst, uint64_t value)
#define _MHD_PUT_64BIT_LE(addr, value64)
#define _MHD_PUT_64BIT_BE_SLOW(addr, value64)
_MHD_static_inline uint32_t _MHD_ROTL32(uint32_t value32, int bits)
_MHD_static_inline void _MHD_PUT_64BIT_LE_SAFE(void *dst, uint64_t value)
additional automatic macros for MHD_config.h
macro definitions for host byte order