Update files for OpenSSL-1.0.0g import.
[dragonfly.git] / sys / sys / cpputil.h
1 #ifndef _SYS_CPPUTIL_H_
2 #define _SYS_CPPUTIL_H_
3
4 #include <sys/cdefs.h>
5 /*
6  * This file includes macros that abuse the preprocessor --
7  * we don't want to have to parse these except when compiling
8  * the files that actually use them.
9  */
10
11 /*
12  * Returns the number of args in __VA_ARGS__.
13  * Note: returns 1 if __VA_ARGS__ is empty!
14  */
15
16 #define VA_NARGS(...) __VA_ARGS_SIZE(__VA_ARGS__, 64, 63, 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,)
17
18 #define __VA_ARGS_SIZE(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size
19
20 /*
21  * Generate a struction declaration using the arguments passed in.
22  * E.g. __GENSTRUCT(mystruct, int a, char *b); expands to
23  * struct mystruct {
24  *      int a;
25  *      char *b;
26  * };
27  */
28
29 #define __GENSTRUCT(tag, args...)\
30         __CONCAT(__GENSTRUCT,VA_NARGS(args))(tag, args)
31
32
33 #define __GENSTRUCT1(tag, arg1) struct tag {    \
34         arg1;   \
35         }
36 #define __GENSTRUCT2(tag, arg1, arg2)   struct tag {    \
37         arg1;   \
38         arg2;   \
39         }
40 #define __GENSTRUCT3(tag, arg1, arg2, arg3)     struct tag {    \
41         arg1;   \
42         arg2;   \
43         arg3;   \
44         }
45 #define __GENSTRUCT4(tag, arg1, arg2, arg3, arg4)       struct tag {    \
46         arg1;   \
47         arg2;   \
48         arg3;   \
49         arg4;   \
50         }
51 #define __GENSTRUCT5(tag, arg1, arg2, arg3, arg4, arg5) struct tag {    \
52         arg1;   \
53         arg2;   \
54         arg3;   \
55         arg4;   \
56         arg5;   \
57         }
58 #define __GENSTRUCT6(tag, arg1, arg2, arg3, arg4, arg5, arg6)   struct tag {    \
59         arg1;   \
60         arg2;   \
61         arg3;   \
62         arg4;   \
63         arg5;   \
64         arg6;   \
65         }
66 #define __GENSTRUCT7(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7)     struct tag {    \
67         arg1;   \
68         arg2;   \
69         arg3;   \
70         arg4;   \
71         arg5;   \
72         arg6;   \
73         arg7;   \
74         }
75 #define __GENSTRUCT8(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)       struct tag {    \
76         arg1;   \
77         arg2;   \
78         arg3;   \
79         arg4;   \
80         arg5;   \
81         arg6;   \
82         arg7;   \
83         arg8;   \
84         }
85 #define __GENSTRUCT9(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) struct tag {    \
86         arg1;   \
87         arg2;   \
88         arg3;   \
89         arg4;   \
90         arg5;   \
91         arg6;   \
92         arg7;   \
93         arg8;   \
94         arg9;   \
95         }
96 #define __GENSTRUCT10(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) struct tag {    \
97         arg1;   \
98         arg2;   \
99         arg3;   \
100         arg4;   \
101         arg5;   \
102         arg6;   \
103         arg7;   \
104         arg8;   \
105         arg9;   \
106         arg10;  \
107         }
108 #define __GENSTRUCT11(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11)  struct tag {    \
109         arg1;   \
110         arg2;   \
111         arg3;   \
112         arg4;   \
113         arg5;   \
114         arg6;   \
115         arg7;   \
116         arg8;   \
117         arg9;   \
118         arg10;  \
119         arg11;  \
120         }
121 #define __GENSTRUCT12(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)   struct tag {    \
122         arg1;   \
123         arg2;   \
124         arg3;   \
125         arg4;   \
126         arg5;   \
127         arg6;   \
128         arg7;   \
129         arg8;   \
130         arg9;   \
131         arg10;  \
132         arg11;  \
133         arg12;  \
134         }
135 #define __GENSTRUCT13(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13)    struct tag {    \
136         arg1;   \
137         arg2;   \
138         arg3;   \
139         arg4;   \
140         arg5;   \
141         arg6;   \
142         arg7;   \
143         arg8;   \
144         arg9;   \
145         arg10;  \
146         arg11;  \
147         arg12;  \
148         arg13;  \
149         }
150 #define __GENSTRUCT14(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14)     struct tag {    \
151         arg1;   \
152         arg2;   \
153         arg3;   \
154         arg4;   \
155         arg5;   \
156         arg6;   \
157         arg7;   \
158         arg8;   \
159         arg9;   \
160         arg10;  \
161         arg11;  \
162         arg12;  \
163         arg13;  \
164         arg14;  \
165         }
166 #define __GENSTRUCT15(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)      struct tag {  \
167         arg1;   \
168         arg2;   \
169         arg3;   \
170         arg4;   \
171         arg5;   \
172         arg6;   \
173         arg7;   \
174         arg8;   \
175         arg9;   \
176         arg10;  \
177         arg11;  \
178         arg12;  \
179         arg13;  \
180         arg14;  \
181         arg15;  \
182         }
183 #define __GENSTRUCT16(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16)       struct tag {   \
184         arg1;   \
185         arg2;   \
186         arg3;   \
187         arg4;   \
188         arg5;   \
189         arg6;   \
190         arg7;   \
191         arg8;   \
192         arg9;   \
193         arg10;  \
194         arg11;  \
195         arg12;  \
196         arg13;  \
197         arg14;  \
198         arg15;  \
199         arg16;  \
200         }
201 #define __GENSTRUCT17(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17)      struct tag {     \
202         arg1;   \
203         arg2;   \
204         arg3;   \
205         arg4;   \
206         arg5;   \
207         arg6;   \
208         arg7;   \
209         arg8;   \
210         arg9;   \
211         arg10;  \
212         arg11;  \
213         arg12;  \
214         arg13;  \
215         arg14;  \
216         arg15;  \
217         arg16;  \
218         arg17;  \
219         }
220 #define __GENSTRUCT18(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18)struct tag {    \
221         arg1;   \
222         arg2;   \
223         arg3;   \
224         arg4;   \
225         arg5;   \
226         arg6;   \
227         arg7;   \
228         arg8;   \
229         arg9;   \
230         arg10;  \
231         arg11;  \
232         arg12;  \
233         arg13;  \
234         arg14;  \
235         arg15;  \
236         arg16;  \
237         arg17;  \
238         arg18;  \
239         }
240 #define __GENSTRUCT19(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19) struct tag {    \
241         arg1;   \
242         arg2;   \
243         arg3;   \
244         arg4;   \
245         arg5;   \
246         arg6;   \
247         arg7;   \
248         arg8;   \
249         arg9;   \
250         arg10;  \
251         arg11;  \
252         arg12;  \
253         arg13;  \
254         arg14;  \
255         arg15;  \
256         arg16;  \
257         arg17;  \
258         arg18;  \
259         arg19;  \
260         }
261 #endif  /* _SYS_CPPUTIL_H_ */