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
This commit is contained in:
Randy Palamar 2024-01-07 11:02:18 -07:00 committed by Roberto E. Vargas Caballero
parent e50d533d59
commit 270ca025ce
1 changed files with 2 additions and 11 deletions

13
expr.c
View File

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