1 /* Floating point output for `printf'.
2 Copyright (C) 1995-2013 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5 Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
7 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
12 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with the GNU C Library; if not, see
19 <http://www.gnu.org/licenses/>. */
21 /* The gmp headers need some configuration frobs. */
28 #include <gmp-mparam.h>
31 #include <stdlib/gmp-impl.h>
32 #include <stdlib/longlong.h>
33 #include <stdlib/fpioconst.h>
34 #include <locale/localeinfo.h>
43 #include <rounding-mode.h>
45 #ifdef COMPILE_WPRINTF
46 # define CHAR_T wchar_t
51 #include "_i18n_number.h"
54 # define NDEBUG /* Undefine this for debugging assertions. */
58 /* This defines make it possible to use the same code for GNU C library and
59 the GNU I/O library. */
60 #define PUT(f, s, n) _IO_sputn (f, s, n)
61 #define PAD(f, c, n) (wide ? _IO_wpadn (f, c, n) : _IO_padn (f, c, n))
62 /* We use this file GNU C library and GNU I/O library. So make
65 #define putc(c, f) (wide \
66 ? (int)_IO_putwc_unlocked (c, f) : _IO_putc_unlocked (c, f))
67 #define size_t _IO_size_t
70 /* Macros for doing the actual output. */
75 const int outc = (ch); \
76 if (putc (outc, fp) == EOF) \
78 if (buffer_malloced) \
85 #define PRINT(ptr, wptr, len) \
88 size_t outlen = (len); \
91 if (PUT (fp, wide ? (const char *) wptr : ptr, outlen) != outlen) \
93 if (buffer_malloced) \
103 while (outlen-- > 0) \
106 while (outlen-- > 0) \
111 #define PADN(ch, len) \
114 if (PAD (fp, ch, len) != len) \
116 if (buffer_malloced) \
124 /* We use the GNU MP library to handle large numbers.
126 An MP variable occupies a varying number of entries in its array. We keep
127 track of this number for efficiency reasons. Otherwise we would always
128 have to process the whole array. */
129 #define MPN_VAR(name) mp_limb_t *name; mp_size_t name##size
131 #define MPN_ASSIGN(dst,src) \
132 memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t))
133 #define MPN_GE(u,v) \
134 (u##size > v##size || (u##size == v##size && __mpn_cmp (u, v, u##size) >= 0))
136 extern mp_size_t
__mpn_extract_double (mp_ptr res_ptr
, mp_size_t size
,
137 int *expt
, int *is_neg
,
139 extern mp_size_t
__mpn_extract_long_double (mp_ptr res_ptr
, mp_size_t size
,
140 int *expt
, int *is_neg
,
142 extern unsigned int __guess_grouping (unsigned int intdig_max
,
143 const char *grouping
);
146 static wchar_t *group_number (wchar_t *buf
, wchar_t *bufend
,
147 unsigned int intdig_no
, const char *grouping
,
148 wchar_t thousands_sep
, int ngroups
)
153 ___printf_fp (FILE *fp
,
154 const struct printf_info
*info
,
155 const void *const *args
)
157 /* The floating-point value to output. */
161 __long_double_t ldbl
;
165 /* Locale-dependent representation of decimal point. */
169 /* Locale-dependent thousands separator and grouping specification. */
170 const char *thousands_sep
= NULL
;
171 wchar_t thousands_sepwc
= 0;
172 const char *grouping
;
174 /* "NaN" or "Inf" for the special cases. */
175 const char *special
= NULL
;
176 const wchar_t *wspecial
= NULL
;
178 /* We need just a few limbs for the input before shifting to the right
180 mp_limb_t fp_input
[(LDBL_MANT_DIG
+ BITS_PER_MP_LIMB
- 1) / BITS_PER_MP_LIMB
];
181 /* We need to shift the contents of fp_input by this amount of bits. */
184 /* The fraction of the floting-point value in question */
186 /* and the exponent. */
188 /* Sign of the exponent. */
190 /* Sign of float number. */
193 /* Scaling factor. */
196 /* Temporary bignum value. */
199 /* The type of output format that will be used: 'e'/'E' or 'f'. */
202 /* Counter for number of written characters. */
205 /* General helper (carry limb). */
208 /* Nonzero if this is output on a wide character stream. */
209 int wide
= info
->wide
;
211 /* Buffer in which we produce the output. */
212 wchar_t *wbuffer
= NULL
;
213 /* Flag whether wbuffer is malloc'ed or not. */
214 int buffer_malloced
= 0;
216 auto wchar_t hack_digit (void);
218 wchar_t hack_digit (void)
222 if (expsign
!= 0 && type
== 'f' && exponent
-- > 0)
224 else if (scalesize
== 0)
226 hi
= frac
[fracsize
- 1];
227 frac
[fracsize
- 1] = __mpn_mul_1 (frac
, frac
, fracsize
- 1, 10);
231 if (fracsize
< scalesize
)
235 hi
= mpn_divmod (tmp
, frac
, fracsize
, scale
, scalesize
);
236 tmp
[fracsize
- scalesize
] = hi
;
239 fracsize
= scalesize
;
240 while (fracsize
!= 0 && frac
[fracsize
- 1] == 0)
244 /* We're not prepared for an mpn variable with zero
251 mp_limb_t _cy
= __mpn_mul_1 (frac
, frac
, fracsize
, 10);
253 frac
[fracsize
++] = _cy
;
260 /* Figure out the decimal point character. */
261 if (info
->extra
== 0)
263 decimal
= _NL_CURRENT (LC_NUMERIC
, DECIMAL_POINT
);
264 decimalwc
= _NL_CURRENT_WORD (LC_NUMERIC
, _NL_NUMERIC_DECIMAL_POINT_WC
);
268 decimal
= _NL_CURRENT (LC_MONETARY
, MON_DECIMAL_POINT
);
269 if (*decimal
== '\0')
270 decimal
= _NL_CURRENT (LC_NUMERIC
, DECIMAL_POINT
);
271 decimalwc
= _NL_CURRENT_WORD (LC_MONETARY
,
272 _NL_MONETARY_DECIMAL_POINT_WC
);
273 if (decimalwc
== L
'\0')
274 decimalwc
= _NL_CURRENT_WORD (LC_NUMERIC
,
275 _NL_NUMERIC_DECIMAL_POINT_WC
);
277 /* The decimal point character must not be zero. */
278 assert (*decimal
!= '\0');
279 assert (decimalwc
!= L
'\0');
283 if (info
->extra
== 0)
284 grouping
= _NL_CURRENT (LC_NUMERIC
, GROUPING
);
286 grouping
= _NL_CURRENT (LC_MONETARY
, MON_GROUPING
);
288 if (*grouping
<= 0 || *grouping
== CHAR_MAX
)
292 /* Figure out the thousands separator character. */
295 if (info
->extra
== 0)
297 _NL_CURRENT_WORD (LC_NUMERIC
, _NL_NUMERIC_THOUSANDS_SEP_WC
);
300 _NL_CURRENT_WORD (LC_MONETARY
,
301 _NL_MONETARY_THOUSANDS_SEP_WC
);
305 if (info
->extra
== 0)
306 thousands_sep
= _NL_CURRENT (LC_NUMERIC
, THOUSANDS_SEP
);
308 thousands_sep
= _NL_CURRENT (LC_MONETARY
, MON_THOUSANDS_SEP
);
311 if ((wide
&& thousands_sepwc
== L
'\0')
312 || (! wide
&& *thousands_sep
== '\0'))
314 else if (thousands_sepwc
== L
'\0')
315 /* If we are printing multibyte characters and there is a
316 multibyte representation for the thousands separator,
317 we must ensure the wide character thousands separator
318 is available, even if it is fake. */
319 thousands_sepwc
= 0xfffffffe;
325 /* Fetch the argument value. */
326 #ifndef __NO_LONG_DOUBLE_MATH
327 if (info
->is_long_double
&& sizeof (long double) > sizeof (double))
329 fpnum
.ldbl
= *(const long double *) args
[0];
331 /* Check for special values: not a number or infinity. */
333 if (__isnanl (fpnum
.ldbl
))
335 is_neg
= signbit (fpnum
.ldbl
);
336 if (isupper (info
->spec
))
347 else if ((res
= __isinfl (fpnum
.ldbl
)))
350 if (isupper (info
->spec
))
363 fracsize
= __mpn_extract_long_double (fp_input
,
365 sizeof (fp_input
[0])),
368 to_shift
= 1 + fracsize
* BITS_PER_MP_LIMB
- LDBL_MANT_DIG
;
372 #endif /* no long double */
374 fpnum
.dbl
= *(const double *) args
[0];
376 /* Check for special values: not a number or infinity. */
378 if (__isnan (fpnum
.dbl
))
380 union ieee754_double u
= { .d
= fpnum
.dbl
};
381 is_neg
= u
.ieee
.negative
!= 0;
382 if (isupper (info
->spec
))
393 else if ((res
= __isinf (fpnum
.dbl
)))
396 if (isupper (info
->spec
))
409 fracsize
= __mpn_extract_double (fp_input
,
411 / sizeof (fp_input
[0])),
412 &exponent
, &is_neg
, fpnum
.dbl
);
413 to_shift
= 1 + fracsize
* BITS_PER_MP_LIMB
- DBL_MANT_DIG
;
419 int width
= info
->width
;
421 if (is_neg
|| info
->showsign
|| info
->space
)
425 if (!info
->left
&& width
> 0)
430 else if (info
->showsign
)
432 else if (info
->space
)
435 PRINT (special
, wspecial
, 3);
437 if (info
->left
&& width
> 0)
444 /* We need three multiprecision variables. Now that we have the exponent
445 of the number we can allocate the needed memory. It would be more
446 efficient to use variables of the fixed maximum size but because this
447 would be really big it could lead to memory problems. */
449 mp_size_t bignum_size
= ((ABS (exponent
) + BITS_PER_MP_LIMB
- 1)
451 + (LDBL_MANT_DIG
/ BITS_PER_MP_LIMB
> 2 ? 8 : 4))
452 * sizeof (mp_limb_t
);
453 frac
= (mp_limb_t
*) alloca (bignum_size
);
454 tmp
= (mp_limb_t
*) alloca (bignum_size
);
455 scale
= (mp_limb_t
*) alloca (bignum_size
);
458 /* We now have to distinguish between numbers with positive and negative
459 exponents because the method used for the one is not applicable/efficient
466 int explog
= LDBL_MAX_10_EXP_LOG
;
468 const struct mp_power
*powers
= &_fpioconst_pow10
[explog
+ 1];
471 if ((exponent
+ to_shift
) % BITS_PER_MP_LIMB
== 0)
473 MPN_COPY_DECR (frac
+ (exponent
+ to_shift
) / BITS_PER_MP_LIMB
,
475 fracsize
+= (exponent
+ to_shift
) / BITS_PER_MP_LIMB
;
479 cy
= __mpn_lshift (frac
+ (exponent
+ to_shift
) / BITS_PER_MP_LIMB
,
481 (exponent
+ to_shift
) % BITS_PER_MP_LIMB
);
482 fracsize
+= (exponent
+ to_shift
) / BITS_PER_MP_LIMB
;
484 frac
[fracsize
++] = cy
;
486 MPN_ZERO (frac
, (exponent
+ to_shift
) / BITS_PER_MP_LIMB
);
488 assert (powers
> &_fpioconst_pow10
[0]);
493 /* The number of the product of two binary numbers with n and m
494 bits respectively has m+n or m+n-1 bits. */
495 if (exponent
>= scaleexpo
+ powers
->p_expo
- 1)
499 #ifndef __NO_LONG_DOUBLE_MATH
500 if (LDBL_MANT_DIG
> _FPIO_CONST_OFFSET
* BITS_PER_MP_LIMB
501 && info
->is_long_double
)
503 #define _FPIO_CONST_SHIFT \
504 (((LDBL_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB) \
505 - _FPIO_CONST_OFFSET)
506 /* 64bit const offset is not enough for
507 IEEE quad long double. */
508 tmpsize
= powers
->arraysize
+ _FPIO_CONST_SHIFT
;
509 memcpy (tmp
+ _FPIO_CONST_SHIFT
,
510 &__tens
[powers
->arrayoff
],
511 tmpsize
* sizeof (mp_limb_t
));
512 MPN_ZERO (tmp
, _FPIO_CONST_SHIFT
);
513 /* Adjust exponent, as scaleexpo will be this much
515 exponent
+= _FPIO_CONST_SHIFT
* BITS_PER_MP_LIMB
;
520 tmpsize
= powers
->arraysize
;
521 memcpy (tmp
, &__tens
[powers
->arrayoff
],
522 tmpsize
* sizeof (mp_limb_t
));
527 cy
= __mpn_mul (tmp
, scale
, scalesize
,
528 &__tens
[powers
->arrayoff
529 + _FPIO_CONST_OFFSET
],
530 powers
->arraysize
- _FPIO_CONST_OFFSET
);
531 tmpsize
= scalesize
+ powers
->arraysize
- _FPIO_CONST_OFFSET
;
536 if (MPN_GE (frac
, tmp
))
539 MPN_ASSIGN (scale
, tmp
);
540 count_leading_zeros (cnt
, scale
[scalesize
- 1]);
541 scaleexpo
= (scalesize
- 2) * BITS_PER_MP_LIMB
- cnt
- 1;
542 exp10
|= 1 << explog
;
547 while (powers
> &_fpioconst_pow10
[0]);
550 /* Optimize number representations. We want to represent the numbers
551 with the lowest number of bytes possible without losing any
552 bytes. Also the highest bit in the scaling factor has to be set
553 (this is a requirement of the MPN division routines). */
556 /* Determine minimum number of zero bits at the end of
558 for (i
= 0; scale
[i
] == 0 && frac
[i
] == 0; i
++)
561 /* Determine number of bits the scaling factor is misplaced. */
562 count_leading_zeros (cnt_h
, scale
[scalesize
- 1]);
566 /* The highest bit of the scaling factor is already set. So
567 we only have to remove the trailing empty limbs. */
570 MPN_COPY_INCR (scale
, scale
+ i
, scalesize
- i
);
572 MPN_COPY_INCR (frac
, frac
+ i
, fracsize
- i
);
580 count_trailing_zeros (cnt_l
, scale
[i
]);
584 count_trailing_zeros (cnt_l2
, frac
[i
]);
590 count_trailing_zeros (cnt_l
, frac
[i
]);
592 /* Now shift the numbers to their optimal position. */
593 if (i
== 0 && BITS_PER_MP_LIMB
- cnt_h
> cnt_l
)
595 /* We cannot save any memory. So just roll both numbers
596 so that the scaling factor has its highest bit set. */
598 (void) __mpn_lshift (scale
, scale
, scalesize
, cnt_h
);
599 cy
= __mpn_lshift (frac
, frac
, fracsize
, cnt_h
);
601 frac
[fracsize
++] = cy
;
603 else if (BITS_PER_MP_LIMB
- cnt_h
<= cnt_l
)
605 /* We can save memory by removing the trailing zero limbs
606 and by packing the non-zero limbs which gain another
609 (void) __mpn_rshift (scale
, scale
+ i
, scalesize
- i
,
610 BITS_PER_MP_LIMB
- cnt_h
);
612 (void) __mpn_rshift (frac
, frac
+ i
, fracsize
- i
,
613 BITS_PER_MP_LIMB
- cnt_h
);
614 fracsize
-= frac
[fracsize
- i
- 1] == 0 ? i
+ 1 : i
;
618 /* We can only save the memory of the limbs which are zero.
619 The non-zero parts occupy the same number of limbs. */
621 (void) __mpn_rshift (scale
, scale
+ (i
- 1),
623 BITS_PER_MP_LIMB
- cnt_h
);
625 (void) __mpn_rshift (frac
, frac
+ (i
- 1),
627 BITS_PER_MP_LIMB
- cnt_h
);
628 fracsize
-= frac
[fracsize
- (i
- 1) - 1] == 0 ? i
: i
- 1;
633 else if (exponent
< 0)
637 int explog
= LDBL_MAX_10_EXP_LOG
;
638 const struct mp_power
*powers
= &_fpioconst_pow10
[explog
+ 1];
640 /* Now shift the input value to its right place. */
641 cy
= __mpn_lshift (frac
, fp_input
, fracsize
, to_shift
);
642 frac
[fracsize
++] = cy
;
643 assert (cy
== 1 || (frac
[fracsize
- 2] == 0 && frac
[0] == 0));
646 exponent
= -exponent
;
648 assert (powers
!= &_fpioconst_pow10
[0]);
653 if (exponent
>= powers
->m_expo
)
655 int i
, incr
, cnt_h
, cnt_l
;
658 /* The __mpn_mul function expects the first argument to be
659 bigger than the second. */
660 if (fracsize
< powers
->arraysize
- _FPIO_CONST_OFFSET
)
661 cy
= __mpn_mul (tmp
, &__tens
[powers
->arrayoff
662 + _FPIO_CONST_OFFSET
],
663 powers
->arraysize
- _FPIO_CONST_OFFSET
,
666 cy
= __mpn_mul (tmp
, frac
, fracsize
,
667 &__tens
[powers
->arrayoff
+ _FPIO_CONST_OFFSET
],
668 powers
->arraysize
- _FPIO_CONST_OFFSET
);
669 tmpsize
= fracsize
+ powers
->arraysize
- _FPIO_CONST_OFFSET
;
673 count_leading_zeros (cnt_h
, tmp
[tmpsize
- 1]);
674 incr
= (tmpsize
- fracsize
) * BITS_PER_MP_LIMB
675 + BITS_PER_MP_LIMB
- 1 - cnt_h
;
677 assert (incr
<= powers
->p_expo
);
679 /* If we increased the exponent by exactly 3 we have to test
680 for overflow. This is done by comparing with 10 shifted
681 to the right position. */
682 if (incr
== exponent
+ 3)
684 if (cnt_h
<= BITS_PER_MP_LIMB
- 4)
688 = ((mp_limb_t
) 10) << (BITS_PER_MP_LIMB
- 4 - cnt_h
);
692 topval
[0] = ((mp_limb_t
) 10) << (BITS_PER_MP_LIMB
- 4);
694 (void) __mpn_lshift (topval
, topval
, 2,
695 BITS_PER_MP_LIMB
- cnt_h
);
699 /* We have to be careful when multiplying the last factor.
700 If the result is greater than 1.0 be have to test it
701 against 10.0. If it is greater or equal to 10.0 the
702 multiplication was not valid. This is because we cannot
703 determine the number of bits in the result in advance. */
704 if (incr
< exponent
+ 3
705 || (incr
== exponent
+ 3 &&
706 (tmp
[tmpsize
- 1] < topval
[1]
707 || (tmp
[tmpsize
- 1] == topval
[1]
708 && tmp
[tmpsize
- 2] < topval
[0]))))
710 /* The factor is right. Adapt binary and decimal
713 exp10
|= 1 << explog
;
715 /* If this factor yields a number greater or equal to
716 1.0, we must not shift the non-fractional digits down. */
720 /* Now we optimize the number representation. */
721 for (i
= 0; tmp
[i
] == 0; ++i
);
722 if (cnt_h
== BITS_PER_MP_LIMB
- 1)
724 MPN_COPY (frac
, tmp
+ i
, tmpsize
- i
);
725 fracsize
= tmpsize
- i
;
729 count_trailing_zeros (cnt_l
, tmp
[i
]);
731 /* Now shift the numbers to their optimal position. */
732 if (i
== 0 && BITS_PER_MP_LIMB
- 1 - cnt_h
> cnt_l
)
734 /* We cannot save any memory. Just roll the
735 number so that the leading digit is in a
738 cy
= __mpn_lshift (frac
, tmp
, tmpsize
, cnt_h
+ 1);
739 fracsize
= tmpsize
+ 1;
740 frac
[fracsize
- 1] = cy
;
742 else if (BITS_PER_MP_LIMB
- 1 - cnt_h
<= cnt_l
)
744 (void) __mpn_rshift (frac
, tmp
+ i
, tmpsize
- i
,
745 BITS_PER_MP_LIMB
- 1 - cnt_h
);
746 fracsize
= tmpsize
- i
;
750 /* We can only save the memory of the limbs which
751 are zero. The non-zero parts occupy the same
754 (void) __mpn_rshift (frac
, tmp
+ (i
- 1),
756 BITS_PER_MP_LIMB
- 1 - cnt_h
);
757 fracsize
= tmpsize
- (i
- 1);
764 while (powers
!= &_fpioconst_pow10
[1] && exponent
> 0);
765 /* All factors but 10^-1 are tested now. */
770 cy
= __mpn_mul_1 (tmp
, frac
, fracsize
, 10);
772 assert (cy
== 0 || tmp
[tmpsize
- 1] < 20);
774 count_trailing_zeros (cnt_l
, tmp
[0]);
775 if (cnt_l
< MIN (4, exponent
))
777 cy
= __mpn_lshift (frac
, tmp
, tmpsize
,
778 BITS_PER_MP_LIMB
- MIN (4, exponent
));
780 frac
[tmpsize
++] = cy
;
783 (void) __mpn_rshift (frac
, tmp
, tmpsize
, MIN (4, exponent
));
786 assert (frac
[fracsize
- 1] < 10);
792 /* This is a special case. We don't need a factor because the
793 numbers are in the range of 1.0 <= |fp| < 8.0. We simply
794 shift it to the right place and divide it by 1.0 to get the
795 leading digit. (Of course this division is not really made.) */
796 assert (0 <= exponent
&& exponent
< 3 &&
797 exponent
+ to_shift
< BITS_PER_MP_LIMB
);
799 /* Now shift the input value to its right place. */
800 cy
= __mpn_lshift (frac
, fp_input
, fracsize
, (exponent
+ to_shift
));
801 frac
[fracsize
++] = cy
;
806 int width
= info
->width
;
807 wchar_t *wstartp
, *wcp
;
810 int intdig_max
, intdig_no
= 0;
816 char spec
= _tolower (info
->spec
);
822 fracdig_min
= fracdig_max
= info
->prec
< 0 ? 6 : info
->prec
;
823 chars_needed
= 1 + 1 + (size_t) fracdig_max
+ 1 + 1 + 4;
824 /* d . ddd e +- ddd */
825 dig_max
= INT_MAX
; /* Unlimited. */
826 significant
= 1; /* Does not matter here. */
828 else if (spec
== 'f')
831 fracdig_min
= fracdig_max
= info
->prec
< 0 ? 6 : info
->prec
;
832 dig_max
= INT_MAX
; /* Unlimited. */
833 significant
= 1; /* Does not matter here. */
836 intdig_max
= exponent
+ 1;
837 /* This can be really big! */ /* XXX Maybe malloc if too big? */
838 chars_needed
= (size_t) exponent
+ 1 + 1 + (size_t) fracdig_max
;
843 chars_needed
= 1 + 1 + (size_t) fracdig_max
;
848 dig_max
= info
->prec
< 0 ? 6 : (info
->prec
== 0 ? 1 : info
->prec
);
849 if ((expsign
== 0 && exponent
>= dig_max
)
850 || (expsign
!= 0 && exponent
> 4))
852 if ('g' - 'G' == 'e' - 'E')
853 type
= 'E' + (info
->spec
- 'G');
855 type
= isupper (info
->spec
) ? 'E' : 'e';
856 fracdig_max
= dig_max
- 1;
858 chars_needed
= 1 + 1 + (size_t) fracdig_max
+ 1 + 1 + 4;
863 intdig_max
= expsign
== 0 ? exponent
+ 1 : 0;
864 fracdig_max
= dig_max
- intdig_max
;
865 /* We need space for the significant digits and perhaps
866 for leading zeros when < 1.0. The number of leading
867 zeros can be as many as would be required for
868 exponential notation with a negative two-digit
869 exponent, which is 4. */
870 chars_needed
= (size_t) dig_max
+ 1 + 4;
872 fracdig_min
= info
->alt
? fracdig_max
: 0;
873 significant
= 0; /* We count significant digits. */
878 /* Guess the number of groups we will make, and thus how
879 many spaces we need for separator characters. */
880 ngroups
= __guess_grouping (intdig_max
, grouping
);
881 /* Allocate one more character in case rounding increases the
883 chars_needed
+= ngroups
+ 1;
886 /* Allocate buffer for output. We need two more because while rounding
887 it is possible that we need two more characters in front of all the
888 other output. If the amount of memory we have to allocate is too
889 large use `malloc' instead of `alloca'. */
890 if (__builtin_expect (chars_needed
>= (size_t) -1 / sizeof (wchar_t) - 2
891 || chars_needed
< fracdig_max
, 0))
893 /* Some overflow occurred. */
894 __set_errno (ERANGE
);
897 size_t wbuffer_to_alloc
= (2 + chars_needed
) * sizeof (wchar_t);
898 buffer_malloced
= ! __libc_use_alloca (wbuffer_to_alloc
);
899 if (__builtin_expect (buffer_malloced
, 0))
901 wbuffer
= (wchar_t *) malloc (wbuffer_to_alloc
);
903 /* Signal an error to the caller. */
907 wbuffer
= (wchar_t *) alloca (wbuffer_to_alloc
);
908 wcp
= wstartp
= wbuffer
+ 2; /* Let room for rounding. */
910 /* Do the real work: put digits in allocated buffer. */
911 if (expsign
== 0 || type
!= 'f')
913 assert (expsign
== 0 || intdig_max
== 1);
914 while (intdig_no
< intdig_max
)
917 *wcp
++ = hack_digit ();
922 || (fracdig_max
> 0 && (fracsize
> 1 || frac
[0] != 0)))
927 /* |fp| < 1.0 and the selected type is 'f', so put "0."
934 /* Generate the needed number of fractional digits. */
937 while (fracdig_no
< fracdig_min
+ added_zeros
938 || (fracdig_no
< fracdig_max
&& (fracsize
> 1 || frac
[0] != 0)))
941 *wcp
= hack_digit ();
944 else if (significant
== 0)
953 wchar_t last_digit
= wcp
[-1] != decimalwc
? wcp
[-1] : wcp
[-2];
954 wchar_t next_digit
= hack_digit ();
956 if (next_digit
!= L
'0' && next_digit
!= L
'5')
958 else if (fracsize
== 1 && frac
[0] == 0)
959 /* Rest of the number is zero. */
961 else if (scalesize
== 0)
963 /* Here we have to see whether all limbs are zero since no
964 normalization happened. */
965 size_t lcnt
= fracsize
;
966 while (lcnt
>= 1 && frac
[lcnt
- 1] == 0)
968 more_bits
= lcnt
> 0;
972 int rounding_mode
= get_rounding_mode ();
973 if (round_away (is_neg
, (last_digit
- L
'0') & 1, next_digit
>= L
'5',
974 more_bits
, rounding_mode
))
980 /* Process fractional digits. Terminate if not rounded or
981 radix character is reached. */
983 while (*--wtp
!= decimalwc
&& *wtp
== L
'9')
988 if (removed
== fracdig_min
&& added_zeros
> 0)
990 if (*wtp
!= decimalwc
)
993 else if (__builtin_expect (spec
== 'g' && type
== 'f' && info
->alt
994 && wtp
== wstartp
+ 1
995 && wstartp
[0] == L
'0',
997 /* This is a special case: the rounded number is 1.0,
998 the format is 'g' or 'G', and the alternative format
999 is selected. This means the result must be "1.". */
1003 if (fracdig_no
== 0 || *wtp
== decimalwc
)
1005 /* Round the integer digits. */
1006 if (*(wtp
- 1) == decimalwc
)
1009 while (--wtp
>= wstartp
&& *wtp
== L
'9')
1016 /* It is more critical. All digits were 9's. */
1021 exponent
+= expsign
== 0 ? 1 : -1;
1023 /* The above exponent adjustment could lead to 1.0e-00,
1024 e.g. for 0.999999999. Make sure exponent 0 always
1029 else if (intdig_no
== dig_max
)
1031 /* This is the case where for type %g the number fits
1032 really in the range for %f output but after rounding
1033 the number of digits is too big. */
1034 *--wstartp
= decimalwc
;
1037 if (info
->alt
|| fracdig_no
> 0)
1039 /* Overwrite the old radix character. */
1040 wstartp
[intdig_no
+ 2] = L
'0';
1044 fracdig_no
+= intdig_no
;
1046 fracdig_max
= intdig_max
- intdig_no
;
1048 /* Now we must print the exponent. */
1049 type
= isupper (info
->spec
) ? 'E' : 'e';
1053 /* We can simply add another another digit before the
1059 /* While rounding the number of digits can change.
1060 If the number now exceeds the limits remove some
1061 fractional digits. */
1062 if (intdig_no
+ fracdig_no
> dig_max
)
1064 wcp
-= intdig_no
+ fracdig_no
- dig_max
;
1065 fracdig_no
-= intdig_no
+ fracdig_no
- dig_max
;
1071 /* Now remove unnecessary '0' at the end of the string. */
1072 while (fracdig_no
> fracdig_min
+ added_zeros
&& *(wcp
- 1) == L
'0')
1077 /* If we eliminate all fractional digits we perhaps also can remove
1078 the radix character. */
1079 if (fracdig_no
== 0 && !info
->alt
&& *(wcp
- 1) == decimalwc
)
1084 /* Rounding might have changed the number of groups. We allocated
1085 enough memory but we need here the correct number of groups. */
1086 if (intdig_no
!= intdig_max
)
1087 ngroups
= __guess_grouping (intdig_no
, grouping
);
1089 /* Add in separator characters, overwriting the same buffer. */
1090 wcp
= group_number (wstartp
, wcp
, intdig_no
, grouping
, thousands_sepwc
,
1094 /* Write the exponent if it is needed. */
1097 if (__builtin_expect (expsign
!= 0 && exponent
== 4 && spec
== 'g', 0))
1099 /* This is another special case. The exponent of the number is
1100 really smaller than -4, which requires the 'e'/'E' format.
1101 But after rounding the number has an exponent of -4. */
1102 assert (wcp
>= wstartp
+ 1);
1103 assert (wstartp
[0] == L
'1');
1104 __wmemcpy (wstartp
, L
"0.0001", 6);
1105 wstartp
[1] = decimalwc
;
1106 if (wcp
>= wstartp
+ 2)
1108 wmemset (wstartp
+ 6, L
'0', wcp
- (wstartp
+ 2));
1116 *wcp
++ = (wchar_t) type
;
1117 *wcp
++ = expsign
? L
'-' : L
'+';
1119 /* Find the magnitude of the exponent. */
1121 while (expscale
<= exponent
)
1125 /* Exponent always has at least two digits. */
1131 *wcp
++ = L
'0' + (exponent
/ expscale
);
1132 exponent
%= expscale
;
1134 while (expscale
> 10);
1135 *wcp
++ = L
'0' + exponent
;
1139 /* Compute number of characters which must be filled with the padding
1141 if (is_neg
|| info
->showsign
|| info
->space
)
1143 width
-= wcp
- wstartp
;
1145 if (!info
->left
&& info
->pad
!= '0' && width
> 0)
1146 PADN (info
->pad
, width
);
1150 else if (info
->showsign
)
1152 else if (info
->space
)
1155 if (!info
->left
&& info
->pad
== '0' && width
> 0)
1159 char *buffer
= NULL
;
1160 char *buffer_end
= NULL
;
1166 /* Create the single byte string. */
1168 size_t thousands_sep_len
;
1170 size_t factor
= (info
->i18n
1171 ? _NL_CURRENT_WORD (LC_CTYPE
, _NL_CTYPE_MB_CUR_MAX
)
1174 decimal_len
= strlen (decimal
);
1176 if (thousands_sep
== NULL
)
1177 thousands_sep_len
= 0;
1179 thousands_sep_len
= strlen (thousands_sep
);
1181 size_t nbuffer
= (2 + chars_needed
* factor
+ decimal_len
1182 + ngroups
* thousands_sep_len
);
1183 if (__builtin_expect (buffer_malloced
, 0))
1185 buffer
= (char *) malloc (nbuffer
);
1188 /* Signal an error to the caller. */
1194 buffer
= (char *) alloca (nbuffer
);
1195 buffer_end
= buffer
+ nbuffer
;
1197 /* Now copy the wide character string. Since the character
1198 (except for the decimal point and thousands separator) must
1199 be coming from the ASCII range we can esily convert the
1200 string without mapping tables. */
1201 for (cp
= buffer
, copywc
= wstartp
; copywc
< wcp
; ++copywc
)
1202 if (*copywc
== decimalwc
)
1203 cp
= (char *) __mempcpy (cp
, decimal
, decimal_len
);
1204 else if (*copywc
== thousands_sepwc
)
1205 cp
= (char *) __mempcpy (cp
, thousands_sep
, thousands_sep_len
);
1207 *cp
++ = (char) *copywc
;
1211 if (__builtin_expect (info
->i18n
, 0))
1213 #ifdef COMPILE_WPRINTF
1214 wstartp
= _i18n_number_rewrite (wstartp
, wcp
,
1215 wbuffer
+ wbuffer_to_alloc
);
1216 wcp
= wbuffer
+ wbuffer_to_alloc
;
1217 assert ((uintptr_t) wbuffer
<= (uintptr_t) wstartp
);
1218 assert ((uintptr_t) wstartp
1219 < (uintptr_t) wbuffer
+ wbuffer_to_alloc
);
1221 tmpptr
= _i18n_number_rewrite (tmpptr
, cp
, buffer_end
);
1223 assert ((uintptr_t) buffer
<= (uintptr_t) tmpptr
);
1224 assert ((uintptr_t) tmpptr
< (uintptr_t) buffer_end
);
1228 PRINT (tmpptr
, wstartp
, wide
? wcp
- wstartp
: cp
- tmpptr
);
1230 /* Free the memory if necessary. */
1231 if (__builtin_expect (buffer_malloced
, 0))
1238 if (info
->left
&& width
> 0)
1239 PADN (info
->pad
, width
);
1243 ldbl_hidden_def (___printf_fp
, __printf_fp
)
1244 ldbl_strong_alias (___printf_fp
, __printf_fp
)
1246 /* Return the number of extra grouping characters that will be inserted
1247 into a number with INTDIG_MAX integer digits. */
1250 __guess_grouping (unsigned int intdig_max
, const char *grouping
)
1252 unsigned int groups
;
1254 /* We treat all negative values like CHAR_MAX. */
1256 if (*grouping
== CHAR_MAX
|| *grouping
<= 0)
1257 /* No grouping should be done. */
1261 while (intdig_max
> (unsigned int) *grouping
)
1264 intdig_max
-= *grouping
++;
1266 if (*grouping
== CHAR_MAX
1271 /* No more grouping should be done. */
1273 else if (*grouping
== 0)
1275 /* Same grouping repeats. */
1276 groups
+= (intdig_max
- 1) / grouping
[-1];
1284 /* Group the INTDIG_NO integer digits of the number in [BUF,BUFEND).
1285 There is guaranteed enough space past BUFEND to extend it.
1286 Return the new end of buffer. */
1290 group_number (wchar_t *buf
, wchar_t *bufend
, unsigned int intdig_no
,
1291 const char *grouping
, wchar_t thousands_sep
, int ngroups
)
1298 /* Move the fractional part down. */
1299 __wmemmove (buf
+ intdig_no
+ ngroups
, buf
+ intdig_no
,
1300 bufend
- (buf
+ intdig_no
));
1302 p
= buf
+ intdig_no
+ ngroups
- 1;
1305 unsigned int len
= *grouping
++;
1307 *p
-- = buf
[--intdig_no
];
1309 *p
-- = thousands_sep
;
1311 if (*grouping
== CHAR_MAX
1316 /* No more grouping should be done. */
1318 else if (*grouping
== 0)
1319 /* Same grouping repeats. */
1321 } while (intdig_no
> (unsigned int) *grouping
);
1323 /* Copy the remaining ungrouped digits. */
1325 *p
-- = buf
[--intdig_no
];
1328 return bufend
+ ngroups
;