summaryrefslogtreecommitdiff
path: root/cesar/lib/preproc.h
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/lib/preproc.h')
-rw-r--r--cesar/lib/preproc.h307
1 files changed, 307 insertions, 0 deletions
diff --git a/cesar/lib/preproc.h b/cesar/lib/preproc.h
new file mode 100644
index 0000000000..d8fe82c5e8
--- /dev/null
+++ b/cesar/lib/preproc.h
@@ -0,0 +1,307 @@
+#ifndef lib_preproc_h
+#define lib_preproc_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2007 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file lib/preproc.h
+ * \brief Preprocessor utilities.
+ * \ingroup lib
+ */
+
+/** Count the number of arguments. A very nice trick from Laurent Deniau, in
+ * <dqgm2f$ije$1@sunnews.cern.ch> 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
+
+/** 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)
+/* }}} */
+
+/** 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)
+/* }}} */
+
+/** 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)
+/* }}} */
+
+/** 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 */