X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/e6591bec0938b76b8c02083eb6ba101aba4e1b7e..2edecb46edfcdc4b25c9d12bcfe23a5d66ec3f33:/utils/t/control-test.c?ds=sidebyside diff --git a/utils/t/control-test.c b/utils/t/control-test.c index f5f4312..d69572b 100644 --- a/utils/t/control-test.c +++ b/utils/t/control-test.c @@ -53,28 +53,49 @@ static void check_step(int s, const char *where) static void laststep(int s, const char *where) { check_step(s, where); step = 0; } +#define FORELSE(head) \ + MC_GOTO(top) \ + MC_LABEL(out) MC_ACT({ ; }) \ + MC_LABEL(top) ALLOWELSE(els) \ + AFTER(outer, { GOELSE(els); }) \ + for (head) \ + WRAP(inner, { ; }, \ + { ; }, \ + { MC_GOTO(out); }) + #define FOR_FIZZBUZZ(var, base, limit) \ - FIRSTBRANCH(fizzbuzz0) GOBRANCH(fizzbuzz2); \ - MIDBRANCH(fizzbuzz1) ; \ - LASTBRANCH(fizzbuzz2) \ - DECL(fizzbuzz3, int _i = base COMMA _limit = limit) \ - 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); }) + MC_GOTO(top) \ + MC_LABEL(out) MC_ACT({ ; }) \ + MC_LABEL(top) DECL(bounds, \ + int _i = base COMMA _limit = limit) \ + for (; _i < _limit; _i++) \ + DECL(buf, char _buf[24]) \ + DECL(var, const char *var) \ + WRAP(wrap, { \ + 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; \ + } \ + }, \ + { ; }, \ + { MC_GOTO(out); }) int main(void) { - BEFORE(before0, { STEP(0); };) STEP(1); - AFTER(after0, { STEP(3); };) STEP(2); + int i; + + BEFORE(before0, { STEP(0); }) STEP(1); + AFTER(after0, { STEP(3); }) STEP(2); LASTSTEP(4); WRAP(wrap0, { STEP(0); }, { STEP(2); }, { MISSTEP; }) STEP(1); @@ -82,10 +103,51 @@ int main(void) LASTSTEP(6); STEP(0); - DECL(decl0, int i = 1) STEP(i); + for (;;) { + AFTER(after1, { STEP(2); break; }) STEP(1); + MISSTEP; break; + } + LASTSTEP(3); + + FORELSE (i = 0; i < 10; i++) { + STEP(i); + if (i == 7) break; + } else + MISSTEP; + LASTSTEP(8); + + FORELSE (i = 0; i < 10; i++) { + STEP(i); + if (i == 12) break; + } else + STEP(10); + LASTSTEP(11); + +#define TEST \ + MC_ACT({ STEP(0); MC_GOTO(in_plain); }) \ + MC_LABEL(done_plain) MC_ACT({ STEP(5); GOELSE(elsie); }) \ + MC_LABEL(in_plain) WRAP(outer_wrap, { STEP(1); }, \ + { STEP(7); }, \ + { MISSTEP; }) \ + ALLOWELSE(elsie) \ + WRAP(inner_wrap, { STEP(2); }, \ + { STEP(4); \ + MC_GOTO(done_plain); }, \ + { MISSTEP; }) \ + STEP(3); \ + else \ + STEP(6); \ + LASTSTEP(8); + TEST +#undef TEST + +#if __STDC_VERSION__ >= 199901 || defined(__cplusplus) + STEP(0); + DECL(decl0, int j = 1) STEP(j); LASTSTEP(2); +#endif - FOR_FIZZBUZZ(fb, 19, 27) printf("%s\n", fb); + FOR_FIZZBUZZ(fb, 19, 32) printf("%s\n", fb); return (rc); }