From 270ca025ce236885e3177cd7acfd2cfbdf6e36a5 Mon Sep 17 00:00:00 2001 From: Randy Palamar Date: Sun, 7 Jan 2024 11:02:18 -0700 Subject: [PATCH] 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 --- expr.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) 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;