diff options
author | gabor <gabor@FreeBSD.org> | 2010-08-15 22:15:04 +0000 |
---|---|---|
committer | gabor <gabor@FreeBSD.org> | 2010-08-15 22:15:04 +0000 |
commit | 5ee11c8783defc30e3f53ba6ba6004cae0574e8b (patch) | |
tree | 44ced6cc8e38528f9ae4294c0509d9f40b61a7c7 /usr.bin/grep/grep.c | |
parent | 257a18ba177d6257c87a07ccb72fc9908650db8c (diff) | |
download | FreeBSD-src-5ee11c8783defc30e3f53ba6ba6004cae0574e8b.zip FreeBSD-src-5ee11c8783defc30e3f53ba6ba6004cae0574e8b.tar.gz |
- Revert strlcpy() changes to memcpy() because it's more efficient and
former may be safer but in this case it doesn't add extra
safety [1]
- Fix -w option [2]
- Fix handling of GREP_OPTIONS [3]
- Fix --line-buffered
- Make stdin input imply --line-buffered so that tail -f can be piped
to grep [4]
- Imply -h if single file is grepped, this is the GNU behaviour
- Reduce locking overhead to gain some more performance [5]
- Inline some functions to help the compiler better optimize the code
- Use shortcut for empty files [6]
PR: bin/149425 [6]
Prodded by: jilles [1]
Reported by: Alex Kozlov <spam@rm-rf.kiev.ua> [2] [3],
swell.k@gmail.com [2],
poyopoyo@puripuri.plala.or.jp [4]
Submitted by: scf [5],
Shuichi KITAGUCHI <ki@hh.iij4u.or.jp> [6]
Approved by: delphij (mentor)
Diffstat (limited to 'usr.bin/grep/grep.c')
-rw-r--r-- | usr.bin/grep/grep.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c index 3dc1a1c..1221785 100644 --- a/usr.bin/grep/grep.c +++ b/usr.bin/grep/grep.c @@ -121,8 +121,8 @@ 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 */ +bool dexclude, dinclude; /* --exclude-dir and --include-dir */ +bool fexclude, finclude; /* --exclude and --include */ enum { BIN_OPT = CHAR_MAX + 1, @@ -236,7 +236,8 @@ add_pattern(char *pat, size_t len) --len; /* pat may not be NUL-terminated */ pattern[patterns] = grep_malloc(len + 1); - strlcpy(pattern[patterns], pat, len + 1); + memcpy(pattern[patterns], pat, len); + pattern[patterns][len] = '\0'; ++patterns; } @@ -355,38 +356,33 @@ main(int argc, char *argv[]) eopts = getenv("GREP_OPTIONS"); - eargc = 1; + /* support for extra arguments in GREP_OPTIONS */ + eargc = 0; if (eopts != NULL) { char *str; - for(i = 0; i < strlen(eopts); i++) - if (eopts[i] == ' ') + /* make an estimation of how many extra arguments we have */ + for (unsigned int j = 0; j < strlen(eopts); j++) + if (eopts[j] == ' ') eargc++; eargv = (char **)grep_malloc(sizeof(char *) * (eargc + 1)); - str = strtok(eopts, " "); eargc = 0; - - while(str != NULL) { - eargv[++eargc] = (char *)grep_malloc(sizeof(char) * - (strlen(str) + 1)); - strlcpy(eargv[eargc], str, strlen(str) + 1); - str = strtok(NULL, " "); - } - eargv[++eargc] = NULL; + /* parse extra arguments */ + while ((str = strsep(&eopts, " ")) != NULL) + eargv[eargc++] = grep_strdup(str); aargv = (char **)grep_calloc(eargc + argc + 1, sizeof(char *)); - aargv[0] = argv[0]; - for(i = 1; i < eargc; i++) - aargv[i] = eargv[i]; - for(int j = 1; j < argc; j++) - aargv[i++] = argv[j]; - - aargc = eargc + argc - 1; + aargv[0] = argv[0]; + for (i = 0; i < eargc; i++) + aargv[i + 1] = eargv[i]; + for (int j = 1; j < argc; j++, i++) + aargv[i + 1] = argv[j]; + aargc = eargc + argc; } else { aargv = argv; aargc = argc; @@ -609,11 +605,11 @@ main(int argc, char *argv[]) add_fpattern(optarg, EXCL_PAT); break; case R_DINCLUDE_OPT: - dexclude = true; + dinclude = true; add_dpattern(optarg, INCL_PAT); break; case R_DEXCLUDE_OPT: - dinclude = true; + dexclude = true; add_dpattern(optarg, EXCL_PAT); break; case HELP_OPT: @@ -685,12 +681,15 @@ main(int argc, char *argv[]) if (dirbehave == DIR_RECURSE) c = grep_tree(aargv); - else + else { + if (aargc == 1) + hflag = true; for (c = 0; aargc--; ++aargv) { if ((finclude || fexclude) && !file_matching(*aargv)) continue; c+= procfile(*aargv); } + } #ifndef WITHOUT_NLS catclose(catalog); |