summaryrefslogtreecommitdiffstats
path: root/usr.bin/grep/grep.c
diff options
context:
space:
mode:
authorgabor <gabor@FreeBSD.org>2010-07-29 00:11:14 +0000
committergabor <gabor@FreeBSD.org>2010-07-29 00:11:14 +0000
commitd3f9c5a1b7e9d966652b4c688f2558356eb149d3 (patch)
tree1e1d5961f5ee38199f4b4fbd83cfffc86339e1c5 /usr.bin/grep/grep.c
parent1e88e37ddc5c0145f7fc505a213d255161668879 (diff)
downloadFreeBSD-src-d3f9c5a1b7e9d966652b4c688f2558356eb149d3.zip
FreeBSD-src-d3f9c5a1b7e9d966652b4c688f2558356eb149d3.tar.gz
- Use the traditional behaviour for filename and directory name inclusion
and exclusion patterns [1] - Some improvements on the exiting code, like replacing memcpy with strlcpy/strcpy Approved by: delphij (mentor) Pointed out by: bf [1], des [1]
Diffstat (limited to 'usr.bin/grep/grep.c')
-rw-r--r--usr.bin/grep/grep.c76
1 files changed, 45 insertions, 31 deletions
diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c
index d8fc5c6..1de68d0 100644
--- a/usr.bin/grep/grep.c
+++ b/usr.bin/grep/grep.c
@@ -85,8 +85,9 @@ regex_t *r_pattern;
fastgrep_t *fg_pattern;
/* Filename exclusion/inclusion patterns */
-unsigned int epatterns, epattern_sz;
-struct epat *epattern;
+unsigned int fpatterns, fpattern_sz;
+unsigned int dpatterns, dpattern_sz;
+struct epat *dpattern, *fpattern;
/* For regex errors */
char re_error[RE_ERROR_BUF + 1];
@@ -112,7 +113,6 @@ bool wflag; /* -w: pattern must start and end on word boundaries */
bool xflag; /* -x: pattern must match entire line */
bool lbflag; /* --line-buffered */
bool nullflag; /* --null */
-bool exclflag; /* --exclude */
char *label; /* --label */
const char *color; /* --color */
int grepbehave = GREP_BASIC; /* -EFGP: type of the regex */
@@ -122,6 +122,9 @@ int devbehave = DEV_READ; /* -D: handling of devices */
int dirbehave = DIR_READ; /* -dRr: handling of directories */
int linkbehave = LINK_READ; /* -OpS: handling of symlinks */
+bool dexclude, dinclude; /* --exclude amd --include */
+bool fexclude, finclude; /* --exclude-dir and --include-dir */
+
enum {
BIN_OPT = CHAR_MAX + 1,
COLOR_OPT,
@@ -234,32 +237,44 @@ add_pattern(char *pat, size_t len)
--len;
/* pat may not be NUL-terminated */
pattern[patterns] = grep_malloc(len + 1);
- memcpy(pattern[patterns], pat, len);
- pattern[patterns][len] = '\0';
+ strlcpy(pattern[patterns], pat, len + 1);
++patterns;
}
/*
- * Adds an include/exclude pattern to the internal array.
+ * Adds a file include/exclude pattern to the internal array.
*/
static void
-add_epattern(char *pat, size_t len, int type, int mode)
+add_fpattern(const char *pat, int mode)
{
/* Increase size if necessary */
- if (epatterns == epattern_sz) {
- epattern_sz *= 2;
- epattern = grep_realloc(epattern, ++epattern_sz *
+ if (fpatterns == fpattern_sz) {
+ fpattern_sz *= 2;
+ fpattern = grep_realloc(fpattern, ++fpattern_sz *
sizeof(struct epat));
}
- if (len > 0 && pat[len - 1] == '\n')
- --len;
- epattern[epatterns].pat = grep_malloc(len + 1);
- memcpy(epattern[epatterns].pat, pat, len);
- epattern[epatterns].pat[len] = '\0';
- epattern[epatterns].type = type;
- epattern[epatterns].mode = mode;
- ++epatterns;
+ fpattern[fpatterns].pat = grep_strdup(pat);
+ fpattern[fpatterns].mode = mode;
+ ++fpatterns;
+}
+
+/*
+ * Adds a directory include/exclude pattern to the internal array.
+ */
+static void
+add_dpattern(const char *pat, int mode)
+{
+
+ /* Increase size if necessary */
+ if (dpatterns == dpattern_sz) {
+ dpattern_sz *= 2;
+ dpattern = grep_realloc(dpattern, ++dpattern_sz *
+ sizeof(struct epat));
+ }
+ dpattern[dpatterns].pat = grep_strdup(pat);
+ dpattern[dpatterns].mode = mode;
+ ++dpatterns;
}
/*
@@ -591,24 +606,20 @@ main(int argc, char *argv[])
nullflag = true;
break;
case R_INCLUDE_OPT:
- exclflag = true;
- add_epattern(basename(optarg), strlen(basename(optarg)),
- FILE_PAT, INCL_PAT);
+ finclude = true;
+ add_fpattern(optarg, INCL_PAT);
break;
case R_EXCLUDE_OPT:
- exclflag = true;
- add_epattern(basename(optarg), strlen(basename(optarg)),
- FILE_PAT, EXCL_PAT);
+ fexclude = true;
+ add_fpattern(optarg, EXCL_PAT);
break;
case R_DINCLUDE_OPT:
- exclflag = true;
- add_epattern(basename(optarg), strlen(basename(optarg)),
- DIR_PAT, INCL_PAT);
+ dexclude = true;
+ add_dpattern(optarg, INCL_PAT);
break;
case R_DEXCLUDE_OPT:
- exclflag = true;
- add_epattern(basename(optarg), strlen(basename(optarg)),
- DIR_PAT, EXCL_PAT);
+ dinclude = true;
+ add_dpattern(optarg, EXCL_PAT);
break;
case HELP_OPT:
default:
@@ -680,8 +691,11 @@ main(int argc, char *argv[])
if (dirbehave == DIR_RECURSE)
c = grep_tree(aargv);
else
- for (c = 0; aargc--; ++aargv)
+ for (c = 0; aargc--; ++aargv) {
+ if ((finclude || fexclude) && !file_matching(*aargv))
+ continue;
c+= procfile(*aargv);
+ }
#ifndef WITHOUT_NLS
catclose(catalog);
OpenPOWER on IntegriCloud