#ifndef lib_preproc_h #define lib_preproc_h /* Cesar project {{{ * * Copyright (C) 2007 Spidcom * * <<>> * * }}} */ /** * \file lib/preproc.h * \brief Preprocessor utilities. * \ingroup lib */ /** Count the number of arguments. A very nice trick from Laurent Deniau, in * on comp.std.c. * Changed a little bit to handle zero arguments with gcc. */ #define PREPROC_NARG(args...) \ PREPROC_NARG_(0, ## args, PREPROC_RSEQ_N()) #define PREPROC_NARG_(...) \ PREPROC_ARG_N(__VA_ARGS__) #define PREPROC_ARG_N( _0, \ _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 PREPROC_RSEQ_N() \ 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,0 /** Paste two expanded arguments. */ #define PASTE_EXPAND(a, b) PASTE (a, b) /** Paste two arguments without expansion. */ #define PASTE(a, b) a ## b /** Reverse the list of arguments. */ #define PREPROC_REVERSE(args...) \ PASTE_EXPAND (PREPROC_REVERSE_, PREPROC_NARG (args)) (args) #define PREPROC_REVERSE_0(t...) #define PREPROC_REVERSE_1(h, t...) h #define PREPROC_REVERSE_2(h, t...) PREPROC_REVERSE_1 (t), h #define PREPROC_REVERSE_3(h, t...) PREPROC_REVERSE_2 (t), h #define PREPROC_REVERSE_4(h, t...) PREPROC_REVERSE_3 (t), h #define PREPROC_REVERSE_5(h, t...) PREPROC_REVERSE_4 (t), h #define PREPROC_REVERSE_6(h, t...) PREPROC_REVERSE_5 (t), h #define PREPROC_REVERSE_7(h, t...) PREPROC_REVERSE_6 (t), h #define PREPROC_REVERSE_8(h, t...) PREPROC_REVERSE_7 (t), h #define PREPROC_REVERSE_9(h, t...) PREPROC_REVERSE_8 (t), h #define PREPROC_REVERSE_10(h, t...) PREPROC_REVERSE_9 (t), h #define PREPROC_REVERSE_11(h, t...) PREPROC_REVERSE_10 (t), h #define PREPROC_REVERSE_12(h, t...) PREPROC_REVERSE_11 (t), h #define PREPROC_REVERSE_13(h, t...) PREPROC_REVERSE_12 (t), h #define PREPROC_REVERSE_14(h, t...) PREPROC_REVERSE_13 (t), h #define PREPROC_REVERSE_15(h, t...) PREPROC_REVERSE_14 (t), h #define PREPROC_REVERSE_16(h, t...) PREPROC_REVERSE_15 (t), h #define PREPROC_REVERSE_17(h, t...) PREPROC_REVERSE_16 (t), h #define PREPROC_REVERSE_18(h, t...) PREPROC_REVERSE_17 (t), h #define PREPROC_REVERSE_19(h, t...) PREPROC_REVERSE_18 (t), h #define PREPROC_REVERSE_20(h, t...) PREPROC_REVERSE_19 (t), h #define PREPROC_REVERSE_21(h, t...) PREPROC_REVERSE_20 (t), h #define PREPROC_REVERSE_22(h, t...) PREPROC_REVERSE_21 (t), h #define PREPROC_REVERSE_23(h, t...) PREPROC_REVERSE_22 (t), h #define PREPROC_REVERSE_24(h, t...) PREPROC_REVERSE_23 (t), h #define PREPROC_REVERSE_25(h, t...) PREPROC_REVERSE_24 (t), h #define PREPROC_REVERSE_26(h, t...) PREPROC_REVERSE_25 (t), h #define PREPROC_REVERSE_27(h, t...) PREPROC_REVERSE_26 (t), h #define PREPROC_REVERSE_28(h, t...) PREPROC_REVERSE_27 (t), h #define PREPROC_REVERSE_29(h, t...) PREPROC_REVERSE_28 (t), h #define PREPROC_REVERSE_30(h, t...) PREPROC_REVERSE_29 (t), h #define PREPROC_REVERSE_31(h, t...) PREPROC_REVERSE_30 (t), h #define PREPROC_REVERSE_32(h, t...) PREPROC_REVERSE_31 (t), h #define PREPROC_REVERSE_33(h, t...) PREPROC_REVERSE_32 (t), h #define PREPROC_REVERSE_34(h, t...) PREPROC_REVERSE_33 (t), h #define PREPROC_REVERSE_35(h, t...) PREPROC_REVERSE_34 (t), h #define PREPROC_REVERSE_36(h, t...) PREPROC_REVERSE_35 (t), h #define PREPROC_REVERSE_37(h, t...) PREPROC_REVERSE_36 (t), h #define PREPROC_REVERSE_38(h, t...) PREPROC_REVERSE_37 (t), h #define PREPROC_REVERSE_39(h, t...) PREPROC_REVERSE_38 (t), h #define PREPROC_REVERSE_40(h, t...) PREPROC_REVERSE_39 (t), h #define PREPROC_REVERSE_41(h, t...) PREPROC_REVERSE_40 (t), h #define PREPROC_REVERSE_42(h, t...) PREPROC_REVERSE_41 (t), h #define PREPROC_REVERSE_43(h, t...) PREPROC_REVERSE_42 (t), h #define PREPROC_REVERSE_44(h, t...) PREPROC_REVERSE_43 (t), h #define PREPROC_REVERSE_45(h, t...) PREPROC_REVERSE_44 (t), h #define PREPROC_REVERSE_46(h, t...) PREPROC_REVERSE_45 (t), h #define PREPROC_REVERSE_47(h, t...) PREPROC_REVERSE_46 (t), h #define PREPROC_REVERSE_48(h, t...) PREPROC_REVERSE_47 (t), h #define PREPROC_REVERSE_49(h, t...) PREPROC_REVERSE_48 (t), h #define PREPROC_REVERSE_50(h, t...) PREPROC_REVERSE_49 (t), h #define PREPROC_REVERSE_51(h, t...) PREPROC_REVERSE_50 (t), h #define PREPROC_REVERSE_52(h, t...) PREPROC_REVERSE_51 (t), h #define PREPROC_REVERSE_53(h, t...) PREPROC_REVERSE_52 (t), h #define PREPROC_REVERSE_54(h, t...) PREPROC_REVERSE_53 (t), h #define PREPROC_REVERSE_55(h, t...) PREPROC_REVERSE_54 (t), h #define PREPROC_REVERSE_56(h, t...) PREPROC_REVERSE_55 (t), h #define PREPROC_REVERSE_57(h, t...) PREPROC_REVERSE_56 (t), h #define PREPROC_REVERSE_58(h, t...) PREPROC_REVERSE_57 (t), h #define PREPROC_REVERSE_59(h, t...) PREPROC_REVERSE_58 (t), h #define PREPROC_REVERSE_60(h, t...) PREPROC_REVERSE_59 (t), h #define PREPROC_REVERSE_61(h, t...) PREPROC_REVERSE_60 (t), h #define PREPROC_REVERSE_62(h, t...) PREPROC_REVERSE_61 (t), h #define PREPROC_REVERSE_63(h, t...) PREPROC_REVERSE_62 (t), h #define PREPROC_REVERSE_64(h, t...) PREPROC_REVERSE_63 (t), h /** Call macro for each argument. */ #define PREPROC_FOR_EACH(macro, args...) \ PASTE_EXPAND (PREPROC_FOR_EACH_, PREPROC_NARG (args)) (macro, args) /* PREPROC_FOR_EACH_x {{{ */ #define PREPROC_FOR_EACH_0(macro, t...) #define PREPROC_FOR_EACH_1(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_0 (macro, ## t) #define PREPROC_FOR_EACH_2(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_1 (macro, ## t) #define PREPROC_FOR_EACH_3(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_2 (macro, ## t) #define PREPROC_FOR_EACH_4(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_3 (macro, ## t) #define PREPROC_FOR_EACH_5(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_4 (macro, ## t) #define PREPROC_FOR_EACH_6(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_5 (macro, ## t) #define PREPROC_FOR_EACH_7(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_6 (macro, ## t) #define PREPROC_FOR_EACH_8(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_7 (macro, ## t) #define PREPROC_FOR_EACH_9(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_8 (macro, ## t) #define PREPROC_FOR_EACH_10(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_9 (macro, ## t) #define PREPROC_FOR_EACH_11(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_10 (macro, ## t) #define PREPROC_FOR_EACH_12(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_11 (macro, ## t) #define PREPROC_FOR_EACH_13(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_12 (macro, ## t) #define PREPROC_FOR_EACH_14(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_13 (macro, ## t) #define PREPROC_FOR_EACH_15(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_14 (macro, ## t) #define PREPROC_FOR_EACH_16(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_15 (macro, ## t) #define PREPROC_FOR_EACH_17(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_16 (macro, ## t) #define PREPROC_FOR_EACH_18(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_17 (macro, ## t) #define PREPROC_FOR_EACH_19(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_18 (macro, ## t) #define PREPROC_FOR_EACH_20(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_19 (macro, ## t) #define PREPROC_FOR_EACH_21(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_20 (macro, ## t) #define PREPROC_FOR_EACH_22(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_21 (macro, ## t) #define PREPROC_FOR_EACH_23(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_22 (macro, ## t) #define PREPROC_FOR_EACH_24(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_23 (macro, ## t) #define PREPROC_FOR_EACH_25(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_24 (macro, ## t) #define PREPROC_FOR_EACH_26(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_25 (macro, ## t) #define PREPROC_FOR_EACH_27(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_26 (macro, ## t) #define PREPROC_FOR_EACH_28(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_27 (macro, ## t) #define PREPROC_FOR_EACH_29(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_28 (macro, ## t) #define PREPROC_FOR_EACH_30(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_29 (macro, ## t) #define PREPROC_FOR_EACH_31(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_30 (macro, ## t) #define PREPROC_FOR_EACH_32(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_31 (macro, ## t) #define PREPROC_FOR_EACH_33(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_32 (macro, ## t) #define PREPROC_FOR_EACH_34(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_33 (macro, ## t) #define PREPROC_FOR_EACH_35(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_34 (macro, ## t) #define PREPROC_FOR_EACH_36(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_35 (macro, ## t) #define PREPROC_FOR_EACH_37(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_36 (macro, ## t) #define PREPROC_FOR_EACH_38(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_37 (macro, ## t) #define PREPROC_FOR_EACH_39(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_38 (macro, ## t) #define PREPROC_FOR_EACH_40(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_39 (macro, ## t) #define PREPROC_FOR_EACH_41(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_40 (macro, ## t) #define PREPROC_FOR_EACH_42(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_41 (macro, ## t) #define PREPROC_FOR_EACH_43(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_42 (macro, ## t) #define PREPROC_FOR_EACH_44(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_43 (macro, ## t) #define PREPROC_FOR_EACH_45(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_44 (macro, ## t) #define PREPROC_FOR_EACH_46(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_45 (macro, ## t) #define PREPROC_FOR_EACH_47(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_46 (macro, ## t) #define PREPROC_FOR_EACH_48(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_47 (macro, ## t) #define PREPROC_FOR_EACH_49(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_48 (macro, ## t) #define PREPROC_FOR_EACH_50(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_49 (macro, ## t) #define PREPROC_FOR_EACH_51(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_50 (macro, ## t) #define PREPROC_FOR_EACH_52(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_51 (macro, ## t) #define PREPROC_FOR_EACH_53(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_52 (macro, ## t) #define PREPROC_FOR_EACH_54(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_53 (macro, ## t) #define PREPROC_FOR_EACH_55(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_54 (macro, ## t) #define PREPROC_FOR_EACH_56(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_55 (macro, ## t) #define PREPROC_FOR_EACH_57(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_56 (macro, ## t) #define PREPROC_FOR_EACH_58(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_57 (macro, ## t) #define PREPROC_FOR_EACH_59(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_58 (macro, ## t) #define PREPROC_FOR_EACH_60(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_59 (macro, ## t) #define PREPROC_FOR_EACH_61(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_60 (macro, ## t) #define PREPROC_FOR_EACH_62(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_61 (macro, ## t) #define PREPROC_FOR_EACH_63(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_62 (macro, ## t) #define PREPROC_FOR_EACH_64(macro, h, t...) \ macro (h)PREPROC_FOR_EACH_63 (macro, ## t) /* }}} */ /** Call macro for each argument, with an extra parameter. */ #define PREPROC_FOR_EACH_PARAM(macro, param, args...) \ PASTE_EXPAND (PREPROC_FOR_EACH_PARAM_, \ PREPROC_NARG (args)) (macro, param, args) /* PREPROC_FOR_EACH_PARAM_x {{{ */ #define PREPROC_FOR_EACH_PARAM_0(macro, param, t...) #define PREPROC_FOR_EACH_PARAM_1(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_0 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_2(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_1 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_3(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_2 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_4(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_3 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_5(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_4 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_6(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_5 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_7(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_6 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_8(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_7 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_9(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_8 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_10(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_9 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_11(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_10 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_12(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_11 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_13(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_12 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_14(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_13 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_15(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_14 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_16(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_15 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_17(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_16 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_18(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_17 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_19(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_18 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_20(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_19 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_21(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_20 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_22(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_21 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_23(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_22 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_24(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_23 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_25(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_24 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_26(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_25 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_27(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_26 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_28(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_27 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_29(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_28 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_30(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_29 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_31(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_30 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_32(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_31 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_33(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_32 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_34(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_33 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_35(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_34 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_36(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_35 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_37(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_36 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_38(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_37 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_39(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_38 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_40(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_39 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_41(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_40 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_42(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_41 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_43(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_42 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_44(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_43 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_45(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_44 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_46(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_45 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_47(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_46 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_48(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_47 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_49(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_48 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_50(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_49 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_51(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_50 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_52(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_51 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_53(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_52 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_54(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_53 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_55(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_54 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_56(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_55 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_57(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_56 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_58(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_57 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_59(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_58 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_60(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_59 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_61(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_60 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_62(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_61 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_63(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_62 (macro, param, ## t) #define PREPROC_FOR_EACH_PARAM_64(macro, param, h, t...) \ macro (param, h)PREPROC_FOR_EACH_PARAM_63 (macro, param, ## t) /* }}} */ /** Call macro for each argument, with comma between calls. */ #define PREPROC_FOR_EACH_COMMA(macro, args...) \ PASTE_EXPAND (PREPROC_FOR_EACH_COMMA_, PREPROC_NARG (args)) (macro, args) /* PREPROC_FOR_EACH_COMMA_x {{{ */ #define PREPROC_FOR_EACH_COMMA_1(macro, h, t...) macro (h) #define PREPROC_FOR_EACH_COMMA_2(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_1 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_3(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_2 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_4(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_3 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_5(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_4 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_6(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_5 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_7(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_6 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_8(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_7 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_9(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_8 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_10(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_9 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_11(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_10 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_12(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_11 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_13(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_12 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_14(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_13 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_15(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_14 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_16(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_15 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_17(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_16 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_18(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_17 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_19(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_18 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_20(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_19 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_21(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_20 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_22(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_21 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_23(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_22 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_24(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_23 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_25(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_24 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_26(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_25 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_27(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_26 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_28(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_27 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_29(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_28 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_30(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_29 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_31(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_30 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_32(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_31 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_33(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_32 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_34(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_33 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_35(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_34 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_36(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_35 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_37(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_36 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_38(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_37 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_39(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_38 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_40(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_39 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_41(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_40 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_42(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_41 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_43(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_42 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_44(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_43 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_45(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_44 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_46(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_45 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_47(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_46 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_48(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_47 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_49(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_48 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_50(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_49 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_51(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_50 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_52(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_51 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_53(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_52 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_54(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_53 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_55(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_54 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_56(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_55 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_57(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_56 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_58(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_57 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_59(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_58 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_60(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_59 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_61(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_60 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_62(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_61 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_63(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_62 (macro, ## t) #define PREPROC_FOR_EACH_COMMA_64(macro, h, t...) \ macro (h), PREPROC_FOR_EACH_COMMA_63 (macro, ## t) /* }}} */ /** Call macro with unpacked arguments. */ #define PREPROC_CALL_UNPACK(macro, args...) \ macro args /** Remove parenthesis: (a, b, c) => a, b, c. */ #define PREPROC_UNPACK(args...) \ PREPROC_UNPACK_ args #define PREPROC_UNPACK_(args...) \ PREPROC_FOR_EACH_COMMA (PREPROC_UNPACK__, ## args) #define PREPROC_UNPACK__(arg) arg #endif /* lib_preproc_h */