aboutsummaryrefslogtreecommitdiff
path: root/misc/efgcvt_r.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-02-11 11:59:55 +0000
committerUlrich Drepper <drepper@redhat.com>1998-02-11 11:59:55 +0000
commit1eb687d0b865ea0d97bb774b23a764f1c4369475 (patch)
tree87aaeeb9bcc74de26af7fda8762c2ff717414f73 /misc/efgcvt_r.c
parent3ec27a876c591a89998aeb89e7ccd1db45b7fb39 (diff)
downloadglibc-1eb687d0b865ea0d97bb774b23a764f1c4369475.zip
glibc-1eb687d0b865ea0d97bb774b23a764f1c4369475.tar.gz
glibc-1eb687d0b865ea0d97bb774b23a764f1c4369475.tar.bz2
Update.
1998-02-11 19:16 Richard Henderson <rth@cygnus.com> * 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.
Diffstat (limited to 'misc/efgcvt_r.c')
-rw-r--r--misc/efgcvt_r.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c
index f6bd988..9e586e1 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;
}