misc/156826: [patch] grep(1): fix BSD grep --color option,
-w matching at the start of the line and -F -w combination problem
Yuri Pankov
yuri.pankov at gmail.com
Thu May 5 08:50:07 UTC 2011
>Number: 156826
>Category: misc
>Synopsis: [patch] grep(1): fix BSD grep --color option, -w matching at the start of the line and -F -w combination problem
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu May 05 08:50:06 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Yuri Pankov
>Release:
>Organization:
>Environment:
>Description:
Several problems with BSD grep:
- -w 'foo' matches 'foobar' at the start of the line
- -F makes -w noop
- --color only colors first match in the line
>How-To-Repeat:
procyon:yuri:/data/src/freebsd/head/usr.bin/grep$ echo foobar | ./grep -w foo; echo $?
foobar
0
procyon:yuri:/data/src/freebsd/head/usr.bin/grep$ echo foobar | ./grep -w bar; echo $?
1
procyon:yuri:/data/src/freebsd/head/usr.bin/grep$ echo foobar | ./grep -F -w foo; echo $?
foobar
0
procyon:yuri:/data/src/freebsd/head/usr.bin/grep$ echo foobar | ./grep -F -w bar; echo $?
foobar
0
Can't show problem with --color here :-)
>Fix:
Patch attached with submission follows:
Index: fastgrep.c
===================================================================
--- fastgrep.c (revision 221483)
+++ fastgrep.c (working copy)
@@ -89,7 +89,7 @@
fg->bol = false;
fg->eol = false;
fg->reversed = false;
- fg->word = wflag;
+ fg->word = false;
/* Remove end-of-line character ('$'). */
if (fg->len > 0 && pat[fg->len - 1] == '$') {
Index: util.c
===================================================================
--- util.c (revision 221483)
+++ util.c (working copy)
@@ -301,18 +301,15 @@
* XXX: grep_search() is a workaround for speed up and should be
* removed in the future. See fastgrep.c.
*/
- if (fg_pattern[i].pattern) {
+ if (fg_pattern[i].pattern)
r = grep_search(&fg_pattern[i],
(unsigned char *)l->dat,
l->len, &pmatch);
- r = (r == 0) ? 0 : REG_NOMATCH;
- st = pmatch.rm_eo;
- } else {
+ else
r = regexec(&r_pattern[i], l->dat, 1,
&pmatch, eflags);
- r = (r == 0) ? 0 : REG_NOMATCH;
- st = pmatch.rm_eo;
- }
+ r = (r == 0) ? 0 : REG_NOMATCH;
+ st = pmatch.rm_eo;
if (r == REG_NOMATCH)
continue;
/* Check for full match */
@@ -321,8 +318,7 @@
(size_t)pmatch.rm_eo != l->len)
r = REG_NOMATCH;
/* Check for whole word match */
- if (r == 0 && fg_pattern[i].word &&
- pmatch.rm_so != 0) {
+ if (r == 0 && (wflag || fg_pattern[i].word)) {
wint_t wbegin, wend;
wbegin = wend = L' ';
@@ -330,11 +326,13 @@
sscanf(&l->dat[pmatch.rm_so - 1],
"%lc", &wbegin) != 1)
r = REG_NOMATCH;
- else if ((size_t)pmatch.rm_eo != l->len &&
+ else if ((size_t)pmatch.rm_eo !=
+ l->len &&
sscanf(&l->dat[pmatch.rm_eo],
"%lc", &wend) != 1)
r = REG_NOMATCH;
- else if (iswword(wbegin) || iswword(wend))
+ else if (iswword(wbegin) ||
+ iswword(wend))
r = REG_NOMATCH;
}
if (r == 0) {
@@ -343,7 +341,8 @@
if (m < MAX_LINE_MATCHES)
matches[m++] = pmatch;
/* matches - skip further patterns */
- if ((color != NULL && !oflag) || qflag || lflag)
+ if ((color == NULL && !oflag) ||
+ qflag || lflag)
break;
}
}
@@ -353,7 +352,7 @@
break;
}
/* One pass if we are not recording matches */
- if ((color != NULL && !oflag) || qflag || lflag)
+ if ((color == NULL && !oflag) || qflag || lflag)
break;
if (st == (size_t)pmatch.rm_so)
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list