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