sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit 1c444555b8c9530a15ea84cd94e4b8de4d8e6019
parent 314a2d20cba0a92f7b0494056c27895169675ca0
Author: Santtu Lakkala <inz@inz.fi>
Date:   Thu,  6 Nov 2025 15:24:08 +0200

grep: Fix -x, simplify addpattern

Use grouping for -x to make \| / | work correctly; as a bonus beginning
and end of line anchors hold their special meaning inside a group,
removing the need for special handling of them.

Further, as this makes -w and -x only differ in anchors used, use the
same code for both.

Diffstat:
Mgrep.c | 31++++++++++---------------------
1 file changed, 10 insertions(+), 21 deletions(-)

diff --git a/grep.c b/grep.c @@ -41,31 +41,20 @@ addpattern(const char *pattern) { struct pattern *pnode; char *tmp; - int bol, eol; - size_t len, patlen; + size_t patlen; patlen = strlen(pattern); - bol = pattern[0] == '^'; - eol = patlen > 0 && pattern[patlen - 1] == '$'; - if (!Fflag && xflag) { - tmp = enmalloc(Error, patlen + 3); - snprintf(tmp, patlen + 3, "%s%s%s", - bol ? "" : "^", - pattern, - eol ? "" : "$"); - } else if (!Fflag && wflag) { - len = patlen + 5 + (Eflag ? 2 : 4); - tmp = enmalloc(Error, len); - - snprintf(tmp, len, "%s\\<%s%.*s%s\\>%s", - bol ? "^" : "", - Eflag ? "(" : "\\(", - (int)patlen - bol - eol, pattern + bol, - Eflag ? ")" : "\\)", - eol ? "$" : ""); - } else { + if (Fflag || (!xflag && !wflag)) { tmp = enstrdup(Error, pattern); + } else { + tmp = enmalloc(Error, patlen + 9); + sprintf(tmp, "%s%s%s%s%s", + xflag ? "^" : "\\<", + Eflag ? "(" : "\\(", + pattern, + Eflag ? ")" : "\\)", + xflag ? "$" : "\\>"); } pnode = enmalloc(Error, sizeof(*pnode));