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>
@@ -31,10 +31,14 @@
/* All Rights Reserved */
/* Copyright 2012 Nexenta Systems, Inc. All rights reserved. */
/*
+ * Copyright 2013 Damian Bogel. All rights reserved.
+ */
+
+/*
* grep -- print lines matching (or not matching) a pattern
*
* status returns:
* 0 - ok, and some matches
* 1 - ok, but no matches
@@ -71,10 +75,12 @@
"Illegal byte sequence.",
"Unknown regexp error code!!",
NULL
};
+#define STDIN_FILENAME gettext("(standard input)")
+
#define errmsg(msg, arg) (void) fprintf(stderr, gettext(msg), arg)
#define BLKSIZE 512
#define GBUFSIZ 8192
#define MAX_DEPTH 1000
@@ -92,10 +98,11 @@
static int vflag;
static int sflag;
static int iflag;
static int wflag;
static int hflag;
+static int Hflag;
static int qflag;
static int errflg;
static int nfile;
static long long tln;
static int nsucc;
@@ -121,15 +128,22 @@
#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
#endif
(void) textdomain(TEXT_DOMAIN);
- while ((c = getopt(argc, argv, "hqblcnRrsviyw")) != -1)
+ while ((c = getopt(argc, argv, "hHqblcnRrsviyw")) != -1)
switch (c) {
+ /* based on options order h or H is set as in GNU grep */
case 'h':
hflag++;
+ Hflag = 0; /* h excludes H */
break;
+ case 'H':
+ if (!lflag) /* H is excluded by l */
+ Hflag++;
+ hflag = 0; /* H excludes h */
+ break;
case 'q': /* POSIX: quiet: status only */
qflag++;
break;
case 'v':
vflag++;
@@ -152,10 +166,11 @@
case 's':
sflag++;
break;
case 'l':
lflag++;
+ Hflag = 0; /* l excludes H */
break;
case 'y':
case 'i':
iflag++;
break;
@@ -165,11 +180,11 @@
case '?':
errflg++;
}
if (errflg || (optind >= argc)) {
- errmsg("Usage: grep [-c|-l|-q] [-r|-R] -hbnsviw "
+ errmsg("Usage: grep [-c|-l|-q] [-r|-R] -hHbnsviw "
"pattern file . . .\n",
(char *)NULL);
exit(2);
}
@@ -297,13 +312,14 @@
if ((linebuf = malloc(fw_lPrntBufLen)) == NULL) {
exit(2); /* out of memory - BAIL */
}
}
- if (file == NULL)
+ if (file == NULL) {
temp = 0;
- else if ((temp = open(file + base, O_RDONLY)) == -1) {
+ file = STDIN_FILENAME;
+ } else if ((temp = open(file + base, O_RDONLY)) == -1) {
if (!sflag)
errmsg("grep: can't open %s\n", file);
nsucc = 2;
return;
}
@@ -311,11 +327,11 @@
/* read in first block of bytes */
if ((count = read(temp, prntbuf, GBUFSIZ)) <= 0) {
(void) close(temp);
if (cflag && !qflag) {
- if (nfile > 1 && !hflag && file)
+ if (Hflag || (nfile > 1 && !hflag))
(void) fprintf(stdout, "%s:", file);
if (!rflag)
(void) fprintf(stdout, "%lld\n", tln);
}
return;
@@ -408,12 +424,12 @@
offset = 0;
}
(void) close(temp);
if (cflag && !qflag) {
- if (!hflag && file && (nfile > 1 ||
- (rflag && outfn)))
+ if (Hflag || (!hflag && ((nfile > 1) ||
+ (rflag && outfn))))
(void) fprintf(stdout, "%s:", file);
(void) fprintf(stdout, "%lld\n", tln);
}
}
@@ -421,13 +437,10 @@
succeed(const char *f)
{
int nchars;
nsucc = (nsucc == 2) ? 2 : 1;
- if (f == NULL)
- f = "<stdin>";
-
if (qflag) {
/* no need to continue */
return (1);
}
@@ -439,11 +452,11 @@
if (lflag) {
(void) fprintf(stdout, "%s\n", f);
return (1);
}
- if (!hflag && (nfile > 1 || (rflag && outfn))) {
+ if (Hflag || (!hflag && (nfile > 1 || (rflag && outfn)))) {
/* print filename */
(void) fprintf(stdout, "%s:", f);
}
if (bflag)