chiark / gitweb /
lib/sod.h: Fix bungled varargs support macro.
[sod] / lib / sod.h
index 894581034835f267486aa2c085a203db6a749f3c..faffb2091b6fd8b1d481fe4154b5d74d51aeb7dd 100644 (file)
--- a/lib/sod.h
+++ b/lib/sod.h
 
 /*----- 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.
@@ -49,7 +59,7 @@
 
 #  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
@@ -94,7 +124,7 @@ SOD__VARARGS_MACROS_PREAMBLE
  */
 
 #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