aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-03 20:34:41 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-03 20:34:41 -0700
commitfdda5c19432ad7dc7f1b1823a058f6444f463372 (patch)
tree61cf6371e4ffbfc1ac6b1c638b4aff72fbee2844 /pw.c
parent906d31bf059bd206ef6054c668fe10b93f33b336 (diff)
downloadpw-fdda5c19432ad7dc7f1b1823a058f6444f463372.tar.gz
pw-fdda5c19432ad7dc7f1b1823a058f6444f463372.tar.bz2
pw-fdda5c19432ad7dc7f1b1823a058f6444f463372.zip
New -g option to pre-load the grep stack.
Diffstat (limited to 'pw.c')
-rw-r--r--pw.c32
1 files changed, 31 insertions, 1 deletions
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"
"<command> 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();
}