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,40 **** --- 31,44 ---- /* 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,80 **** --- 75,86 ---- "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,101 **** --- 98,108 ---- 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,135 **** #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) switch (c) { case 'h': hflag++; break; case 'q': /* POSIX: quiet: status only */ qflag++; break; case 'v': vflag++; --- 128,149 ---- #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, "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,161 **** --- 166,176 ---- case 's': sflag++; break; case 'l': lflag++; + Hflag = 0; /* l excludes H */ break; case 'y': case 'i': iflag++; break;
*** 165,175 **** case '?': errflg++; } if (errflg || (optind >= argc)) { ! errmsg("Usage: grep [-c|-l|-q] [-r|-R] -hbnsviw " "pattern file . . .\n", (char *)NULL); exit(2); } --- 180,190 ---- case '?': errflg++; } if (errflg || (optind >= argc)) { ! errmsg("Usage: grep [-c|-l|-q] [-r|-R] -hHbnsviw " "pattern file . . .\n", (char *)NULL); exit(2); }
*** 297,309 **** if ((linebuf = malloc(fw_lPrntBufLen)) == NULL) { exit(2); /* out of memory - BAIL */ } } ! if (file == NULL) temp = 0; ! else if ((temp = open(file + base, O_RDONLY)) == -1) { if (!sflag) errmsg("grep: can't open %s\n", file); nsucc = 2; return; } --- 312,325 ---- if ((linebuf = malloc(fw_lPrntBufLen)) == NULL) { exit(2); /* out of memory - BAIL */ } } ! if (file == NULL) { temp = 0; ! 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,321 **** /* read in first block of bytes */ if ((count = read(temp, prntbuf, GBUFSIZ)) <= 0) { (void) close(temp); if (cflag && !qflag) { ! if (nfile > 1 && !hflag && file) (void) fprintf(stdout, "%s:", file); if (!rflag) (void) fprintf(stdout, "%lld\n", tln); } return; --- 327,337 ---- /* read in first block of bytes */ if ((count = read(temp, prntbuf, GBUFSIZ)) <= 0) { (void) close(temp); if (cflag && !qflag) { ! if (Hflag || (nfile > 1 && !hflag)) (void) fprintf(stdout, "%s:", file); if (!rflag) (void) fprintf(stdout, "%lld\n", tln); } return;
*** 408,419 **** offset = 0; } (void) close(temp); if (cflag && !qflag) { ! if (!hflag && file && (nfile > 1 || ! (rflag && outfn))) (void) fprintf(stdout, "%s:", file); (void) fprintf(stdout, "%lld\n", tln); } } --- 424,435 ---- offset = 0; } (void) close(temp); if (cflag && !qflag) { ! if (Hflag || (!hflag && ((nfile > 1) || ! (rflag && outfn)))) (void) fprintf(stdout, "%s:", file); (void) fprintf(stdout, "%lld\n", tln); } }
*** 421,433 **** succeed(const char *f) { int nchars; nsucc = (nsucc == 2) ? 2 : 1; - if (f == NULL) - f = "<stdin>"; - if (qflag) { /* no need to continue */ return (1); } --- 437,446 ----
*** 439,449 **** if (lflag) { (void) fprintf(stdout, "%s\n", f); return (1); } ! if (!hflag && (nfile > 1 || (rflag && outfn))) { /* print filename */ (void) fprintf(stdout, "%s:", f); } if (bflag) --- 452,462 ---- if (lflag) { (void) fprintf(stdout, "%s\n", f); return (1); } ! if (Hflag || (!hflag && (nfile > 1 || (rflag && outfn)))) { /* print filename */ (void) fprintf(stdout, "%s:", f); } if (bflag)