From owner-freebsd-bugs@FreeBSD.ORG Thu May 5 08:50:07 2011 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 357DB106564A for ; Thu, 5 May 2011 08:50:07 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 0AE108FC0C for ; Thu, 5 May 2011 08:50:07 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p458o6ss091578 for ; Thu, 5 May 2011 08:50:06 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p458o6Aq091577; Thu, 5 May 2011 08:50:06 GMT (envelope-from gnats) Resent-Date: Thu, 5 May 2011 08:50:06 GMT Resent-Message-Id: <201105050850.p458o6Aq091577@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Yuri Pankov Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 03EA81065675 for ; Thu, 5 May 2011 08:48:06 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id E53608FC0A for ; Thu, 5 May 2011 08:48:05 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.4/8.14.4) with ESMTP id p458m52H071223 for ; Thu, 5 May 2011 08:48:05 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.4/8.14.4/Submit) id p458m5ot071222; Thu, 5 May 2011 08:48:05 GMT (envelope-from nobody) Message-Id: <201105050848.p458m5ot071222@red.freebsd.org> Date: Thu, 5 May 2011 08:48:05 GMT From: Yuri Pankov To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: misc/156826: [patch] grep(1): fix BSD grep --color option, -w matching at the start of the line and -F -w combination problem X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 May 2011 08:50:07 -0000 >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: