From 0d7b3425f8eb4c7754d8a18c438af0541fa9ba91 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 3 May 2022 21:00:01 -0700 Subject: Implement quit count safeguard. --- pw.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'pw.c') diff --git a/pw.c b/pw.c index 01dfd68..1c883ec 100644 --- a/pw.c +++ b/pw.c @@ -243,6 +243,7 @@ static void usage(void) "-l realnum long update interval (s)\n" "-n integer display size (# of lines)\n" "-d do not quit on end-of-input\n" + "-q integer Require this many repetitions of q to quit\n" "-E treat regular expressions as extended\n" "-B treat regular expressions as basic (default)\n\n" "-g [!]pattern add pattern to grep stack; ! inverts.\n\n" @@ -702,6 +703,7 @@ int main(int argc, char **argv) kbd_colon, kbd_result, kbd_trig }; int auto_quit = 1; + int quit_count = 1, quit_countdown = quit_count; int exit_status = EXIT_FAILURE; char cmdbuf[cmdsize], *curcmd = 0, *savedcmd = 0; #ifdef SIGWINCH @@ -726,7 +728,7 @@ int main(int argc, char **argv) } } - while ((opt = getopt(argc, argv, "n:i:l:dEBg:")) != -1) { + while ((opt = getopt(argc, argv, "n:i:l:dEBg:q:")) != -1) { switch (opt) { case 'n': { @@ -756,6 +758,15 @@ int main(int argc, char **argv) case 'd': auto_quit = 0; break; + case 'q': + { + char *err; + if ((quit_countdown = quit_count = getzp(optarg, &err)) < 0) { + error("-%c option: %s\n", opt, err); + return EXIT_FAILURE; + } + break; + } case 'E': regex_flags = REG_EXTENDED; break; @@ -1044,9 +1055,17 @@ int main(int argc, char **argv) curcmd = 0; // fallthrough case kbd_cmd: + if (ch != 'q' && ch != 3) + quit_countdown = quit_count; switch (ch) { case 'q': case 3: - kbd_state = kbd_exit; + if (--quit_countdown == 0) { + kbd_state = kbd_exit; + } else { + sprintf(cmdbuf, "%d more to quit", quit_countdown); + curcmd = cmdbuf; + kbd_state = kbd_result; + } break; case 'h': if (hpos >= 8) { -- cgit v1.2.3