From 6f39215cd319f0b5982ae633cc94c7d2508466d8 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Fri, 20 Sep 2024 10:56:17 +0200 Subject: [PATCH] add keyboard recorder --- reversi.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/reversi.c b/reversi.c index 7e486cc..75e91ce 100644 --- a/reversi.c +++ b/reversi.c @@ -19,9 +19,10 @@ char *progname = NULL; char *version = "0.1"; +char *boardname = "8x8"; char *filename = NULL; +int maxnbrecords = 0; int scale = 1; -char *boardname = "8x8"; char *help = " 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 */ -- 2.30.2