diff options
author | gabor <gabor@FreeBSD.org> | 2010-07-29 00:11:14 +0000 |
---|---|---|
committer | gabor <gabor@FreeBSD.org> | 2010-07-29 00:11:14 +0000 |
commit | d3f9c5a1b7e9d966652b4c688f2558356eb149d3 (patch) | |
tree | 1e1d5961f5ee38199f4b4fbd83cfffc86339e1c5 /usr.bin/grep/grep.c | |
parent | 1e88e37ddc5c0145f7fc505a213d255161668879 (diff) | |
download | FreeBSD-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.c | 76 |
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); |