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,43 ****
--- 34,47 ----
*
*/
/* 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,61 ****
--- 56,67 ----
#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,87 ****
--- 84,94 ----
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,163 ****
if (*ap == 'f' || *ap == 'F') {
fgrep++;
}
}
! while ((c = getopt(argc, argv, "vwchilnrbse:f:qxEFIR")) != EOF) {
switch (c) {
case 'v': /* POSIX: negate matches */
nvflag = 0;
break;
--- 160,170 ----
if (*ap == 'f' || *ap == 'F') {
fgrep++;
}
}
! while ((c = getopt(argc, argv, "vwchHilnrbse:f:qxEFIR")) != EOF) {
switch (c) {
case 'v': /* POSIX: negate matches */
nvflag = 0;
break;
*** 214,226 ****
--- 221,241 ----
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,301 ****
--- 307,322 ----
*/
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,356 ****
*/
fixpatterns();
/* Process all files: stdin, or rest of arg list */
if (argc < 2) {
! matched = grep(0, gettext("(standard input)"));
} else {
! if (argc > 2 && hflag == 0)
outfn = 1; /* Print filename on match line */
for (argv++; *argv != NULL; argv++) {
process_path(*argv);
}
}
--- 365,377 ----
*/
fixpatterns();
/* Process all files: stdin, or rest of arg list */
if (argc < 2) {
! matched = grep(0, STDIN_FILENAME);
} else {
! if (Hflag || (argc > 2 && hflag == 0))
outfn = 1; /* Print filename on match line */
for (argv++; *argv != NULL; argv++) {
process_path(*argv);
}
}
*** 1110,1120 ****
if (lflag) {
(void) printf("%s\n", fn);
break;
}
if (!cflag) {
! if (outfn) {
(void) printf("%s:", fn);
}
if (bflag) {
(void) printf("%lld:", (offset_t)
(line_offset / BSIZE));
--- 1131,1141 ----
if (lflag) {
(void) printf("%s\n", fn);
break;
}
if (!cflag) {
! if (Hflag || outfn) {
(void) printf("%s:", fn);
}
if (bflag) {
(void) printf("%lld:", (offset_t)
(line_offset / BSIZE));
*** 1137,1147 ****
line_offset += line_len + 1;
ptr = ptrend + 1;
}
if (cflag) {
! if (outfn) {
(void) printf("%s:", fn);
}
if (!qflag) {
(void) printf("%lld\n", matches);
}
--- 1158,1168 ----
line_offset += line_len + 1;
ptr = ptrend + 1;
}
if (cflag) {
! if (Hflag || outfn) {
(void) printf("%s:", fn);
}
if (!qflag) {
(void) printf("%lld\n", matches);
}
*** 1156,1204 ****
usage(void)
{
if (egrep || fgrep) {
(void) fprintf(stderr, gettext("Usage:\t%s"), cmdname);
(void) fprintf(stderr,
! gettext(" [-c|-l|-q] [-r|-R] [-bhinsvx] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! gettext(" [-c|-l|-q] [-r|-R] [-bhinsvx] "
"[-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] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! gettext(" [-c|-l|-q] [-r|-R] [-bhinsvwx] "
"[-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] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! gettext(" -E [-c|-l|-q] [-r|-R] [-bhinsvx] "
"[-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] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! gettext(" -F [-c|-l|-q] [-bhinsvx] [-e pattern_list]... "
"[-f pattern_file]... [file...]\n"));
}
exit(2);
/* NOTREACHED */
}
--- 1177,1225 ----
usage(void)
{
if (egrep || fgrep) {
(void) fprintf(stderr, gettext("Usage:\t%s"), cmdname);
(void) fprintf(stderr,
! 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] [-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] [-bhHinsvwx] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! 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] [-bhHinsvx] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! 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] [-bhHinsvx] "
"pattern_list [file ...]\n"));
(void) fprintf(stderr, "\t%s", cmdname);
(void) fprintf(stderr,
! gettext(" -F [-c|-l|-q] [-bhHinsvx] [-e pattern_list]... "
"[-f pattern_file]... [file...]\n"));
}
exit(2);
/* NOTREACHED */
}