Fix fwrite() reading beyond end of buffer in error path
[glibc.git] / stdio-common / printf_fp.c
blob2b93e6c57ac135a0bd5460d5dd75578ef22bc494
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. */
22 #define HAVE_ALLOCA 1
24 #include <libioP.h>
25 #include <alloca.h>
26 #include <ctype.h>
27 #include <float.h>
28 #include <gmp-mparam.h>
29 #include <gmp.h>
30 #include <ieee754.h>
31 #include <stdlib/gmp-impl.h>
32 #include <stdlib/longlong.h>
33 #include <stdlib/fpioconst.h>
34 #include <locale/localeinfo.h>
35 #include <limits.h>
36 #include <math.h>
37 #include <printf.h>
38 #include <string.h>
39 #include <unistd.h>
40 #include <stdlib.h>
41 #include <wchar.h>
42 #include <stdbool.h>
43 #include <rounding-mode.h>
45 #ifdef COMPILE_WPRINTF
46 # define CHAR_T wchar_t
47 #else
48 # define CHAR_T char
49 #endif
51 #include "_i18n_number.h"
53 #ifndef NDEBUG
54 # define NDEBUG /* Undefine this for debugging assertions. */
55 #endif
56 #include <assert.h>
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
63 names equal. */
64 #undef putc
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
68 #define FILE _IO_FILE
70 /* Macros for doing the actual output. */
72 #define outchar(ch) \
73 do \
74 { \
75 const int outc = (ch); \
76 if (putc (outc, fp) == EOF) \
77 { \
78 if (buffer_malloced) \
79 free (wbuffer); \
80 return -1; \
81 } \
82 ++done; \
83 } while (0)
85 #define PRINT(ptr, wptr, len) \
86 do \
87 { \
88 size_t outlen = (len); \
89 if (len > 20) \
90 { \
91 if (PUT (fp, wide ? (const char *) wptr : ptr, outlen) != outlen) \
92 { \
93 if (buffer_malloced) \
94 free (wbuffer); \
95 return -1; \
96 } \
97 ptr += outlen; \
98 done += outlen; \
99 } \
100 else \
102 if (wide) \
103 while (outlen-- > 0) \
104 outchar (*wptr++); \
105 else \
106 while (outlen-- > 0) \
107 outchar (*ptr++); \
109 } while (0)
111 #define PADN(ch, len) \
112 do \
114 if (PAD (fp, ch, len) != len) \
116 if (buffer_malloced) \
117 free (wbuffer); \
118 return -1; \
120 done += len; \
122 while (0)
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,
138 double value);
139 extern mp_size_t __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
140 int *expt, int *is_neg,
141 long double value);
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)
149 internal_function;
153 ___printf_fp (FILE *fp,
154 const struct printf_info *info,
155 const void *const *args)
157 /* The floating-point value to output. */
158 union
160 double dbl;
161 __long_double_t ldbl;
163 fpnum;
165 /* Locale-dependent representation of decimal point. */
166 const char *decimal;
167 wchar_t decimalwc;
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
179 position. */
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. */
182 int to_shift = 0;
184 /* The fraction of the floting-point value in question */
185 MPN_VAR(frac);
186 /* and the exponent. */
187 int exponent;
188 /* Sign of the exponent. */
189 int expsign = 0;
190 /* Sign of float number. */
191 int is_neg = 0;
193 /* Scaling factor. */
194 MPN_VAR(scale);
196 /* Temporary bignum value. */
197 MPN_VAR(tmp);
199 /* The type of output format that will be used: 'e'/'E' or 'f'. */
200 int type;
202 /* Counter for number of written characters. */
203 int done = 0;
205 /* General helper (carry limb). */
206 mp_limb_t cy;
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)
220 mp_limb_t hi;
222 if (expsign != 0 && type == 'f' && exponent-- > 0)
223 hi = 0;
224 else if (scalesize == 0)
226 hi = frac[fracsize - 1];
227 frac[fracsize - 1] = __mpn_mul_1 (frac, frac, fracsize - 1, 10);
229 else
231 if (fracsize < scalesize)
232 hi = 0;
233 else
235 hi = mpn_divmod (tmp, frac, fracsize, scale, scalesize);
236 tmp[fracsize - scalesize] = hi;
237 hi = tmp[0];
239 fracsize = scalesize;
240 while (fracsize != 0 && frac[fracsize - 1] == 0)
241 --fracsize;
242 if (fracsize == 0)
244 /* We're not prepared for an mpn variable with zero
245 limbs. */
246 fracsize = 1;
247 return L'0' + hi;
251 mp_limb_t _cy = __mpn_mul_1 (frac, frac, fracsize, 10);
252 if (_cy != 0)
253 frac[fracsize++] = _cy;
256 return L'0' + hi;
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);
266 else
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');
281 if (info->group)
283 if (info->extra == 0)
284 grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
285 else
286 grouping = _NL_CURRENT (LC_MONETARY, MON_GROUPING);
288 if (*grouping <= 0 || *grouping == CHAR_MAX)
289 grouping = NULL;
290 else
292 /* Figure out the thousands separator character. */
293 if (wide)
295 if (info->extra == 0)
296 thousands_sepwc =
297 _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_THOUSANDS_SEP_WC);
298 else
299 thousands_sepwc =
300 _NL_CURRENT_WORD (LC_MONETARY,
301 _NL_MONETARY_THOUSANDS_SEP_WC);
303 else
305 if (info->extra == 0)
306 thousands_sep = _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
307 else
308 thousands_sep = _NL_CURRENT (LC_MONETARY, MON_THOUSANDS_SEP);
311 if ((wide && thousands_sepwc == L'\0')
312 || (! wide && *thousands_sep == '\0'))
313 grouping = NULL;
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;
322 else
323 grouping = NULL;
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. */
332 int res;
333 if (__isnanl (fpnum.ldbl))
335 is_neg = signbit (fpnum.ldbl);
336 if (isupper (info->spec))
338 special = "NAN";
339 wspecial = L"NAN";
341 else
343 special = "nan";
344 wspecial = L"nan";
347 else if ((res = __isinfl (fpnum.ldbl)))
349 is_neg = res < 0;
350 if (isupper (info->spec))
352 special = "INF";
353 wspecial = L"INF";
355 else
357 special = "inf";
358 wspecial = L"inf";
361 else
363 fracsize = __mpn_extract_long_double (fp_input,
364 (sizeof (fp_input) /
365 sizeof (fp_input[0])),
366 &exponent, &is_neg,
367 fpnum.ldbl);
368 to_shift = 1 + fracsize * BITS_PER_MP_LIMB - LDBL_MANT_DIG;
371 else
372 #endif /* no long double */
374 fpnum.dbl = *(const double *) args[0];
376 /* Check for special values: not a number or infinity. */
377 int res;
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))
384 special = "NAN";
385 wspecial = L"NAN";
387 else
389 special = "nan";
390 wspecial = L"nan";
393 else if ((res = __isinf (fpnum.dbl)))
395 is_neg = res < 0;
396 if (isupper (info->spec))
398 special = "INF";
399 wspecial = L"INF";
401 else
403 special = "inf";
404 wspecial = L"inf";
407 else
409 fracsize = __mpn_extract_double (fp_input,
410 (sizeof (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;
417 if (special)
419 int width = info->width;
421 if (is_neg || info->showsign || info->space)
422 --width;
423 width -= 3;
425 if (!info->left && width > 0)
426 PADN (' ', width);
428 if (is_neg)
429 outchar ('-');
430 else if (info->showsign)
431 outchar ('+');
432 else if (info->space)
433 outchar (' ');
435 PRINT (special, wspecial, 3);
437 if (info->left && width > 0)
438 PADN (' ', width);
440 return done;
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)
450 / BITS_PER_MP_LIMB
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
460 for the other. */
461 scalesize = 0;
462 if (exponent > 2)
464 /* |FP| >= 8.0. */
465 int scaleexpo = 0;
466 int explog = LDBL_MAX_10_EXP_LOG;
467 int exp10 = 0;
468 const struct mp_power *powers = &_fpioconst_pow10[explog + 1];
469 int cnt_h, cnt_l, i;
471 if ((exponent + to_shift) % BITS_PER_MP_LIMB == 0)
473 MPN_COPY_DECR (frac + (exponent + to_shift) / BITS_PER_MP_LIMB,
474 fp_input, fracsize);
475 fracsize += (exponent + to_shift) / BITS_PER_MP_LIMB;
477 else
479 cy = __mpn_lshift (frac + (exponent + to_shift) / BITS_PER_MP_LIMB,
480 fp_input, fracsize,
481 (exponent + to_shift) % BITS_PER_MP_LIMB);
482 fracsize += (exponent + to_shift) / BITS_PER_MP_LIMB;
483 if (cy)
484 frac[fracsize++] = cy;
486 MPN_ZERO (frac, (exponent + to_shift) / BITS_PER_MP_LIMB);
488 assert (powers > &_fpioconst_pow10[0]);
491 --powers;
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)
497 if (scalesize == 0)
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
514 bigger too. */
515 exponent += _FPIO_CONST_SHIFT * BITS_PER_MP_LIMB;
517 else
518 #endif
520 tmpsize = powers->arraysize;
521 memcpy (tmp, &__tens[powers->arrayoff],
522 tmpsize * sizeof (mp_limb_t));
525 else
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;
532 if (cy == 0)
533 --tmpsize;
536 if (MPN_GE (frac, tmp))
538 int cnt;
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;
545 --explog;
547 while (powers > &_fpioconst_pow10[0]);
548 exponent = exp10;
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). */
554 if (scalesize > 0)
556 /* Determine minimum number of zero bits at the end of
557 both numbers. */
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]);
564 if (cnt_h == 0)
566 /* The highest bit of the scaling factor is already set. So
567 we only have to remove the trailing empty limbs. */
568 if (i > 0)
570 MPN_COPY_INCR (scale, scale + i, scalesize - i);
571 scalesize -= i;
572 MPN_COPY_INCR (frac, frac + i, fracsize - i);
573 fracsize -= i;
576 else
578 if (scale[i] != 0)
580 count_trailing_zeros (cnt_l, scale[i]);
581 if (frac[i] != 0)
583 int cnt_l2;
584 count_trailing_zeros (cnt_l2, frac[i]);
585 if (cnt_l2 < cnt_l)
586 cnt_l = cnt_l2;
589 else
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);
600 if (cy != 0)
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
607 free one. */
609 (void) __mpn_rshift (scale, scale + i, scalesize - i,
610 BITS_PER_MP_LIMB - cnt_h);
611 scalesize -= i + 1;
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;
616 else
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),
622 scalesize - (i - 1),
623 BITS_PER_MP_LIMB - cnt_h);
624 scalesize -= i;
625 (void) __mpn_rshift (frac, frac + (i - 1),
626 fracsize - (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)
635 /* |FP| < 1.0. */
636 int exp10 = 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));
645 expsign = 1;
646 exponent = -exponent;
648 assert (powers != &_fpioconst_pow10[0]);
651 --powers;
653 if (exponent >= powers->m_expo)
655 int i, incr, cnt_h, cnt_l;
656 mp_limb_t topval[2];
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,
664 frac, fracsize);
665 else
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;
670 if (cy == 0)
671 --tmpsize;
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)
686 topval[0] = 0;
687 topval[1]
688 = ((mp_limb_t) 10) << (BITS_PER_MP_LIMB - 4 - cnt_h);
690 else
692 topval[0] = ((mp_limb_t) 10) << (BITS_PER_MP_LIMB - 4);
693 topval[1] = 0;
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
711 exponents. */
712 exponent -= incr;
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. */
717 if (exponent < 0)
718 cnt_h += -exponent;
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;
727 else
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
736 separate limb. */
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;
748 else
750 /* We can only save the memory of the limbs which
751 are zero. The non-zero parts occupy the same
752 number of limbs. */
754 (void) __mpn_rshift (frac, tmp + (i - 1),
755 tmpsize - (i - 1),
756 BITS_PER_MP_LIMB - 1 - cnt_h);
757 fracsize = tmpsize - (i - 1);
762 --explog;
764 while (powers != &_fpioconst_pow10[1] && exponent > 0);
765 /* All factors but 10^-1 are tested now. */
766 if (exponent > 0)
768 int cnt_l;
770 cy = __mpn_mul_1 (tmp, frac, fracsize, 10);
771 tmpsize = fracsize;
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));
779 if (cy != 0)
780 frac[tmpsize++] = cy;
782 else
783 (void) __mpn_rshift (frac, tmp, tmpsize, MIN (4, exponent));
784 fracsize = tmpsize;
785 exp10 |= 1;
786 assert (frac[fracsize - 1] < 10);
788 exponent = exp10;
790 else
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;
802 exponent = 0;
806 int width = info->width;
807 wchar_t *wstartp, *wcp;
808 size_t chars_needed;
809 int expscale;
810 int intdig_max, intdig_no = 0;
811 int fracdig_min;
812 int fracdig_max;
813 int dig_max;
814 int significant;
815 int ngroups = 0;
816 char spec = _tolower (info->spec);
818 if (spec == 'e')
820 type = info->spec;
821 intdig_max = 1;
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')
830 type = '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. */
834 if (expsign == 0)
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;
840 else
842 intdig_max = 1;
843 chars_needed = 1 + 1 + (size_t) fracdig_max;
846 else
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');
854 else
855 type = isupper (info->spec) ? 'E' : 'e';
856 fracdig_max = dig_max - 1;
857 intdig_max = 1;
858 chars_needed = 1 + 1 + (size_t) fracdig_max + 1 + 1 + 4;
860 else
862 type = 'f';
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. */
876 if (grouping)
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
882 number of groups. */
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);
895 return -1;
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);
902 if (wbuffer == NULL)
903 /* Signal an error to the caller. */
904 return -1;
906 else
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)
916 ++intdig_no;
917 *wcp++ = hack_digit ();
919 significant = 1;
920 if (info->alt
921 || fracdig_min > 0
922 || (fracdig_max > 0 && (fracsize > 1 || frac[0] != 0)))
923 *wcp++ = decimalwc;
925 else
927 /* |fp| < 1.0 and the selected type is 'f', so put "0."
928 in the buffer. */
929 *wcp++ = L'0';
930 --exponent;
931 *wcp++ = decimalwc;
934 /* Generate the needed number of fractional digits. */
935 int fracdig_no = 0;
936 int added_zeros = 0;
937 while (fracdig_no < fracdig_min + added_zeros
938 || (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0)))
940 ++fracdig_no;
941 *wcp = hack_digit ();
942 if (*wcp++ != L'0')
943 significant = 1;
944 else if (significant == 0)
946 ++fracdig_max;
947 if (fracdig_min > 0)
948 ++added_zeros;
952 /* Do rounding. */
953 wchar_t last_digit = wcp[-1] != decimalwc ? wcp[-1] : wcp[-2];
954 wchar_t next_digit = hack_digit ();
955 bool more_bits;
956 if (next_digit != L'0' && next_digit != L'5')
957 more_bits = true;
958 else if (fracsize == 1 && frac[0] == 0)
959 /* Rest of the number is zero. */
960 more_bits = false;
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)
967 --lcnt;
968 more_bits = lcnt > 0;
970 else
971 more_bits = true;
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))
976 wchar_t *wtp = wcp;
978 if (fracdig_no > 0)
980 /* Process fractional digits. Terminate if not rounded or
981 radix character is reached. */
982 int removed = 0;
983 while (*--wtp != decimalwc && *wtp == L'9')
985 *wtp = L'0';
986 ++removed;
988 if (removed == fracdig_min && added_zeros > 0)
989 --added_zeros;
990 if (*wtp != decimalwc)
991 /* Round up. */
992 (*wtp)++;
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.". */
1000 --added_zeros;
1003 if (fracdig_no == 0 || *wtp == decimalwc)
1005 /* Round the integer digits. */
1006 if (*(wtp - 1) == decimalwc)
1007 --wtp;
1009 while (--wtp >= wstartp && *wtp == L'9')
1010 *wtp = L'0';
1012 if (wtp >= wstartp)
1013 /* Round up. */
1014 (*wtp)++;
1015 else
1016 /* It is more critical. All digits were 9's. */
1018 if (type != 'f')
1020 *wstartp = '1';
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
1025 uses + sign. */
1026 if (exponent == 0)
1027 expsign = 0;
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;
1035 *--wstartp = L'1';
1037 if (info->alt || fracdig_no > 0)
1039 /* Overwrite the old radix character. */
1040 wstartp[intdig_no + 2] = L'0';
1041 ++fracdig_no;
1044 fracdig_no += intdig_no;
1045 intdig_no = 1;
1046 fracdig_max = intdig_max - intdig_no;
1047 ++exponent;
1048 /* Now we must print the exponent. */
1049 type = isupper (info->spec) ? 'E' : 'e';
1051 else
1053 /* We can simply add another another digit before the
1054 radix. */
1055 *--wstartp = L'1';
1056 ++intdig_no;
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')
1074 --wcp;
1075 --fracdig_no;
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)
1080 --wcp;
1082 if (grouping)
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,
1091 ngroups);
1094 /* Write the exponent if it is needed. */
1095 if (type != 'f')
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));
1109 wcp += 4;
1111 else
1112 wcp += 5;
1114 else
1116 *wcp++ = (wchar_t) type;
1117 *wcp++ = expsign ? L'-' : L'+';
1119 /* Find the magnitude of the exponent. */
1120 expscale = 10;
1121 while (expscale <= exponent)
1122 expscale *= 10;
1124 if (exponent < 10)
1125 /* Exponent always has at least two digits. */
1126 *wcp++ = L'0';
1127 else
1130 expscale /= 10;
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
1140 character. */
1141 if (is_neg || info->showsign || info->space)
1142 --width;
1143 width -= wcp - wstartp;
1145 if (!info->left && info->pad != '0' && width > 0)
1146 PADN (info->pad, width);
1148 if (is_neg)
1149 outchar ('-');
1150 else if (info->showsign)
1151 outchar ('+');
1152 else if (info->space)
1153 outchar (' ');
1155 if (!info->left && info->pad == '0' && width > 0)
1156 PADN ('0', width);
1159 char *buffer = NULL;
1160 char *buffer_end = NULL;
1161 char *cp = NULL;
1162 char *tmpptr;
1164 if (! wide)
1166 /* Create the single byte string. */
1167 size_t decimal_len;
1168 size_t thousands_sep_len;
1169 wchar_t *copywc;
1170 size_t factor = (info->i18n
1171 ? _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)
1172 : 1);
1174 decimal_len = strlen (decimal);
1176 if (thousands_sep == NULL)
1177 thousands_sep_len = 0;
1178 else
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);
1186 if (buffer == NULL)
1188 /* Signal an error to the caller. */
1189 free (wbuffer);
1190 return -1;
1193 else
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);
1206 else
1207 *cp++ = (char) *copywc;
1210 tmpptr = buffer;
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);
1220 #else
1221 tmpptr = _i18n_number_rewrite (tmpptr, cp, buffer_end);
1222 cp = buffer_end;
1223 assert ((uintptr_t) buffer <= (uintptr_t) tmpptr);
1224 assert ((uintptr_t) tmpptr < (uintptr_t) buffer_end);
1225 #endif
1228 PRINT (tmpptr, wstartp, wide ? wcp - wstartp : cp - tmpptr);
1230 /* Free the memory if necessary. */
1231 if (__builtin_expect (buffer_malloced, 0))
1233 free (buffer);
1234 free (wbuffer);
1238 if (info->left && width > 0)
1239 PADN (info->pad, width);
1241 return done;
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. */
1249 unsigned int
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. */
1258 return 0;
1260 groups = 0;
1261 while (intdig_max > (unsigned int) *grouping)
1263 ++groups;
1264 intdig_max -= *grouping++;
1266 if (*grouping == CHAR_MAX
1267 #if CHAR_MIN < 0
1268 || *grouping < 0
1269 #endif
1271 /* No more grouping should be done. */
1272 break;
1273 else if (*grouping == 0)
1275 /* Same grouping repeats. */
1276 groups += (intdig_max - 1) / grouping[-1];
1277 break;
1281 return groups;
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. */
1288 static wchar_t *
1289 internal_function
1290 group_number (wchar_t *buf, wchar_t *bufend, unsigned int intdig_no,
1291 const char *grouping, wchar_t thousands_sep, int ngroups)
1293 wchar_t *p;
1295 if (ngroups == 0)
1296 return bufend;
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];
1308 while (--len > 0);
1309 *p-- = thousands_sep;
1311 if (*grouping == CHAR_MAX
1312 #if CHAR_MIN < 0
1313 || *grouping < 0
1314 #endif
1316 /* No more grouping should be done. */
1317 break;
1318 else if (*grouping == 0)
1319 /* Same grouping repeats. */
1320 --grouping;
1321 } while (intdig_no > (unsigned int) *grouping);
1323 /* Copy the remaining ungrouped digits. */
1325 *p-- = buf[--intdig_no];
1326 while (p > buf);
1328 return bufend + ngroups;