size_t len;
{
int n, i;
+ int left;
if (buf == NULL)
{
return -1;
}
+ left = 0;
if (!ISINF (value) && !ISNAN (value))
{
/* OK, the following is not entirely correct. -0.0 is not handled
*sign = value < 0.0;
if (*sign)
value = -value;
+
+ if (ndigit < 0)
+ {
+ /* Rounding to the left of the decimal point. Solaris 2.5.1. */
+ for (i = ndigit; i < 0; i++)
+ value *= 0.1;
+
+ left = ndigit;
+ ndigit = 0;
+ }
}
else
/* Value is Inf or NaN. */
*sign = 0;
- if (ndigit <= 0)
- {
- if (len > 0)
- buf[0] = '\0';
- *decpt = 0;
- return 0;
- }
-
n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
if (n < 0)
return -1;
++i;
while (i < n && !isdigit (buf[i]));
memmove (&buf[*decpt], &buf[i], n - i);
- buf[n - (i - *decpt)] = '\0';
+ n -= i - *decpt;
+ buf[n] = '\0';
+ }
+
+ if (left)
+ {
+ *decpt -= left;
+ if (--len > n)
+ {
+ while (left++ < 0 && len > n)
+ buf[n++] = '0';
+ buf [n] = '\0';
+ }
}
return 0;
if (APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit - 1, decpt, sign, buf, len))
return -1;
+
+ if (ndigit <= 0)
+ {
+ if (len > 0)
+ buf[0] = '\0';
+ *decpt = ndigit;
+ return 0;
+ }
+
*decpt += exponent;
return 0;
}