On Fri, Nov 12, 1999 at 20:45:10 -0800, Paul Eggert wrote:
> 
>    Date: Fri, 12 Nov 1999 17:23:21 -0800
>    From: "David O'Brien" <[EMAIL PROTECTED]>
> 
>    I assume "--ignore-binary" or "--ignore-binary-files" would be the GNU
>    longopt.
> 
> Another possibility would be to follow the example of the existing
> --directories=ACTION option, e.g. something like this:
> 
> --binary-files=ACTION      how to handle binary files
>                            ACTION is 'read', 'skip', or 'summarize' (default)
> -I                         equivalent to --binary-files=skip
> -a, --text                 equivalent to --binary-files=read
> 
Paul, could you please consider applying the following patch (it is against
virgin grep-2.4 sources).  Could you please also let me know when the Alpha
with this feature will be made available, so I could import it into FreeBSD.
Or maybe tell me an address of appropriate "announce" mailing list...


Thanks,
-- 
Ruslan Ermilov          Sysadmin and DBA of the
[EMAIL PROTECTED]        United Commercial Bank,
[EMAIL PROTECTED]          FreeBSD committer,
+380.652.247.647        Simferopol, Ukraine

http://www.FreeBSD.org  The Power To Serve
http://www.oracle.com   Enabling The Information Age
--- grep.c.orig Sat Nov 13 18:31:55 1999
+++ grep.c      Tue Jan  4 14:11:09 2000
@@ -60,7 +60,7 @@
 
 /* Short options.  */
 static char const short_options[] =
-"0123456789A:B:C::EFGHUVX:abcd:e:f:hiLlnqrsuvwxyZz";
+"0123456789A:B:C::EFGHIUVX:Y:abcd:e:f:hiLlnqrsuvwxyZz";
 
 /* Long options equivalences. */
 static struct option long_options[] =
@@ -68,6 +68,7 @@
   {"after-context", required_argument, NULL, 'A'},
   {"basic-regexp", no_argument, NULL, 'G'},
   {"before-context", required_argument, NULL, 'B'},
+  {"binary-files", required_argument, NULL, 'Y'},
   {"byte-offset", no_argument, NULL, 'b'},
   {"context", optional_argument, NULL, 'C'},
   {"count", no_argument, NULL, 'c'},
@@ -120,6 +121,14 @@
     SKIP_DIRECTORIES
   } directories;
 
+/* How to handle binary files.  */
+static enum
+  {
+    SUMMARIZE_BINARIES,
+    READ_BINARIES,
+    SKIP_BINARIES
+  } binaries;
+
 static int  ck_atoi PARAMS ((char const *, int *));
 static void usage PARAMS ((int)) __attribute__((noreturn));
 static void error PARAMS ((const char *, int));
@@ -476,7 +485,6 @@
 }
 
 /* Flags controlling the style of output. */
-static int always_text;                /* Assume the input is always text. */
 static int filename_mask;      /* If zero, output nulls after filenames.  */
 static int out_quiet;          /* Suppress all normal output. */
 static int out_invert;         /* Print nonmatching stuff. */
@@ -732,11 +740,14 @@
       return nlines;
     }
 
-  not_text = (! (always_text | out_quiet)
+  not_text = (binaries != READ_BINARIES
              && memchr (bufbeg, eol ? '\0' : '\200', buflim - bufbeg));
   done_on_match += not_text;
   out_quiet += not_text;
 
+  if (not_text && binaries == SKIP_BINARIES)
+    goto finish_grep;
+
   for (;;)
     {
       lastnl = bufbeg;
@@ -993,10 +1004,13 @@
   -H, --with-filename       print the filename for each match\n\
   -h, --no-filename         suppress the prefixing filename on output\n\
   -q, --quiet, --silent     suppress all normal output\n\
-  -a, --text                do not suppress binary output\n\
   -d, --directories=ACTION  how to handle directories\n\
                             ACTION is 'read', 'recurse', or 'skip'.\n\
   -r, --recursive           equivalent to --directories=recurse.\n\
+  -Y, --binary-files=ACTION how to handle binary files\n\
+                            ACTION is 'summarize' (default), 'read', or 'skip'.
+  -a, --text                equivalent to --binary-files=read\n\
+  -I                        equivalent to --binary-files=skip\n\
   -L, --files-without-match only print FILE names containing no match\n\
   -l, --files-with-matches  only print FILE names containing matches\n\
   -c, --count               only print a count of matching lines per FILE\n\
@@ -1276,7 +1290,7 @@
        setmatcher (optarg);
        break;
       case 'a':
-       always_text = 1;
+       binaries = READ_BINARIES;
        break;
       case 'b':
        out_byte = 1;
@@ -1326,6 +1340,9 @@
       case 'h':
        no_filenames = 1;
        break;
+      case 'I':
+       binaries = SKIP_BINARIES;
+       break;
       case 'i':
       case 'y':                        /* For old-timers . . . */
        match_icase = 1;
@@ -1363,6 +1380,16 @@
        break;
       case 'x':
        match_lines = 1;
+       break;
+      case 'Y':
+       if (strcmp (optarg, "summarize") == 0)
+         binaries = SUMMARIZE_BINARIES;
+       else if (strcmp (optarg, "read") == 0)
+         binaries = READ_BINARIES;
+       else if (strcmp (optarg, "skip") == 0)
+         binaries = SKIP_BINARIES;
+       else
+         fatal (_("unknown binary-files method"), 0);
        break;
       case 'Z':
        filename_mask = 0;

Reply via email to