[Toybox] [PATCH] grep: cleanup, add -Hs
Strake
strake888 at gmail.com
Sat Jul 20 09:42:48 PDT 2013
# HG changeset patch
# User Strake
# Date 1374338194 18000
# Node ID 24cd187521c1c89f16cddb9b346c1da7e900ecdd
# Parent 1cf9c28012a76dd30cd1a7fcba8251b189d7df5a
grep
partly due to Isaac Dunham
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;
+ 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");
}
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) {
- 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 ();
}
1374338568.0
More information about the Toybox
mailing list