Print this page
3737 grep does not support -H option
3759 egrep(1) and fgrep(1) -s flag does not hide -c output
Reviewed by: Albert Lee <trisk@nexenta.com>
Reviewed by: Andy Stormont <andyjstormont@gmail.com>

@@ -34,10 +34,14 @@
  *
  */
 
 /* Copyright 2012 Nexenta Systems, Inc.  All rights reserved. */
 
+/*
+ * Copyright 2013 Damian Bogel. All rights reserved.
+ */
+
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <stdarg.h>
 #include <regex.h>

@@ -52,10 +56,12 @@
 #include <unistd.h>
 #include <wctype.h>
 #include <ftw.h>
 #include <sys/param.h>
 
+#define STDIN_FILENAME gettext("(standard input)")
+
 #define BSIZE           512             /* Size of block for -b */
 #define BUFSIZE         8192            /* Input buffer size */
 #define MAX_DEPTH       1000            /* how deep to recurse */
 
 #define M_CSETSIZE      256             /* singlebyte chars */

@@ -78,10 +84,11 @@
 static uchar_t  fgrep = 0;              /* Invoked as fgrep */
 static uchar_t  egrep = 0;              /* Invoked as egrep */
 static uchar_t  nvflag = 1;             /* Print matching lines */
 static uchar_t  cflag;                  /* Count of matches */
 static uchar_t  iflag;                  /* Case insensitve matching */
+static uchar_t  Hflag;                  /* Precede lines by file name */
 static uchar_t  hflag;                  /* Supress printing of filename */
 static uchar_t  lflag;                  /* Print file names of matches */
 static uchar_t  nflag;                  /* Precede lines by line number */
 static uchar_t  rflag;                  /* Search directories recursively */
 static uchar_t  bflag;                  /* Preccede matches by block number */

@@ -153,11 +160,11 @@
                 if (*ap == 'f' || *ap == 'F') {
                         fgrep++;
                 }
         }
 
