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:
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.