libmicrohttpd2

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

commit e05e01cbc692753f4e32ad6e2b5cf46baeec58d9
parent 6587b80479098c9ec6c833b6f1b3da2d241ffae7
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Fri, 29 Aug 2025 18:49:32 +0200

mhd_align.h: simplified and improved portability

Diffstat:
Msrc/mhd2/mhd_align.h | 79+++++++++++++++++++++++++++++++++++--------------------------------------------
1 file changed, 35 insertions(+), 44 deletions(-)

diff --git a/src/mhd2/mhd_align.h b/src/mhd2/mhd_align.h @@ -49,61 +49,52 @@ #include "sys_base_types.h" -#include "sys_offsetof.h" - -#ifdef HAVE_C_ALIGNOF -# ifdef HAVE_STDALIGN_H -# include <stdalign.h> -# endif /* HAVE_STDALIGN_H */ -# define mhd_ALIGNOF(type) alignof(type) -#endif /* HAVE_C_ALIGNOF */ - -#ifndef mhd_ALIGNOF -# if defined(_MSC_VER) && ! defined(__clang__) && _MSC_VER >= 1700 -# define mhd_ALIGNOF(type) __alignof (type) -# endif /* _MSC_VER >= 1700 */ -#endif /* !mhd_ALIGNOF */ - -#ifdef mhd_ALIGNOF -# if (defined(__GNUC__) && __GNUC__ < 4 && __GNUC_MINOR__ < 9 && \ +#if (defined(__GNUC__) && __GNUC__ < 4 && __GNUC_MINOR__ < 9 && \ ! defined(__clang__)) || \ (defined(__clang__) && __clang_major__ < 8) || \ (defined(__clang__) && __clang_major__ < 11 && \ defined(__apple_build_version__)) /* GCC before 4.9 and clang before 8.0 have incorrect implementation of 'alignof()' which returns preferred alignment instead of minimal required alignment */ -# define mhd_ALIGNOF_UNRELIABLE 1 -# endif - -# if defined(_MSC_VER) && ! defined(__clang__) && _MSC_VER < 1900 +# define mhd_SYS_ALIGNOF_UNRELIABLE 1 +#elif defined(_MSC_VER) && ! defined(__clang__) && _MSC_VER < 1900 /* MSVC has the same problem as old GCC versions: '__alignof()' may return "preferred" alignment instead of "required". */ -# define mhd_ALIGNOF_UNRELIABLE 1 -# endif /* _MSC_VER < 1900 */ -#endif /* mhd_ALIGNOF */ +# define mhd_SYS_ALIGNOF_UNRELIABLE 1 +#endif /* _MSC_VER < 1900 */ +#ifndef mhd_ALIGNOF +# ifndef mhd_SYS_ALIGNOF_UNRELIABLE +# ifdef HAVE_C_ALIGNOF +# if ! defined(__STDC_VERSION__) || (__STDC_VERSION__ + 0) < 202311 +# ifdef HAVE_STDALIGN_H +# include <stdalign.h> +# endif /* HAVE_STDALIGN_H */ +# endif +# if defined(alignof) || defined(__alignof_is_defined) || \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ + 0) >= 202311) +# define mhd_ALIGNOF(TYPE) alignof(TYPE) +# endif +# endif /* HAVE_C_ALIGNOF */ + +# ifndef mhd_ALIGNOF +# if defined(_MSC_VER) && ! defined(__clang__) && _MSC_VER >= 1700 +# define mhd_ALIGNOF(TYPE) __alignof (TYPE) +# endif /* _MSC_VER >= 1700 */ +# endif /* !mhd_ALIGNOF */ +# endif +#endif + +#ifndef mhd_ALIGNOF +# include "sys_offsetof.h" +# define mhd_ALIGNOF(TYPE) \ + offsetof (struct { char mhd__s; TYPE mhd__m; }, mhd__m) +#endif /* Provide a limited set of alignment macros */ /* The set could be extended as needed */ -#if defined(mhd_ALIGNOF) && ! defined(mhd_ALIGNOF_UNRELIABLE) -# define mhd_UINT32_ALIGN mhd_ALIGNOF (uint32_t) -# define mhd_UINT64_ALIGN mhd_ALIGNOF (uint64_t) -#else /* ! mhd_ALIGNOF */ -struct mhd_dummy_uint32_offset_test_ -{ - char dummy; - uint32_t ui32; -}; -# define mhd_UINT32_ALIGN \ - offsetof (struct mhd_dummy_uint32_offset_test_, ui32) - -struct mhd_dummy_uint64_offset_test_ -{ - char dummy; - uint64_t ui64; -}; -# define mhd_UINT64_ALIGN \ - offsetof (struct mhd_dummy_uint64_offset_test_, ui64) -#endif /* ! mhd_ALIGNOF */ +#define mhd_UINT32_ALIGN mhd_ALIGNOF (uint_least32_t) +#define mhd_UINT64_ALIGN mhd_ALIGNOF (uint_least32_t) +#define mhd_UINT_FAST32_ALIGN mhd_ALIGNOF (uint_fast32_t) #endif /* ! MHD_ALIGN_H */