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;

Reply via email to