libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 4b834afcd19940420d11d3d609e11c787cf11a4f
parent fa3e0e79b98599bedd42d5a26c7fa23ea06802e3
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Sun,  2 Nov 2025 19:26:14 +0100

mhd_bithelpers.h: added 32bit BE get/put for unaligned addresses

Diffstat:
Msrc/mhd2/mhd_bithelpers.h | 28++++++++++++++++++++++++++++
1 file changed, 28 insertions(+), 0 deletions(-)

diff --git a/src/mhd2/mhd_bithelpers.h b/src/mhd2/mhd_bithelpers.h @@ -464,6 +464,19 @@ mhd_PUT_32BIT_BE(void *addr, uint32_t value32) # define mhd_PUT_32BIT_BE_ALLOW_UNALIGNED 1 #endif /* mhd_BYTE_ORDER != mhd_LITTLE_ENDIAN */ +/* Put result safely to unaligned address */ +#ifdef mhd_PUT_32BIT_BE_ALLOW_UNALIGNED +# define mhd_PUT_32BIT_BE_UNALIGN(addr, value32) \ + mhd_PUT_32BIT_BE ((addr),(value32)) +#else /* ! mhd_PUT_32BIT_BE_ALLOW_UNALIGNED */ +# define mhd_PUT_32BIT_BE_UNALIGN(addr, value32) \ + do { uint32_t mhd__aligned_dst; \ + mhd_PUT_32BIT_BE (&mhd__aligned_dst, (value32)); \ + memcpy ((addr), &mhd__aligned_dst, \ + sizeof(mhd__aligned_dst)); } while (0) +#endif /* ! mhd_PUT_32BIT_BE_ALLOW_UNALIGNED */ + + /* mhd_GET_32BIT_BE (addr) * get big-endian 32-bit value stored at addr * and return it in native-endian mode. @@ -491,6 +504,21 @@ mhd_GET_32BIT_BE(const void *addr) # define mhd_GET_32BIT_BE_ALLOW_UNALIGNED 1 #endif /* mhd_BYTE_ORDER != mhd_LITTLE_ENDIAN */ +#ifdef mhd_GET_32BIT_BE_ALLOW_UNALIGNED +# define mhd_GET_32BIT_BE_UNALIGN(addr) mhd_GET_32BIT_BE ((addr)) +#else /* ! mhd_GET_32BIT_LE_ALLOW_UNALIGNED */ +/* Get value safely from an unaligned address */ +mhd_static_inline MHD_FN_PAR_NONNULL_ALL_ uint32_t +mhd_GET_32BIT_BE_UNALIGN (const void *addr) +{ + uint32_t aligned_src; + memcpy (&aligned_src, + addr, + sizeof(aligned_src)); + return mhd_GET_32BIT_BE (&aligned_src); +} +#endif /* ! mhd_GET_32BIT_BE_ALLOW_UNALIGNED */ + /* mhd_PUT_UINTFAST32_BE(addr, uif32) * Put uint_fast32_t value to the addr in big endian mode.