From: Mark Wooding Date: Sun, 23 Apr 2023 14:47:00 +0000 (+0100) Subject: @@@ wip@g X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/commitdiff_plain/65135ebd123c8d8de32f570206d9b5945bf6dee9 @@@ wip@g --- diff --git a/utils/control.h b/utils/control.h index 433d57b..fdc7125 100644 --- a/utils/control.h +++ b/utils/control.h @@ -57,10 +57,10 @@ * 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@ * @@ -78,8 +78,9 @@ */ #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@ @@ -92,8 +93,8 @@ */ #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 (;;) \ @@ -115,11 +116,12 @@ #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); \ diff --git a/utils/t/control-test.c b/utils/t/control-test.c index f5f4312..28fa4ba 100644 --- a/utils/t/control-test.c +++ b/utils/t/control-test.c @@ -61,20 +61,21 @@ static void laststep(int s, const char *where) 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); diff --git a/utils/tests.at b/utils/tests.at index affde41..88b3b5f 100644 --- a/utils/tests.at +++ b/utils/tests.at @@ -39,7 +39,17 @@ AT_CLEANUP ## control AT_SETUP([utilities: control]) AT_KEYWORDS([utils control]) -AT_CHECK([BUILDDIR/t/control.t], [0]) +AT_DATA([expout], +[19 +buzz +fizz +22 +23 +fizz +buzz +26 +]) +AT_CHECK([BUILDDIR/t/control.t], [0], [expout]) AT_CLEANUP ## exc