about summary refs log tree commit diff
path: root/Src/builtin.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2007-11-06 11:04:34 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2007-11-06 11:04:34 +0000
commitb9f3fc7c81dfde1400ebec848a1356116d2e95aa (patch)
treef82a8d777ac11400fb9f4e6fde04e7125c8fa811 /Src/builtin.c
parent154ebe3e9668f65909facaef9cb64c9c4697903b (diff)
downloadzsh-b9f3fc7c81dfde1400ebec848a1356116d2e95aa.tar.gz
zsh-b9f3fc7c81dfde1400ebec848a1356116d2e95aa.tar.xz
zsh-b9f3fc7c81dfde1400ebec848a1356116d2e95aa.zip
24068: attempt to make `printf "%g\n" -0 output "-0"
Diffstat (limited to 'Src/builtin.c')
-rw-r--r--Src/builtin.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 7420ed887..d69ab5591 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -4162,9 +4162,25 @@ bin_print(char *name, char **args, Options ops, int func)
 			    break;
 		    case 2:
 			if (curarg) {
-			    mnumval = matheval(curarg);
-			    doubleval = (mnumval.type & MN_FLOAT) ?
-			    	mnumval.u.d : (double)mnumval.u.l;
+			    char *eptr;
+			    /*
+			     * First attempt to parse as a floating
+			     * point constant.  If we go through
+			     * a math evaluation, we can lose
+			     * mostly unimportant information
+			     * that people in standards organizations
+			     * worry about.
+			     */
+			    doubleval = strtod(curarg, &eptr);
+			    /*
+			     * If it didn't parse as a constant,
+			     * parse it as an expression.
+			     */
+			    if (*eptr != '\0') {
+				mnumval = matheval(curarg);
+				doubleval = (mnumval.type & MN_FLOAT) ?
+				    mnumval.u.d : (double)mnumval.u.l;
+			    }
 			} else doubleval = 0;
 			if (errflag) {
 			    doubleval = 0;