@@@ fltfmt mess
[mLib] / utils / align.h
index 196c8a2..9d2e654 100644 (file)
   extern "C" {
 #endif
 
+/*----- Header files ------------------------------------------------------*/
+
+#include <stddef.h>
+
 /*----- Data structures ---------------------------------------------------*/
 
 union align {
   int i;
   long l;
   double d;
+  long double ld;
   void *p;
   void (*f)(void *);
   struct notexist *s;
+#if __STDC_VERSION__ >= 201112
+  max_align_t m;
+#endif
 };
 
 /*----- Macros provided ---------------------------------------------------*/
 
+#if __STDC_VERSION__ >= 201112
+#  define ALIGNOF(ty) _Alignof(ty)
+#else
+#  define ALIGNOF(ty) (offsetof(struct { unsigned char _x; ty _y; }, _y))
+#endif
+
 #define ALIGN(sz) do {                                                 \
-  sz += sizeof(union align) - 1;                                       \
-  sz -= sz % sizeof(union align);                                      \
+  (sz) += ALIGNOF(union align) - 1;                                    \
+  (sz) -= (sz)%ALIGNOF(union align);                                   \
 } while (0)
 
 /*----- That's all, folks -------------------------------------------------*/