/* grep.c - main driver file for grep.
Copyright 1992, 1997-1999, 2000 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
/* Written July 1992 by Mike Haertel. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#if defined(HAVE_MMAP)
# include <sys/mman.h>
#endif
#if defined(HAVE_SETRLIMIT)
# include <sys/time.h>
# include <sys/resource.h>
#endif
#include <stdio.h>
#include "system.h"
#include "getopt.h"
#include "getpagesize.h"
#include "grep.h"
#include "savedir.h"
#include "xstrtol.h"
#include "xalloc.h"
#include "error.h"
#include "exclude.h"
#include "closeout.h"
#undef MAX
#define MAX(A,B) ((A) > (B) ? (A) : (B))
struct stats
{
struct stats const *parent;
struct stat stat;
};
/* base of chain of stat buffers, used to detect directory loops */
static struct stats stats_base;
/* if non-zero, display usage information and exit */
static int show_help;
/* If non-zero, print the version on standard output and exit. */
static int show_version;
/* If nonzero, suppress diagnostics for nonexistent or unreadable files. */
static int suppress_errors;
/* If nonzero, use mmap if possible. */
static int mmap_option;
/* If nonzero, use grep_color marker. */
static int color_option;
/* If nonzero, show only the part of a line matching the expression. */
static int only_matching;
/* The color string used. The user can overwrite it using the environment
variable GREP_COLOR. The default is to print red. */
static const char *grep_color = "01;31";
static struct exclude *excluded_patterns;
static struct exclude *included_patterns;
/* Short options. */
static char const short_options[] =
"0123456789A:B:C:D:EFGHIPUVX:abcd:e:f:hiKLlm:noqRrsuvwxyZz";
/* Non-boolean long options that have no corresponding short equivalents. */
enum
{
BINARY_FILES_OPTION = CHAR_MAX + 1,
COLOR_OPTION,
INCLUDE_OPTION,
EXCLUDE_OPTION,
EXCLUDE_FROM_OPTION,
LINE_BUFFERED_OPTION,
LABEL_OPTION
};
/* Long options equivalences. */
static struct option const long_options[] =
{
{"after-context", required_argument, NULL, 'A'},
=1= |