Commit | Line | Data |
---|---|---|
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 | ||
41 | union 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 |