commit 270ca025ce236885e3177cd7acfd2cfbdf6e36a5 Author: Randy Palamar <ra...@rnpnr.xyz> AuthorDate: Sun Jan 7 11:02:18 2024 -0700 Commit: Roberto E. Vargas Caballero <k...@shike2.com> CommitDate: Tue Jan 16 09:11:46 2024 +0100
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 diff --git a/expr.c b/expr.c index ae32b9f..3afb94b 100644 --- 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;