diff options
author | Jilles Tjoelker <jilles@FreeBSD.org> | 2019-02-10 22:23:05 +0000 |
---|---|---|
committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2019-02-10 22:23:05 +0000 |
commit | aac5464b6108116bc4172b47f54854f6f85c7a64 (patch) | |
tree | 1151ffbe371a28cf932a79a8fa5e1934769b5385 /bin | |
parent | 2a0f9d54162cfb8dbf1cd4cc5dd59aaa9f98a08e (diff) | |
download | src-test2-aac5464b6108116bc4172b47f54854f6f85c7a64.tar.gz src-test2-aac5464b6108116bc4172b47f54854f6f85c7a64.zip |
Notes
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/arith_yacc.c | 2 | ||||
-rw-r--r-- | bin/sh/arith_yacc.h | 1 | ||||
-rw-r--r-- | bin/sh/arith_yylex.c | 30 | ||||
-rw-r--r-- | bin/sh/shell.h | 1 | ||||
-rw-r--r-- | bin/sh/tests/expansion/Makefile | 2 | ||||
-rw-r--r-- | bin/sh/tests/expansion/arith16.0 | 26 | ||||
-rw-r--r-- | bin/sh/tests/expansion/arith17.0 | 3 |
7 files changed, 62 insertions, 3 deletions
diff --git a/bin/sh/arith_yacc.c b/bin/sh/arith_yacc.c index 5000c6b0d1be..a08163bdc29b 100644 --- a/bin/sh/arith_yacc.c +++ b/bin/sh/arith_yacc.c @@ -104,7 +104,7 @@ static arith_t arith_lookupvarint(char *varname) if (str == NULL || *str == '\0') str = "0"; errno = 0; - result = strtoarith_t(str, &p, 0); + result = strtoarith_t(str, &p); if (errno != 0 || *p != '\0') yyerror("variable conversion error"); return result; diff --git a/bin/sh/arith_yacc.h b/bin/sh/arith_yacc.h index ca92e6f7fa17..7fdd99b75b57 100644 --- a/bin/sh/arith_yacc.h +++ b/bin/sh/arith_yacc.h @@ -90,4 +90,5 @@ union yystype { extern union yystype yylval; +arith_t strtoarith_t(const char *restrict nptr, char **restrict endptr); int yylex(void); diff --git a/bin/sh/arith_yylex.c b/bin/sh/arith_yylex.c index f7eaf3e3fa6d..9f320dbcb585 100644 --- a/bin/sh/arith_yylex.c +++ b/bin/sh/arith_yylex.c @@ -35,6 +35,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include <ctype.h> +#include <errno.h> #include <inttypes.h> #include <stdlib.h> #include <string.h> @@ -50,6 +52,32 @@ __FBSDID("$FreeBSD$"); #error Arithmetic tokens are out of order. #endif +arith_t +strtoarith_t(const char *restrict nptr, char **restrict endptr) +{ + arith_t val; + + while (isspace((unsigned char)*nptr)) + nptr++; + switch (*nptr) { + case '-': + return strtoimax(nptr, endptr, 0); + case '0': + return (arith_t)strtoumax(nptr, endptr, 0); + default: + val = (arith_t)strtoumax(nptr, endptr, 0); + if (val >= 0) + return val; + else if (val == ARITH_MIN) { + errno = ERANGE; + return ARITH_MIN; + } else { + errno = ERANGE; + return ARITH_MAX; + } + } +} + int yylex(void) { @@ -78,7 +106,7 @@ yylex(void) case '7': case '8': case '9': - yylval.val = strtoarith_t(buf, &end, 0); + yylval.val = strtoarith_t(buf, &end); arith_buf = end; return ARITH_NUM; case 'A': diff --git a/bin/sh/shell.h b/bin/sh/shell.h index 9e2f9ab6e735..c06e737e658f 100644 --- a/bin/sh/shell.h +++ b/bin/sh/shell.h @@ -59,7 +59,6 @@ */ typedef intmax_t arith_t; #define ARITH_FORMAT_STR "%" PRIdMAX -#define strtoarith_t(nptr, endptr, base) (intmax_t)strtoumax(nptr, endptr, base) #define ARITH_MIN INTMAX_MIN #define ARITH_MAX INTMAX_MAX diff --git a/bin/sh/tests/expansion/Makefile b/bin/sh/tests/expansion/Makefile index 25cf218f40a2..58df967304f5 100644 --- a/bin/sh/tests/expansion/Makefile +++ b/bin/sh/tests/expansion/Makefile @@ -22,6 +22,8 @@ ${PACKAGE}FILES+= arith12.0 ${PACKAGE}FILES+= arith13.0 ${PACKAGE}FILES+= arith14.0 ${PACKAGE}FILES+= arith15.0 +${PACKAGE}FILES+= arith16.0 +${PACKAGE}FILES+= arith17.0 ${PACKAGE}FILES+= assign1.0 ${PACKAGE}FILES+= cmdsubst1.0 ${PACKAGE}FILES+= cmdsubst2.0 diff --git a/bin/sh/tests/expansion/arith16.0 b/bin/sh/tests/expansion/arith16.0 new file mode 100644 index 000000000000..b764e3c216f8 --- /dev/null +++ b/bin/sh/tests/expansion/arith16.0 @@ -0,0 +1,26 @@ +# $FreeBSD$ + +failures=0 + +for x in \ + 0x10000000000000000 \ + -0x8000000000000001 \ + 0xfffffffffffffffffffffffffffffffff \ + -0xfffffffffffffffffffffffffffffffff \ + 02000000000000000000000 \ + 9223372036854775808 \ + 9223372036854775809 \ + -9223372036854775809 \ + 9999999999999999999999999 \ + -9999999999999999999999999 +do + msg=$({ + v=$((x)) || : + } 3>&1 >&2 2>&3 3>&-) + r=$? + if [ "$r" = 0 ] || [ -z "$msg" ]; then + printf 'Failed: %s\n' "$x" + : $((failures += 1)) + fi +done +exit $((failures > 0)) diff --git a/bin/sh/tests/expansion/arith17.0 b/bin/sh/tests/expansion/arith17.0 new file mode 100644 index 000000000000..0a9260886ddb --- /dev/null +++ b/bin/sh/tests/expansion/arith17.0 @@ -0,0 +1,3 @@ +# $FreeBSD$ + +[ $((9223372036854775809)) -gt 0 ] |