On Sat, Jul 20, 2013 at 11:42:48AM -0500, Strake wrote: > # HG changeset patch > # User Strake > # Date 1374338194 18000 > # Node ID 24cd187521c1c89f16cddb9b346c1da7e900ecdd > # Parent 1cf9c28012a76dd30cd1a7fcba8251b189d7df5a > grep > > partly due to Isaac Dunham > See inline comments below. > diff -r 1cf9c28012a7 -r 24cd187521c1 toys/pending/grep.c > --- a/toys/pending/grep.c Wed Jul 17 17:27:14 2013 -0500 > +++ b/toys/pending/grep.c Sat Jul 20 11:36:34 2013 -0500 > @@ -5,13 +5,13 @@ > * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ > * See > http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html > > -USE_GREP(NEWTOY(grep, "EFhinovclqe*f*m#", TOYFLAG_BIN)) > +USE_GREP(NEWTOY(grep, "EFHahinosvclqe*f*m#", TOYFLAG_BIN)) > > config GREP > bool "grep" > default n > help > - usage: grep [-clq] [-EFhinov] (-e RE | -f REfile | RE) [file...] > + usage: grep [-clq] [-EFHhinosv] (-e RE | -f REfile | RE) [file...] > > modes: > default: print lines from each file what match regular expression RE. > @@ -22,20 +22,18 @@ > flags: > -E: extended RE syntax > -F: fixed RE syntax, i.e. all characters literal > + -H: print file name > -h: not print file name > -i: case insensitive > -n: print line numbers > -o: print only matching part > + -s: keep silent on error > -v: invert match > */ > > #define FOR_grep > #include "toys.h" > #include <regex.h> > -#include <err.h> > - > -/* could be in GLOBALS but so need initialization code */ > -static int c = 1; > > static regex_t re; /* fails in GLOBALS */ > > @@ -60,10 +58,12 @@ > > while (regexec (&re, y, 1, &match, atBOL ? 0 : REG_NOTBOL) == 0) { > if (atBOL) nMatch++; > - c = 0; atBOL = 0; > + toys.exitval = 0; > + atBOL = 0; > switch (TT.mode) { > case 'q': > - exit (0); > + toys.exitval = 0;
I don't think switch(TT.mode) is changing toys.exitval. > + xexit (); > case 'l': > if (!(toys.optflags & FLAG_h)) printf ("%s\n", name); > free (x); > @@ -121,7 +121,8 @@ > for (;;) { > if (getline (&x, &l, f) < 0) { > if (feof (f)) break; > - err (2, "failed to read"); > + toys.exitval = 2; > + perror_exit ("failed to read"); I'd think this should be "warn and see if there are more REs"... But I could be wrong. And this reminds me: Any particular reason that buildRE() needs to be a one-call monster that does all the regexes in a single pass? I would have thought that the code used to parse TT.eArgu could be shared with parsing each line of TT.fArgu. Also, Rob: does error_exit really need toys.exitval to be set? > } > y = x + strlen (x) - 1; > if (y[0] == '\n') y[0] = 0; > @@ -129,14 +130,17 @@ > y = toys.optflags & FLAG_F ? regfix (x) : x; > if (re_xs) re_xs = xastrcat (re_xs, "|"); > re_xs = xastrcat (re_xs, y); > - free (y); > + if (toys.optflags & FLAG_F) free (y); > } > free (x); > fclose (f); > } > > if (!re_xs) { > - if (toys.optc < 1) errx (2, "no RE"); > + if (toys.optc < 1) { > + toys.exitval = 2; > + error_exit ("no RE"); > + } > re_xs = toys.optflags & FLAG_F ? regfix (toys.optargs[0]) : > toys.optargs[0]; > toys.optc--; toys.optargs++; > } > @@ -144,7 +148,8 @@ > if (regcomp (&re, re_xs, > (toys.optflags & (FLAG_E | FLAG_F) ? REG_EXTENDED : 0) | > (toys.optflags & FLAG_i ? REG_ICASE : 0)) != 0) > { You can remove the != 0. > - errx (2, "bad RE"); > + toys.exitval = 2; > + error_exit ("bad RE"); > } > } > > @@ -155,8 +160,9 @@ > if (toys.optflags & FLAG_l) TT.mode = 'l'; > if (toys.optflags & FLAG_q) TT.mode = 'q'; > > - if (toys.optc > 0) loopfiles (toys.optargs, do_grep); > - else do_grep (0, "-"); > + if (!(toys.optflags & FLAG_H) && (toys.optc < 2)) toys.optflags |= FLAG_h; > > - exit (c); > + toys.exitval = 1; > + loopfiles_rw (toys.optargs, O_RDONLY, 0, toys.optflags & FLAG_s, do_grep); > + xexit (); > } _______________________________________________ Toybox mailing list Toybox@lists.landley.net http://lists.landley.net/listinfo.cgi/toybox-landley.net