/*----- Preliminary utilities ---------------------------------------------*/
+/* Various hacks for checking compiler versions. */
+#define SOD__GCC_P(maj, min) \
+ (__GNUC__ > (maj) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min)))
+
+#ifdef __GNUC__
+# define SOD__EXTENSION __extension__
+#else
+# define SOD__EXTENSION
+#endif
+
/* --- @SOD__HAVE_VARARGS_MACROS@ --- *
*
* Use: Defined if the compiler supports C99-style variadic macros.
# define SOD__HAVE_VARARGS_MACROS
-#elif __GNUC__ >= 3
+#elif SOD__GCC_P(3, 0)
/* We're using GCC, which is trying to deny it but we don't believe it.
* Unfortunately there's a fly in the ointment: if `-pedantic' -- or,
* worse, `-pedantic-errors' -- is set, then GCC will warn about these
/* We're going to want to make use of this ourselves. */
SOD__VARARGS_MACROS_PREAMBLE
+/* --- @SOD__ALIGNOF@ --- *
+ *
+ * Arguments: @type@ = a C type name, consisting of declaration specifiers
+ * and `*[QUALIFIERS]' declarator operators
+ *
+ * Returns: A sufficient alignment for objects of the given @type@, as a
+ * @size_t@.
+ */
+
+#if __STDC_VERSION__ >= 201112
+# define SOD__ALIGNOF(type) _Alignof(type)
+#elif SOD__GCC_P(4, 7)
+# define SOD__ALIGNOF(type) __extension__ _Alignof(type)
+#elif defined(__GNUC__)
+# define SOD__ALIGNOF(type) __alignof__(type)
+#else
+# define SOD__ALIGNOF(type) \
+offsetof(struct { char sod__x; type sod__y; }, sod__y)
+#endif
+
/* --- @SOD__IGNORE@ --- *
*
* Arguments: @var@ = some variable name
*/
#ifdef SOD__HAVE_VARARGS_MACROS
-# define SOD__CAR(...) SOD__CARx(__VA_LIST__, _)
+# define SOD__CAR(...) SOD__CARx(__VA_ARGS__, _)
# define SOD__CARx(a, ...) a
#endif