diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-03-17 22:03:25 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-03-17 22:03:25 -0700 |
commit | 37b86df09ff381bcc4f60802d43e57bd9bfcac73 (patch) | |
tree | 76065637ec0ea0d646ec783c00a156f9702968c7 /sys/src/cmd/cpp/test.c | |
parent | 52dc943702a8f7815546e76286b153c3813e1db0 (diff) |
Improve the posix preprocessor.
This fixes token pasting, making it expand when
it should expand, and paste before expansion when
it should paste before expanding.
#define CAT(a, b) a ## b
#define BAR 3
#define FOO CAT(BAR, 3)
FOO
now produces 33, while
#define CAT(a, b) a ## b
#define EOF (-1)
#define NOP(x) x
NOP(CAT(foo, EOF))
CAT(,EOF)
CAT(,)
produces
fooEOF
(-1)
<empty>
respectively.
Diffstat (limited to 'sys/src/cmd/cpp/test.c')
-rw-r--r-- | sys/src/cmd/cpp/test.c | 65 |
1 files changed, 61 insertions, 4 deletions
diff --git a/sys/src/cmd/cpp/test.c b/sys/src/cmd/cpp/test.c index 3fbd6bdd6..451e364f4 100644 --- a/sys/src/cmd/cpp/test.c +++ b/sys/src/cmd/cpp/test.c @@ -1,4 +1,61 @@ -#define M1() -#define M2(A1) A1() -M2(M1) -M2(P1) +#define NOP(x) x +#define CAT(a, b) a ## b +#define EOF (-1) +x NOP(CAT(foo, EOF)) y +x NOP(CAT(EOF, foo)) y +x CAT(, EOF) y +y CAT(foo,) x +x CAT(,foo) y +X NOP(CAT(,)) y + +#define NCAT(a) foo ## a +NCAT(bar) + +#define XCAT(a) ## a +foo XCAT(bar) + +#define CAT3(foo) a##foo##b +CAT3(blah) + +#define BAR 3 +#define FOO CAT(BAR, 3) +FOO + +/* + * CURRENTLY BROKEN: + * __VA_ARGS__ requires at least one item. + * It should accept an empty list. +#define xprint(a, ...) print(a, __VA_ARGS__) +xprint("hi", "there") +xprint("hi") +*/ + +#define C a,b +#define X(a) a +#define Y X(C) +Y + +#define x 3 +#define f(a) f(x * (a)) +#undef x +#define x 2 +#define g f +#define z z[0] +#define h g(~ +#define m(a) a(w) +#define w 0,1 +#define t(a) a +#define p() int +#define q(x) x +#define r(x,y) x ## y +#define str(x) # x +f(y+1) + f(f(z)) % t(t(g)(0) + t)(1); +g(x+(3,4)-w) | h 5) & m +(f)^m(m); +/* + * CURRENTLY BROKEN: + * mac() needs at least one argument. + * It should treat no args as a single empty arg list. +p() i[q()] = { q(1), r(2,3), r(4,), r(,5), r(,) }; +char c[2][6] = { str(hello), str() }; +*/
\ No newline at end of file |