[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