26 #ifndef MHD_BITHELPERS_H
27 #define MHD_BITHELPERS_H 1
31 #if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
32 defined(__OPTIMIZE__)))
39 # define __has_builtin(x) 0
43 #ifdef MHD_HAVE___BUILTIN_BSWAP32
44 #define _MHD_BYTES_SWAP32(value32) \
45 ((uint32_t) __builtin_bswap32 ((uint32_t) value32))
46 #elif defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
47 defined(__OPTIMIZE__)))
50 #pragma intrinsic(_byteswap_ulong)
52 #define _MHD_BYTES_SWAP32(value32) \
53 ((uint32_t) _byteswap_ulong ((uint32_t) value32))
54 #elif __has_builtin (__builtin_bswap32)
55 #define _MHD_BYTES_SWAP32(value32) \
56 ((uint32_t) __builtin_bswap32 ((uint32_t) value32))
58 #define _MHD_BYTES_SWAP32(value32) \
59 ( (((uint32_t) (value32)) << 24) \
60 | ((((uint32_t) (value32)) & ((uint32_t) 0x0000FF00)) << 8) \
61 | ((((uint32_t) (value32)) & ((uint32_t) 0x00FF0000)) >> 8) \
62 | (((uint32_t) (value32)) >> 24) )
65 #ifdef MHD_HAVE___BUILTIN_BSWAP64
66 #define _MHD_BYTES_SWAP64(value64) \
67 ((uint64_t) __builtin_bswap64 ((uint64_t) value64))
68 #elif defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
69 defined(__OPTIMIZE__)))
72 #pragma intrinsic(_byteswap_uint64)
74 #define _MHD_BYTES_SWAP64(value64) \
75 ((uint64_t) _byteswap_uint64 ((uint64_t) value64))
76 #elif __has_builtin (__builtin_bswap64)
77 #define _MHD_BYTES_SWAP64(value64) \
78 ((uint64_t) __builtin_bswap64 ((uint64_t) value64))
80 #define _MHD_BYTES_SWAP64(value64) \
81 ( (((uint64_t) (value64)) << 56) \
82 | ((((uint64_t) (value64)) & ((uint64_t) 0x000000000000FF00)) << 40) \
83 | ((((uint64_t) (value64)) & ((uint64_t) 0x0000000000FF0000)) << 24) \
84 | ((((uint64_t) (value64)) & ((uint64_t) 0x00000000FF000000)) << 8) \
85 | ((((uint64_t) (value64)) & ((uint64_t) 0x000000FF00000000)) >> 8) \
86 | ((((uint64_t) (value64)) & ((uint64_t) 0x0000FF0000000000)) >> 24) \
87 | ((((uint64_t) (value64)) & ((uint64_t) 0x00FF000000000000)) >> 40) \
88 | (((uint64_t) (value64)) >> 56) )
96 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
97 #define _MHD_PUT_64BIT_LE(addr, value64) \
98 ((*(uint64_t*) (addr)) = (uint64_t) (value64))
99 #elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
100 #define _MHD_PUT_64BIT_LE(addr, value64) \
101 ((*(uint64_t*) (addr)) = _MHD_BYTES_SWAP64 (value64))
104 #define _MHD_PUT_64BIT_LE(addr, value64) do { \
105 ((uint8_t*) (addr))[0] = (uint8_t) ((uint64_t) (value64)); \
106 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 8); \
107 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 16); \
108 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 24); \
109 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 32); \
110 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 40); \
111 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 48); \
112 ((uint8_t*) (addr))[7] = (uint8_t) (((uint64_t) (value64)) >> 56); \
120 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
121 #define _MHD_PUT_32BIT_LE(addr,value32) \
122 ((*(uint32_t*) (addr)) = (uint32_t) (value32))
123 #elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
124 #define _MHD_PUT_32BIT_LE(addr, value32) \
125 ((*(uint32_t*) (addr)) = _MHD_BYTES_SWAP32 (value32))
128 #define _MHD_PUT_32BIT_LE(addr, value32) do { \
129 ((uint8_t*) (addr))[0] = (uint8_t) ((uint32_t) (value32)); \
130 ((uint8_t*) (addr))[1] = (uint8_t) (((uint32_t) (value32)) >> 8); \
131 ((uint8_t*) (addr))[2] = (uint8_t) (((uint32_t) (value32)) >> 16); \
132 ((uint8_t*) (addr))[3] = (uint8_t) (((uint32_t) (value32)) >> 24); \
140 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
141 #define _MHD_GET_32BIT_LE(addr) \
142 (*(const uint32_t*) (addr))
143 #elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
144 #define _MHD_GET_32BIT_LE(addr) \
145 _MHD_BYTES_SWAP32 (*(const uint32_t*) (addr))
148 #define _MHD_GET_32BIT_LE(addr) \
149 ( ( (uint32_t) (((const uint8_t*) addr)[0])) \
150 | (((uint32_t) (((const uint8_t*) addr)[1])) << 8) \
151 | (((uint32_t) (((const uint8_t*) addr)[2])) << 16) \
152 | (((uint32_t) (((const uint8_t*) addr)[3])) << 24) )
160 #if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
161 #define _MHD_PUT_64BIT_BE(addr, value64) \
162 ((*(uint64_t*) (addr)) = (uint64_t) (value64))
163 #elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
164 #define _MHD_PUT_64BIT_BE(addr, value64) \
165 ((*(uint64_t*) (addr)) = _MHD_BYTES_SWAP64 (value64))
168 #define _MHD_PUT_64BIT_BE(addr, value64) do { \
169 ((uint8_t*) (addr))[7] = (uint8_t) ((uint64_t) (value64)); \
170 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 8); \
171 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 16); \
172 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 24); \
173 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 32); \
174 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 40); \
175 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 48); \
176 ((uint8_t*) (addr))[0] = (uint8_t) (((uint64_t) (value64)) >> 56); \
184 #if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
185 #define _MHD_PUT_32BIT_BE(addr, value32) \
186 ((*(uint32_t*) (addr)) = (uint32_t) (value32))
187 #elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
188 #define _MHD_PUT_32BIT_BE(addr, value32) \
189 ((*(uint32_t*) (addr)) = _MHD_BYTES_SWAP32 (value32))
192 #define _MHD_PUT_32BIT_BE(addr, value32) do { \
193 ((uint8_t*) (addr))[3] = (uint8_t) ((uint32_t) (value32)); \
194 ((uint8_t*) (addr))[2] = (uint8_t) (((uint32_t) (value32)) >> 8); \
195 ((uint8_t*) (addr))[1] = (uint8_t) (((uint32_t) (value32)) >> 16); \
196 ((uint8_t*) (addr))[0] = (uint8_t) (((uint32_t) (value32)) >> 24); \
204 #if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
205 #define _MHD_GET_32BIT_BE(addr) \
206 (*(const uint32_t*) (addr))
207 #elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
208 #define _MHD_GET_32BIT_BE(addr) \
209 _MHD_BYTES_SWAP32 (*(const uint32_t*) (addr))
212 #define _MHD_GET_32BIT_BE(addr) \
213 ( (((uint32_t) (((const uint8_t*) addr)[0])) << 24) \
214 | (((uint32_t) (((const uint8_t*) addr)[1])) << 16) \
215 | (((uint32_t) (((const uint8_t*) addr)[2])) << 8) \
216 | ((uint32_t) (((const uint8_t*) addr)[3])) )
224 #if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
225 defined(__OPTIMIZE__)))
228 #pragma intrinsic(_rotr)
230 #define _MHD_ROTR32(value32, bits) \
231 ((uint32_t) _rotr ((uint32_t) (value32),(bits)))
234 #define _MHD_ROTR32(value32, bits) \
235 (((uint32_t) (value32)) >> (bits) | ((uint32_t) (value32)) << (32 - bits))
macro definitions for host byte order