@@@ fltfmt mess
[mLib] / utils / align.h
CommitLineData
b65a28d1 1/* -*-c-*-
2 *
b65a28d1 3 * Pointer alignment hack
4 *
5 * (c) 2003 Straylight/Edgeware
6 */
7
d4efbcd9 8/*----- Licensing notice --------------------------------------------------*
b65a28d1 9 *
10 * This file is part of the mLib utilities library.
11 *
12 * mLib is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Library General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
d4efbcd9 16 *
b65a28d1 17 * mLib is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Library General Public License for more details.
d4efbcd9 21 *
b65a28d1 22 * You should have received a copy of the GNU Library General Public
23 * License along with mLib; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 * MA 02111-1307, USA.
26 */
27
b65a28d1 28#ifndef MLIB_ALIGN_H
29#define MLIB_ALIGN_H
30
31#ifdef __cplusplus
32 extern "C" {
33#endif
34
b1a20bee
MW
35/*----- Header files ------------------------------------------------------*/
36
37#include <stddef.h>
38
b65a28d1 39/*----- Data structures ---------------------------------------------------*/
40
41union align {
42 int i;
43 long l;
44 double d;
b1a20bee 45 long double ld;
b65a28d1 46 void *p;
47 void (*f)(void *);
48 struct notexist *s;
b1a20bee
MW
49#if __STDC_VERSION__ >= 201112
50 max_align_t m;
51#endif
b65a28d1 52};
53
54/*----- Macros provided ---------------------------------------------------*/
55
b1a20bee
MW
56#if __STDC_VERSION__ >= 201112
57# define ALIGNOF(ty) _Alignof(ty)
58#else
59# define ALIGNOF(ty) (offsetof(struct { unsigned char _x; ty _y; }, _y))
60#endif
61
b65a28d1 62#define ALIGN(sz) do { \
b1a20bee
MW
63 (sz) += ALIGNOF(union align) - 1; \
64 (sz) -= (sz)%ALIGNOF(union align); \
b65a28d1 65} while (0)
66
67/*----- That's all, folks -------------------------------------------------*/
68
69#ifdef __cplusplus
70 }
71#endif
72
73#endif