/*
 * THIS TESTS:
 *  - this is a memory stress test
 */

#define FOO ZZZ
#define BAR YYY

#define ZZZ 1 + YYY
#define YYY 2 + ZZZ

#define A(word) (word)
#define B(word) (word + A(word))
#define C(word) (B(word) + A(word))
#define D(m, word) (C(word) * m(word))
#define E(a,b) (D(C, a##b) + a##_longer_thing)
#define F(a,b) (D(A, #a) + (D(B, #b)) + (E(b,a)))

F(0,1);
F(FOO, BAR);
F(FOO + BAR + 10, BAR * 10 + FOO);

#define Empty
#define G1(x) G2 Empty (x)
#define G2(x) G3 Empty (x)
#define G3(x) G4 Empty (x)
#define G4(x) G5 Empty (x)
#define G5(x) G6 Empty (x)
#define G6(x) G7 Empty (x)
#define G7(x) G8 Empty (x)
#define G8(x) G9 Empty (x)
#define G9(x) (x + x)
#define Expand(x) x

G1(0);
Expand(G1(1));
Expand(Expand(G1(2)));
Expand(Expand(Expand(G1(3))));
Expand(Expand(Expand(Expand(G1(4)))));
Expand(Expand(Expand(Expand(Expand(G1(5))))));
Expand(Expand(Expand(Expand(Expand(Expand(G1(6)))))));
Expand(Expand(Expand(Expand(Expand(Expand(Expand(G1(7))))))));
Expand(Expand(Expand(Expand(Expand(Expand(Expand(Expand(G1(8)))))))));
Expand(Expand(Expand(Expand(Expand(Expand(Expand(Expand(Expand(G1(9))))))))));

#define Comma ,
#define M(a) N(a)
#define N(a,b) a+b

M(100 Comma 200);

#define FOOD(name, ...) show(#__VA_ARGS__, __VA_ARGS__); ++name##_counter; show(#name": %d\n", name##_counter)

FOOD(bard, aplha, beta, gamma, delta);

Expand(Expand(Expand(Expand(Expand(Expand(Expand(Expand(Expand(F(FOO + BAR + 10, BAR * 10 + FOO))))))))));