+/*----- 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.
+ *
+ * This is more complicated than just checking the value of
+ * @__STDC_VERSION__@ because GCC has traditionally claimed C89
+ * by default, but provides the functionality anyway unless it's
+ * been explicitly turned off.
+ */
+
+#if __STDC_VERSION__ >= 199901
+ /* The feature exists. All is well with the world. */
+
+# define SOD__HAVE_VARARGS_MACROS
+
+#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
+ * macros being defined, and there isn't a way to detect pedantry from the
+ * preprocessor.
+ *
+ * We must deploy bodges. There doesn't seem to be a good way to suppress
+ * particular warnings from the preprocessor: in particular, messing about
+ * with `pragma GCC diagnostic' doesn't help. So we're left with this
+ * hack: just declare all Sod-generated header files which try to do
+ * varargs macro things to be `system headers', which means that GCC's
+ * preprocessor will let them get away with all manner of nefarious stuff.
+ */
+
+# define SOD__HAVE_VARARGS_MACROS
+# define SOD__VARARGS_MACROS_PREAMBLE _Pragma("GCC system_header")
+
+#endif
+
+/* Make sure this gratuitous hack is understood, at least vacuously. */
+#ifndef SOD__VARARGS_MACROS_PREAMBLE
+# define SOD__VARARGS_MACROS_PREAMBLE
+#endif
+
+/* 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
+ *
+ * Use: Suppress any warning that @var@ isn't used.
+ */
+
+#define SOD__IGNORE(var) ((void)(var))
+
+/* --- @SOD__NORETURN@ --- *
+ *
+ * Use: Marks functions which are not expected to return.
+ */
+
+#if SOD__GCC_P(2, 5)
+# define SOD__NORETURN __attribute__((__noreturn__))
+#endif
+
+#ifndef SOD__NORETURN
+# define SOD__NORETURN
+#endif
+
+/* --- @SOD__PARANOIA@ --- *
+ *
+ * Arguments: @cond@ = a condition to check
+ * @conseq@ = a thing to evaluate to if the check passes
+ * @alt@ = a thing to do if the check fails
+ *
+ * Use: Check to make sure something is good at runtime, unless
+ * disabled.
+ */
+
+#if SOD_RECKLESS
+# define SOD__PARANOIA(cond, conseq, alt) (conseq)
+#else
+# define SOD__PARANOIA(cond, conseq, alt) ((cond) ? (conseq) : (alt))
+#endif
+
+/* --- @SOD__CAR@ --- *
+ *
+ * Arguments: @...@ = a nonempty list of arguments
+ *
+ * Returns: The first argument only.
+ */
+
+#ifdef SOD__HAVE_VARARGS_MACROS
+# define SOD__CAR(...) SOD__CARx(__VA_ARGS__, _)
+# define SOD__CARx(a, ...) a
+#endif
+