* from the correspondingly tagged statement, and continues with the
* following statement again.
*/
-#define FIRSTBRANCH(tag) if (1) MCTRL__LABEL(tag): {
-#define MIDBRANCH(tag) } else if (0) MCTRL__LABEL(tag): {
-#define LASTBRANCH(tag) } else MCTRL__LABEL(tag):
-#define GOBRANCH(tag) goto MCTRL__LABEL(tag)
+#define FIRSTBRANCH(tag) if (1) { goto MCTRL__LABEL(tag); MCTRL__LABEL(tag):
+#define MIDBRANCH(tag) } else if (0) MCTRL__LABEL(tag): {
+#define LASTBRANCH(tag) } else MCTRL__LABEL(tag):
+#define GOBRANCH(tag) goto MCTRL__LABEL(tag)
/* @BEFORE(tag, stmt_0) stmt_1@
*
*/
#define AFTER(tag, stmt) \
if (1) goto MCTRL__LABEL(tag##__after_body); \
+ else if (1) { MCTRL__LABEL(tag##__after_end): stmt } \
else for (;;) \
- if (1) { stmt break; } \
+ if (1) goto MCTRL__LABEL(tag##__after_end); \
else MCTRL__LABEL(tag##__after_body):
/* @WRAP(tag, before, onend, onbreak) stmt@
*/
#define WRAP(tag, before, onend, onbreak) \
if (1) { before goto MCTRL__LABEL(tag##__wrap_body); } \
- else if (1) MCTRL__LABEL(tag##__wrap_end): onend \
- else if (1) MCTRL__LABEL(tag##__wrap_break): onbreak \
+ else if (1) { MCTRL__LABEL(tag##__wrap_end): onend } \
+ else if (1) { MCTRL__LABEL(tag##__wrap_break): onbreak } \
else for (;;) \
if (1) goto MCTRL__LABEL(tag##__wrap_break); \
else for (;;) \
#define ALLOWELSE(tag, before, onend, onbreak) \
if (1) goto MCTRL__LABEL(tag##__allowelse_body); \
else if (1) MCTRL__LABEL(tag##__allowelse_body_end): ; \
- else if (1) MCTRL__LABEL(tag##__allowelse_else_end): onend \
- else if (1) MCTRL__LABEL(tag##__allowelse_else_break): onbreak \
- else if (1) MCTRL__LABEL(tag##__allowelse_before_else): \
- { before goto MCTRL__LABEL(tag##__allowelse_else); } \
- else for (;;) \
+ else if (1) { MCTRL__LABEL(tag##__allowelse_else_end): onend } \
+ else if (1) { MCTRL__LABEL(tag##__allowelse_else_break): onbreak } \
+ else if (1) { \
+ MCTRL__LABEL(tag##__allowelse_before_else): \
+ before goto MCTRL__LABEL(tag##__allowelse_else); \
+ } else for (;;) \
if (1) goto MCTRL__LABEL(tag##__allowelse_else_break); \
else for (;;) \
if (1) goto MCTRL__LABEL(tag##__allowelse_else_end); \
for (; _i < _limit; _i++) \
DECL(fizzbuzz4, char _buf[24]) \
DECL(fizzbuzz5, const char *var) \
- WRAP(fizzbuzz6, \
- { switch (_i%15) { \
- case 0: var = "fizzbuzz"; break; \
- case 3: case 6: case 9: case 12: var = "fizz"; break; \
- case 5: case 10: var = "buzz"; break; \
- default: sprintf(_buf, "%d", _i); var = _buf; break; \
- } }, \
- { ; }, \
- { GOBRANCH(fizzbuzz1); })
+ WRAP(fizzbuzz6, { \
+ switch (_i%15) { \
+ case 0: var = "fizzbuzz"; break; \
+ case 3: case 6: case 9: case 12: var = "fizz"; break; \
+ case 5: case 10: var = "buzz"; break; \
+ default: sprintf(_buf, "%d", _i); var = _buf; break; \
+ } \
+ }, \
+ { ; }, \
+ { GOBRANCH(fizzbuzz1); })
int main(void)
{
- BEFORE(before0, { STEP(0); };) STEP(1);
- AFTER(after0, { STEP(3); };) STEP(2);
+ BEFORE(before0, { STEP(0); }) STEP(1);
+ AFTER(after0, { STEP(3); }) STEP(2);
LASTSTEP(4);
WRAP(wrap0, { STEP(0); }, { STEP(2); }, { MISSTEP; }) STEP(1);