sbase

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

commit 270ca025ce236885e3177cd7acfd2cfbdf6e36a5
parent e50d533d598dbe284e225e2ee52ed5f76a6e6f6a
Author: Randy Palamar <randy@rnpnr.xyz>
Date:   Sun,  7 Jan 2024 11:02:18 -0700

expr: don't evaluate matched substr as a number

POSIX specifies that if the pattern contains a subexpression then
the first matched subexpression should be returned if it exists.

This fixes things like the following:

./expr 00003 : '\(.*\)'
Before: 3
After: 00003

Diffstat:
Mexpr.c | 13++-----------
1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/expr.c b/expr.c @@ -59,11 +59,9 @@ match(struct val *vstr, struct val *vregx, struct val *ret) { regex_t re; regmatch_t matches[2]; - long long d; size_t anchlen; char *s, *p, *anchreg; char *str = vstr->str, *regx = vregx->str; - const char *errstr; /* anchored regex */ anchlen = strlen(regx) + 1 + 1; @@ -83,15 +81,8 @@ match(struct val *vstr, struct val *vregx, struct val *ret) s = str + matches[1].rm_so; p = str + matches[1].rm_eo; *p = '\0'; - - d = strtonum(s, LLONG_MIN, LLONG_MAX, &errstr); - if (!errstr) { - ret->num = d; - return; - } else { - ret->str = enstrdup(3, s); - return; - } + ret->str = enstrdup(3, s); + return; } else { regfree(&re); str += matches[0].rm_so;