playground feature
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 24 Jun 2024 14:58:16 +0000 (16:58 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 24 Jun 2024 14:58:16 +0000 (16:58 +0200)
gameoflife.c

index 03a96c2af4a17c1f6f53782e54e48b5c45226c0b..a39ed2139d2f3b080fe508f1323366306ebb721a 100644 (file)
@@ -23,7 +23,8 @@
 char *progname = NULL;
 char *version = "0.1";
 
-char *file = NULL;
+char *filename = NULL;
+char *playname = NULL;
 char mode = 'e';
 int speed = 5;
 int xsize = 0;
@@ -52,9 +53,9 @@ int usage (int ret)
 {
     FILE *fd = ret ? stderr : stdout;
     fprintf (fd, "usage: %s [-e file] [-h] [-p file] [-s tens] [-v level] [-x int] [-y int]\n", progname);
-    fprintf (fd, " -e: edit file (%s)\n", (file) ? file : "none");
+    fprintf (fd, " -e: edit file (%s)\n", (filename) ? filename : "none");
     fprintf (fd, " -h: help message\n");
-    fprintf (fd, " -p: play file (%s)\n", (file) ? file : "none");
+    fprintf (fd, " -p: play file (%s)\n", (playname) ? playname : "none");
     fprintf (fd, " -s: speed ĭn tens/sec (%d)\n", speed);
     fprintf (fd, " -v: verbose level (%d)\n", verbose);
     fprintf (fd, " -x: board height (%d)\n", xsize);
@@ -93,7 +94,7 @@ int main (int argc, char *argv[])
                 return usage (1);
             }
             mode = 'e';
-            file = arg;
+            filename = arg;
             break;
         case 'p':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
@@ -102,7 +103,7 @@ int main (int argc, char *argv[])
                 return usage (1);
             }
             mode = 'p';
-            file = arg;
+            playname = arg;
             break;
         case 's':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
@@ -151,22 +152,22 @@ int main (int argc, char *argv[])
         return 1;
     }
 
-    /* load data */
+    /* load element */
     char *buffer = NULL;
     board_t *element = NULL;
     int xelement = 0;
     int yelement = 0;
-    if (file) {
-        buffer = readdata (file);
+    if (filename) {
+        buffer = readdata (filename);
         if (buffer) {
             element = loadboard (buffer);
             if (element == NULL) {
-                VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", file));
+                VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", filename));
                 return 1;
             }
             free (buffer);
         } else {
-            VERBOSE (ERROR, fprintf (stderr, "can't read file (%s)\n", file));
+            VERBOSE (ERROR, fprintf (stderr, "can't read file (%s)\n", filename));
             return 1;
         }
     } else { /* mono cell */
@@ -174,6 +175,23 @@ int main (int argc, char *argv[])
         element->tab[0] = 'X';
     }
 
+    /* load playground */
+    board_t *playground = NULL;
+    if (playname) {
+        buffer = readdata (playname);
+        if (buffer) {
+            playground = loadboard (buffer);
+            if (playground == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", playname));
+                return 1;
+            }
+            free (buffer);
+        } else {
+            VERBOSE (ERROR, fprintf (stderr, "can't read file (%s)\n", playname));
+            return 1;
+        }
+    }
+
     /* init curses window */
     initscr ();
     noecho ();
@@ -192,7 +210,7 @@ int main (int argc, char *argv[])
     if (ysize <= 0) {
         ysize = ymax - 2 * (yoffset + 1);
     }
-    board_t *board = initboard (xsize, ysize);
+    board_t *board = (playground) ? resizeboard (playground, xsize, ysize) : initboard (xsize, ysize);
 
     /* window positions */
     int xboard = xoffset + 1;
@@ -213,11 +231,18 @@ int main (int argc, char *argv[])
         char *ptr = NULL;
 
         boardwindow (board, xboard, yboard, 1);
-        if (mode == 'e') {
+        switch (mode) {
+        case 'e':
+            halfdelay (0);
             rotateelement (element, rotate);
             mirrorelement (element, mirror);
             elementwindow (board, xboard, yboard, element, xelement, yelement);
+            break;
+        case 'p':
+            halfdelay (speed);
+            break;
         }
+
         rotate = 0;
         mirror = 0;
 
@@ -229,7 +254,6 @@ int main (int argc, char *argv[])
             case '\n':
             case '\r':
                 mode = 'p';
-                halfdelay (speed);
                 break;
             case 'c':
                 putelement (board, element, xelement, yelement, 1);
@@ -290,7 +314,6 @@ int main (int argc, char *argv[])
             case '\n':
             case '\r':
                 mode = 'e';
-                halfdelay (0);
                 break;
             case 'q':
                 stop = 1;
@@ -315,7 +338,9 @@ int main (int argc, char *argv[])
 /* test: gameoflife.exe -e nofile.gol 2>&1 | grep "can't read file" */
 /* test: gameoflife.exe -e bogus.gol 2>&1 | grep 'incorrect file' */
 /* test: gameoflife.exe -h | grep usage */
-/* test--: gameoflife.exe -p file.gol 2>&1 | grep 'not found' */
+/* test: gameoflife.exe -p 2>&1 | grep 'no play' */
+/* test: gameoflife.exe -p nofile.gol 2>&1 | grep "can't read file" */
+/* test: gameoflife.exe -p bogus.gol 2>&1 | grep 'incorrect file' */
 /* test: gameoflife.exe -s 2>&1 | grep 'no speed' */
 /* test: gameoflife.exe -s 0 2>&1 | grep 'incorrect speed' */
 /* test: gameoflife.exe -v 2>&1 | grep missing */
@@ -324,7 +349,8 @@ int main (int argc, char *argv[])
 /* test: gameoflife.exe _ 2>&1 | grep invalid */
 /* test: echo -n q | gameoflife.exe -e glider.gol */
 /* test: { echo clllldckkkrcjjjjcxfcilililecs; sleep 5; echo -n q; } | gameoflife.exe -e glider.gol -v 2 -s 2 */
-/* test: { echo icklckcjcjckjs; sleep 2; echo; sleep 1; echo -n q; } | gameoflife.exe -x 5 -y 5 */
+/* test: { echo icklckcjcjckjs; sleep 2; echo; sleep 1; echo -n q; } | gameoflife.exe -x 10 -y 10 */
+/* test: { echo; sleep 4; echo -n q; } | gameoflife -p board.gol -s 1 */
 /* test: { echo cllllrckkkkjjd; sleep 3; echo -n q; } | gameoflife.exe -e beehive.gol -s 1 */
 
 /* vim: set ts=4 sw=4 et: */