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_ */ 262