aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-03 21:00:01 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-03 21:00:01 -0700
commit0d7b3425f8eb4c7754d8a18c438af0541fa9ba91 (patch)
treee3e39e1d1c8461b1f4965ec200234ead22221d4a /pw.c
parent81e976380e571f1df8c5a4bdc5f4387c9a684260 (diff)
downloadpw-0d7b3425f8eb4c7754d8a18c438af0541fa9ba91.tar.gz
pw-0d7b3425f8eb4c7754d8a18c438af0541fa9ba91.tar.bz2
pw-0d7b3425f8eb4c7754d8a18c438af0541fa9ba91.zip
Implement quit count safeguard.
Diffstat (limited to 'pw.c')
-rw-r--r--pw.c23
1 files changed, 21 insertions, 2 deletions
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) {