Add a macro to count the number of args to a macro
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Jul 2018 00:06:43 +0000 (20:06 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Jul 2018 14:25:54 +0000 (10:25 -0400)
Usage:
assert(MACRO_NR_ARGS() == 0);
or:
#define foo(...) printk("Got %d\n", MACRO_NR_ARGS(__VA_ARGS__))

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/compiler.h

index 5159f24..df10b87 100644 (file)
  * nothing or to some attribute.  We use it for the name of the pcpu variables
  * .section, so need it to not be #defined yet. */
 #undef __percpu
+
+/* If __VA_ARGS__ is empty, the ## will eat the comma to the left, so we call
+ * __MACRO_NARG with 1 + NR_ARGS arguments, then the 6, 5, 4, etc.  __MACRO_NARG
+ * will strip the 0 (the _0), then the args (if any), and then return the Nth
+ * integer passed in, which will be the number of original args. */
+#define __MACRO_NARG(_0, _1, _2, _3, _4, _5, _6, x, ...) x
+#define MACRO_NR_ARGS(...) __MACRO_NARG(0, ##__VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)