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.3 2005/10/08 13:28:23 corecode 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::EFGHIORUVX: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 {"only-files", no_argument
, NULL
, 'O'},
110 {"quiet", no_argument
, NULL
, 'q'},
111 {"recursive", no_argument
, NULL
, 'r'},
112 {"regexp", required_argument
, NULL
, 'e'},
113 {"invert-match", no_argument
, NULL
, 'v'},
114 {"silent", no_argument
, NULL
, 'q'},
115 {"text", no_argument
, NULL
, 'a'},
116 {"binary", no_argument
, NULL
, 'U'},
117 {"unix-byte-offsets", no_argument
, NULL
, 'u'},
118 {"version", no_argument
, NULL
, 'V'},
119 {"with-filename", no_argument
, NULL
, 'H'},
120 {"word-regexp", no_argument
, NULL
, 'w'},
124 /* Define flags declared in grep.h. */
129 unsigned char eolbyte
;
131 /* For error messages. */
133 static char const *filename
;
136 /* How to handle directories. */
144 /* How to dir/device/links. */
145 static int only_files
;
147 static int ck_atoi
PARAMS ((char const *, int *));
148 static void usage
PARAMS ((int)) __attribute__((noreturn
));
149 static void error
PARAMS ((const char *, int));
150 static void setmatcher
PARAMS ((char const *));
151 static int install_matcher
PARAMS ((char const *));
152 static int prepend_args
PARAMS ((char const *, char *, char **));
153 static void prepend_default_options
PARAMS ((char const *, int *, char ***));
154 static char *page_alloc
PARAMS ((size_t, char **));
155 static int reset
PARAMS ((int, char const *, struct stats
*));
156 static int fillbuf
PARAMS ((size_t, struct stats
*));
157 static int grepbuf
PARAMS ((char *, char *));
158 static void prtext
PARAMS ((char *, char *, int *));
159 static void prpending
PARAMS ((char *));
160 static void prline
PARAMS ((char *, char *, int));
161 static void print_offset_sep
PARAMS ((off_t
, int));
162 static void nlscan
PARAMS ((char *));
163 static int grep
PARAMS ((int, char const *, struct stats
*));
164 static int grepdir
PARAMS ((char const *, struct stats
*));
165 static int grepfile
PARAMS ((char const *, struct stats
*));
167 static inline int undossify_input
PARAMS ((register char *, size_t));
170 /* Functions we'll use to search. */
171 static void (*compile
) PARAMS ((char *, size_t));
172 static char *(*execute
) PARAMS ((char *, size_t, char **));
174 /* Print a message and possibly an error string. Remember
175 that something awful happened. */
177 error (const char *mesg
, int errnum
)
180 fprintf (stderr
, "%s: %s: %s\n", prog
, mesg
, strerror (errnum
));
182 fprintf (stderr
, "%s: %s\n", prog
, mesg
);
186 /* Like error (), but die horribly after printing. */
188 fatal (const char *mesg
, int errnum
)
190 error (mesg
, errnum
);
194 /* Interface to handle errors and fix library lossage. */
196 xmalloc (size_t size
)
200 result
= malloc (size
);
202 fatal (_("memory exhausted"), 0);
206 /* Interface to handle errors and fix some library lossage. */
208 xrealloc (char *ptr
, size_t size
)
213 result
= realloc (ptr
, size
);
215 result
= malloc (size
);
217 fatal (_("memory exhausted"), 0);
221 /* Convert STR to a positive integer, storing the result in *OUT.
222 If STR is not a valid integer, return -1 (otherwise 0). */
224 ck_atoi (char const *str
, int *out
)
227 for (p
= str
; *p
; p
++)
228 if (*p
< '0' || *p
> '9')
231 *out
= atoi (optarg
);
236 /* Hairy buffering mechanism for grep. The intent is to keep
237 all reads aligned on a page boundary and multiples of the
240 static char *ubuffer
; /* Unaligned base of buffer. */
241 static char *buffer
; /* Base of buffer. */
242 static size_t bufsalloc
; /* Allocated size of buffer save region. */
243 static size_t bufalloc
; /* Total buffer size. */
244 #define PREFERRED_SAVE_FACTOR 5 /* Preferred value of bufalloc / bufsalloc. */
245 static int bufdesc
; /* File descriptor. */
246 static char *bufbeg
; /* Beginning of user-visible stuff. */
247 static char *buflim
; /* Limit of user-visible stuff. */
248 static size_t pagesize
; /* alignment of memory pages */
249 static off_t bufoffset
; /* Read offset; defined on regular files. */
251 #if defined(HAVE_MMAP)
252 static int bufmapped
; /* True if buffer is memory-mapped. */
253 static off_t initial_bufoffset
; /* Initial value of bufoffset. */
258 static gzFile gzbufdesc
; /* zlib file descriptor. */
259 static int Zflag
; /* uncompress before searching. */
262 /* Return VAL aligned to the next multiple of ALIGNMENT. VAL can be
263 an integer or a pointer. Both args must be free of side effects. */
264 #define ALIGN_TO(val, alignment) \
265 ((size_t) (val) % (alignment) == 0 \
267 : (val) + ((alignment) - (size_t) (val) % (alignment)))
269 /* Return the address of a page-aligned buffer of size SIZE,
270 reallocating it from *UP. Set *UP to the newly allocated (but
271 possibly unaligned) buffer used to build the aligned buffer. To
272 free the buffer, free (*UP). */
274 page_alloc (size_t size
, char **up
)
276 size_t asize
= size
+ pagesize
- 1;
279 char *p
= *up
? realloc (*up
, asize
) : malloc (asize
);
283 return ALIGN_TO (p
, pagesize
);
289 /* Reset the buffer for a new file, returning zero if we should skip it.
290 Initialize on the first time through. */
292 reset (int fd
, char const *file
, struct stats
*stats
)
295 bufsalloc
= ALIGN_TO (bufalloc
/ PREFERRED_SAVE_FACTOR
, pagesize
);
299 pagesize
= getpagesize ();
303 ubufsalloc
= MAX (8192, pagesize
);
305 ubufsalloc
= BUFSALLOC
;
307 bufsalloc
= ALIGN_TO (ubufsalloc
, pagesize
);
308 bufalloc
= PREFERRED_SAVE_FACTOR
* bufsalloc
;
309 /* The 1 byte of overflow is a kludge for dfaexec(), which
310 inserts a sentinel newline at the end of the buffer
311 being searched. There's gotta be a better way... */
312 if (bufsalloc
< ubufsalloc
313 || bufalloc
/ PREFERRED_SAVE_FACTOR
!= bufsalloc
314 || bufalloc
+ 1 < bufalloc
315 || ! (buffer
= page_alloc (bufalloc
+ 1, &ubuffer
)))
316 fatal (_("memory exhausted"), 0);
321 gzbufdesc
= gzdopen(fd
, "r");
322 if (gzbufdesc
== NULL
)
323 fatal(_("memory exhausted"), 0);
330 if (fstat (fd
, &stats
->stat
) != 0)
332 error ("fstat", errno
);
335 if (directories
== SKIP_DIRECTORIES
&& S_ISDIR (stats
->stat
.st_mode
))
341 S_ISREG (stats
->stat
.st_mode
))
347 bufoffset
= lseek (fd
, 0, SEEK_CUR
);
350 error ("lseek", errno
);
355 initial_bufoffset
= bufoffset
;
356 bufmapped
= mmap_option
&& bufoffset
% pagesize
== 0;
368 /* Read new stuff into the buffer, saving the specified
369 amount of old stuff. When we're done, 'bufbeg' points
370 to the beginning of the buffer contents, and 'buflim'
371 points just after the end. Return zero if there's an error. */
373 fillbuf (size_t save
, struct stats
*stats
)
379 /* Offset from start of unaligned buffer to start of old stuff
380 that we want to save. */
381 size_t saved_offset
= buflim
- ubuffer
- save
;
383 if (bufsalloc
< save
)
385 size_t aligned_save
= ALIGN_TO (save
, pagesize
);
386 size_t maxalloc
= (size_t) -1;
389 if (S_ISREG (stats
->stat
.st_mode
))
391 /* Calculate an upper bound on how much memory we should allocate.
392 We can't use ALIGN_TO here, since off_t might be longer than
393 size_t. Watch out for arithmetic overflow. */
394 off_t to_be_read
= stats
->stat
.st_size
- bufoffset
;
395 size_t slop
= to_be_read
% pagesize
;
396 off_t aligned_to_be_read
= to_be_read
+ (slop
? pagesize
- slop
: 0);
397 off_t maxalloc_off
= aligned_save
+ aligned_to_be_read
;
398 if (0 <= maxalloc_off
&& maxalloc_off
== (size_t) maxalloc_off
)
399 maxalloc
= maxalloc_off
;
402 /* Grow bufsalloc until it is at least as great as `save'; but
403 if there is an overflow, just grow it to the next page boundary. */
404 while (bufsalloc
< save
)
405 if (bufsalloc
< bufsalloc
* 2)
409 bufsalloc
= aligned_save
;
413 /* Grow the buffer size to be PREFERRED_SAVE_FACTOR times
415 newalloc
= PREFERRED_SAVE_FACTOR
* bufsalloc
;
416 if (maxalloc
< newalloc
)
418 /* ... except don't grow it more than a pagesize past the
419 file size, as that might cause unnecessary memory
420 exhaustion if the file is large. */
422 bufsalloc
= aligned_save
;
425 /* Check that the above calculations made progress, which might
426 not occur if there is arithmetic overflow. If there's no
427 progress, or if the new buffer size is larger than the old
428 and buffer reallocation fails, report memory exhaustion. */
429 if (bufsalloc
< save
|| newalloc
< save
430 || (newalloc
== save
&& newalloc
!= maxalloc
)
431 || (bufalloc
< newalloc
433 = page_alloc ((bufalloc
= newalloc
) + 1, &ubuffer
))))
434 fatal (_("memory exhausted"), 0);
437 bufbeg
= buffer
+ bufsalloc
- save
;
438 memmove (bufbeg
, ubuffer
+ saved_offset
, save
);
439 readsize
= bufalloc
- bufsalloc
;
441 #if defined(HAVE_MMAP)
444 size_t mmapsize
= readsize
;
446 /* Don't mmap past the end of the file; some hosts don't allow this.
447 Use `read' on the last page. */
448 if (stats
->stat
.st_size
- bufoffset
< mmapsize
)
450 mmapsize
= stats
->stat
.st_size
- bufoffset
;
451 mmapsize
-= mmapsize
% pagesize
;
455 && (mmap ((caddr_t
) (buffer
+ bufsalloc
), mmapsize
,
456 PROT_READ
| PROT_WRITE
, MAP_PRIVATE
| MAP_FIXED
,
460 /* Do not bother to use madvise with MADV_SEQUENTIAL or
461 MADV_WILLNEED on the mmapped memory. One might think it
462 would help, but it slows us down about 30% on SunOS 4.1. */
467 /* Stop using mmap on this file. Synchronize the file
468 offset. Do not warn about mmap failures. On some hosts
469 (e.g. Solaris 2.5) mmap can fail merely because some
470 other process has an advisory read lock on the file.
471 There's no point alarming the user about this misfeature. */
473 if (bufoffset
!= initial_bufoffset
474 && lseek (bufdesc
, bufoffset
, SEEK_SET
) < 0)
476 error ("lseek", errno
);
489 bytesread
= gzread (gzbufdesc
, buffer
+ bufsalloc
, readsize
);
492 bytesread
= read (bufdesc
, buffer
+ bufsalloc
, readsize
);
493 while (bytesread
< 0 && errno
== EINTR
);
497 fillsize
= bytesread
;
500 bufoffset
+= fillsize
;
503 fillsize
= undossify_input (buffer
+ bufsalloc
, fillsize
);
505 buflim
= buffer
+ bufsalloc
+ fillsize
;
509 /* Flags controlling the style of output. */
514 WITHOUT_MATCH_BINARY_FILES
515 } binary_files
; /* How to handle binary files. */
516 static int out_quiet
; /* Suppress all normal output. */
517 static int out_invert
; /* Print nonmatching stuff. */
518 static int out_file
; /* Print filenames. */
519 static int out_line
; /* Print line numbers. */
520 static int out_byte
; /* Print byte offsets. */
521 static int out_before
; /* Lines of leading context. */
522 static int out_after
; /* Lines of trailing context. */
523 static int count_matches
; /* Count matching lines. */
524 static int list_files
; /* List matching files. */
525 static int no_filenames
; /* Suppress file names. */
526 static int suppress_errors
; /* Suppress diagnostics. */
528 /* Internal variables to keep track of byte count, context, etc. */
529 static off_t totalcc
; /* Total character count before bufbeg. */
530 static char *lastnl
; /* Pointer after last newline counted. */
531 static char *lastout
; /* Pointer after last character output;
532 NULL if no character has been output
533 or if it's conceptually before bufbeg. */
534 static off_t totalnl
; /* Total newline count before lastnl. */
535 static int pending
; /* Pending lines of output. */
536 static int done_on_match
; /* Stop scanning file on first match */
546 for (beg
= lastnl
; (beg
= memchr (beg
, eolbyte
, lim
- beg
)); beg
++)
552 print_offset_sep (off_t pos
, int sep
)
554 /* Do not rely on printf to print pos, since off_t may be longer than long,
555 and long long is not portable. */
557 char buf
[sizeof pos
* CHAR_BIT
];
558 char *p
= buf
+ sizeof buf
- 1;
562 *--p
= '0' + pos
% 10;
563 while ((pos
/= 10) != 0);
565 fwrite (p
, 1, buf
+ sizeof buf
- p
, stdout
);
569 prline (char *beg
, char *lim
, int sep
)
572 printf ("%s%c", filename
, sep
& filename_mask
);
576 print_offset_sep (++totalnl
, sep
);
581 off_t pos
= totalcc
+ (beg
- bufbeg
);
583 pos
= dossified_pos (pos
);
585 print_offset_sep (pos
, sep
);
587 fwrite (beg
, 1, lim
- beg
, stdout
);
589 error (_("writing output"), errno
);
593 /* Print pending lines of trailing context prior to LIM. */
595 prpending (char *lim
)
601 while (pending
> 0 && lastout
< lim
)
604 if ((nl
= memchr (lastout
, eolbyte
, lim
- lastout
)) != 0)
608 prline (lastout
, nl
, '-');
612 /* Print the lines between BEG and LIM. Deal with context crap.
613 If NLINESP is non-null, store a count of lines between BEG and LIM. */
615 prtext (char *beg
, char *lim
, int *nlinesp
)
617 static int used
; /* avoid printing "--" before any output */
622 if (!out_quiet
&& pending
> 0)
629 /* Deal with leading context crap. */
631 bp
= lastout
? lastout
: bufbeg
;
632 for (i
= 0; i
< out_before
; ++i
)
636 while (p
> bp
&& p
[-1] != eol
);
638 /* We only print the "--" separator if our output is
639 discontiguous from the last output in the file. */
640 if ((out_before
|| out_after
) && used
&& p
!= lastout
)
645 nl
= memchr (p
, eol
, beg
- p
);
646 prline (p
, nl
+ 1, '-');
653 /* Caller wants a line count. */
654 for (n
= 0; p
< lim
; ++n
)
656 if ((nl
= memchr (p
, eol
, lim
- p
)) != 0)
668 prline (beg
, lim
, ':');
670 pending
= out_quiet
? 0 : out_after
;
674 /* Scan the specified portion of the buffer, matching lines (or
675 between matching lines if OUT_INVERT is true). Return a count of
678 grepbuf (char *beg
, char *lim
)
681 register char *p
, *b
;
687 while ((b
= (*execute
)(p
, lim
- p
, &endp
)) != 0)
689 /* Avoid matching the empty line at the end of the buffer. */
690 if (b
== lim
&& ((b
> beg
&& b
[-1] == eol
) || b
== beg
))
694 prtext (b
, endp
, (int *) 0);
706 if (out_invert
&& p
< lim
)
714 /* Search a given file. Normally, return a count of lines printed;
715 but if the file is a directory and we search it recursively, then
716 return -2 if there was a match, and -1 otherwise. */
718 grep (int fd
, char const *file
, struct stats
*stats
)
722 size_t residue
, save
;
726 if (!reset (fd
, file
, stats
))
729 if (file
&& directories
== RECURSE_DIRECTORIES
730 && S_ISDIR (stats
->stat
.st_mode
))
732 /* Close fd now, so that we don't open a lot of file descriptors
733 when we recurse deeply. */
741 return grepdir (file
, stats
) - 2;
753 if (! fillbuf (save
, stats
))
755 if (! (is_EISDIR (errno
, file
) && suppress_errors
))
756 error (filename
, errno
);
760 not_text
= (((binary_files
== BINARY_BINARY_FILES
&& !out_quiet
)
761 || binary_files
== WITHOUT_MATCH_BINARY_FILES
)
762 && memchr (bufbeg
, eol
? '\0' : '\200', buflim
- bufbeg
));
763 if (not_text
&& binary_files
== WITHOUT_MATCH_BINARY_FILES
)
765 done_on_match
+= not_text
;
766 out_quiet
+= not_text
;
773 if (buflim
- bufbeg
== save
)
775 beg
= bufbeg
+ save
- residue
;
776 for (lim
= buflim
; lim
> beg
&& lim
[-1] != eol
; --lim
)
778 residue
= buflim
- lim
;
781 nlines
+= grepbuf (beg
, lim
);
784 if (nlines
&& done_on_match
&& !out_invert
)
789 while (i
< out_before
&& beg
> bufbeg
&& beg
!= lastout
)
794 while (beg
> bufbeg
&& beg
[-1] != eol
);
798 save
= residue
+ lim
- beg
;
799 totalcc
+= buflim
- bufbeg
- save
;
802 if (! fillbuf (save
, stats
))
804 if (! (is_EISDIR (errno
, file
) && suppress_errors
))
805 error (filename
, errno
);
812 nlines
+= grepbuf (bufbeg
+ save
- residue
, buflim
);
818 done_on_match
-= not_text
;
819 out_quiet
-= not_text
;
820 if ((not_text
& ~out_quiet
) && nlines
!= 0)
821 printf (_("Binary file %s matches\n"), filename
);
826 grepfile (char const *file
, struct stats
*stats
)
835 filename
= _("(standard input)");
841 if (stat(file
, &stats
->stat
) != 0)
843 if (S_ISDIR(stats
->stat
.st_mode
))
845 if (directories
!= RECURSE_DIRECTORIES
)
847 if (lstat(file
, &stats
->stat
) != 0)
849 if (!S_ISDIR(stats
->stat
.st_mode
))
852 else if (!S_ISREG(stats
->stat
.st_mode
))
855 while ((desc
= open (file
, O_RDONLY
)) < 0 && errno
== EINTR
)
862 if (is_EISDIR (e
, file
) && directories
== RECURSE_DIRECTORIES
)
864 return grepdir (file
, stats
);
867 if (!suppress_errors
)
869 if (directories
== SKIP_DIRECTORIES
)
877 /* When skipping directories, don't worry about
878 directories that can't be opened. */
879 if (stat (file
, &stats
->stat
) == 0
880 && S_ISDIR (stats
->stat
.st_mode
))
895 /* Set input to binary mode. Pipes are simulated with files
896 on DOS, so this includes the case of "foo | grep bar". */
901 count
= grep (desc
, file
, stats
);
909 printf ("%s%c", filename
, ':' & filename_mask
);
910 printf ("%d\n", count
);
914 if (list_files
== 1 - 2 * status
)
915 printf ("%s%c", filename
, '\n' & filename_mask
);
923 while (close (desc
) != 0)
935 grepdir (char const *dir
, struct stats
*stats
)
938 struct stats
*ancestor
;
941 for (ancestor
= stats
; (ancestor
= ancestor
->parent
) != 0; )
942 if (ancestor
->stat
.st_ino
== stats
->stat
.st_ino
943 && ancestor
->stat
.st_dev
== stats
->stat
.st_dev
)
945 if (!suppress_errors
)
946 fprintf (stderr
, _("%s: warning: %s: %s\n"), prog
, dir
,
947 _("recursive directory loop"));
951 name_space
= savedir (dir
, (unsigned) stats
->stat
.st_size
);
957 if (!suppress_errors
)
961 fatal (_("Memory exhausted"), 0);
965 size_t dirlen
= strlen (dir
);
966 int needs_slash
= ! (dirlen
== FILESYSTEM_PREFIX_LEN (dir
)
967 || IS_SLASH (dir
[dirlen
- 1]));
969 char *namep
= name_space
;
971 child
.parent
= stats
;
972 out_file
+= !no_filenames
;
975 size_t namelen
= strlen (namep
);
976 file
= xrealloc (file
, dirlen
+ 1 + namelen
+ 1);
979 strcpy (file
+ dirlen
+ needs_slash
, namep
);
980 namep
+= namelen
+ 1;
981 status
&= grepfile (file
, &child
);
983 out_file
-= !no_filenames
;
997 fprintf (stderr
, _("Usage: %s [OPTION]... PATTERN [FILE]...\n"), prog
);
998 fprintf (stderr
, _("Try `%s --help' for more information.\n"), prog
);
1002 printf (_("Usage: %s [OPTION]... PATTERN [FILE] ...\n"), prog
);
1004 Search for PATTERN in each FILE or standard input.\n\
1005 Example: %s -i 'hello world' menu.h main.c\n\
1007 Regexp selection and interpretation:\n"), prog
);
1009 -E, --extended-regexp PATTERN is an extended regular expression\n\
1010 -F, --fixed-strings PATTERN is a set of newline-separated strings\n\
1011 -G, --basic-regexp PATTERN is a basic regular expression\n"));
1013 -e, --regexp=PATTERN use PATTERN as a regular expression\n\
1014 -f, --file=FILE obtain PATTERN from FILE\n\
1015 -i, --ignore-case ignore case distinctions\n\
1016 -w, --word-regexp force PATTERN to match only whole words\n\
1017 -x, --line-regexp force PATTERN to match only whole lines\n\
1018 -z, --null-data a data line ends in 0 byte, not newline\n"));
1022 -s, --no-messages suppress error messages\n\
1023 -v, --invert-match select non-matching lines\n\
1024 -V, --version print version information and exit\n\
1025 --help display this help and exit\n\
1026 -Z, --decompress decompress input before searching (HAVE_LIBZ=1)\n\
1027 --mmap use memory-mapped input if possible\n"));
1031 -b, --byte-offset print the byte offset with output lines\n\
1032 -n, --line-number print line number with output lines\n\
1033 -H, --with-filename print the filename for each match\n\
1034 -h, --no-filename suppress the prefixing filename on output\n\
1035 -q, --quiet, --silent suppress all normal output\n\
1036 --binary-files=TYPE assume that binary files are TYPE\n\
1037 TYPE is 'binary', 'text', or 'without-match'.\n\
1038 -a, --text equivalent to --binary-files=text\n\
1039 -I equivalent to --binary-files=without-match\n\
1040 -d, --directories=ACTION how to handle directories\n\
1041 ACTION is 'read', 'recurse', or 'skip'.\n\
1042 -r, --recursive equivalent to --directories=recurse.\n\
1043 -O, --only-files Ignore special files, except symlinks.\n\
1044 When recursing into directories, ignore\n\
1045 symlinked directories as well.\n\
1046 -L, --files-without-match only print FILE names containing no match\n\
1047 -l, --files-with-matches only print FILE names containing matches\n\
1048 -c, --count only print a count of matching lines per FILE\n\
1049 --null print 0 byte after FILE name\n"));
1053 -B, --before-context=NUM print NUM lines of leading context\n\
1054 -A, --after-context=NUM print NUM lines of trailing context\n\
1055 -C, --context[=NUM] print NUM (default 2) lines of output context\n\
1056 unless overridden by -A or -B\n\
1057 -NUM same as --context=NUM\n\
1058 -U, --binary do not strip CR characters at EOL (MSDOS)\n\
1059 -u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS)\n\
1061 `egrep' means `grep -E'. `fgrep' means `grep -F'.\n\
1062 With no FILE, or when FILE is -, read standard input. If less than\n\
1063 two FILEs given, assume -h. Exit status is 0 if match, 1 if no match,\n\
1064 and 2 if trouble.\n"));
1065 printf (_("\nReport bugs to <bug-gnu-utils@gnu.org>.\n"));
1070 /* Set the matcher to M, reporting any conflicts. */
1072 setmatcher (char const *m
)
1074 if (matcher
&& strcmp (matcher
, m
) != 0)
1075 fatal (_("conflicting matchers specified"), 0);
1079 /* Go through the matchers vector and look for the specified matcher.
1080 If we find it, install it in compile and execute, and return 1. */
1082 install_matcher (char const *name
)
1085 #ifdef HAVE_SETRLIMIT
1089 for (i
= 0; matchers
[i
].name
; ++i
)
1090 if (strcmp (name
, matchers
[i
].name
) == 0)
1092 compile
= matchers
[i
].compile
;
1093 execute
= matchers
[i
].execute
;
1094 #if HAVE_SETRLIMIT && defined(RLIMIT_STACK)
1095 /* I think every platform needs to do this, so that regex.c
1096 doesn't oveflow the stack. The default value of
1097 `re_max_failures' is too large for some platforms: it needs
1098 more than 3MB-large stack.
1100 The test for HAVE_SETRLIMIT should go into `configure'. */
1101 if (!getrlimit (RLIMIT_STACK
, &rlim
))
1104 extern long int re_max_failures
; /* from regex.c */
1106 /* Approximate the amount regex.c needs, plus some more. */
1107 newlim
= re_max_failures
* 2 * 20 * sizeof (char *);
1108 if (newlim
> rlim
.rlim_max
)
1110 newlim
= rlim
.rlim_max
;
1111 re_max_failures
= newlim
/ (2 * 20 * sizeof (char *));
1113 if (rlim
.rlim_cur
< newlim
)
1114 rlim
.rlim_cur
= newlim
;
1116 setrlimit (RLIMIT_STACK
, &rlim
);
1124 /* Find the white-space-separated options specified by OPTIONS, and
1125 using BUF to store copies of these options, set ARGV[0], ARGV[1],
1126 etc. to the option copies. Return the number N of options found.
1127 Do not set ARGV[N] to NULL. If ARGV is NULL, do not store ARGV[0]
1128 etc. Backslash can be used to escape whitespace (and backslashes). */
1130 prepend_args (char const *options
, char *buf
, char **argv
)
1132 char const *o
= options
;
1138 while (ISSPACE ((unsigned char) *o
))
1147 if ((*b
++ = *o
++) == '\\' && *o
)
1149 while (*o
&& ! ISSPACE ((unsigned char) *o
));
1155 /* Prepend the whitespace-separated options in OPTIONS to the argument
1156 vector of a main program with argument count *PARGC and argument
1159 prepend_default_options (char const *options
, int *pargc
, char ***pargv
)
1163 char *buf
= xmalloc (strlen (options
) + 1);
1164 int prepended
= prepend_args (options
, buf
, (char **) NULL
);
1166 char * const *argv
= *pargv
;
1167 char **pp
= (char **) xmalloc ((prepended
+ argc
+ 1) * sizeof *pp
);
1168 *pargc
= prepended
+ argc
;
1171 pp
+= prepend_args (options
, buf
, pp
);
1172 while ((*pp
++ = *argv
++))
1178 main (int argc
, char **argv
)
1181 size_t keycc
, oldcc
, keyalloc
;
1183 int opt
, cc
, status
;
1184 int default_context
;
1185 unsigned digit_args_val
;
1187 extern char *optarg
;
1190 initialize_main (&argc
, &argv
);
1192 if (prog
&& strrchr (prog
, '/'))
1193 prog
= strrchr (prog
, '/') + 1;
1196 if (prog
[0] == 'z') {
1202 #if defined(__MSDOS__) || defined(_WIN32)
1203 /* DOS and MS-Windows use backslashes as directory separators, and usually
1204 have an .exe suffix. They also have case-insensitive filesystems. */
1208 char *bslash
= strrchr (argv
[0], '\\');
1210 if (bslash
&& bslash
>= prog
) /* for mixed forward/backslash case */
1212 else if (prog
== argv
[0]
1213 && argv
[0][0] && argv
[0][1] == ':') /* "c:progname" */
1216 /* Collapse the letter-case, so `strcmp' could be used hence. */
1218 if (*p
>= 'A' && *p
<= 'Z')
1221 /* Remove the .exe extension, if any. */
1222 if ((p
= strrchr (prog
, '.')) && strcmp (p
, ".exe") == 0)
1233 /* The value -1 means to use DEFAULT_CONTEXT. */
1234 out_after
= out_before
= -1;
1235 /* Default before/after context: chaged by -C/-NUM options */
1236 default_context
= 0;
1237 /* Accumulated value of individual digits in a -NUM option */
1241 /* Internationalization. */
1243 setlocale (LC_ALL
, "");
1246 bindtextdomain (PACKAGE
, LOCALEDIR
);
1247 textdomain (PACKAGE
);
1250 prepend_default_options (getenv ("GREP_OPTIONS"), &argc
, &argv
);
1252 while ((opt
= getopt_long (argc
, argv
, short_options
, long_options
, NULL
))
1266 digit_args_val
= 10 * digit_args_val
+ opt
- '0';
1267 default_context
= digit_args_val
;
1272 if (ck_atoi (optarg
, &out_after
))
1273 fatal (_("invalid context length argument"), 0);
1279 if (ck_atoi (optarg
, &out_before
))
1280 fatal (_("invalid context length argument"), 0);
1284 /* Set output match context, but let any explicit leading or
1285 trailing amount specified with -A or -B stand. */
1288 if (ck_atoi (optarg
, &default_context
))
1289 fatal (_("invalid context length argument"), 0);
1292 default_context
= 2;
1295 setmatcher ("egrep");
1298 setmatcher ("fgrep");
1301 setmatcher ("grep");
1307 binary_files
= WITHOUT_MATCH_BINARY_FILES
;
1314 dos_use_file_type
= DOS_BINARY
;
1319 dos_report_unix_offset
= 1;
1326 setmatcher (optarg
);
1329 binary_files
= TEXT_BINARY_FILES
;
1339 if (strcmp (optarg
, "read") == 0)
1340 directories
= READ_DIRECTORIES
;
1341 else if (strcmp (optarg
, "skip") == 0)
1342 directories
= SKIP_DIRECTORIES
;
1343 else if (strcmp (optarg
, "recurse") == 0)
1344 directories
= RECURSE_DIRECTORIES
;
1346 fatal (_("unknown directories method"), 0);
1349 cc
= strlen (optarg
);
1350 keys
= xrealloc (keys
, keycc
+ cc
+ 1);
1351 strcpy (&keys
[keycc
], optarg
);
1353 keys
[keycc
++] = '\n';
1356 fp
= strcmp (optarg
, "-") != 0 ? fopen (optarg
, "r") : stdin
;
1358 fatal (optarg
, errno
);
1359 for (keyalloc
= 1; keyalloc
<= keycc
+ 1; keyalloc
*= 2)
1361 keys
= xrealloc (keys
, keyalloc
);
1364 && (cc
= fread (keys
+ keycc
, 1, keyalloc
- 1 - keycc
, fp
)) > 0)
1367 if (keycc
== keyalloc
- 1)
1368 keys
= xrealloc (keys
, keyalloc
*= 2);
1372 /* Append final newline if file ended in non-newline. */
1373 if (oldcc
!= keycc
&& keys
[keycc
- 1] != '\n')
1374 keys
[keycc
++] = '\n';
1380 case 'y': /* For old-timers . . . */
1384 /* Like -l, except list files that don't contain matches.
1385 Inspired by the same option in Hume's gre. */
1404 directories
= RECURSE_DIRECTORIES
;
1407 suppress_errors
= 1;
1428 case BINARY_FILES_OPTION
:
1429 if (strcmp (optarg
, "binary") == 0)
1430 binary_files
= BINARY_BINARY_FILES
;
1431 else if (strcmp (optarg
, "text") == 0)
1432 binary_files
= TEXT_BINARY_FILES
;
1433 else if (strcmp (optarg
, "without-match") == 0)
1434 binary_files
= WITHOUT_MATCH_BINARY_FILES
;
1436 fatal (_("unknown binary-files type"), 0);
1447 out_after
= default_context
;
1449 out_before
= default_context
;
1456 printf (_("%s (GNU grep) %s\n"), matcher
, VERSION
);
1459 Copyright (C) 1988, 1992-1998, 1999 Free Software Foundation, Inc.\n"));
1461 This is free software; see the source for copying conditions. There is NO\n\
1462 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"));
1473 /* No keys were specified (e.g. -f /dev/null). Match nothing. */
1476 /* Strip trailing newline. */
1482 keys
= argv
[optind
++];
1483 keycc
= strlen (keys
);
1488 if (!install_matcher (matcher
) && !install_matcher ("default"))
1491 (*compile
)(keys
, keycc
);
1493 if ((argc
- optind
> 1 && !no_filenames
) || with_filenames
)
1497 /* Output is set to binary mode because we shouldn't convert
1498 NL to CR-LF pairs, especially when grepping binary files. */
1509 char *file
= argv
[optind
];
1510 status
&= grepfile (strcmp (file
, "-") == 0 ? (char *) NULL
: file
,
1513 while ( ++optind
< argc
);
1516 status
= grepfile ((char *) NULL
, &stats_base
);
1518 if (fclose (stdout
) == EOF
)
1519 error (_("writing output"), errno
);
1521 exit (errseen
? 2 : status
);