1 /* grep.c - main driver file for grep.
2 Copyright (C) 1992, 1997, 1998, 1999 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 /* Written July 1992 by Mike Haertel. */
20 /* Builtin decompression 1997 by Wolfram Schneider <wosch@FreeBSD.org>. */
22 /* $FreeBSD: src/gnu/usr.bin/grep/grep.c,v 1.20.2.1 2000/06/13 07:17:27 ru Exp $ */
23 /* $DragonFly: src/gnu/usr.bin/grep/grep.c,v 1.2 2003/06/17 04:25:45 dillon Exp $ */
28 #include <sys/types.h>
30 #if defined(HAVE_MMAP)
31 # include <sys/mman.h>
33 #if defined(HAVE_SETRLIMIT)
34 # include <sys/time.h>
35 # include <sys/resource.h>
40 #include "getpagesize.h"
45 #define MAX(A,B) ((A) > (B) ? (A) : (B))
53 /* base of chain of stat buffers, used to detect directory loops */
54 static struct stats stats_base;
56 /* if non-zero, display usage information and exit */
59 /* If non-zero, print the version on standard output and exit. */
60 static int show_version;
62 /* If nonzero, use mmap if possible. */
63 static int mmap_option;
65 /* If zero, output nulls after filenames. */
66 static int filename_mask;
69 static char const short_options[] =
70 "0123456789A:B:C::EFGHIRUVX:abcd:e:f:hiLlnqrsuvwxyZz";
72 /* Non-boolean long options that have no corresponding short equivalents. */
75 BINARY_FILES_OPTION = CHAR_MAX + 1
78 /* Long options equivalences. */
79 static struct option long_options[] =
81 {"after-context", required_argument, NULL, 'A'},
82 {"basic-regexp", no_argument, NULL, 'G'},
83 {"before-context", required_argument, NULL, 'B'},
84 {"binary-files", required_argument, NULL, BINARY_FILES_OPTION},
85 {"byte-offset", no_argument, NULL, 'b'},
86 {"context", optional_argument, NULL, 'C'},
87 {"count", no_argument, NULL, 'c'},
88 {"directories", required_argument, NULL, 'd'},
89 {"extended-regexp", no_argument, NULL, 'E'},
90 {"file", required_argument, NULL, 'f'},
91 {"files-with-matches", no_argument, NULL, 'l'},
92 {"files-without-match", no_argument, NULL, 'L'},
93 {"fixed-regexp", no_argument, NULL, 'F'},
94 {"fixed-strings", no_argument, NULL, 'F'},
95 {"help", no_argument, &show_help, 1},
96 {"ignore-case", no_argument, NULL, 'i'},
97 {"line-number", no_argument, NULL, 'n'},
98 {"line-regexp", no_argument, NULL, 'x'},
99 {"mmap", no_argument, &mmap_option, 1},
100 {"no-filename", no_argument, NULL, 'h'},
101 {"no-messages", no_argument, NULL, 's'},
103 {"decompress", no_argument, NULL, 'Z'},
104 {"null", no_argument, &filename_mask, 0},
106 {"null", no_argument, NULL, 'Z'},
108 {"null-data", no_argument, NULL, 'z'},
109 {"quiet", no_argument, NULL, 'q'},
110 {"recursive", no_argument, NULL, 'r'},
111 {"regexp", required_argument, NULL, 'e'},
112 {"invert-match", no_argument, NULL, 'v'},
113 {"silent", no_argument, NULL, 'q'},
114 {"text", no_argument, NULL, 'a'},
115 {"binary", no_argument, NULL, 'U'},
116 {"unix-byte-offsets", no_argument, NULL, 'u'},
117 {"version", no_argument, NULL, 'V'},
118 {"with-filename", no_argument, NULL, 'H'},
119 {"word-regexp", no_argument, NULL, 'w'},
123 /* Define flags declared in grep.h. */
128 unsigned char eolbyte;
130 /* For error messages. */
132 static char const *filename;
135 /* How to handle directories. */
143 static int ck_atoi PARAMS ((char const *, int *));
144 static void usage PARAMS ((int)) __attribute__((noreturn));
145 static void error PARAMS ((const char *, int));
146 static void setmatcher PARAMS ((char const *));
147 static int install_matcher PARAMS ((char const *));
148 static int prepend_args PARAMS ((char const *, char *, char **));
149 static void prepend_default_options PARAMS ((char const *, int *, char ***));
150 static char *page_alloc PARAMS ((size_t, char **));
151 static int reset PARAMS ((int, char const *, struct stats *));
152 static int fillbuf PARAMS ((size_t, struct stats *));
153 static int grepbuf PARAMS ((char *, char *));
154 static void prtext PARAMS ((char *, char *, int *));
155 static void prpending PARAMS ((char *));
156 static void prline PARAMS ((char *, char *, int));
157 static void print_offset_sep PARAMS ((off_t, int));
158 static void nlscan PARAMS ((char *));
159 static int grep PARAMS ((int, char const *, struct stats *));
160 static int grepdir PARAMS ((char const *, struct stats *));
161 static int grepfile PARAMS ((char const *, struct stats *));
163 static inline int undossify_input PARAMS ((register char *, size_t));
166 /* Functions we'll use to search. */
167 static void (*compile) PARAMS ((char *, size_t));
168 static char *(*execute) PARAMS ((char *, size_t, char **));
170 /* Print a message and possibly an error string. Remember
171 that something awful happened. */
173 error (const char *mesg, int errnum)
176 fprintf (stderr, "%s: %s: %s\n", prog, mesg, strerror (errnum));
178 fprintf (stderr, "%s: %s\n", prog, mesg);
182 /* Like error (), but die horribly after printing. */
184 fatal (const char *mesg, int errnum)
186 error (mesg, errnum);
190 /* Interface to handle errors and fix library lossage. */
192 xmalloc (size_t size)
196 result = malloc (size);
198 fatal (_("memory exhausted"), 0);
202 /* Interface to handle errors and fix some library lossage. */
204 xrealloc (char *ptr, size_t size)
209 result = realloc (ptr, size);
211 result = malloc (size);
213 fatal (_("memory exhausted"), 0);
217 /* Convert STR to a positive integer, storing the result in *OUT.
218 If STR is not a valid integer, return -1 (otherwise 0). */
220 ck_atoi (char const *str, int *out)
223 for (p = str; *p; p++)
224 if (*p < '0' || *p > '9')
227 *out = atoi (optarg);
232 /* Hairy buffering mechanism for grep. The intent is to keep
233 all reads aligned on a page boundary and multiples of the
236 static char *ubuffer; /* Unaligned base of buffer. */
237 static char *buffer; /* Base of buffer. */
238 static size_t bufsalloc; /* Allocated size of buffer save region. */
239 static size_t bufalloc; /* Total buffer size. */
240 #define PREFERRED_SAVE_FACTOR 5 /* Preferred value of bufalloc / bufsalloc. */
241 static int bufdesc; /* File descriptor. */
242 static char *bufbeg; /* Beginning of user-visible stuff. */
243 static char *buflim; /* Limit of user-visible stuff. */
244 static size_t pagesize; /* alignment of memory pages */
245 static off_t bufoffset; /* Read offset; defined on regular files. */
247 #if defined(HAVE_MMAP)
248 static int bufmapped; /* True if buffer is memory-mapped. */
249 static off_t initial_bufoffset; /* Initial value of bufoffset. */
254 static gzFile gzbufdesc; /* zlib file descriptor. */
255 static int Zflag; /* uncompress before searching. */
258 /* Return VAL aligned to the next multiple of ALIGNMENT. VAL can be
259 an integer or a pointer. Both args must be free of side effects. */
260 #define ALIGN_TO(val, alignment) \
261 ((size_t) (val) % (alignment) == 0 \
263 : (val) + ((alignment) - (size_t) (val) % (alignment)))
265 /* Return the address of a page-aligned buffer of size SIZE,
266 reallocating it from *UP. Set *UP to the newly allocated (but
267 possibly unaligned) buffer used to build the aligned buffer. To
268 free the buffer, free (*UP). */
270 page_alloc (size_t size, char **up)
272 size_t asize = size + pagesize - 1;
275 char *p = *up ? realloc (*up, asize) : malloc (asize);
279 return ALIGN_TO (p, pagesize);
285 /* Reset the buffer for a new file, returning zero if we should skip it.
286 Initialize on the first time through. */
288 reset (int fd, char const *file, struct stats *stats)
291 bufsalloc = ALIGN_TO (bufalloc / PREFERRED_SAVE_FACTOR, pagesize);
295 pagesize = getpagesize ();
299 ubufsalloc = MAX (8192, pagesize);
301 ubufsalloc = BUFSALLOC;
303 bufsalloc = ALIGN_TO (ubufsalloc, pagesize);
304 bufalloc = PREFERRED_SAVE_FACTOR * bufsalloc;
305 /* The 1 byte of overflow is a kludge for dfaexec(), which
306 inserts a sentinel newline at the end of the buffer
307 being searched. There's gotta be a better way... */
308 if (bufsalloc < ubufsalloc
309 || bufalloc / PREFERRED_SAVE_FACTOR != bufsalloc
310 || bufalloc + 1 < bufalloc
311 || ! (buffer = page_alloc (bufalloc + 1, &ubuffer)))
312 fatal (_("memory exhausted"), 0);
317 gzbufdesc = gzdopen(fd, "r");
318 if (gzbufdesc == NULL)
319 fatal(_("memory exhausted"), 0);
326 if (fstat (fd, &stats->stat) != 0)
328 error ("fstat", errno);
331 if (directories == SKIP_DIRECTORIES && S_ISDIR (stats->stat.st_mode))
337 S_ISREG (stats->stat.st_mode))
343 bufoffset = lseek (fd, 0, SEEK_CUR);
346 error ("lseek", errno);
351 initial_bufoffset = bufoffset;
352 bufmapped = mmap_option && bufoffset % pagesize == 0;
364 /* Read new stuff into the buffer, saving the specified
365 amount of old stuff. When we're done, 'bufbeg' points
366 to the beginning of the buffer contents, and 'buflim'
367 points just after the end. Return zero if there's an error. */
369 fillbuf (size_t save, struct stats *stats)
375 /* Offset from start of unaligned buffer to start of old stuff
376 that we want to save. */
377 size_t saved_offset = buflim - ubuffer - save;
379 if (bufsalloc < save)
381 size_t aligned_save = ALIGN_TO (save, pagesize);
382 size_t maxalloc = (size_t) -1;
385 if (S_ISREG (stats->stat.st_mode))
387 /* Calculate an upper bound on how much memory we should allocate.
388 We can't use ALIGN_TO here, since off_t might be longer than
389 size_t. Watch out for arithmetic overflow. */
390 off_t to_be_read = stats->stat.st_size - bufoffset;
391 size_t slop = to_be_read % pagesize;
392 off_t aligned_to_be_read = to_be_read + (slop ? pagesize - slop : 0);
393 off_t maxalloc_off = aligned_save + aligned_to_be_read;
394 if (0 <= maxalloc_off && maxalloc_off == (size_t) maxalloc_off)
395 maxalloc = maxalloc_off;
398 /* Grow bufsalloc until it is at least as great as `save'; but
399 if there is an overflow, just grow it to the next page boundary. */
400 while (bufsalloc < save)
401 if (bufsalloc < bufsalloc * 2)
405 bufsalloc = aligned_save;
409 /* Grow the buffer size to be PREFERRED_SAVE_FACTOR times
411 newalloc = PREFERRED_SAVE_FACTOR * bufsalloc;
412 if (maxalloc < newalloc)
414 /* ... except don't grow it more than a pagesize past the
415 file size, as that might cause unnecessary memory
416 exhaustion if the file is large. */
418 bufsalloc = aligned_save;
421 /* Check that the above calculations made progress, which might
422 not occur if there is arithmetic overflow. If there's no
423 progress, or if the new buffer size is larger than the old
424 and buffer reallocation fails, report memory exhaustion. */
425 if (bufsalloc < save || newalloc < save
426 || (newalloc == save && newalloc != maxalloc)
427 || (bufalloc < newalloc
429 = page_alloc ((bufalloc = newalloc) + 1, &ubuffer))))
430 fatal (_("memory exhausted"), 0);
433 bufbeg = buffer + bufsalloc - save;
434 memmove (bufbeg, ubuffer + saved_offset, save);
435 readsize = bufalloc - bufsalloc;
437 #if defined(HAVE_MMAP)
440 size_t mmapsize = readsize;
442 /* Don't mmap past the end of the file; some hosts don't allow this.
443 Use `read' on the last page. */
444 if (stats->stat.st_size - bufoffset < mmapsize)
446 mmapsize = stats->stat.st_size - bufoffset;
447 mmapsize -= mmapsize % pagesize;
451 && (mmap ((caddr_t) (buffer + bufsalloc), mmapsize,
452 PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
456 /* Do not bother to use madvise with MADV_SEQUENTIAL or
457 MADV_WILLNEED on the mmapped memory. One might think it
458 would help, but it slows us down about 30% on SunOS 4.1. */
463 /* Stop using mmap on this file. Synchronize the file
464 offset. Do not warn about mmap failures. On some hosts
465 (e.g. Solaris 2.5) mmap can fail merely because some
466 other process has an advisory read lock on the file.
467 There's no point alarming the user about this misfeature. */
469 if (bufoffset != initial_bufoffset
470 && lseek (bufdesc, bufoffset, SEEK_SET) < 0)
472 error ("lseek", errno);
485 bytesread = gzread (gzbufdesc, buffer + bufsalloc, readsize);
488 bytesread = read (bufdesc, buffer + bufsalloc, readsize);
489 while (bytesread < 0 && errno == EINTR);
493 fillsize = bytesread;
496 bufoffset += fillsize;
499 fillsize = undossify_input (buffer + bufsalloc, fillsize);
501 buflim = buffer + bufsalloc + fillsize;
505 /* Flags controlling the style of output. */
510 WITHOUT_MATCH_BINARY_FILES
511 } binary_files; /* How to handle binary files. */
512 static int out_quiet; /* Suppress all normal output. */
513 static int out_invert; /* Print nonmatching stuff. */
514 static int out_file; /* Print filenames. */
515 static int out_line; /* Print line numbers. */
516 static int out_byte; /* Print byte offsets. */
517 static int out_before; /* Lines of leading context. */
518 static int out_after; /* Lines of trailing context. */
519 static int count_matches; /* Count matching lines. */
520 static int list_files; /* List matching files. */
521 static int no_filenames; /* Suppress file names. */
522 static int suppress_errors; /* Suppress diagnostics. */
524 /* Internal variables to keep track of byte count, context, etc. */
525 static off_t totalcc; /* Total character count before bufbeg. */
526 static char *lastnl; /* Pointer after last newline counted. */
527 static char *lastout; /* Pointer after last character output;
528 NULL if no character has been output
529 or if it's conceptually before bufbeg. */
530 static off_t totalnl; /* Total newline count before lastnl. */
531 static int pending; /* Pending lines of output. */
532 static int done_on_match; /* Stop scanning file on first match */
542 for (beg = lastnl; (beg = memchr (beg, eolbyte, lim - beg)); beg++)
548 print_offset_sep (off_t pos, int sep)
550 /* Do not rely on printf to print pos, since off_t may be longer than long,
551 and long long is not portable. */
553 char buf[sizeof pos * CHAR_BIT];
554 char *p = buf + sizeof buf - 1;
558 *--p = '0' + pos % 10;
559 while ((pos /= 10) != 0);
561 fwrite (p, 1, buf + sizeof buf - p, stdout);
565 prline (char *beg, char *lim, int sep)
568 printf ("%s%c", filename, sep & filename_mask);
572 print_offset_sep (++totalnl, sep);
577 off_t pos = totalcc + (beg - bufbeg);
579 pos = dossified_pos (pos);
581 print_offset_sep (pos, sep);
583 fwrite (beg, 1, lim - beg, stdout);
585 error (_("writing output"), errno);
589 /* Print pending lines of trailing context prior to LIM. */
591 prpending (char *lim)
597 while (pending > 0 && lastout < lim)
600 if ((nl = memchr (lastout, eolbyte, lim - lastout)) != 0)
604 prline (lastout, nl, '-');
608 /* Print the lines between BEG and LIM. Deal with context crap.
609 If NLINESP is non-null, store a count of lines between BEG and LIM. */
611 prtext (char *beg, char *lim, int *nlinesp)
613 static int used; /* avoid printing "--" before any output */
618 if (!out_quiet && pending > 0)
625 /* Deal with leading context crap. */
627 bp = lastout ? lastout : bufbeg;
628 for (i = 0; i < out_before; ++i)
632 while (p > bp && p[-1] != eol);
634 /* We only print the "--" separator if our output is
635 discontiguous from the last output in the file. */
636 if ((out_before || out_after) && used && p != lastout)
641 nl = memchr (p, eol, beg - p);
642 prline (p, nl + 1, '-');
649 /* Caller wants a line count. */
650 for (n = 0; p < lim; ++n)
652 if ((nl = memchr (p, eol, lim - p)) != 0)
664 prline (beg, lim, ':');
666 pending = out_quiet ? 0 : out_after;
670 /* Scan the specified portion of the buffer, matching lines (or
671 between matching lines if OUT_INVERT is true). Return a count of
674 grepbuf (char *beg, char *lim)
677 register char *p, *b;
683 while ((b = (*execute)(p, lim - p, &endp)) != 0)
685 /* Avoid matching the empty line at the end of the buffer. */
686 if (b == lim && ((b > beg && b[-1] == eol) || b == beg))
690 prtext (b, endp, (int *) 0);
702 if (out_invert && p < lim)
710 /* Search a given file. Normally, return a count of lines printed;
711 but if the file is a directory and we search it recursively, then
712 return -2 if there was a match, and -1 otherwise. */
714 grep (int fd, char const *file, struct stats *stats)
718 size_t residue, save;
722 if (!reset (fd, file, stats))
725 if (file && directories == RECURSE_DIRECTORIES
726 && S_ISDIR (stats->stat.st_mode))
728 /* Close fd now, so that we don't open a lot of file descriptors
729 when we recurse deeply. */
737 return grepdir (file, stats) - 2;
749 if (! fillbuf (save, stats))
751 if (! (is_EISDIR (errno, file) && suppress_errors))
752 error (filename, errno);
756 not_text = (((binary_files == BINARY_BINARY_FILES && !out_quiet)
757 || binary_files == WITHOUT_MATCH_BINARY_FILES)
758 && memchr (bufbeg, eol ? '\0' : '\200', buflim - bufbeg));
759 if (not_text && binary_files == WITHOUT_MATCH_BINARY_FILES)
761 done_on_match += not_text;
762 out_quiet += not_text;
769 if (buflim - bufbeg == save)
771 beg = bufbeg + save - residue;
772 for (lim = buflim; lim > beg && lim[-1] != eol; --lim)
774 residue = buflim - lim;
777 nlines += grepbuf (beg, lim);
780 if (nlines && done_on_match && !out_invert)
785 while (i < out_before && beg > bufbeg && beg != lastout)
790 while (beg > bufbeg && beg[-1] != eol);
794 save = residue + lim - beg;
795 totalcc += buflim - bufbeg - save;
798 if (! fillbuf (save, stats))
800 if (! (is_EISDIR (errno, file) && suppress_errors))
801 error (filename, errno);
808 nlines += grepbuf (bufbeg + save - residue, buflim);
814 done_on_match -= not_text;
815 out_quiet -= not_text;
816 if ((not_text & ~out_quiet) && nlines != 0)
817 printf (_("Binary file %s matches\n"), filename);
822 grepfile (char const *file, struct stats *stats)
831 filename = _("(standard input)");
835 while ((desc = open (file, O_RDONLY)) < 0 && errno == EINTR)
842 if (is_EISDIR (e, file) && directories == RECURSE_DIRECTORIES)
844 if (stat (file, &stats->stat) != 0)
850 return grepdir (file, stats);
853 if (!suppress_errors)
855 if (directories == SKIP_DIRECTORIES)
863 /* When skipping directories, don't worry about
864 directories that can't be opened. */
865 if (stat (file, &stats->stat) == 0
866 && S_ISDIR (stats->stat.st_mode))
881 /* Set input to binary mode. Pipes are simulated with files
882 on DOS, so this includes the case of "foo | grep bar". */
887 count = grep (desc, file, stats);
895 printf ("%s%c", filename, ':' & filename_mask);
896 printf ("%d\n", count);
900 if (list_files == 1 - 2 * status)
901 printf ("%s%c", filename, '\n' & filename_mask);
909 while (close (desc) != 0)
921 grepdir (char const *dir, struct stats *stats)
924 struct stats *ancestor;
927 for (ancestor = stats; (ancestor = ancestor->parent) != 0; )
928 if (ancestor->stat.st_ino == stats->stat.st_ino
929 && ancestor->stat.st_dev == stats->stat.st_dev)
931 if (!suppress_errors)
932 fprintf (stderr, _("%s: warning: %s: %s\n"), prog, dir,
933 _("recursive directory loop"));
937 name_space = savedir (dir, (unsigned) stats->stat.st_size);
943 if (!suppress_errors)
947 fatal (_("Memory exhausted"), 0);
951 size_t dirlen = strlen (dir);
952 int needs_slash = ! (dirlen == FILESYSTEM_PREFIX_LEN (dir)
953 || IS_SLASH (dir[dirlen - 1]));
955 char *namep = name_space;
957 child.parent = stats;
958 out_file += !no_filenames;
961 size_t namelen = strlen (namep);
962 file = xrealloc (file, dirlen + 1 + namelen + 1);
965 strcpy (file + dirlen + needs_slash, namep);
966 namep += namelen + 1;
967 status &= grepfile (file, &child);
969 out_file -= !no_filenames;
983 fprintf (stderr, _("Usage: %s [OPTION]... PATTERN [FILE]...\n"), prog);
984 fprintf (stderr, _("Try `%s --help' for more information.\n"), prog);
988 printf (_("Usage: %s [OPTION]... PATTERN [FILE] ...\n"), prog);
990 Search for PATTERN in each FILE or standard input.\n\
991 Example: %s -i 'hello world' menu.h main.c\n\
993 Regexp selection and interpretation:\n"), prog);
995 -E, --extended-regexp PATTERN is an extended regular expression\n\
996 -F, --fixed-strings PATTERN is a set of newline-separated strings\n\
997 -G, --basic-regexp PATTERN is a basic regular expression\n"));
999 -e, --regexp=PATTERN use PATTERN as a regular expression\n\
1000 -f, --file=FILE obtain PATTERN from FILE\n\
1001 -i, --ignore-case ignore case distinctions\n\
1002 -w, --word-regexp force PATTERN to match only whole words\n\
1003 -x, --line-regexp force PATTERN to match only whole lines\n\
1004 -z, --null-data a data line ends in 0 byte, not newline\n"));
1008 -s, --no-messages suppress error messages\n\
1009 -v, --invert-match select non-matching lines\n\
1010 -V, --version print version information and exit\n\
1011 --help display this help and exit\n\
1012 -Z, --decompress decompress input before searching (HAVE_LIBZ=1)\n\
1013 --mmap use memory-mapped input if possible\n"));
1017 -b, --byte-offset print the byte offset with output lines\n\
1018 -n, --line-number print line number with output lines\n\
1019 -H, --with-filename print the filename for each match\n\
1020 -h, --no-filename suppress the prefixing filename on output\n\
1021 -q, --quiet, --silent suppress all normal output\n\
1022 --binary-files=TYPE assume that binary files are TYPE\n\
1023 TYPE is 'binary', 'text', or 'without-match'.\n\
1024 -a, --text equivalent to --binary-files=text\n\
1025 -I equivalent to --binary-files=without-match\n\
1026 -d, --directories=ACTION how to handle directories\n\
1027 ACTION is 'read', 'recurse', or 'skip'.\n\
1028 -r, --recursive equivalent to --directories=recurse.\n\
1029 -L, --files-without-match only print FILE names containing no match\n\
1030 -l, --files-with-matches only print FILE names containing matches\n\
1031 -c, --count only print a count of matching lines per FILE\n\
1032 --null print 0 byte after FILE name\n"));
1036 -B, --before-context=NUM print NUM lines of leading context\n\
1037 -A, --after-context=NUM print NUM lines of trailing context\n\
1038 -C, --context[=NUM] print NUM (default 2) lines of output context\n\
1039 unless overridden by -A or -B\n\
1040 -NUM same as --context=NUM\n\
1041 -U, --binary do not strip CR characters at EOL (MSDOS)\n\
1042 -u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS)\n\
1044 `egrep' means `grep -E'. `fgrep' means `grep -F'.\n\
1045 With no FILE, or when FILE is -, read standard input. If less than\n\
1046 two FILEs given, assume -h. Exit status is 0 if match, 1 if no match,\n\
1047 and 2 if trouble.\n"));
1048 printf (_("\nReport bugs to <bug-gnu-utils@gnu.org>.\n"));
1053 /* Set the matcher to M, reporting any conflicts. */
1055 setmatcher (char const *m)
1057 if (matcher && strcmp (matcher, m) != 0)
1058 fatal (_("conflicting matchers specified"), 0);
1062 /* Go through the matchers vector and look for the specified matcher.
1063 If we find it, install it in compile and execute, and return 1. */
1065 install_matcher (char const *name)
1068 #ifdef HAVE_SETRLIMIT
1072 for (i = 0; matchers[i].name; ++i)
1073 if (strcmp (name, matchers[i].name) == 0)
1075 compile = matchers[i].compile;
1076 execute = matchers[i].execute;
1077 #if HAVE_SETRLIMIT && defined(RLIMIT_STACK)
1078 /* I think every platform needs to do this, so that regex.c
1079 doesn't oveflow the stack. The default value of
1080 `re_max_failures' is too large for some platforms: it needs
1081 more than 3MB-large stack.
1083 The test for HAVE_SETRLIMIT should go into `configure'. */
1084 if (!getrlimit (RLIMIT_STACK, &rlim))
1087 extern long int re_max_failures; /* from regex.c */
1089 /* Approximate the amount regex.c needs, plus some more. */
1090 newlim = re_max_failures * 2 * 20 * sizeof (char *);
1091 if (newlim > rlim.rlim_max)
1093 newlim = rlim.rlim_max;
1094 re_max_failures = newlim / (2 * 20 * sizeof (char *));
1096 if (rlim.rlim_cur < newlim)
1097 rlim.rlim_cur = newlim;
1099 setrlimit (RLIMIT_STACK, &rlim);
1107 /* Find the white-space-separated options specified by OPTIONS, and
1108 using BUF to store copies of these options, set ARGV[0], ARGV[1],
1109 etc. to the option copies. Return the number N of options found.
1110 Do not set ARGV[N] to NULL. If ARGV is NULL, do not store ARGV[0]
1111 etc. Backslash can be used to escape whitespace (and backslashes). */
1113 prepend_args (char const *options, char *buf, char **argv)
1115 char const *o = options;
1121 while (ISSPACE ((unsigned char) *o))
1130 if ((*b++ = *o++) == '\\' && *o)
1132 while (*o && ! ISSPACE ((unsigned char) *o));
1138 /* Prepend the whitespace-separated options in OPTIONS to the argument
1139 vector of a main program with argument count *PARGC and argument
1142 prepend_default_options (char const *options, int *pargc, char ***pargv)
1146 char *buf = xmalloc (strlen (options) + 1);
1147 int prepended = prepend_args (options, buf, (char **) NULL);
1149 char * const *argv = *pargv;
1150 char **pp = (char **) xmalloc ((prepended + argc + 1) * sizeof *pp);
1151 *pargc = prepended + argc;
1154 pp += prepend_args (options, buf, pp);
1155 while ((*pp++ = *argv++))
1161 main (int argc, char **argv)
1164 size_t keycc, oldcc, keyalloc;
1166 int opt, cc, status;
1167 int default_context;
1168 unsigned digit_args_val;
1170 extern char *optarg;
1173 initialize_main (&argc, &argv);
1175 if (prog && strrchr (prog, '/'))
1176 prog = strrchr (prog, '/') + 1;
1179 if (prog[0] == 'z') {
1185 #if defined(__MSDOS__) || defined(_WIN32)
1186 /* DOS and MS-Windows use backslashes as directory separators, and usually
1187 have an .exe suffix. They also have case-insensitive filesystems. */
1191 char *bslash = strrchr (argv[0], '\\');
1193 if (bslash && bslash >= prog) /* for mixed forward/backslash case */
1195 else if (prog == argv[0]
1196 && argv[0][0] && argv[0][1] == ':') /* "c:progname" */
1199 /* Collapse the letter-case, so `strcmp' could be used hence. */
1201 if (*p >= 'A' && *p <= 'Z')
1204 /* Remove the .exe extension, if any. */
1205 if ((p = strrchr (prog, '.')) && strcmp (p, ".exe") == 0)
1216 /* The value -1 means to use DEFAULT_CONTEXT. */
1217 out_after = out_before = -1;
1218 /* Default before/after context: chaged by -C/-NUM options */
1219 default_context = 0;
1220 /* Accumulated value of individual digits in a -NUM option */
1224 /* Internationalization. */
1226 setlocale (LC_ALL, "");
1229 bindtextdomain (PACKAGE, LOCALEDIR);
1230 textdomain (PACKAGE);
1233 prepend_default_options (getenv ("GREP_OPTIONS"), &argc, &argv);
1235 while ((opt = getopt_long (argc, argv, short_options, long_options, NULL))
1249 digit_args_val = 10 * digit_args_val + opt - '0';
1250 default_context = digit_args_val;
1255 if (ck_atoi (optarg, &out_after))
1256 fatal (_("invalid context length argument"), 0);
1262 if (ck_atoi (optarg, &out_before))
1263 fatal (_("invalid context length argument"), 0);
1267 /* Set output match context, but let any explicit leading or
1268 trailing amount specified with -A or -B stand. */
1271 if (ck_atoi (optarg, &default_context))
1272 fatal (_("invalid context length argument"), 0);
1275 default_context = 2;
1278 setmatcher ("egrep");
1281 setmatcher ("fgrep");
1284 setmatcher ("grep");
1290 binary_files = WITHOUT_MATCH_BINARY_FILES;
1294 dos_use_file_type = DOS_BINARY;
1299 dos_report_unix_offset = 1;
1306 setmatcher (optarg);
1309 binary_files = TEXT_BINARY_FILES;
1319 if (strcmp (optarg, "read") == 0)
1320 directories = READ_DIRECTORIES;
1321 else if (strcmp (optarg, "skip") == 0)
1322 directories = SKIP_DIRECTORIES;
1323 else if (strcmp (optarg, "recurse") == 0)
1324 directories = RECURSE_DIRECTORIES;
1326 fatal (_("unknown directories method"), 0);
1329 cc = strlen (optarg);
1330 keys = xrealloc (keys, keycc + cc + 1);
1331 strcpy (&keys[keycc], optarg);
1333 keys[keycc++] = '\n';
1336 fp = strcmp (optarg, "-") != 0 ? fopen (optarg, "r") : stdin;
1338 fatal (optarg, errno);
1339 for (keyalloc = 1; keyalloc <= keycc + 1; keyalloc *= 2)
1341 keys = xrealloc (keys, keyalloc);
1344 && (cc = fread (keys + keycc, 1, keyalloc - 1 - keycc, fp)) > 0)
1347 if (keycc == keyalloc - 1)
1348 keys = xrealloc (keys, keyalloc *= 2);
1352 /* Append final newline if file ended in non-newline. */
1353 if (oldcc != keycc && keys[keycc - 1] != '\n')
1354 keys[keycc++] = '\n';
1360 case 'y': /* For old-timers . . . */
1364 /* Like -l, except list files that don't contain matches.
1365 Inspired by the same option in Hume's gre. */
1384 directories = RECURSE_DIRECTORIES;
1387 suppress_errors = 1;
1408 case BINARY_FILES_OPTION:
1409 if (strcmp (optarg, "binary") == 0)
1410 binary_files = BINARY_BINARY_FILES;
1411 else if (strcmp (optarg, "text") == 0)
1412 binary_files = TEXT_BINARY_FILES;
1413 else if (strcmp (optarg, "without-match") == 0)
1414 binary_files = WITHOUT_MATCH_BINARY_FILES;
1416 fatal (_("unknown binary-files type"), 0);
1427 out_after = default_context;
1429 out_before = default_context;
1436 printf (_("%s (GNU grep) %s\n"), matcher, VERSION);
1439 Copyright (C) 1988, 1992-1998, 1999 Free Software Foundation, Inc.\n"));
1441 This is free software; see the source for copying conditions. There is NO\n\
1442 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"));
1453 /* No keys were specified (e.g. -f /dev/null). Match nothing. */
1456 /* Strip trailing newline. */
1462 keys = argv[optind++];
1463 keycc = strlen (keys);
1468 if (!install_matcher (matcher) && !install_matcher ("default"))
1471 (*compile)(keys, keycc);
1473 if ((argc - optind > 1 && !no_filenames) || with_filenames)
1477 /* Output is set to binary mode because we shouldn't convert
1478 NL to CR-LF pairs, especially when grepping binary files. */
1489 char *file = argv[optind];
1490 status &= grepfile (strcmp (file, "-") == 0 ? (char *) NULL : file,
1493 while ( ++optind < argc);
1496 status = grepfile ((char *) NULL, &stats_base);
1498 if (fclose (stdout) == EOF)
1499 error (_("writing output"), errno);
1501 exit (errseen ? 2 : status);