add keyboard recorder
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 20 Sep 2024 08:56:17 +0000 (10:56 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 20 Sep 2024 08:56:17 +0000 (10:56 +0200)
reversi.c

index 7e486cce4b00dd07932ac030de0cd4e5a9b3e6dd..75e91ce26fe9fbeea3688be1fb1139d6e82d34c5 100644 (file)
--- a/reversi.c
+++ b/reversi.c
 char *progname = NULL;
 char *version = "0.1";
 
+char *boardname = "8x8";
 char *filename = NULL;
+int maxnbrecords = 0;
 int scale = 1;
-char *boardname = "8x8";
 
 char *help =
     "<i> Move up cursor\n"
@@ -38,10 +39,11 @@ char *help =
 int usage (int ret)
 {
     FILE *fd = ret ? stderr : stdout;
-    fprintf (fd, "usage: %s [-b] [-f file] [-h] [-s int] [-v int]\n", progname);
+    fprintf (fd, "usage: %s [-b] [-f file] [-h] [-r int] [-s int] [-v int]\n", progname);
     fprintf (fd, " -b: board form  [6x10, 5x12, 4x15, 3x20] (%s)\n", boardname);
     fprintf (fd, " -f: file name (%s)\n", (filename) ? filename : "none");
     fprintf (fd, " -h: help message\n");
+    fprintf (fd, " -r: max nb records (%d)\n", maxnbrecords);
     fprintf (fd, " -s: scale [0..3] (%d)\n", scale);
     fprintf (fd, " -v: verbose level (%d)\n", verbose);
     fprintf (fd, "%s version %s\n", progname, version);
@@ -87,6 +89,14 @@ int main (int argc, char *argv[])
             }
             filename = 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 's':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
@@ -141,6 +151,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 ();
@@ -205,6 +223,20 @@ int main (int argc, char *argv[])
 
         /* get key press */
         int ch = getch ();
+        
+        /* record key pressed */
+        if (maxnbrecords) {
+            if (nbrecords < maxnbrecords) {
+                rec[nbrecords++] = ch;
+            } else {
+                int i;
+                for (i = 0; i < nbrecords - 1; i++) {
+                    rec[i] = rec[i + 1];
+                }
+                //memmove (rec, rec + 1, nbrecords - 1);
+                rec[nbrecords - 1] = ch;
+            }
+        }
 
         /* general controls */
         switch (ch) {
@@ -277,9 +309,24 @@ int main (int argc, char *argv[])
 
     }
 
+    /* cleaning before quiting */
     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");
+    }
 
     freeboard (board);
+    free (rec);
 
     return 0;
 }
@@ -291,6 +338,7 @@ int main (int argc, char *argv[])
 /* test: reversi.exe -f nofile.pen 2>&1 | grep "can't read file" */
 /* test: reversi.exe -f bogus.pen 2>&1 | grep 'incorrect file' */
 /* test: reversi.exe -h | grep usage */
+/* test: reversi.exe -r 2>&1 | grep 'missing' */
 /* test: reversi.exe -s 2>&1 | grep 'no scale' */
 /* test: reversi.exe -s 4 2>&1 | grep incorrect */
 /* test: reversi.exe -v 2>&1 | grep missing */