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>
@@ -30,13 +30,13 @@
/* All Rights Reserved */
/* Copyright (c) 1987, 1988 Microsoft Corporation */
/* All Rights Reserved */
-%{
-#pragma ident "%Z%%M% %I% %E% SMI"
-%}
+/*
+ * Copyright 2013 Damian Bogel. All rights reserved.
+ */
/*
* egrep -- print lines containing (or not containing) a regular expression
*
* status returns:
@@ -59,10 +59,12 @@
#include <widec.h>
#include <stdlib.h>
#include <limits.h>
#include <locale.h>
+#define STDIN_FILENAME gettext("(standard input)")
+
#define BLKSIZE 512 /* size of reported disk blocks */
#define EBUFSIZ 8192
#define MAXLIN 350
#define NCHARS 256
#define MAXPOS 4000
@@ -108,15 +110,16 @@
long long lnum;
int bflag;
int cflag;
int eflag;
int fflag;
+int Hflag;
int hflag;
int iflag;
int lflag;
int nflag;
-int sflag;
+int qflag;
int vflag;
int nfile;
long long blkno;
long long tln;
int nsucc;
@@ -642,11 +645,11 @@
}
return;
}
}
-#define USAGE "[ -bchilnsv ] [ -e exp ] [ -f file ] [ strings ] [ file ] ..."
+#define USAGE "[ -bchHilnsqv ] [ -e exp ] [ -f file ] [ strings ] [ file ] ..."
int
main(int argc, char **argv)
{
char c;
@@ -658,11 +661,11 @@
#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, "ybcie:f:hlnvs")) != -1)
+ while((c = getopt(argc, argv, "ybcie:f:Hhlnvsq")) != -1)
switch(c) {
case 'b':
bflag++;
continue;
@@ -684,29 +687,38 @@
gettext("egrep: can't open %s\n"), optarg);
exit(2);
}
continue;
+ case 'H':
+ if (!lflag) /* H is excluded by l as in GNU grep */
+ Hflag++;
+ hflag = 0; /* H excludes h */
+ continue;
+
case 'h':
hflag++;
+ Hflag = 0; /* h excludes H */
continue;
case 'y':
case 'i':
iflag++;
continue;
case 'l':
lflag++;
+ Hflag = 0; /* l excludes H */
continue;
case 'n':
nflag++;
continue;
- case 's':
- sflag++;
+ case 'q':
+ case 's': /* Solaris: legacy option */
+ qflag++;
continue;
case 'v':
vflag++;
continue;
@@ -797,20 +809,20 @@
gettext("egrep: can't open %s\n"), file);
badbotch=1;
return;
}
} else {
- file = "<stdin>";
f = stdin;
+ file = STDIN_FILENAME;
}
lnum = 1;
tln = 0;
if((count = read(fileno(f), buf, EBUFSIZ)) <= 0) {
fclose(f);
- if (cflag) {
- if (nfile>1 && !hflag)
+ if (cflag && !qflag) {
+ if (Hflag || (nfile > 1 && !hflag))
fprintf(stdout, "%s:", file);
fprintf(stdout, "%lld\n", tln);
}
return;
}
@@ -900,23 +912,23 @@
}
succ = vflag;
break;
}
}
- if(succ) {
+ if (succ) {
nsucc = 1;
- if (cflag) tln++;
- else if (sflag)
- ; /* ugh */
- else if (lflag) {
- printf("%s\n", file);
+ if (lflag || qflag) {
+ if (!qflag)
+ (void) printf("%s\n", file);
fclose(f);
return;
}
- else {
- if (nfile > 1 && !hflag)
- printf(gettext("%s:"), file);
+ if (cflag) {
+ tln++;
+ } else {
+ if (Hflag || (nfile > 1 && !hflag))
+ printf("%s:", file);
if (bflag) {
nchars = blkno - (buf + count - ptrend) - 2;
if(nlflag)
nchars++;
printf("%lld:", nchars/BLKSIZE);
@@ -942,13 +954,13 @@
lnum++;
if (reinit == 1)
clearg();
}
fclose(f);
- if (cflag) {
- if (nfile > 1 && !hflag)
- printf(gettext("%s:"), file);
+ if (cflag && !qflag) {
+ if (Hflag || (nfile > 1 && !hflag))
+ printf("%s:", file);
printf("%lld\n", tln);
}
}
void