-        while ((c = getopt(argc, argv, "vwchilnrbse:f:qxEFIR")) != EOF) {
+        while ((c = getopt(argc, argv, "vwchHilnrbse:f:qxEFIR")) != EOF) {
                 switch (c) {
                 case 'v':       /* POSIX: negate matches */
                         nvflag = 0;
                         break;
 

@@ -214,13 +221,21 @@
                                     cmdname);
                                 exit(2);
                         }
                         *(file_list + n_file - 1) = optarg;
                         break;
+
+                /* based on options order h or H is set as in GNU grep */
                 case 'h':       /* Solaris: supress printing of file name */
                         hflag = 1;
+                        Hflag = 0;
                         break;
+                /* Solaris: precede every matching with file name */
+                case 'H':
+                        Hflag = 1;
+                        hflag = 0;
+                        break;
 
                 case 'q':       /* POSIX: quiet: status only */
                         qflag++;
                         break;
 

@@ -292,10 +307,16 @@
          */
         if (Eflag && Fflag)
                 usage();
 
         /*
+         * -l overrides -H like in GNU grep
+         */
+        if (lflag)
+                Hflag = 0;
+
+        /*
          * -c, -l and -q flags are mutually exclusive
          * We have -c override -l like in Solaris.
          * -q overrides -l & -c programmatically in grep() function.
          */
         if (cflag && lflag)

@@ -344,13 +365,13 @@
          */
         fixpatterns();
 
         /* Process all files: stdin, or rest of arg list */
         if (argc < 2) {
-                matched = grep(0, gettext("(standard input)"));
+                matched = grep(0, STDIN_FILENAME);
         } else {
-                if (argc > 2 && hflag == 0)
+                if (Hflag || (argc > 2 && hflag == 0))
                         outfn = 1;      /* Print filename on match line */
                 for (argv++; *argv != NULL; argv++) {
                         process_path(*argv);
                 }
         }

@@ -1110,11 +1131,11 @@
                         if (lflag) {
                                 (void) printf("%s\n", fn);
                                 break;
                         }
                         if (!cflag) {
-                                if (outfn) {
+                                if (Hflag || outfn) {
                                         (void) printf("%s:", fn);
                                 }
                                 if (bflag) {
                                         (void) printf("%lld:", (offset_t)
                                             (line_offset / BSIZE));

@@ -1137,11 +1158,11 @@
                 line_offset += line_len + 1;
                 ptr = ptrend + 1;
         }
 
         if (cflag) {
-                if (outfn) {
+                if (Hflag || outfn) {
                         (void) printf("%s:", fn);
                 }
                 if (!qflag) {
                         (void) printf("%lld\n", matches);
                 }

@@ -1156,49 +1177,49 @@
 usage(void)
 {
         if (egrep || fgrep) {
                 (void) fprintf(stderr, gettext("Usage:\t%s"), cmdname);
                 (void) fprintf(stderr,
-                    gettext(" [-c|-l|-q] [-r|-R] [-bhinsvx] "
+                    gettext(" [-c|-l|-q] [-r|-R] [-bhHinsvx] "
                     "pattern_list [file ...]\n"));
 
                 (void) fprintf(stderr, "\t%s", cmdname);
                 (void) fprintf(stderr,
-                    gettext(" [-c|-l|-q] [-r|-R] [-bhinsvx] "
+                    gettext(" [-c|-l|-q] [-r|-R] [-bhHinsvx] "
                     "[-e pattern_list]... "
                     "[-f pattern_file]... [file...]\n"));
         } else {
                 (void) fprintf(stderr, gettext("Usage:\t%s"), cmdname);
                 (void) fprintf(stderr,
-                    gettext(" [-c|-l|-q] [-r|-R] [-bhinsvwx] "
+                    gettext(" [-c|-l|-q] [-r|-R] [-bhHinsvwx] "
                     "pattern_list [file ...]\n"));
 
                 (void) fprintf(stderr, "\t%s", cmdname);
                 (void) fprintf(stderr,
-                    gettext(" [-c|-l|-q] [-r|-R] [-bhinsvwx] "
+                    gettext(" [-c|-l|-q] [-r|-R] [-bhHinsvwx] "
                     "[-e pattern_list]... "
                     "[-f pattern_file]... [file...]\n"));
 
                 (void) fprintf(stderr, "\t%s", cmdname);
                 (void) fprintf(stderr,
-                    gettext(" -E [-c|-l|-q] [-r|-R] [-bhinsvx] "
+                    gettext(" -E [-c|-l|-q] [-r|-R] [-bhHinsvx] "
                     "pattern_list [file ...]\n"));
 
                 (void) fprintf(stderr, "\t%s", cmdname);
                 (void) fprintf(stderr,
-                    gettext(" -E [-c|-l|-q] [-r|-R] [-bhinsvx] "
+                    gettext(" -E [-c|-l|-q] [-r|-R] [-bhHinsvx] "
                     "[-e pattern_list]... "
                     "[-f pattern_file]... [file...]\n"));
 
                 (void) fprintf(stderr, "\t%s", cmdname);
                 (void) fprintf(stderr,
-                    gettext(" -F [-c|-l|-q] [-r|-R] [-bhinsvx] "
+                    gettext(" -F [-c|-l|-q] [-r|-R] [-bhHinsvx] "
                     "pattern_list [file ...]\n"));
 
                 (void) fprintf(stderr, "\t%s", cmdname);
                 (void) fprintf(stderr,
-                    gettext(" -F [-c|-l|-q] [-bhinsvx] [-e pattern_list]... "
+                    gettext(" -F [-c|-l|-q] [-bhHinsvx] [-e pattern_list]... "
                     "[-f pattern_file]... [file...]\n"));
         }
         exit(2);
         /* NOTREACHED */
 }