Date: Thu, 5 May 2011 08:48:05 GMT From: Yuri Pankov <yuri.pankov@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/156826: [patch] grep(1): fix BSD grep --color option, -w matching at the start of the line and -F -w combination problem Message-ID: <201105050848.p458m5ot071222@red.freebsd.org> Resent-Message-ID: <201105050850.p458o6Aq091577@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201105050848.p458m5ot071222>