add a keypressed recorder to ease testing
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 5 Jul 2024 15:54:41 +0000 (17:54 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 5 Jul 2024 15:54:41 +0000 (17:54 +0200)
checkers.c

index 86b9759db4af60ed4bf758b32252fdb7764a30fb..1c381230ea85fa598563fe3a1fde37d867f0fb39 100644 (file)
@@ -22,6 +22,7 @@ char *version = "0.1";
 
 char *boardname = "10x10";
 char *filename = NULL;
+int maxnbrecords = 0;
 int scale = 2;
 
 int xoffset = 1;
@@ -48,6 +49,7 @@ int usage (int ret)
     fprintf (fd, " -h: help message\n");
     fprintf (fd, " -f: file name (%s)\n", (filename) ? filename : "none");
     fprintf (fd, " -s: scale [0..3] (%d)\n", scale);
+    fprintf (fd, " -r: max nb records (%d)\n", maxnbrecords);
     fprintf (fd, " -v: verbose level (%d)\n", verbose);
     fprintf (fd, "%s version %s\n", progname, version);
 
@@ -108,6 +110,14 @@ int main (int argc, char *argv[])
             }
             verbose = atoi (arg);
             break;
+        case 'r':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: missing max number of records\n", progname));
+                return usage (1);
+            }
+            maxnbrecords = atoi (arg);
+            break;
         case 'h':
         default:
             return usage (c != 'h');
@@ -148,6 +158,14 @@ int main (int argc, char *argv[])
     }
     setscale (board, scale);
 
+    /* init recorder */
+    int *rec = NULL;
+    if (maxnbrecords) {
+        rec = (int *) calloc (maxnbrecords, sizeof (int));
+        CHECKALLOC (rec);
+    }
+    int nbrecords = 0;
+
     /* init curses window */
     initscr ();
     noecho ();
@@ -212,6 +230,15 @@ int main (int argc, char *argv[])
         }
 
         int ch = getch ();
+        if (maxnbrecords) {
+            if (nbrecords < maxnbrecords) {
+                rec[nbrecords++] = ch;
+            } else {
+                memmove (rec + 1, rec, nbrecords - 1);
+                rec[nbrecords] = ch;
+            }
+        }
+
         switch (ch) {
         case ' ':
         case 'c':
@@ -364,6 +391,21 @@ int main (int argc, char *argv[])
     }
 
     endwin ();
+
+    if (nbrecords) {
+        int i;
+        printf ("records: ");
+        for (i = 0; i < nbrecords; i++) {
+            if ((rec[i] > 31) && (rec[i] < 128)) {
+                printf ("%c", rec[i]);
+            } else {
+                printf ("0x%x", rec[i]);
+            }
+        }
+        printf ("\n");
+    }
+
+    free (rec);
     freecache (cache);
     freeboard (board);
 
@@ -379,8 +421,10 @@ int main (int argc, char *argv[])
 /* test: solitaire.exe -h | grep usage */
 /* test: solitaire.exe -s 2>&1 | grep 'no scale' */
 /* test: solitaire.exe -s 4 2>&1 | grep incorrect */
+/* test: solitaire.exe -r 2>&1 | grep missing */
 /* test: solitaire.exe -v 2>&1 | grep missing */
 /* test: solitaire.exe _ 2>&1 | grep invalid */
-/* test: { echo lkji; sleep 1; echo -n q; } | solitaire.exe -v 4 */
+/* test: { echo -n lkji; sleep 1; echo -n q; } | solitaire.exe -v 4 */
+/* test: { echo -n lllclvkkliciv; sleep 1; echo -n ijjjkkclv; sleep 1; echo -n llicijkxxccjkv; sleep 1; echo -n q; } | solitaire.exe */
 
 /* vim: set ts=4 sw=4 et: */