Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/bin/sh In uses like $(( var )) (un-dollared vars in arithmet...
details: https://anonhg.NetBSD.org/src/rev/a4df4e96c3c4
branches: trunk
changeset: 831950:a4df4e96c3c4
user: kre <kre%NetBSD.org@localhost>
date: Sat Apr 21 23:01:29 2018 +0000
description:
In uses like $(( var )) (un-dollared vars in arithmetic) we allow
leading whitespace in the value of var (because strtoimax() does)
but did not allow trailing whitespace. The effect is that some
cases where $(( ${var:-0} )) would work do not work without the $
expansion.
Fix that - allow trailing whitespace. However, continue to insist
upon at least one digit (a non-null var that contains nothing but
whitespace is still an error).
Note: posix is not helpful here, it simply requires that the variable
contain "a value that forms a valid integer constant" (with an optional
+ or - sign).
diffstat:
bin/sh/arithmetic.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diffs (43 lines):
diff -r 2877bd770995 -r a4df4e96c3c4 bin/sh/arithmetic.c
--- a/bin/sh/arithmetic.c Sat Apr 21 21:32:14 2018 +0000
+++ b/bin/sh/arithmetic.c Sat Apr 21 23:01:29 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: arithmetic.c,v 1.4 2017/07/24 13:21:14 kre Exp $ */
+/* $NetBSD: arithmetic.c,v 1.5 2018/04/21 23:01:29 kre Exp $ */
/*-
* Copyright (c) 1993
@@ -39,7 +39,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: arithmetic.c,v 1.4 2017/07/24 13:21:14 kre Exp $");
+__RCSID("$NetBSD: arithmetic.c,v 1.5 2018/04/21 23:01:29 kre Exp $");
#endif /* not lint */
#include <limits.h>
@@ -59,6 +59,7 @@
#include "options.h"
#include "var.h"
#include "show.h"
+#include "syntax.h"
#if ARITH_BOR + ARITH_ASS_GAP != ARITH_BORASS || \
ARITH_ASS + ARITH_ASS_GAP != ARITH_EQ
@@ -127,8 +128,15 @@
str = "0";
errno = 0;
result = strtoimax(str, &p, 0);
- if (errno != 0 || *p != '\0')
+ if (errno != 0 || *p != '\0') {
+ if (errno == 0) {
+ while (*p != '\0' && is_space(*p))
+ p++;
+ if (*p == '\0')
+ return result;
+ }
arith_err("variable contains non-numeric value");
+ }
return result;
}
Home |
Main Index |
Thread Index |
Old Index