Commit 2e51303a by Aaron Leung

It turns out I can pass function pointers as va_args -- just need to typedef…

It turns out I can pass function pointers as va_args -- just need to typedef their signatures to make them star-able.
parent be6d8f2d
......@@ -34,9 +34,12 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
}
}
int prefix_try_alternatives(char *src, int (*m[])(char *)) {
int prefix_try_alternatives(char *src, ...) {
int p = 0;
while (m && !(p = (*m)(src))) m++;
va_list ap;
va_start(ap, src);
prefix_matcher m = va_arg(ap, prefix_matcher);
while (m && !(p = (*m)(src))) m = va_arg(ap, prefix_matcher);
return p;
}
......@@ -59,12 +62,9 @@ DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
int prefix_is_string(char *src) {
int (*ms[])(char *) = {
prefix_is_double_quoted_string,
prefix_is_single_quoted_string,
NULL
};
return prefix_try_alternatives(src, ms);
return prefix_try_alternatives(src,
prefix_is_double_quoted_string,
prefix_is_single_quoted_string);
}
DEFINE_EXACT_MATCHER(lparen, "(");
......
typedef int(*prefix_matcher)(char *);
int prefix_is_exactly(char *, char*);
int prefix_is_one_of(char *, char *);
int prefix_is_some_of(char *, char *);
......@@ -35,6 +37,9 @@ int prefix_is_ ## name(char *src) { \
return p; \
}
#define prefix_list(...) { __VA_ARGS__, NULL }
DECLARE_MATCHER(one_space);
DECLARE_MATCHER(one_alpha);
DECLARE_MATCHER(one_digit);
......
......@@ -31,6 +31,12 @@ int main() {
printn(v, prefix_is_one_alpha(v));
printn(v, prefix_is_exactly(v, "hello"));
{
int hidden = 42;
printf("%d\n", hidden);
}
printf("%s", "Did this run?\n");
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment