--- expr.c.orig 2018-12-17 16:32:21.000000000 +0200 +++ expr.c 2019-06-18 08:30:31.110851666 +0300 @@ -1386,8 +1386,12 @@ readtok () } else if (DIGIT(c)) { - while (ISALNUM (c) || c == '#' || c == '@' || c == '_') - c = *cp++; + unsigned char prevc = c; + while (ISALNUM (c) || c == '#' || c == '@' || c == '_' || ((c == '+' || c == '-') && prevc == '#')) + { + prevc = c; + c = *cp++; + } c = *--cp; *cp = '\0'; @@ -1531,6 +1535,8 @@ strlong (num) register char *s; register unsigned char c; int base, foundbase; + int digits = 0; + char sign = 0; intmax_t val; s = num; @@ -1569,8 +1575,16 @@ strlong (num) base = val; val = 0; + digits = 0; foundbase++; } + else if (c == '-' || c == '+') + { + if (digits > 0 || sign != 0) + evalerror (_("invalid number")); + + sign = c; + } else if (ISALNUM(c) || (c == '_') || (c == '@')) { if (DIGIT(c)) @@ -1588,11 +1602,18 @@ strlong (num) evalerror (_("value too great for base")); val = (val * base) + c; + digits++; } else break; } + if (sign == '-') + val *= -1; + + if (digits == 0) + evalerror (_("no digits in number")); + return (val); }