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:
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;