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
45# define _MHD_has_builtin_dummy 1
50#ifdef MHD_HAVE___BUILTIN_BSWAP32
51#define _MHD_BYTES_SWAP32(value32) \
52 ((uint32_t) __builtin_bswap32 ((uint32_t) value32))
53#elif defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
54 defined(__OPTIMIZE__)))
57#pragma intrinsic(_byteswap_ulong)
59#define _MHD_BYTES_SWAP32(value32) \
60 ((uint32_t) _byteswap_ulong ((uint32_t) value32))
62 __has_builtin (__builtin_bswap32)
63#define _MHD_BYTES_SWAP32(value32) \
64 ((uint32_t) __builtin_bswap32 ((uint32_t) value32))
66#define _MHD_BYTES_SWAP32(value32) \
67 ( (((uint32_t) (value32)) << 24) \
68 | ((((uint32_t) (value32)) & ((uint32_t) 0x0000FF00)) << 8) \
69 | ((((uint32_t) (value32)) & ((uint32_t) 0x00FF0000)) >> 8) \
70 | (((uint32_t) (value32)) >> 24) )
73#ifdef MHD_HAVE___BUILTIN_BSWAP64
74#define _MHD_BYTES_SWAP64(value64) \
75 ((uint64_t) __builtin_bswap64 ((uint64_t) value64))
76#elif defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
77 defined(__OPTIMIZE__)))
80#pragma intrinsic(_byteswap_uint64)
82#define _MHD_BYTES_SWAP64(value64) \
83 ((uint64_t) _byteswap_uint64 ((uint64_t) value64))
85 __has_builtin (__builtin_bswap64)
86#define _MHD_BYTES_SWAP64(value64) \
87 ((uint64_t) __builtin_bswap64 ((uint64_t) value64))
89#define _MHD_BYTES_SWAP64(value64) \
90 ( (((uint64_t) (value64)) << 56) \
91 | ((((uint64_t) (value64)) & ((uint64_t) 0x000000000000FF00)) << 40) \
92 | ((((uint64_t) (value64)) & ((uint64_t) 0x0000000000FF0000)) << 24) \
93 | ((((uint64_t) (value64)) & ((uint64_t) 0x00000000FF000000)) << 8) \
94 | ((((uint64_t) (value64)) & ((uint64_t) 0x000000FF00000000)) >> 8) \
95 | ((((uint64_t) (value64)) & ((uint64_t) 0x0000FF0000000000)) >> 24) \
96 | ((((uint64_t) (value64)) & ((uint64_t) 0x00FF000000000000)) >> 40) \
97 | (((uint64_t) (value64)) >> 56) )
106#define _MHD_PUT_64BIT_LE_SLOW(addr, value64) do { \
107 ((uint8_t*) (addr))[0] = (uint8_t) ((uint64_t) (value64)); \
108 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 8); \
109 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 16); \
110 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 24); \
111 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 32); \
112 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 40); \
113 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 48); \
114 ((uint8_t*) (addr))[7] = (uint8_t) (((uint64_t) (value64)) >> 56); \
116#if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
117#define _MHD_PUT_64BIT_LE(addr, value64) \
118 ((*(uint64_t*) (addr)) = (uint64_t) (value64))
119#elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
120#define _MHD_PUT_64BIT_LE(addr, value64) \
121 ((*(uint64_t*) (addr)) = _MHD_BYTES_SWAP64 (value64))
124#define _MHD_PUT_64BIT_LE(addr, value64) do { \
125 ((uint8_t*) (addr))[0] = (uint8_t) ((uint64_t) (value64)); \
126 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 8); \
127 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 16); \
128 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 24); \
129 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 32); \
130 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 40); \
131 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 48); \
132 ((uint8_t*) (addr))[7] = (uint8_t) (((uint64_t) (value64)) >> 56); \
135#define _MHD_PUT_64BIT_LE_UNALIGNED 1
139_MHD_static_inline
void
142#ifndef _MHD_PUT_64BIT_LE_UNALIGNED
155#if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
156#define _MHD_PUT_32BIT_LE(addr,value32) \
157 ((*(uint32_t*) (addr)) = (uint32_t) (value32))
158#elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
159#define _MHD_PUT_32BIT_LE(addr, value32) \
160 ((*(uint32_t*) (addr)) = _MHD_BYTES_SWAP32 (value32))
163#define _MHD_PUT_32BIT_LE(addr, value32) do { \
164 ((uint8_t*) (addr))[0] = (uint8_t) ((uint32_t) (value32)); \
165 ((uint8_t*) (addr))[1] = (uint8_t) (((uint32_t) (value32)) >> 8); \
166 ((uint8_t*) (addr))[2] = (uint8_t) (((uint32_t) (value32)) >> 16); \
167 ((uint8_t*) (addr))[3] = (uint8_t) (((uint32_t) (value32)) >> 24); \
170#define _MHD_PUT_32BIT_LE_UNALIGNED 1
177#if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
178#define _MHD_GET_32BIT_LE(addr) \
179 (*(const uint32_t*) (addr))
180#elif _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
181#define _MHD_GET_32BIT_LE(addr) \
182 _MHD_BYTES_SWAP32 (*(const uint32_t*) (addr))
185#define _MHD_GET_32BIT_LE(addr) \
186 ( ( (uint32_t) (((const uint8_t*) addr)[0])) \
187 | (((uint32_t) (((const uint8_t*) addr)[1])) << 8) \
188 | (((uint32_t) (((const uint8_t*) addr)[2])) << 16) \
189 | (((uint32_t) (((const uint8_t*) addr)[3])) << 24) )
191#define _MHD_GET_32BIT_LE_UNALIGNED 1
200#define _MHD_PUT_64BIT_BE_SLOW(addr, value64) do { \
201 ((uint8_t*) (addr))[7] = (uint8_t) ((uint64_t) (value64)); \
202 ((uint8_t*) (addr))[6] = (uint8_t) (((uint64_t) (value64)) >> 8); \
203 ((uint8_t*) (addr))[5] = (uint8_t) (((uint64_t) (value64)) >> 16); \
204 ((uint8_t*) (addr))[4] = (uint8_t) (((uint64_t) (value64)) >> 24); \
205 ((uint8_t*) (addr))[3] = (uint8_t) (((uint64_t) (value64)) >> 32); \
206 ((uint8_t*) (addr))[2] = (uint8_t) (((uint64_t) (value64)) >> 40); \
207 ((uint8_t*) (addr))[1] = (uint8_t) (((uint64_t) (value64)) >> 48); \
208 ((uint8_t*) (addr))[0] = (uint8_t) (((uint64_t) (value64)) >> 56); \
210#if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
211#define _MHD_PUT_64BIT_BE(addr, value64) \
212 ((*(uint64_t*) (addr)) = (uint64_t) (value64))
213#elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
214#define _MHD_PUT_64BIT_BE(addr, value64) \
215 ((*(uint64_t*) (addr)) = _MHD_BYTES_SWAP64 (value64))
218#define _MHD_PUT_64BIT_BE(addr, value64) _MHD_PUT_64BIT_BE_SLOW(addr, value64)
220#define _MHD_PUT_64BIT_BE_UNALIGNED 1
224_MHD_static_inline
void
227#ifndef _MHD_PUT_64BIT_BE_UNALIGNED
239#if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
240#define _MHD_GET_64BIT_BE(addr) \
241 (*(const uint64_t*) (addr))
242#elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
243#define _MHD_GET_64BIT_BE(addr) \
244 _MHD_BYTES_SWAP64 (*(const uint64_t*) (addr))
247#define _MHD_GET_64BIT_BE(addr) \
248 ( (((uint64_t) (((const uint8_t*) addr)[0])) << 56) \
249 | (((uint64_t) (((const uint8_t*) addr)[1])) << 48) \
250 | (((uint64_t) (((const uint8_t*) addr)[2])) << 40) \
251 | (((uint64_t) (((const uint8_t*) addr)[3])) << 32) \
252 | (((uint64_t) (((const uint8_t*) addr)[4])) << 24) \
253 | (((uint64_t) (((const uint8_t*) addr)[5])) << 16) \
254 | (((uint64_t) (((const uint8_t*) addr)[6])) << 8) \
255 | ((uint64_t) (((const uint8_t*) addr)[7])) )
257#define _MHD_GET_64BIT_BE_ALLOW_UNALIGNED 1
265#if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
266#define _MHD_PUT_32BIT_BE(addr, value32) \
267 ((*(uint32_t*) (addr)) = (uint32_t) (value32))
268#elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
269#define _MHD_PUT_32BIT_BE(addr, value32) \
270 ((*(uint32_t*) (addr)) = _MHD_BYTES_SWAP32 (value32))
273#define _MHD_PUT_32BIT_BE(addr, value32) do { \
274 ((uint8_t*) (addr))[3] = (uint8_t) ((uint32_t) (value32)); \
275 ((uint8_t*) (addr))[2] = (uint8_t) (((uint32_t) (value32)) >> 8); \
276 ((uint8_t*) (addr))[1] = (uint8_t) (((uint32_t) (value32)) >> 16); \
277 ((uint8_t*) (addr))[0] = (uint8_t) (((uint32_t) (value32)) >> 24); \
280#define _MHD_PUT_32BIT_BE_UNALIGNED 1
287#if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
288#define _MHD_GET_32BIT_BE(addr) \
289 (*(const uint32_t*) (addr))
290#elif _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
291#define _MHD_GET_32BIT_BE(addr) \
292 _MHD_BYTES_SWAP32 (*(const uint32_t*) (addr))
295#define _MHD_GET_32BIT_BE(addr) \
296 ( (((uint32_t) (((const uint8_t*) addr)[0])) << 24) \
297 | (((uint32_t) (((const uint8_t*) addr)[1])) << 16) \
298 | (((uint32_t) (((const uint8_t*) addr)[2])) << 8) \
299 | ((uint32_t) (((const uint8_t*) addr)[3])) )
301#define _MHD_GET_32BIT_BE_UNALIGNED 1
309#if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
310 defined(__OPTIMIZE__)))
313#pragma intrinsic(_rotr)
315#define _MHD_ROTR32(value32, bits) \
316 ((uint32_t) _rotr ((uint32_t) (value32),(bits)))
317#elif __has_builtin (__builtin_rotateright32)
318#define _MHD_ROTR32(value32, bits) \
319 ((uint32_t) __builtin_rotateright32 ((value32), (bits)))
321_MHD_static_inline uint32_t
328 return (value32 >> bits) | (value32 << (32 - bits));
339#if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
340 defined(__OPTIMIZE__)))
343#pragma intrinsic(_rotl)
345#define _MHD_ROTL32(value32, bits) \
346 ((uint32_t) _rotl ((uint32_t) (value32),(bits)))
347#elif __has_builtin (__builtin_rotateleft32)
348#define _MHD_ROTL32(value32, bits) \
349 ((uint32_t) __builtin_rotateleft32 ((value32), (bits)))
351_MHD_static_inline uint32_t
358 return (value32 << bits) | (value32 >> (32 - bits));
369#if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
370 defined(__OPTIMIZE__)))
373#pragma intrinsic(_rotr64)
375#define _MHD_ROTR64(value64, bits) \
376 ((uint64_t) _rotr64 ((uint64_t) (value64),(bits)))
377#elif __has_builtin (__builtin_rotateright64)
378#define _MHD_ROTR64(value64, bits) \
379 ((uint64_t) __builtin_rotateright64 ((value64), (bits)))
381_MHD_static_inline uint64_t
388 return (value64 >> bits) | (value64 << (64 - bits));
396#ifdef _MHD_has_builtin_dummy
#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 uint64_t _MHD_ROTR64(uint64_t value64, int bits)
_MHD_static_inline void _MHD_PUT_64BIT_LE_SAFE(void *dst, uint64_t value)
macro definitions for host byte order
additional automatic macros for MHD_config.h
#define MHD_DATA_TRUNCATION_RUNTIME_CHECK_DISABLE_
#define MHD_DATA_TRUNCATION_RUNTIME_CHECK_RESTORE_