From fdda5c19432ad7dc7f1b1823a058f6444f463372 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 3 May 2022 20:34:41 -0700 Subject: New -g option to pre-load the grep stack. --- pw.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'pw.c') diff --git a/pw.c b/pw.c index c9d9bbf..8da30a4 100644 --- a/pw.c +++ b/pw.c @@ -245,6 +245,7 @@ static void usage(void) "-d do not quit on end-of-input\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" " represents an arbitrary command that generates the\n" "output to be monitored by %s.\n\n" "Standard input must be redirected; it cannot be the same device\n" @@ -725,7 +726,7 @@ int main(int argc, char **argv) } } - while ((opt = getopt(argc, argv, "n:i:l:dEB")) != -1) { + while ((opt = getopt(argc, argv, "n:i:l:dEBg:")) != -1) { switch (opt) { case 'n': { @@ -761,6 +762,35 @@ int main(int argc, char **argv) case 'B': regex_flags = 0; break; + case 'g': + { + grep *gr = &grepstack[ngrep]; + char *pat = optarg; + int inv = 0; + + if (ngrep >= maxgrep) { + error("too many patterns specified with -g\n"); + return EXIT_FAILURE; + } + + if (*pat == '!') { + inv = 1; + pat++; + } else if (strncmp(pat, "\\!", 2) == 0) { + pat++; + } + + if ((grinit(gr, dsdup(pat), inv, dsdrop)) != 0) { + char grmsg[cmdsize]; + grerrstr(gr, grmsg, sizeof grmsg); + error("-%c option: bad pattern %s: %s\n", opt, pat, grmsg); + return EXIT_FAILURE; + } + + ngrep++; + stat |= stat_grep; + } + break; default: usage(); } -- cgit v1.2.3