From 1eb687d0b865ea0d97bb774b23a764f1c4369475 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 11 Feb 1998 11:59:55 +0000 Subject: Update. 1998-02-11 19:16 Richard Henderson * stdlib/strtod.c (STRTOF): Don't call lshift with zero count. * isomac.c: Move to... * stdlib/isomac.c: ...here. * Makefile: Move rules for handling isomac... * stdlib/Makefile: ...to here. --- misc/efgcvt_r.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'misc/efgcvt_r.c') diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c index f6bd98888b..9e586e15a8 100644 --- a/misc/efgcvt_r.c +++ b/misc/efgcvt_r.c @@ -49,6 +49,7 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len) size_t len; { int n, i; + int left; if (buf == NULL) { @@ -56,6 +57,7 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len) return -1; } + left = 0; if (isfinite (value)) { *sign = signbit (value) != 0; @@ -65,10 +67,20 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len) if (ndigit < 0) { /* Rounding to the left of the decimal point. */ - for (i = ndigit; i < 0; i++) - value *= 0.1; + while (ndigit < 0) + { + FLOAT_TYPE new_value = value * 0.1; - ndigit = 0; + if (new_value < 1.0) + { + ndigit = 0; + break; + } + + value = new_value; + ++left; + ++ndigit; + } } } else @@ -110,6 +122,17 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len) buf[n - (i - MAX (*decpt, 0))] = '\0'; } + if (left) + { + *decpt += left; + if (--len > n) + { + while (left-- > 0 && n < len) + buf[n++] = '0'; + buf[n] = '\0'; + } + } + return 0; } -- cgit v1.2.3