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 399 # undef __has_builtin #define MHD_DATA_TRUNCATION_RUNTIME_CHECK_RESTORE_
additional automatic macros for MHD_config.h
_MHD_static_inline void _MHD_PUT_64BIT_BE_SAFE(void *dst, uint64_t value)
#define _MHD_UINT64_ALIGN
_MHD_static_inline uint32_t _MHD_ROTR32(uint32_t value32, int bits)
#define _MHD_PUT_64BIT_BE_SLOW(addr, value64)
_MHD_static_inline uint64_t _MHD_ROTR64(uint64_t value64, int bits)
#define MHD_DATA_TRUNCATION_RUNTIME_CHECK_DISABLE_
macro definitions for host byte order
#define _MHD_PUT_64BIT_LE_SLOW(addr, value64)
#define _MHD_PUT_64BIT_BE(addr, value64)
_MHD_static_inline void _MHD_PUT_64BIT_LE_SAFE(void *dst, uint64_t value)
#define _MHD_PUT_64BIT_LE(addr, value64)
_MHD_static_inline uint32_t _MHD_ROTL32(uint32_t value32, int bits)