-
Notifications
You must be signed in to change notification settings - Fork 270
/
mchck-cdefs.h
135 lines (107 loc) · 4.56 KB
/
mchck-cdefs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* Copyright (c) 2011,2012 Simon Schubert <[email protected]>.
* Modifications by Jacob Alexander 2014-2015 <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// ----- Compiler Includes -----
#include <sys/param.h>
// ----- Defines & Macros -----
#define _CONCAT(x,y) _CONCAT1(x,y)
#define _CONCAT1(x,y) x ## y
#define _STR_(a) #a
typedef __CHAR16_TYPE__ char16_t;
#define __packed __attribute__((__packed__))
/* From FreeBSD: compile-time asserts */
#define CTASSERT(x) _Static_assert(x, _STR_(x))
#define CTASSERT_SIZE_BYTE(t, s) CTASSERT(sizeof(t) == (s))
#define CTASSERT_SIZE_BIT(t, s) CTASSERT(sizeof(t) * 8 == (s))
#define UNION_STRUCT_START(size) \
union { \
_CONCAT(_CONCAT(uint, size), _t) raw; \
struct { \
/* just to swallow the following semicolon */ \
struct _CONCAT(_CONCAT(__dummy_, __COUNTER__), _t) {}
#define UNION_STRUCT_END \
}; /* struct */ \
}; /* union */
/**
* From <news:[email protected]>,
* <https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s>
*/
#define __PP_NARG(...) \
__PP_NARG_(__0, ## __VA_ARGS__, __PP_RSEQ_N())
#define __PP_NARG_(...) \
__PP_ARG_N(__VA_ARGS__)
#define __PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
_31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
_61,_62,_63,N,...) N
#define __PP_RSEQ_N() \
62,61,60, \
59,58,57,56,55,54,53,52,51,50, \
49,48,47,46,45,44,43,42,41,40, \
39,38,37,36,35,34,33,32,31,30, \
29,28,27,26,25,24,23,22,21,20, \
19,18,17,16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0
/**
* From <https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms>
*/
#define __CAT(a, ...) __PRIMITIVE_CAT(a, __VA_ARGS__)
#define __PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define __IIF(c) __PRIMITIVE_CAT(__IIF_, c)
#define __IIF_0(t, ...) __VA_ARGS__
#define __IIF_1(t, ...) t
#define __COMPL(b) __PRIMITIVE_CAT(__COMPL_, b)
#define __COMPL_0 1
#define __COMPL_1 0
#define __CHECK_N(x, n, ...) n
#define __CHECK(...) __CHECK_N(__VA_ARGS__, 0,)
#define __PROBE(x) x, 1,
#define __NOT(x) __CHECK(__PRIMITIVE_CAT(__NOT_, x))
#define __NOT_0 __PROBE(~)
#define __BOOL(x) __COMPL(__NOT(x))
#define __IF(c) __IIF(__BOOL(c))
#define __EAT(...)
#define __EXPAND(...) __VA_ARGS__
#define __WHEN(c) __IF(c)(__EXPAND, __EAT)
#define __HEAD(h, ...) h
#define __TAIL(h, ...) __VA_ARGS__
#define __EVAL(...) __EVAL1(__EVAL1(__EVAL1(__VA_ARGS__)))
#define __EVAL1(...) __EVAL2(__EVAL2(__EVAL2(__VA_ARGS__)))
#define __EVAL2(...) __EVAL3(__EVAL3(__EVAL3(__VA_ARGS__)))
#define __EVAL3(...) __EVAL4(__EVAL4(__EVAL4(__VA_ARGS__)))
#define __EVAL4(...) __EVAL5(__EVAL5(__EVAL5(__VA_ARGS__)))
#define __EVAL5(...) __EVAL6(__EVAL6(__EVAL6(__VA_ARGS__)))
#define __EVAL6(...) __VA_ARGS__
#define __EMPTY()
#define __DEFER(id) id __EMPTY()
#define __OBSTRUCT(...) __VA_ARGS__ __DEFER(__EMPTY)()
#define __CAT_ARG(f, a) __OBSTRUCT(f) a
#define __REPEAT(...) __EVAL(__REPEAT_(__VA_ARGS__))
#define __REPEAT_INNER(...) __OBSTRUCT(__REPEAT_INDIRECT) () (__VA_ARGS__)
#define __REPEAT_INDIRECT() __REPEAT_
#define __REPEAT_(iter, itermacro, macro, a, ...) \
__OBSTRUCT(macro)(iter, a) \
__WHEN(__PP_NARG(__VA_ARGS__)) \
( \
__OBSTRUCT(__REPEAT_INDIRECT) () ( \
itermacro(iter, a), itermacro, macro, __VA_ARGS__ \
) \
)