chiark / gitweb /
@@@ wip@g
authorMark Wooding <mdw@distorted.org.uk>
Sun, 23 Apr 2023 14:47:00 +0000 (15:47 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 23 Apr 2023 22:58:36 +0000 (23:58 +0100)
utils/control.h
utils/t/control-test.c
utils/tests.at

index 433d57bb3ac883d3f9f82354ab0879ac8453a8df..fdc712584f53a27f82bcb45ea274ce522f5fb3c9 100644 (file)
  * 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 (;;)                                                 \
 #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);        \
index f5f4312f87a0bd531c0acd805618443d84480c0a..28fa4ba7364e5a54b6092005e780ef5b40aabf20 100644 (file)
@@ -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);
index affde41ef96e8d61b241d7bd9d95f79eca8a457c..88b3b5ffb56d80e5f91f0e85feff68b4a0b32d1f 100644 (file)
@@ -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