• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/timemachine/gettext-0.17/gettext-tools/gnulib-lib/
1/* vsprintf with automatic memory allocation.
2   Copyright (C) 1999, 2002-2007 Free Software Foundation, Inc.
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2, or (at your option)
7   any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License along
15   with this program; if not, write to the Free Software Foundation,
16   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18/* This file can be parametrized with the following macros:
19     VASNPRINTF         The name of the function being defined.
20     FCHAR_T            The element type of the format string.
21     DCHAR_T            The element type of the destination (result) string.
22     FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
23                        in the format string are ASCII. MUST be set if
24                        FCHAR_T and DCHAR_T are not the same type.
25     DIRECTIVE          Structure denoting a format directive.
26                        Depends on FCHAR_T.
27     DIRECTIVES         Structure denoting the set of format directives of a
28                        format string.  Depends on FCHAR_T.
29     PRINTF_PARSE       Function that parses a format string.
30                        Depends on FCHAR_T.
31     DCHAR_CPY          memcpy like function for DCHAR_T[] arrays.
32     DCHAR_SET          memset like function for DCHAR_T[] arrays.
33     DCHAR_MBSNLEN      mbsnlen like function for DCHAR_T[] arrays.
34     SNPRINTF           The system's snprintf (or similar) function.
35                        This may be either snprintf or swprintf.
36     TCHAR_T            The element type of the argument and result string
37                        of the said SNPRINTF function.  This may be either
38                        char or wchar_t.  The code exploits that
39                        sizeof (TCHAR_T) | sizeof (DCHAR_T) and
40                        alignof (TCHAR_T) <= alignof (DCHAR_T).
41     DCHAR_IS_TCHAR     Set to 1 if DCHAR_T and TCHAR_T are the same type.
42     DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
43     DCHAR_IS_UINT8_T   Set to 1 if DCHAR_T is uint8_t.
44     DCHAR_IS_UINT16_T  Set to 1 if DCHAR_T is uint16_t.
45     DCHAR_IS_UINT32_T  Set to 1 if DCHAR_T is uint32_t.  */
46
47/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
48   This must come before <config.h> because <config.h> may include
49   <features.h>, and once <features.h> has been included, it's too late.  */
50#ifndef _GNU_SOURCE
51# define _GNU_SOURCE    1
52#endif
53
54#ifndef VASNPRINTF
55# include <config.h>
56#endif
57#ifndef IN_LIBINTL
58# include <alloca.h>
59#endif
60
61/* Specification.  */
62#ifndef VASNPRINTF
63# if WIDE_CHAR_VERSION
64#  include "vasnwprintf.h"
65# else
66#  include "vasnprintf.h"
67# endif
68#endif
69
70#include <locale.h>	/* localeconv() */
71#include <stdio.h>	/* snprintf(), sprintf() */
72#include <stdlib.h>	/* abort(), malloc(), realloc(), free() */
73#include <string.h>	/* memcpy(), strlen() */
74#include <errno.h>	/* errno */
75#include <limits.h>	/* CHAR_BIT */
76#include <float.h>	/* DBL_MAX_EXP, LDBL_MAX_EXP */
77#if HAVE_NL_LANGINFO
78# include <langinfo.h>
79#endif
80#ifndef VASNPRINTF
81# if WIDE_CHAR_VERSION
82#  include "wprintf-parse.h"
83# else
84#  include "printf-parse.h"
85# endif
86#endif
87
88/* Checked size_t computations.  */
89#include "xsize.h"
90
91#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
92# include <math.h>
93# include "float+.h"
94#endif
95
96#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
97# include <math.h>
98# include "isnan.h"
99#endif
100
101#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
102# include <math.h>
103# include "isnanl-nolibm.h"
104# include "fpucw.h"
105#endif
106
107#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
108# include <math.h>
109# include "isnan.h"
110# include "printf-frexp.h"
111#endif
112
113#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
114# include <math.h>
115# include "isnanl-nolibm.h"
116# include "printf-frexpl.h"
117# include "fpucw.h"
118#endif
119
120/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW.  */
121#ifndef EOVERFLOW
122# define EOVERFLOW E2BIG
123#endif
124
125#if HAVE_WCHAR_T
126# if HAVE_WCSLEN
127#  define local_wcslen wcslen
128# else
129   /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
130      a dependency towards this library, here is a local substitute.
131      Define this substitute only once, even if this file is included
132      twice in the same compilation unit.  */
133#  ifndef local_wcslen_defined
134#   define local_wcslen_defined 1
135static size_t
136local_wcslen (const wchar_t *s)
137{
138  const wchar_t *ptr;
139
140  for (ptr = s; *ptr != (wchar_t) 0; ptr++)
141    ;
142  return ptr - s;
143}
144#  endif
145# endif
146#endif
147
148/* Default parameters.  */
149#ifndef VASNPRINTF
150# if WIDE_CHAR_VERSION
151#  define VASNPRINTF vasnwprintf
152#  define FCHAR_T wchar_t
153#  define DCHAR_T wchar_t
154#  define TCHAR_T wchar_t
155#  define DCHAR_IS_TCHAR 1
156#  define DIRECTIVE wchar_t_directive
157#  define DIRECTIVES wchar_t_directives
158#  define PRINTF_PARSE wprintf_parse
159#  define DCHAR_CPY wmemcpy
160# else
161#  define VASNPRINTF vasnprintf
162#  define FCHAR_T char
163#  define DCHAR_T char
164#  define TCHAR_T char
165#  define DCHAR_IS_TCHAR 1
166#  define DIRECTIVE char_directive
167#  define DIRECTIVES char_directives
168#  define PRINTF_PARSE printf_parse
169#  define DCHAR_CPY memcpy
170# endif
171#endif
172#if WIDE_CHAR_VERSION
173  /* TCHAR_T is wchar_t.  */
174# define USE_SNPRINTF 1
175# if HAVE_DECL__SNWPRINTF
176   /* On Windows, the function swprintf() has a different signature than
177      on Unix; we use the _snwprintf() function instead.  */
178#  define SNPRINTF _snwprintf
179# else
180   /* Unix.  */
181#  define SNPRINTF swprintf
182# endif
183#else
184  /* TCHAR_T is char.  */
185# /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
186     But don't use it on BeOS, since BeOS snprintf produces no output if the
187     size argument is >= 0x3000000.  */
188# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__
189#  define USE_SNPRINTF 1
190# else
191#  define USE_SNPRINTF 0
192# endif
193# if HAVE_DECL__SNPRINTF
194   /* Windows.  */
195#  define SNPRINTF _snprintf
196# else
197   /* Unix.  */
198#  define SNPRINTF snprintf
199   /* Here we need to call the native snprintf, not rpl_snprintf.  */
200#  undef snprintf
201# endif
202#endif
203/* Here we need to call the native sprintf, not rpl_sprintf.  */
204#undef sprintf
205
206#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
207/* Determine the decimal-point character according to the current locale.  */
208# ifndef decimal_point_char_defined
209#  define decimal_point_char_defined 1
210static char
211decimal_point_char ()
212{
213  const char *point;
214  /* Determine it in a multithread-safe way.  We know nl_langinfo is
215     multithread-safe on glibc systems, but is not required to be multithread-
216     safe by POSIX.  sprintf(), however, is multithread-safe.  localeconv()
217     is rarely multithread-safe.  */
218#  if HAVE_NL_LANGINFO && __GLIBC__
219  point = nl_langinfo (RADIXCHAR);
220#  elif 1
221  char pointbuf[5];
222  sprintf (pointbuf, "%#.0f", 1.0);
223  point = &pointbuf[1];
224#  else
225  point = localeconv () -> decimal_point;
226#  endif
227  /* The decimal point is always a single byte: either '.' or ','.  */
228  return (point[0] != '\0' ? point[0] : '.');
229}
230# endif
231#endif
232
233#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
234
235/* Equivalent to !isfinite(x) || x == 0, but does not require libm.  */
236static int
237is_infinite_or_zero (double x)
238{
239  return isnan (x) || x + x == x;
240}
241
242#endif
243
244#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
245
246/* Equivalent to !isfinite(x), but does not require libm.  */
247static int
248is_infinitel (long double x)
249{
250  return isnanl (x) || (x + x == x && x != 0.0L);
251}
252
253#endif
254
255#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
256
257/* Converting 'long double' to decimal without rare rounding bugs requires
258   real bignums.  We use the naming conventions of GNU gmp, but vastly simpler
259   (and slower) algorithms.  */
260
261typedef unsigned int mp_limb_t;
262# define GMP_LIMB_BITS 32
263typedef int mp_limb_verify[2 * (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS) - 1];
264
265typedef unsigned long long mp_twolimb_t;
266# define GMP_TWOLIMB_BITS 64
267typedef int mp_twolimb_verify[2 * (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS) - 1];
268
269/* Representation of a bignum >= 0.  */
270typedef struct
271{
272  size_t nlimbs;
273  mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc().  */
274} mpn_t;
275
276/* Compute the product of two bignums >= 0.
277   Return the allocated memory in case of success, NULL in case of memory
278   allocation failure.  */
279static void *
280multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
281{
282  const mp_limb_t *p1;
283  const mp_limb_t *p2;
284  size_t len1;
285  size_t len2;
286
287  if (src1.nlimbs <= src2.nlimbs)
288    {
289      len1 = src1.nlimbs;
290      p1 = src1.limbs;
291      len2 = src2.nlimbs;
292      p2 = src2.limbs;
293    }
294  else
295    {
296      len1 = src2.nlimbs;
297      p1 = src2.limbs;
298      len2 = src1.nlimbs;
299      p2 = src1.limbs;
300    }
301  /* Now 0 <= len1 <= len2.  */
302  if (len1 == 0)
303    {
304      /* src1 or src2 is zero.  */
305      dest->nlimbs = 0;
306      dest->limbs = (mp_limb_t *) malloc (1);
307    }
308  else
309    {
310      /* Here 1 <= len1 <= len2.  */
311      size_t dlen;
312      mp_limb_t *dp;
313      size_t k, i, j;
314
315      dlen = len1 + len2;
316      dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
317      if (dp == NULL)
318	return NULL;
319      for (k = len2; k > 0; )
320	dp[--k] = 0;
321      for (i = 0; i < len1; i++)
322	{
323	  mp_limb_t digit1 = p1[i];
324	  mp_twolimb_t carry = 0;
325	  for (j = 0; j < len2; j++)
326	    {
327	      mp_limb_t digit2 = p2[j];
328	      carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
329	      carry += dp[i + j];
330	      dp[i + j] = (mp_limb_t) carry;
331	      carry = carry >> GMP_LIMB_BITS;
332	    }
333	  dp[i + len2] = (mp_limb_t) carry;
334	}
335      /* Normalise.  */
336      while (dlen > 0 && dp[dlen - 1] == 0)
337	dlen--;
338      dest->nlimbs = dlen;
339      dest->limbs = dp;
340    }
341  return dest->limbs;
342}
343
344/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
345   a is written as  a = q * b + r  with 0 <= r < b.  q is the quotient, r
346   the remainder.
347   Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
348   q is incremented.
349   Return the allocated memory in case of success, NULL in case of memory
350   allocation failure.  */
351static void *
352divide (mpn_t a, mpn_t b, mpn_t *q)
353{
354  /* Algorithm:
355     First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
356     with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
357     If m<n, then q:=0 and r:=a.
358     If m>=n=1, perform a single-precision division:
359       r:=0, j:=m,
360       while j>0 do
361         {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
362               = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
363         j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
364       Normalise [q[m-1],...,q[0]], yields q.
365     If m>=n>1, perform a multiple-precision division:
366       We have a/b < beta^(m-n+1).
367       s:=intDsize-1-(hightest bit in b[n-1]), 0<=s<intDsize.
368       Shift a and b left by s bits, copying them. r:=a.
369       r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
370       For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
371         Compute q* :
372           q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
373           In case of overflow (q* >= beta) set q* := beta-1.
374           Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
375           and c3 := b[n-2] * q*.
376           {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
377            occurred.  Furthermore 0 <= c3 < beta^2.
378            If there was overflow and
379            r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
380            the next test can be skipped.}
381           While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
382             Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
383           If q* > 0:
384             Put r := r - b * q* * beta^j. In detail:
385               [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
386               hence: u:=0, for i:=0 to n-1 do
387                              u := u + q* * b[i],
388                              r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
389                              u:=u div beta (+ 1, if carry in subtraction)
390                      r[n+j]:=r[n+j]-u.
391               {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
392                               < q* + 1 <= beta,
393                the carry u does not overflow.}
394             If a negative carry occurs, put q* := q* - 1
395               and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
396         Set q[j] := q*.
397       Normalise [q[m-n],..,q[0]]; this yields the quotient q.
398       Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
399       rest r.
400       The room for q[j] can be allocated at the memory location of r[n+j].
401     Finally, round-to-even:
402       Shift r left by 1 bit.
403       If r > b or if r = b and q[0] is odd, q := q+1.
404   */
405  const mp_limb_t *a_ptr = a.limbs;
406  size_t a_len = a.nlimbs;
407  const mp_limb_t *b_ptr = b.limbs;
408  size_t b_len = b.nlimbs;
409  mp_limb_t *roomptr;
410  mp_limb_t *tmp_roomptr = NULL;
411  mp_limb_t *q_ptr;
412  size_t q_len;
413  mp_limb_t *r_ptr;
414  size_t r_len;
415
416  /* Allocate room for a_len+2 digits.
417     (Need a_len+1 digits for the real division and 1 more digit for the
418     final rounding of q.)  */
419  roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
420  if (roomptr == NULL)
421    return NULL;
422
423  /* Normalise a.  */
424  while (a_len > 0 && a_ptr[a_len - 1] == 0)
425    a_len--;
426
427  /* Normalise b.  */
428  for (;;)
429    {
430      if (b_len == 0)
431	/* Division by zero.  */
432	abort ();
433      if (b_ptr[b_len - 1] == 0)
434	b_len--;
435      else
436	break;
437    }
438
439  /* Here m = a_len >= 0 and n = b_len > 0.  */
440
441  if (a_len < b_len)
442    {
443      /* m<n: trivial case.  q=0, r := copy of a.  */
444      r_ptr = roomptr;
445      r_len = a_len;
446      memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
447      q_ptr = roomptr + a_len;
448      q_len = 0;
449    }
450  else if (b_len == 1)
451    {
452      /* n=1: single precision division.
453	 beta^(m-1) <= a < beta^m  ==>  beta^(m-2) <= a/b < beta^m  */
454      r_ptr = roomptr;
455      q_ptr = roomptr + 1;
456      {
457	mp_limb_t den = b_ptr[0];
458	mp_limb_t remainder = 0;
459	const mp_limb_t *sourceptr = a_ptr + a_len;
460	mp_limb_t *destptr = q_ptr + a_len;
461	size_t count;
462	for (count = a_len; count > 0; count--)
463	  {
464	    mp_twolimb_t num =
465	      ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
466	    *--destptr = num / den;
467	    remainder = num % den;
468	  }
469	/* Normalise and store r.  */
470	if (remainder > 0)
471	  {
472	    r_ptr[0] = remainder;
473	    r_len = 1;
474	  }
475	else
476	  r_len = 0;
477	/* Normalise q.  */
478	q_len = a_len;
479	if (q_ptr[q_len - 1] == 0)
480	  q_len--;
481      }
482    }
483  else
484    {
485      /* n>1: multiple precision division.
486	 beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n  ==>
487	 beta^(m-n-1) <= a/b < beta^(m-n+1).  */
488      /* Determine s.  */
489      size_t s;
490      {
491	mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
492	s = 31;
493	if (msd >= 0x10000)
494	  {
495	    msd = msd >> 16;
496	    s -= 16;
497	  }
498	if (msd >= 0x100)
499	  {
500	    msd = msd >> 8;
501	    s -= 8;
502	  }
503	if (msd >= 0x10)
504	  {
505	    msd = msd >> 4;
506	    s -= 4;
507	  }
508	if (msd >= 0x4)
509	  {
510	    msd = msd >> 2;
511	    s -= 2;
512	  }
513	if (msd >= 0x2)
514	  {
515	    msd = msd >> 1;
516	    s -= 1;
517	  }
518      }
519      /* 0 <= s < GMP_LIMB_BITS.
520	 Copy b, shifting it left by s bits.  */
521      if (s > 0)
522	{
523	  tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
524	  if (tmp_roomptr == NULL)
525	    {
526	      free (roomptr);
527	      return NULL;
528	    }
529	  {
530	    const mp_limb_t *sourceptr = b_ptr;
531	    mp_limb_t *destptr = tmp_roomptr;
532	    mp_twolimb_t accu = 0;
533	    size_t count;
534	    for (count = b_len; count > 0; count--)
535	      {
536		accu += (mp_twolimb_t) *sourceptr++ << s;
537		*destptr++ = (mp_limb_t) accu;
538		accu = accu >> GMP_LIMB_BITS;
539	      }
540	    /* accu must be zero, since that was how s was determined.  */
541	    if (accu != 0)
542	      abort ();
543	  }
544	  b_ptr = tmp_roomptr;
545	}
546      /* Copy a, shifting it left by s bits, yields r.
547	 Memory layout:
548	 At the beginning: r = roomptr[0..a_len],
549	 at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len]  */
550      r_ptr = roomptr;
551      if (s == 0)
552	{
553	  memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
554	  r_ptr[a_len] = 0;
555	}
556      else
557	{
558	  const mp_limb_t *sourceptr = a_ptr;
559	  mp_limb_t *destptr = r_ptr;
560	  mp_twolimb_t accu = 0;
561	  size_t count;
562	  for (count = a_len; count > 0; count--)
563	    {
564	      accu += (mp_twolimb_t) *sourceptr++ << s;
565	      *destptr++ = (mp_limb_t) accu;
566	      accu = accu >> GMP_LIMB_BITS;
567	    }
568	  *destptr++ = (mp_limb_t) accu;
569	}
570      q_ptr = roomptr + b_len;
571      q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
572      {
573	size_t j = a_len - b_len; /* m-n */
574	mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
575	mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
576	mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
577	  ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
578	/* Division loop, traversed m-n+1 times.
579	   j counts down, b is unchanged, beta/2 <= b[n-1] < beta.  */
580	for (;;)
581	  {
582	    mp_limb_t q_star;
583	    mp_limb_t c1;
584	    if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
585	      {
586		/* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow.  */
587		mp_twolimb_t num =
588		  ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
589		  | r_ptr[j + b_len - 1];
590		q_star = num / b_msd;
591		c1 = num % b_msd;
592	      }
593	    else
594	      {
595		/* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1].  */
596		q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
597		/* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
598		   <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
599		   <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
600		        {<= beta !}.
601		   If yes, jump directly to the subtraction loop.
602		   (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
603		    <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
604		if (r_ptr[j + b_len] > b_msd
605		    || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
606		  /* r[j+n] >= b[n-1]+1 or
607		     r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
608		     carry.  */
609		  goto subtract;
610	      }
611	    /* q_star = q*,
612	       c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta).  */
613	    {
614	      mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
615		((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
616	      mp_twolimb_t c3 = /* b[n-2] * q* */
617		(mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
618	      /* While c2 < c3, increase c2 and decrease c3.
619		 Consider c3-c2.  While it is > 0, decrease it by
620		 b[n-1]*beta+b[n-2].  Because of b[n-1]*beta+b[n-2] >= beta^2/2
621		 this can happen only twice.  */
622	      if (c3 > c2)
623		{
624		  q_star = q_star - 1; /* q* := q* - 1 */
625		  if (c3 - c2 > b_msdd)
626		    q_star = q_star - 1; /* q* := q* - 1 */
627		}
628	    }
629	    if (q_star > 0)
630	      subtract:
631	      {
632		/* Subtract r := r - b * q* * beta^j.  */
633		mp_limb_t cr;
634		{
635		  const mp_limb_t *sourceptr = b_ptr;
636		  mp_limb_t *destptr = r_ptr + j;
637		  mp_twolimb_t carry = 0;
638		  size_t count;
639		  for (count = b_len; count > 0; count--)
640		    {
641		      /* Here 0 <= carry <= q*.  */
642		      carry =
643			carry
644			+ (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
645			+ (mp_limb_t) ~(*destptr);
646		      /* Here 0 <= carry <= beta*q* + beta-1.  */
647		      *destptr++ = ~(mp_limb_t) carry;
648		      carry = carry >> GMP_LIMB_BITS; /* <= q* */
649		    }
650		  cr = (mp_limb_t) carry;
651		}
652		/* Subtract cr from r_ptr[j + b_len], then forget about
653		   r_ptr[j + b_len].  */
654		if (cr > r_ptr[j + b_len])
655		  {
656		    /* Subtraction gave a carry.  */
657		    q_star = q_star - 1; /* q* := q* - 1 */
658		    /* Add b back.  */
659		    {
660		      const mp_limb_t *sourceptr = b_ptr;
661		      mp_limb_t *destptr = r_ptr + j;
662		      mp_limb_t carry = 0;
663		      size_t count;
664		      for (count = b_len; count > 0; count--)
665			{
666			  mp_limb_t source1 = *sourceptr++;
667			  mp_limb_t source2 = *destptr;
668			  *destptr++ = source1 + source2 + carry;
669			  carry =
670			    (carry
671			     ? source1 >= (mp_limb_t) ~source2
672			     : source1 > (mp_limb_t) ~source2);
673			}
674		    }
675		    /* Forget about the carry and about r[j+n].  */
676		  }
677	      }
678	    /* q* is determined.  Store it as q[j].  */
679	    q_ptr[j] = q_star;
680	    if (j == 0)
681	      break;
682	    j--;
683	  }
684      }
685      r_len = b_len;
686      /* Normalise q.  */
687      if (q_ptr[q_len - 1] == 0)
688	q_len--;
689# if 0 /* Not needed here, since we need r only to compare it with b/2, and
690	  b is shifted left by s bits.  */
691      /* Shift r right by s bits.  */
692      if (s > 0)
693	{
694	  mp_limb_t ptr = r_ptr + r_len;
695	  mp_twolimb_t accu = 0;
696	  size_t count;
697	  for (count = r_len; count > 0; count--)
698	    {
699	      accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
700	      accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
701	      *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
702	    }
703	}
704# endif
705      /* Normalise r.  */
706      while (r_len > 0 && r_ptr[r_len - 1] == 0)
707	r_len--;
708    }
709  /* Compare r << 1 with b.  */
710  if (r_len > b_len)
711    goto increment_q;
712  {
713    size_t i;
714    for (i = b_len;;)
715      {
716	mp_limb_t r_i =
717	  (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
718	  | (i < r_len ? r_ptr[i] << 1 : 0);
719	mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
720	if (r_i > b_i)
721	  goto increment_q;
722	if (r_i < b_i)
723	  goto keep_q;
724	if (i == 0)
725	  break;
726	i--;
727      }
728  }
729  if (q_len > 0 && ((q_ptr[0] & 1) != 0))
730    /* q is odd.  */
731    increment_q:
732    {
733      size_t i;
734      for (i = 0; i < q_len; i++)
735	if (++(q_ptr[i]) != 0)
736	  goto keep_q;
737      q_ptr[q_len++] = 1;
738    }
739  keep_q:
740  if (tmp_roomptr != NULL)
741    free (tmp_roomptr);
742  q->limbs = q_ptr;
743  q->nlimbs = q_len;
744  return roomptr;
745}
746
747/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
748   representation.
749   Destroys the contents of a.
750   Return the allocated memory - containing the decimal digits in low-to-high
751   order, terminated with a NUL character - in case of success, NULL in case
752   of memory allocation failure.  */
753static char *
754convert_to_decimal (mpn_t a, size_t extra_zeroes)
755{
756  mp_limb_t *a_ptr = a.limbs;
757  size_t a_len = a.nlimbs;
758  /* 0.03345 is slightly larger than log(2)/(9*log(10)).  */
759  size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
760  char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes));
761  if (c_ptr != NULL)
762    {
763      char *d_ptr = c_ptr;
764      for (; extra_zeroes > 0; extra_zeroes--)
765	*d_ptr++ = '0';
766      while (a_len > 0)
767	{
768	  /* Divide a by 10^9, in-place.  */
769	  mp_limb_t remainder = 0;
770	  mp_limb_t *ptr = a_ptr + a_len;
771	  size_t count;
772	  for (count = a_len; count > 0; count--)
773	    {
774	      mp_twolimb_t num =
775		((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
776	      *ptr = num / 1000000000;
777	      remainder = num % 1000000000;
778	    }
779	  /* Store the remainder as 9 decimal digits.  */
780	  for (count = 9; count > 0; count--)
781	    {
782	      *d_ptr++ = '0' + (remainder % 10);
783	      remainder = remainder / 10;
784	    }
785	  /* Normalize a.  */
786	  if (a_ptr[a_len - 1] == 0)
787	    a_len--;
788	}
789      /* Remove leading zeroes.  */
790      while (d_ptr > c_ptr && d_ptr[-1] == '0')
791	d_ptr--;
792      /* But keep at least one zero.  */
793      if (d_ptr == c_ptr)
794	*d_ptr++ = '0';
795      /* Terminate the string.  */
796      *d_ptr = '\0';
797    }
798  return c_ptr;
799}
800
801# if NEED_PRINTF_LONG_DOUBLE
802
803/* Assuming x is finite and >= 0:
804   write x as x = 2^e * m, where m is a bignum.
805   Return the allocated memory in case of success, NULL in case of memory
806   allocation failure.  */
807static void *
808decode_long_double (long double x, int *ep, mpn_t *mp)
809{
810  mpn_t m;
811  int exp;
812  long double y;
813  size_t i;
814
815  /* Allocate memory for result.  */
816  m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
817  m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
818  if (m.limbs == NULL)
819    return NULL;
820  /* Split into exponential part and mantissa.  */
821  y = frexpl (x, &exp);
822  if (!(y >= 0.0L && y < 1.0L))
823    abort ();
824  /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * LDBL_MANT_BIT), and the
825     latter is an integer.  */
826  /* Convert the mantissa (y * LDBL_MANT_BIT) to a sequence of limbs.
827     I'm not sure whether it's safe to cast a 'long double' value between
828     2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
829     'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
830     doesn't matter).  */
831#  if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
832#   if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
833    {
834      mp_limb_t hi, lo;
835      y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
836      hi = (int) y;
837      y -= hi;
838      if (!(y >= 0.0L && y < 1.0L))
839	abort ();
840      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
841      lo = (int) y;
842      y -= lo;
843      if (!(y >= 0.0L && y < 1.0L))
844	abort ();
845      m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
846    }
847#   else
848    {
849      mp_limb_t d;
850      y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
851      d = (int) y;
852      y -= d;
853      if (!(y >= 0.0L && y < 1.0L))
854	abort ();
855      m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
856    }
857#   endif
858#  endif
859  for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
860    {
861      mp_limb_t hi, lo;
862      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
863      hi = (int) y;
864      y -= hi;
865      if (!(y >= 0.0L && y < 1.0L))
866	abort ();
867      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
868      lo = (int) y;
869      y -= lo;
870      if (!(y >= 0.0L && y < 1.0L))
871	abort ();
872      m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
873    }
874  if (!(y == 0.0L))
875    abort ();
876  /* Normalise.  */
877  while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
878    m.nlimbs--;
879  *mp = m;
880  *ep = exp - LDBL_MANT_BIT;
881  return m.limbs;
882}
883
884# endif
885
886# if NEED_PRINTF_DOUBLE
887
888/* Assuming x is finite and >= 0:
889   write x as x = 2^e * m, where m is a bignum.
890   Return the allocated memory in case of success, NULL in case of memory
891   allocation failure.  */
892static void *
893decode_double (double x, int *ep, mpn_t *mp)
894{
895  mpn_t m;
896  int exp;
897  double y;
898  size_t i;
899
900  /* Allocate memory for result.  */
901  m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
902  m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
903  if (m.limbs == NULL)
904    return NULL;
905  /* Split into exponential part and mantissa.  */
906  y = frexp (x, &exp);
907  if (!(y >= 0.0 && y < 1.0))
908    abort ();
909  /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * DBL_MANT_BIT), and the
910     latter is an integer.  */
911  /* Convert the mantissa (y * DBL_MANT_BIT) to a sequence of limbs.
912     I'm not sure whether it's safe to cast a 'double' value between
913     2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
914     'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
915     doesn't matter).  */
916#  if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
917#   if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
918    {
919      mp_limb_t hi, lo;
920      y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
921      hi = (int) y;
922      y -= hi;
923      if (!(y >= 0.0 && y < 1.0))
924	abort ();
925      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
926      lo = (int) y;
927      y -= lo;
928      if (!(y >= 0.0 && y < 1.0))
929	abort ();
930      m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
931    }
932#   else
933    {
934      mp_limb_t d;
935      y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
936      d = (int) y;
937      y -= d;
938      if (!(y >= 0.0 && y < 1.0))
939	abort ();
940      m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
941    }
942#   endif
943#  endif
944  for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
945    {
946      mp_limb_t hi, lo;
947      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
948      hi = (int) y;
949      y -= hi;
950      if (!(y >= 0.0 && y < 1.0))
951	abort ();
952      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
953      lo = (int) y;
954      y -= lo;
955      if (!(y >= 0.0 && y < 1.0))
956	abort ();
957      m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
958    }
959  if (!(y == 0.0))
960    abort ();
961  /* Normalise.  */
962  while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
963    m.nlimbs--;
964  *mp = m;
965  *ep = exp - DBL_MANT_BIT;
966  return m.limbs;
967}
968
969# endif
970
971/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
972   Returns the decimal representation of round (x * 10^n).
973   Return the allocated memory - containing the decimal digits in low-to-high
974   order, terminated with a NUL character - in case of success, NULL in case
975   of memory allocation failure.  */
976static char *
977scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
978{
979  int s;
980  size_t extra_zeroes;
981  unsigned int abs_n;
982  unsigned int abs_s;
983  mp_limb_t *pow5_ptr;
984  size_t pow5_len;
985  unsigned int s_limbs;
986  unsigned int s_bits;
987  mpn_t pow5;
988  mpn_t z;
989  void *z_memory;
990  char *digits;
991
992  if (memory == NULL)
993    return NULL;
994  /* x = 2^e * m, hence
995     y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
996       = round (2^s * 5^n * m).  */
997  s = e + n;
998  extra_zeroes = 0;
999  /* Factor out a common power of 10 if possible.  */
1000  if (s > 0 && n > 0)
1001    {
1002      extra_zeroes = (s < n ? s : n);
1003      s -= extra_zeroes;
1004      n -= extra_zeroes;
1005    }
1006  /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
1007     Before converting to decimal, we need to compute
1008     z = round (2^s * 5^n * m).  */
1009  /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
1010     sign.  2.322 is slightly larger than log(5)/log(2).  */
1011  abs_n = (n >= 0 ? n : -n);
1012  abs_s = (s >= 0 ? s : -s);
1013  pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
1014				    + abs_s / GMP_LIMB_BITS + 1)
1015				   * sizeof (mp_limb_t));
1016  if (pow5_ptr == NULL)
1017    {
1018      free (memory);
1019      return NULL;
1020    }
1021  /* Initialize with 1.  */
1022  pow5_ptr[0] = 1;
1023  pow5_len = 1;
1024  /* Multiply with 5^|n|.  */
1025  if (abs_n > 0)
1026    {
1027      static mp_limb_t const small_pow5[13 + 1] =
1028	{
1029	  1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
1030	  48828125, 244140625, 1220703125
1031	};
1032      unsigned int n13;
1033      for (n13 = 0; n13 <= abs_n; n13 += 13)
1034	{
1035	  mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
1036	  size_t j;
1037	  mp_twolimb_t carry = 0;
1038	  for (j = 0; j < pow5_len; j++)
1039	    {
1040	      mp_limb_t digit2 = pow5_ptr[j];
1041	      carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
1042	      pow5_ptr[j] = (mp_limb_t) carry;
1043	      carry = carry >> GMP_LIMB_BITS;
1044	    }
1045	  if (carry > 0)
1046	    pow5_ptr[pow5_len++] = (mp_limb_t) carry;
1047	}
1048    }
1049  s_limbs = abs_s / GMP_LIMB_BITS;
1050  s_bits = abs_s % GMP_LIMB_BITS;
1051  if (n >= 0 ? s >= 0 : s <= 0)
1052    {
1053      /* Multiply with 2^|s|.  */
1054      if (s_bits > 0)
1055	{
1056	  mp_limb_t *ptr = pow5_ptr;
1057	  mp_twolimb_t accu = 0;
1058	  size_t count;
1059	  for (count = pow5_len; count > 0; count--)
1060	    {
1061	      accu += (mp_twolimb_t) *ptr << s_bits;
1062	      *ptr++ = (mp_limb_t) accu;
1063	      accu = accu >> GMP_LIMB_BITS;
1064	    }
1065	  if (accu > 0)
1066	    {
1067	      *ptr = (mp_limb_t) accu;
1068	      pow5_len++;
1069	    }
1070	}
1071      if (s_limbs > 0)
1072	{
1073	  size_t count;
1074	  for (count = pow5_len; count > 0;)
1075	    {
1076	      count--;
1077	      pow5_ptr[s_limbs + count] = pow5_ptr[count];
1078	    }
1079	  for (count = s_limbs; count > 0;)
1080	    {
1081	      count--;
1082	      pow5_ptr[count] = 0;
1083	    }
1084	  pow5_len += s_limbs;
1085	}
1086      pow5.limbs = pow5_ptr;
1087      pow5.nlimbs = pow5_len;
1088      if (n >= 0)
1089	{
1090	  /* Multiply m with pow5.  No division needed.  */
1091	  z_memory = multiply (m, pow5, &z);
1092	}
1093      else
1094	{
1095	  /* Divide m by pow5 and round.  */
1096	  z_memory = divide (m, pow5, &z);
1097	}
1098    }
1099  else
1100    {
1101      pow5.limbs = pow5_ptr;
1102      pow5.nlimbs = pow5_len;
1103      if (n >= 0)
1104	{
1105	  /* n >= 0, s < 0.
1106	     Multiply m with pow5, then divide by 2^|s|.  */
1107	  mpn_t numerator;
1108	  mpn_t denominator;
1109	  void *tmp_memory;
1110	  tmp_memory = multiply (m, pow5, &numerator);
1111	  if (tmp_memory == NULL)
1112	    {
1113	      free (pow5_ptr);
1114	      free (memory);
1115	      return NULL;
1116	    }
1117	  /* Construct 2^|s|.  */
1118	  {
1119	    mp_limb_t *ptr = pow5_ptr + pow5_len;
1120	    size_t i;
1121	    for (i = 0; i < s_limbs; i++)
1122	      ptr[i] = 0;
1123	    ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
1124	    denominator.limbs = ptr;
1125	    denominator.nlimbs = s_limbs + 1;
1126	  }
1127	  z_memory = divide (numerator, denominator, &z);
1128	  free (tmp_memory);
1129	}
1130      else
1131	{
1132	  /* n < 0, s > 0.
1133	     Multiply m with 2^s, then divide by pow5.  */
1134	  mpn_t numerator;
1135	  mp_limb_t *num_ptr;
1136	  num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
1137					  * sizeof (mp_limb_t));
1138	  if (num_ptr == NULL)
1139	    {
1140	      free (pow5_ptr);
1141	      free (memory);
1142	      return NULL;
1143	    }
1144	  {
1145	    mp_limb_t *destptr = num_ptr;
1146	    {
1147	      size_t i;
1148	      for (i = 0; i < s_limbs; i++)
1149		*destptr++ = 0;
1150	    }
1151	    if (s_bits > 0)
1152	      {
1153		const mp_limb_t *sourceptr = m.limbs;
1154		mp_twolimb_t accu = 0;
1155		size_t count;
1156		for (count = m.nlimbs; count > 0; count--)
1157		  {
1158		    accu += (mp_twolimb_t) *sourceptr++ << s_bits;
1159		    *destptr++ = (mp_limb_t) accu;
1160		    accu = accu >> GMP_LIMB_BITS;
1161		  }
1162		if (accu > 0)
1163		  *destptr++ = (mp_limb_t) accu;
1164	      }
1165	    else
1166	      {
1167		const mp_limb_t *sourceptr = m.limbs;
1168		size_t count;
1169		for (count = m.nlimbs; count > 0; count--)
1170		  *destptr++ = *sourceptr++;
1171	      }
1172	    numerator.limbs = num_ptr;
1173	    numerator.nlimbs = destptr - num_ptr;
1174	  }
1175	  z_memory = divide (numerator, pow5, &z);
1176	  free (num_ptr);
1177	}
1178    }
1179  free (pow5_ptr);
1180  free (memory);
1181
1182  /* Here y = round (x * 10^n) = z * 10^extra_zeroes.  */
1183
1184  if (z_memory == NULL)
1185    return NULL;
1186  digits = convert_to_decimal (z, extra_zeroes);
1187  free (z_memory);
1188  return digits;
1189}
1190
1191# if NEED_PRINTF_LONG_DOUBLE
1192
1193/* Assuming x is finite and >= 0, and n is an integer:
1194   Returns the decimal representation of round (x * 10^n).
1195   Return the allocated memory - containing the decimal digits in low-to-high
1196   order, terminated with a NUL character - in case of success, NULL in case
1197   of memory allocation failure.  */
1198static char *
1199scale10_round_decimal_long_double (long double x, int n)
1200{
1201  int e;
1202  mpn_t m;
1203  void *memory = decode_long_double (x, &e, &m);
1204  return scale10_round_decimal_decoded (e, m, memory, n);
1205}
1206
1207# endif
1208
1209# if NEED_PRINTF_DOUBLE
1210
1211/* Assuming x is finite and >= 0, and n is an integer:
1212   Returns the decimal representation of round (x * 10^n).
1213   Return the allocated memory - containing the decimal digits in low-to-high
1214   order, terminated with a NUL character - in case of success, NULL in case
1215   of memory allocation failure.  */
1216static char *
1217scale10_round_decimal_double (double x, int n)
1218{
1219  int e;
1220  mpn_t m;
1221  void *memory = decode_double (x, &e, &m);
1222  return scale10_round_decimal_decoded (e, m, memory, n);
1223}
1224
1225# endif
1226
1227# if NEED_PRINTF_LONG_DOUBLE
1228
1229/* Assuming x is finite and > 0:
1230   Return an approximation for n with 10^n <= x < 10^(n+1).
1231   The approximation is usually the right n, but may be off by 1 sometimes.  */
1232static int
1233floorlog10l (long double x)
1234{
1235  int exp;
1236  long double y;
1237  double z;
1238  double l;
1239
1240  /* Split into exponential part and mantissa.  */
1241  y = frexpl (x, &exp);
1242  if (!(y >= 0.0L && y < 1.0L))
1243    abort ();
1244  if (y == 0.0L)
1245    return INT_MIN;
1246  if (y < 0.5L)
1247    {
1248      while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
1249	{
1250	  y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
1251	  exp -= GMP_LIMB_BITS;
1252	}
1253      if (y < (1.0L / (1 << 16)))
1254	{
1255	  y *= 1.0L * (1 << 16);
1256	  exp -= 16;
1257	}
1258      if (y < (1.0L / (1 << 8)))
1259	{
1260	  y *= 1.0L * (1 << 8);
1261	  exp -= 8;
1262	}
1263      if (y < (1.0L / (1 << 4)))
1264	{
1265	  y *= 1.0L * (1 << 4);
1266	  exp -= 4;
1267	}
1268      if (y < (1.0L / (1 << 2)))
1269	{
1270	  y *= 1.0L * (1 << 2);
1271	  exp -= 2;
1272	}
1273      if (y < (1.0L / (1 << 1)))
1274	{
1275	  y *= 1.0L * (1 << 1);
1276	  exp -= 1;
1277	}
1278    }
1279  if (!(y >= 0.5L && y < 1.0L))
1280    abort ();
1281  /* Compute an approximation for l = log2(x) = exp + log2(y).  */
1282  l = exp;
1283  z = y;
1284  if (z < 0.70710678118654752444)
1285    {
1286      z *= 1.4142135623730950488;
1287      l -= 0.5;
1288    }
1289  if (z < 0.8408964152537145431)
1290    {
1291      z *= 1.1892071150027210667;
1292      l -= 0.25;
1293    }
1294  if (z < 0.91700404320467123175)
1295    {
1296      z *= 1.0905077326652576592;
1297      l -= 0.125;
1298    }
1299  if (z < 0.9576032806985736469)
1300    {
1301      z *= 1.0442737824274138403;
1302      l -= 0.0625;
1303    }
1304  /* Now 0.95 <= z <= 1.01.  */
1305  z = 1 - z;
1306  /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ...
1307     Four terms are enough to get an approximation with error < 10^-7.  */
1308  l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
1309  /* Finally multiply with log(2)/log(10), yields an approximation for
1310     log10(x).  */
1311  l *= 0.30102999566398119523;
1312  /* Round down to the next integer.  */
1313  return (int) l + (l < 0 ? -1 : 0);
1314}
1315
1316# endif
1317
1318# if NEED_PRINTF_DOUBLE
1319
1320/* Assuming x is finite and > 0:
1321   Return an approximation for n with 10^n <= x < 10^(n+1).
1322   The approximation is usually the right n, but may be off by 1 sometimes.  */
1323static int
1324floorlog10 (double x)
1325{
1326  int exp;
1327  double y;
1328  double z;
1329  double l;
1330
1331  /* Split into exponential part and mantissa.  */
1332  y = frexp (x, &exp);
1333  if (!(y >= 0.0 && y < 1.0))
1334    abort ();
1335  if (y == 0.0)
1336    return INT_MIN;
1337  if (y < 0.5)
1338    {
1339      while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
1340	{
1341	  y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
1342	  exp -= GMP_LIMB_BITS;
1343	}
1344      if (y < (1.0 / (1 << 16)))
1345	{
1346	  y *= 1.0 * (1 << 16);
1347	  exp -= 16;
1348	}
1349      if (y < (1.0 / (1 << 8)))
1350	{
1351	  y *= 1.0 * (1 << 8);
1352	  exp -= 8;
1353	}
1354      if (y < (1.0 / (1 << 4)))
1355	{
1356	  y *= 1.0 * (1 << 4);
1357	  exp -= 4;
1358	}
1359      if (y < (1.0 / (1 << 2)))
1360	{
1361	  y *= 1.0 * (1 << 2);
1362	  exp -= 2;
1363	}
1364      if (y < (1.0 / (1 << 1)))
1365	{
1366	  y *= 1.0 * (1 << 1);
1367	  exp -= 1;
1368	}
1369    }
1370  if (!(y >= 0.5 && y < 1.0))
1371    abort ();
1372  /* Compute an approximation for l = log2(x) = exp + log2(y).  */
1373  l = exp;
1374  z = y;
1375  if (z < 0.70710678118654752444)
1376    {
1377      z *= 1.4142135623730950488;
1378      l -= 0.5;
1379    }
1380  if (z < 0.8408964152537145431)
1381    {
1382      z *= 1.1892071150027210667;
1383      l -= 0.25;
1384    }
1385  if (z < 0.91700404320467123175)
1386    {
1387      z *= 1.0905077326652576592;
1388      l -= 0.125;
1389    }
1390  if (z < 0.9576032806985736469)
1391    {
1392      z *= 1.0442737824274138403;
1393      l -= 0.0625;
1394    }
1395  /* Now 0.95 <= z <= 1.01.  */
1396  z = 1 - z;
1397  /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ...
1398     Four terms are enough to get an approximation with error < 10^-7.  */
1399  l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
1400  /* Finally multiply with log(2)/log(10), yields an approximation for
1401     log10(x).  */
1402  l *= 0.30102999566398119523;
1403  /* Round down to the next integer.  */
1404  return (int) l + (l < 0 ? -1 : 0);
1405}
1406
1407# endif
1408
1409#endif
1410
1411DCHAR_T *
1412VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
1413	    const FCHAR_T *format, va_list args)
1414{
1415  DIRECTIVES d;
1416  arguments a;
1417
1418  if (PRINTF_PARSE (format, &d, &a) < 0)
1419    /* errno is already set.  */
1420    return NULL;
1421
1422#define CLEANUP() \
1423  free (d.dir);								\
1424  if (a.arg)								\
1425    free (a.arg);
1426
1427  if (PRINTF_FETCHARGS (args, &a) < 0)
1428    {
1429      CLEANUP ();
1430      errno = EINVAL;
1431      return NULL;
1432    }
1433
1434  {
1435    size_t buf_neededlength;
1436    TCHAR_T *buf;
1437    TCHAR_T *buf_malloced;
1438    const FCHAR_T *cp;
1439    size_t i;
1440    DIRECTIVE *dp;
1441    /* Output string accumulator.  */
1442    DCHAR_T *result;
1443    size_t allocated;
1444    size_t length;
1445
1446    /* Allocate a small buffer that will hold a directive passed to
1447       sprintf or snprintf.  */
1448    buf_neededlength =
1449      xsum4 (7, d.max_width_length, d.max_precision_length, 6);
1450#if HAVE_ALLOCA
1451    if (buf_neededlength < 4000 / sizeof (TCHAR_T))
1452      {
1453	buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
1454	buf_malloced = NULL;
1455      }
1456    else
1457#endif
1458      {
1459	size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
1460	if (size_overflow_p (buf_memsize))
1461	  goto out_of_memory_1;
1462	buf = (TCHAR_T *) malloc (buf_memsize);
1463	if (buf == NULL)
1464	  goto out_of_memory_1;
1465	buf_malloced = buf;
1466      }
1467
1468    if (resultbuf != NULL)
1469      {
1470	result = resultbuf;
1471	allocated = *lengthp;
1472      }
1473    else
1474      {
1475	result = NULL;
1476	allocated = 0;
1477      }
1478    length = 0;
1479    /* Invariants:
1480       result is either == resultbuf or == NULL or malloc-allocated.
1481       If length > 0, then result != NULL.  */
1482
1483    /* Ensures that allocated >= needed.  Aborts through a jump to
1484       out_of_memory if needed is SIZE_MAX or otherwise too big.  */
1485#define ENSURE_ALLOCATION(needed) \
1486    if ((needed) > allocated)						     \
1487      {									     \
1488	size_t memory_size;						     \
1489	DCHAR_T *memory;						     \
1490									     \
1491	allocated = (allocated > 0 ? xtimes (allocated, 2) : 12);	     \
1492	if ((needed) > allocated)					     \
1493	  allocated = (needed);						     \
1494	memory_size = xtimes (allocated, sizeof (DCHAR_T));		     \
1495	if (size_overflow_p (memory_size))				     \
1496	  goto out_of_memory;						     \
1497	if (result == resultbuf || result == NULL)			     \
1498	  memory = (DCHAR_T *) malloc (memory_size);			     \
1499	else								     \
1500	  memory = (DCHAR_T *) realloc (result, memory_size);		     \
1501	if (memory == NULL)						     \
1502	  goto out_of_memory;						     \
1503	if (result == resultbuf && length > 0)				     \
1504	  DCHAR_CPY (memory, result, length);				     \
1505	result = memory;						     \
1506      }
1507
1508    for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
1509      {
1510	if (cp != dp->dir_start)
1511	  {
1512	    size_t n = dp->dir_start - cp;
1513	    size_t augmented_length = xsum (length, n);
1514
1515	    ENSURE_ALLOCATION (augmented_length);
1516	    /* This copies a piece of FCHAR_T[] into a DCHAR_T[].  Here we
1517	       need that the format string contains only ASCII characters
1518	       if FCHAR_T and DCHAR_T are not the same type.  */
1519	    if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
1520	      {
1521		DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
1522		length = augmented_length;
1523	      }
1524	    else
1525	      {
1526		do
1527		  result[length++] = (unsigned char) *cp++;
1528		while (--n > 0);
1529	      }
1530	  }
1531	if (i == d.count)
1532	  break;
1533
1534	/* Execute a single directive.  */
1535	if (dp->conversion == '%')
1536	  {
1537	    size_t augmented_length;
1538
1539	    if (!(dp->arg_index == ARG_NONE))
1540	      abort ();
1541	    augmented_length = xsum (length, 1);
1542	    ENSURE_ALLOCATION (augmented_length);
1543	    result[length] = '%';
1544	    length = augmented_length;
1545	  }
1546	else
1547	  {
1548	    if (!(dp->arg_index != ARG_NONE))
1549	      abort ();
1550
1551	    if (dp->conversion == 'n')
1552	      {
1553		switch (a.arg[dp->arg_index].type)
1554		  {
1555		  case TYPE_COUNT_SCHAR_POINTER:
1556		    *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
1557		    break;
1558		  case TYPE_COUNT_SHORT_POINTER:
1559		    *a.arg[dp->arg_index].a.a_count_short_pointer = length;
1560		    break;
1561		  case TYPE_COUNT_INT_POINTER:
1562		    *a.arg[dp->arg_index].a.a_count_int_pointer = length;
1563		    break;
1564		  case TYPE_COUNT_LONGINT_POINTER:
1565		    *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
1566		    break;
1567#if HAVE_LONG_LONG_INT
1568		  case TYPE_COUNT_LONGLONGINT_POINTER:
1569		    *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
1570		    break;
1571#endif
1572		  default:
1573		    abort ();
1574		  }
1575	      }
1576#if ENABLE_UNISTDIO
1577	    /* The unistdio extensions.  */
1578	    else if (dp->conversion == 'U')
1579	      {
1580		arg_type type = a.arg[dp->arg_index].type;
1581		int flags = dp->flags;
1582		int has_width;
1583		size_t width;
1584		int has_precision;
1585		size_t precision;
1586
1587		has_width = 0;
1588		width = 0;
1589		if (dp->width_start != dp->width_end)
1590		  {
1591		    if (dp->width_arg_index != ARG_NONE)
1592		      {
1593			int arg;
1594
1595			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
1596			  abort ();
1597			arg = a.arg[dp->width_arg_index].a.a_int;
1598			if (arg < 0)
1599			  {
1600			    /* "A negative field width is taken as a '-' flag
1601			        followed by a positive field width."  */
1602			    flags |= FLAG_LEFT;
1603			    width = (unsigned int) (-arg);
1604			  }
1605			else
1606			  width = arg;
1607		      }
1608		    else
1609		      {
1610			const FCHAR_T *digitp = dp->width_start;
1611
1612			do
1613			  width = xsum (xtimes (width, 10), *digitp++ - '0');
1614			while (digitp != dp->width_end);
1615		      }
1616		    has_width = 1;
1617		  }
1618
1619		has_precision = 0;
1620		precision = 0;
1621		if (dp->precision_start != dp->precision_end)
1622		  {
1623		    if (dp->precision_arg_index != ARG_NONE)
1624		      {
1625			int arg;
1626
1627			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
1628			  abort ();
1629			arg = a.arg[dp->precision_arg_index].a.a_int;
1630			/* "A negative precision is taken as if the precision
1631			    were omitted."  */
1632			if (arg >= 0)
1633			  {
1634			    precision = arg;
1635			    has_precision = 1;
1636			  }
1637		      }
1638		    else
1639		      {
1640			const FCHAR_T *digitp = dp->precision_start + 1;
1641
1642			precision = 0;
1643			while (digitp != dp->precision_end)
1644			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
1645			has_precision = 1;
1646		      }
1647		  }
1648
1649		switch (type)
1650		  {
1651		  case TYPE_U8_STRING:
1652		    {
1653		      const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
1654		      const uint8_t *arg_end;
1655		      size_t characters;
1656
1657		      if (has_precision)
1658			{
1659			  /* Use only PRECISION characters, from the left.  */
1660			  arg_end = arg;
1661			  characters = 0;
1662			  for (; precision > 0; precision--)
1663			    {
1664			      int count = u8_strmblen (arg_end);
1665			      if (count == 0)
1666				break;
1667			      if (count < 0)
1668				{
1669				  if (!(result == resultbuf || result == NULL))
1670				    free (result);
1671				  if (buf_malloced != NULL)
1672				    free (buf_malloced);
1673				  CLEANUP ();
1674				  errno = EILSEQ;
1675				  return NULL;
1676				}
1677			      arg_end += count;
1678			      characters++;
1679			    }
1680			}
1681		      else if (has_width)
1682			{
1683			  /* Use the entire string, and count the number of
1684			     characters.  */
1685			  arg_end = arg;
1686			  characters = 0;
1687			  for (;;)
1688			    {
1689			      int count = u8_strmblen (arg_end);
1690			      if (count == 0)
1691				break;
1692			      if (count < 0)
1693				{
1694				  if (!(result == resultbuf || result == NULL))
1695				    free (result);
1696				  if (buf_malloced != NULL)
1697				    free (buf_malloced);
1698				  CLEANUP ();
1699				  errno = EILSEQ;
1700				  return NULL;
1701				}
1702			      arg_end += count;
1703			      characters++;
1704			    }
1705			}
1706		      else
1707			{
1708			  /* Use the entire string.  */
1709			  arg_end = arg + u8_strlen (arg);
1710			  /* The number of characters doesn't matter.  */
1711			  characters = 0;
1712			}
1713
1714		      if (has_width && width > characters
1715			  && !(dp->flags & FLAG_LEFT))
1716			{
1717			  size_t n = width - characters;
1718			  ENSURE_ALLOCATION (xsum (length, n));
1719			  DCHAR_SET (result + length, ' ', n);
1720			  length += n;
1721			}
1722
1723# if DCHAR_IS_UINT8_T
1724		      {
1725			size_t n = arg_end - arg;
1726			ENSURE_ALLOCATION (xsum (length, n));
1727			DCHAR_CPY (result + length, arg, n);
1728			length += n;
1729		      }
1730# else
1731		      { /* Convert.  */
1732			DCHAR_T *converted = result + length;
1733			size_t converted_len = allocated - length;
1734#  if DCHAR_IS_TCHAR
1735			/* Convert from UTF-8 to locale encoding.  */
1736			if (u8_conv_to_encoding (locale_charset (),
1737						 iconveh_question_mark,
1738						 arg, arg_end - arg, NULL,
1739						 &converted, &converted_len)
1740			    < 0)
1741#  else
1742			/* Convert from UTF-8 to UTF-16/UTF-32.  */
1743			converted =
1744			  U8_TO_DCHAR (arg, arg_end - arg,
1745				       converted, &converted_len);
1746			if (converted == NULL)
1747#  endif
1748			  {
1749			    int saved_errno = errno;
1750			    if (!(result == resultbuf || result == NULL))
1751			      free (result);
1752			    if (buf_malloced != NULL)
1753			      free (buf_malloced);
1754			    CLEANUP ();
1755			    errno = saved_errno;
1756			    return NULL;
1757			  }
1758			if (converted != result + length)
1759			  {
1760			    ENSURE_ALLOCATION (xsum (length, converted_len));
1761			    DCHAR_CPY (result + length, converted, converted_len);
1762			    free (converted);
1763			  }
1764			length += converted_len;
1765		      }
1766# endif
1767
1768		      if (has_width && width > characters
1769			  && (dp->flags & FLAG_LEFT))
1770			{
1771			  size_t n = width - characters;
1772			  ENSURE_ALLOCATION (xsum (length, n));
1773			  DCHAR_SET (result + length, ' ', n);
1774			  length += n;
1775			}
1776		    }
1777		    break;
1778
1779		  case TYPE_U16_STRING:
1780		    {
1781		      const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
1782		      const uint16_t *arg_end;
1783		      size_t characters;
1784
1785		      if (has_precision)
1786			{
1787			  /* Use only PRECISION characters, from the left.  */
1788			  arg_end = arg;
1789			  characters = 0;
1790			  for (; precision > 0; precision--)
1791			    {
1792			      int count = u16_strmblen (arg_end);
1793			      if (count == 0)
1794				break;
1795			      if (count < 0)
1796				{
1797				  if (!(result == resultbuf || result == NULL))
1798				    free (result);
1799				  if (buf_malloced != NULL)
1800				    free (buf_malloced);
1801				  CLEANUP ();
1802				  errno = EILSEQ;
1803				  return NULL;
1804				}
1805			      arg_end += count;
1806			      characters++;
1807			    }
1808			}
1809		      else if (has_width)
1810			{
1811			  /* Use the entire string, and count the number of
1812			     characters.  */
1813			  arg_end = arg;
1814			  characters = 0;
1815			  for (;;)
1816			    {
1817			      int count = u16_strmblen (arg_end);
1818			      if (count == 0)
1819				break;
1820			      if (count < 0)
1821				{
1822				  if (!(result == resultbuf || result == NULL))
1823				    free (result);
1824				  if (buf_malloced != NULL)
1825				    free (buf_malloced);
1826				  CLEANUP ();
1827				  errno = EILSEQ;
1828				  return NULL;
1829				}
1830			      arg_end += count;
1831			      characters++;
1832			    }
1833			}
1834		      else
1835			{
1836			  /* Use the entire string.  */
1837			  arg_end = arg + u16_strlen (arg);
1838			  /* The number of characters doesn't matter.  */
1839			  characters = 0;
1840			}
1841
1842		      if (has_width && width > characters
1843			  && !(dp->flags & FLAG_LEFT))
1844			{
1845			  size_t n = width - characters;
1846			  ENSURE_ALLOCATION (xsum (length, n));
1847			  DCHAR_SET (result + length, ' ', n);
1848			  length += n;
1849			}
1850
1851# if DCHAR_IS_UINT16_T
1852		      {
1853			size_t n = arg_end - arg;
1854			ENSURE_ALLOCATION (xsum (length, n));
1855			DCHAR_CPY (result + length, arg, n);
1856			length += n;
1857		      }
1858# else
1859		      { /* Convert.  */
1860			DCHAR_T *converted = result + length;
1861			size_t converted_len = allocated - length;
1862#  if DCHAR_IS_TCHAR
1863			/* Convert from UTF-16 to locale encoding.  */
1864			if (u16_conv_to_encoding (locale_charset (),
1865						  iconveh_question_mark,
1866						  arg, arg_end - arg, NULL,
1867						  &converted, &converted_len)
1868			    < 0)
1869#  else
1870			/* Convert from UTF-16 to UTF-8/UTF-32.  */
1871			converted =
1872			  U16_TO_DCHAR (arg, arg_end - arg,
1873					converted, &converted_len);
1874			if (converted == NULL)
1875#  endif
1876			  {
1877			    int saved_errno = errno;
1878			    if (!(result == resultbuf || result == NULL))
1879			      free (result);
1880			    if (buf_malloced != NULL)
1881			      free (buf_malloced);
1882			    CLEANUP ();
1883			    errno = saved_errno;
1884			    return NULL;
1885			  }
1886			if (converted != result + length)
1887			  {
1888			    ENSURE_ALLOCATION (xsum (length, converted_len));
1889			    DCHAR_CPY (result + length, converted, converted_len);
1890			    free (converted);
1891			  }
1892			length += converted_len;
1893		      }
1894# endif
1895
1896		      if (has_width && width > characters
1897			  && (dp->flags & FLAG_LEFT))
1898			{
1899			  size_t n = width - characters;
1900			  ENSURE_ALLOCATION (xsum (length, n));
1901			  DCHAR_SET (result + length, ' ', n);
1902			  length += n;
1903			}
1904		    }
1905		    break;
1906
1907		  case TYPE_U32_STRING:
1908		    {
1909		      const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
1910		      const uint32_t *arg_end;
1911		      size_t characters;
1912
1913		      if (has_precision)
1914			{
1915			  /* Use only PRECISION characters, from the left.  */
1916			  arg_end = arg;
1917			  characters = 0;
1918			  for (; precision > 0; precision--)
1919			    {
1920			      int count = u32_strmblen (arg_end);
1921			      if (count == 0)
1922				break;
1923			      if (count < 0)
1924				{
1925				  if (!(result == resultbuf || result == NULL))
1926				    free (result);
1927				  if (buf_malloced != NULL)
1928				    free (buf_malloced);
1929				  CLEANUP ();
1930				  errno = EILSEQ;
1931				  return NULL;
1932				}
1933			      arg_end += count;
1934			      characters++;
1935			    }
1936			}
1937		      else if (has_width)
1938			{
1939			  /* Use the entire string, and count the number of
1940			     characters.  */
1941			  arg_end = arg;
1942			  characters = 0;
1943			  for (;;)
1944			    {
1945			      int count = u32_strmblen (arg_end);
1946			      if (count == 0)
1947				break;
1948			      if (count < 0)
1949				{
1950				  if (!(result == resultbuf || result == NULL))
1951				    free (result);
1952				  if (buf_malloced != NULL)
1953				    free (buf_malloced);
1954				  CLEANUP ();
1955				  errno = EILSEQ;
1956				  return NULL;
1957				}
1958			      arg_end += count;
1959			      characters++;
1960			    }
1961			}
1962		      else
1963			{
1964			  /* Use the entire string.  */
1965			  arg_end = arg + u32_strlen (arg);
1966			  /* The number of characters doesn't matter.  */
1967			  characters = 0;
1968			}
1969
1970		      if (has_width && width > characters
1971			  && !(dp->flags & FLAG_LEFT))
1972			{
1973			  size_t n = width - characters;
1974			  ENSURE_ALLOCATION (xsum (length, n));
1975			  DCHAR_SET (result + length, ' ', n);
1976			  length += n;
1977			}
1978
1979# if DCHAR_IS_UINT32_T
1980		      {
1981			size_t n = arg_end - arg;
1982			ENSURE_ALLOCATION (xsum (length, n));
1983			DCHAR_CPY (result + length, arg, n);
1984			length += n;
1985		      }
1986# else
1987		      { /* Convert.  */
1988			DCHAR_T *converted = result + length;
1989			size_t converted_len = allocated - length;
1990#  if DCHAR_IS_TCHAR
1991			/* Convert from UTF-32 to locale encoding.  */
1992			if (u32_conv_to_encoding (locale_charset (),
1993						  iconveh_question_mark,
1994						  arg, arg_end - arg, NULL,
1995						  &converted, &converted_len)
1996			    < 0)
1997#  else
1998			/* Convert from UTF-32 to UTF-8/UTF-16.  */
1999			converted =
2000			  U32_TO_DCHAR (arg, arg_end - arg,
2001					converted, &converted_len);
2002			if (converted == NULL)
2003#  endif
2004			  {
2005			    int saved_errno = errno;
2006			    if (!(result == resultbuf || result == NULL))
2007			      free (result);
2008			    if (buf_malloced != NULL)
2009			      free (buf_malloced);
2010			    CLEANUP ();
2011			    errno = saved_errno;
2012			    return NULL;
2013			  }
2014			if (converted != result + length)
2015			  {
2016			    ENSURE_ALLOCATION (xsum (length, converted_len));
2017			    DCHAR_CPY (result + length, converted, converted_len);
2018			    free (converted);
2019			  }
2020			length += converted_len;
2021		      }
2022# endif
2023
2024		      if (has_width && width > characters
2025			  && (dp->flags & FLAG_LEFT))
2026			{
2027			  size_t n = width - characters;
2028			  ENSURE_ALLOCATION (xsum (length, n));
2029			  DCHAR_SET (result + length, ' ', n);
2030			  length += n;
2031			}
2032		    }
2033		    break;
2034
2035		  default:
2036		    abort ();
2037		  }
2038	      }
2039#endif
2040#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
2041	    else if ((dp->conversion == 'a' || dp->conversion == 'A')
2042# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
2043		     && (0
2044#  if NEED_PRINTF_DOUBLE
2045			 || a.arg[dp->arg_index].type == TYPE_DOUBLE
2046#  endif
2047#  if NEED_PRINTF_LONG_DOUBLE
2048			 || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
2049#  endif
2050			)
2051# endif
2052		    )
2053	      {
2054		arg_type type = a.arg[dp->arg_index].type;
2055		int flags = dp->flags;
2056		int has_width;
2057		size_t width;
2058		int has_precision;
2059		size_t precision;
2060		size_t tmp_length;
2061		DCHAR_T tmpbuf[700];
2062		DCHAR_T *tmp;
2063		DCHAR_T *pad_ptr;
2064		DCHAR_T *p;
2065
2066		has_width = 0;
2067		width = 0;
2068		if (dp->width_start != dp->width_end)
2069		  {
2070		    if (dp->width_arg_index != ARG_NONE)
2071		      {
2072			int arg;
2073
2074			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
2075			  abort ();
2076			arg = a.arg[dp->width_arg_index].a.a_int;
2077			if (arg < 0)
2078			  {
2079			    /* "A negative field width is taken as a '-' flag
2080			        followed by a positive field width."  */
2081			    flags |= FLAG_LEFT;
2082			    width = (unsigned int) (-arg);
2083			  }
2084			else
2085			  width = arg;
2086		      }
2087		    else
2088		      {
2089			const FCHAR_T *digitp = dp->width_start;
2090
2091			do
2092			  width = xsum (xtimes (width, 10), *digitp++ - '0');
2093			while (digitp != dp->width_end);
2094		      }
2095		    has_width = 1;
2096		  }
2097
2098		has_precision = 0;
2099		precision = 0;
2100		if (dp->precision_start != dp->precision_end)
2101		  {
2102		    if (dp->precision_arg_index != ARG_NONE)
2103		      {
2104			int arg;
2105
2106			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
2107			  abort ();
2108			arg = a.arg[dp->precision_arg_index].a.a_int;
2109			/* "A negative precision is taken as if the precision
2110			    were omitted."  */
2111			if (arg >= 0)
2112			  {
2113			    precision = arg;
2114			    has_precision = 1;
2115			  }
2116		      }
2117		    else
2118		      {
2119			const FCHAR_T *digitp = dp->precision_start + 1;
2120
2121			precision = 0;
2122			while (digitp != dp->precision_end)
2123			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
2124			has_precision = 1;
2125		      }
2126		  }
2127
2128		/* Allocate a temporary buffer of sufficient size.  */
2129		if (type == TYPE_LONGDOUBLE)
2130		  tmp_length =
2131		    (unsigned int) ((LDBL_DIG + 1)
2132				    * 0.831 /* decimal -> hexadecimal */
2133				   )
2134		    + 1; /* turn floor into ceil */
2135		else
2136		  tmp_length =
2137		    (unsigned int) ((DBL_DIG + 1)
2138				    * 0.831 /* decimal -> hexadecimal */
2139				   )
2140		    + 1; /* turn floor into ceil */
2141		if (tmp_length < precision)
2142		  tmp_length = precision;
2143		/* Account for sign, decimal point etc. */
2144		tmp_length = xsum (tmp_length, 12);
2145
2146		if (tmp_length < width)
2147		  tmp_length = width;
2148
2149		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
2150
2151		if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
2152		  tmp = tmpbuf;
2153		else
2154		  {
2155		    size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
2156
2157		    if (size_overflow_p (tmp_memsize))
2158		      /* Overflow, would lead to out of memory.  */
2159		      goto out_of_memory;
2160		    tmp = (DCHAR_T *) malloc (tmp_memsize);
2161		    if (tmp == NULL)
2162		      /* Out of memory.  */
2163		      goto out_of_memory;
2164		  }
2165
2166		pad_ptr = NULL;
2167		p = tmp;
2168		if (type == TYPE_LONGDOUBLE)
2169		  {
2170# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
2171		    long double arg = a.arg[dp->arg_index].a.a_longdouble;
2172
2173		    if (isnanl (arg))
2174		      {
2175			if (dp->conversion == 'A')
2176			  {
2177			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
2178			  }
2179			else
2180			  {
2181			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
2182			  }
2183		      }
2184		    else
2185		      {
2186			int sign = 0;
2187			DECL_LONG_DOUBLE_ROUNDING
2188
2189			BEGIN_LONG_DOUBLE_ROUNDING ();
2190
2191			if (signbit (arg)) /* arg < 0.0L or negative zero */
2192			  {
2193			    sign = -1;
2194			    arg = -arg;
2195			  }
2196
2197			if (sign < 0)
2198			  *p++ = '-';
2199			else if (flags & FLAG_SHOWSIGN)
2200			  *p++ = '+';
2201			else if (flags & FLAG_SPACE)
2202			  *p++ = ' ';
2203
2204			if (arg > 0.0L && arg + arg == arg)
2205			  {
2206			    if (dp->conversion == 'A')
2207			      {
2208				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
2209			      }
2210			    else
2211			      {
2212				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
2213			      }
2214			  }
2215			else
2216			  {
2217			    int exponent;
2218			    long double mantissa;
2219
2220			    if (arg > 0.0L)
2221			      mantissa = printf_frexpl (arg, &exponent);
2222			    else
2223			      {
2224				exponent = 0;
2225				mantissa = 0.0L;
2226			      }
2227
2228			    if (has_precision
2229				&& precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
2230			      {
2231				/* Round the mantissa.  */
2232				long double tail = mantissa;
2233				size_t q;
2234
2235				for (q = precision; ; q--)
2236				  {
2237				    int digit = (int) tail;
2238				    tail -= digit;
2239				    if (q == 0)
2240				      {
2241					if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
2242					  tail = 1 - tail;
2243					else
2244					  tail = - tail;
2245					break;
2246				      }
2247				    tail *= 16.0L;
2248				  }
2249				if (tail != 0.0L)
2250				  for (q = precision; q > 0; q--)
2251				    tail *= 0.0625L;
2252				mantissa += tail;
2253			      }
2254
2255			    *p++ = '0';
2256			    *p++ = dp->conversion - 'A' + 'X';
2257			    pad_ptr = p;
2258			    {
2259			      int digit;
2260
2261			      digit = (int) mantissa;
2262			      mantissa -= digit;
2263			      *p++ = '0' + digit;
2264			      if ((flags & FLAG_ALT)
2265				  || mantissa > 0.0L || precision > 0)
2266				{
2267				  *p++ = decimal_point_char ();
2268				  /* This loop terminates because we assume
2269				     that FLT_RADIX is a power of 2.  */
2270				  while (mantissa > 0.0L)
2271				    {
2272				      mantissa *= 16.0L;
2273				      digit = (int) mantissa;
2274				      mantissa -= digit;
2275				      *p++ = digit
2276					     + (digit < 10
2277						? '0'
2278						: dp->conversion - 10);
2279				      if (precision > 0)
2280					precision--;
2281				    }
2282				  while (precision > 0)
2283				    {
2284				      *p++ = '0';
2285				      precision--;
2286				    }
2287				}
2288			      }
2289			      *p++ = dp->conversion - 'A' + 'P';
2290#  if WIDE_CHAR_VERSION
2291			      {
2292				static const wchar_t decimal_format[] =
2293				  { '%', '+', 'd', '\0' };
2294				SNPRINTF (p, 6 + 1, decimal_format, exponent);
2295			      }
2296			      while (*p != '\0')
2297				p++;
2298#  else
2299			      if (sizeof (DCHAR_T) == 1)
2300				{
2301				  sprintf ((char *) p, "%+d", exponent);
2302				  while (*p != '\0')
2303				    p++;
2304				}
2305			      else
2306				{
2307				  char expbuf[6 + 1];
2308				  const char *ep;
2309				  sprintf (expbuf, "%+d", exponent);
2310				  for (ep = expbuf; (*p = *ep) != '\0'; ep++)
2311				    p++;
2312				}
2313#  endif
2314			  }
2315
2316			END_LONG_DOUBLE_ROUNDING ();
2317		      }
2318# else
2319		    abort ();
2320# endif
2321		  }
2322		else
2323		  {
2324# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
2325		    double arg = a.arg[dp->arg_index].a.a_double;
2326
2327		    if (isnan (arg))
2328		      {
2329			if (dp->conversion == 'A')
2330			  {
2331			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
2332			  }
2333			else
2334			  {
2335			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
2336			  }
2337		      }
2338		    else
2339		      {
2340			int sign = 0;
2341
2342			if (signbit (arg)) /* arg < 0.0 or negative zero */
2343			  {
2344			    sign = -1;
2345			    arg = -arg;
2346			  }
2347
2348			if (sign < 0)
2349			  *p++ = '-';
2350			else if (flags & FLAG_SHOWSIGN)
2351			  *p++ = '+';
2352			else if (flags & FLAG_SPACE)
2353			  *p++ = ' ';
2354
2355			if (arg > 0.0 && arg + arg == arg)
2356			  {
2357			    if (dp->conversion == 'A')
2358			      {
2359				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
2360			      }
2361			    else
2362			      {
2363				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
2364			      }
2365			  }
2366			else
2367			  {
2368			    int exponent;
2369			    double mantissa;
2370
2371			    if (arg > 0.0)
2372			      mantissa = printf_frexp (arg, &exponent);
2373			    else
2374			      {
2375				exponent = 0;
2376				mantissa = 0.0;
2377			      }
2378
2379			    if (has_precision
2380				&& precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
2381			      {
2382				/* Round the mantissa.  */
2383				double tail = mantissa;
2384				size_t q;
2385
2386				for (q = precision; ; q--)
2387				  {
2388				    int digit = (int) tail;
2389				    tail -= digit;
2390				    if (q == 0)
2391				      {
2392					if (digit & 1 ? tail >= 0.5 : tail > 0.5)
2393					  tail = 1 - tail;
2394					else
2395					  tail = - tail;
2396					break;
2397				      }
2398				    tail *= 16.0;
2399				  }
2400				if (tail != 0.0)
2401				  for (q = precision; q > 0; q--)
2402				    tail *= 0.0625;
2403				mantissa += tail;
2404			      }
2405
2406			    *p++ = '0';
2407			    *p++ = dp->conversion - 'A' + 'X';
2408			    pad_ptr = p;
2409			    {
2410			      int digit;
2411
2412			      digit = (int) mantissa;
2413			      mantissa -= digit;
2414			      *p++ = '0' + digit;
2415			      if ((flags & FLAG_ALT)
2416				  || mantissa > 0.0 || precision > 0)
2417				{
2418				  *p++ = decimal_point_char ();
2419				  /* This loop terminates because we assume
2420				     that FLT_RADIX is a power of 2.  */
2421				  while (mantissa > 0.0)
2422				    {
2423				      mantissa *= 16.0;
2424				      digit = (int) mantissa;
2425				      mantissa -= digit;
2426				      *p++ = digit
2427					     + (digit < 10
2428						? '0'
2429						: dp->conversion - 10);
2430				      if (precision > 0)
2431					precision--;
2432				    }
2433				  while (precision > 0)
2434				    {
2435				      *p++ = '0';
2436				      precision--;
2437				    }
2438				}
2439			      }
2440			      *p++ = dp->conversion - 'A' + 'P';
2441#  if WIDE_CHAR_VERSION
2442			      {
2443				static const wchar_t decimal_format[] =
2444				  { '%', '+', 'd', '\0' };
2445				SNPRINTF (p, 6 + 1, decimal_format, exponent);
2446			      }
2447			      while (*p != '\0')
2448				p++;
2449#  else
2450			      if (sizeof (DCHAR_T) == 1)
2451				{
2452				  sprintf ((char *) p, "%+d", exponent);
2453				  while (*p != '\0')
2454				    p++;
2455				}
2456			      else
2457				{
2458				  char expbuf[6 + 1];
2459				  const char *ep;
2460				  sprintf (expbuf, "%+d", exponent);
2461				  for (ep = expbuf; (*p = *ep) != '\0'; ep++)
2462				    p++;
2463				}
2464#  endif
2465			  }
2466		      }
2467# else
2468		    abort ();
2469# endif
2470		  }
2471		/* The generated string now extends from tmp to p, with the
2472		   zero padding insertion point being at pad_ptr.  */
2473		if (has_width && p - tmp < width)
2474		  {
2475		    size_t pad = width - (p - tmp);
2476		    DCHAR_T *end = p + pad;
2477
2478		    if (flags & FLAG_LEFT)
2479		      {
2480			/* Pad with spaces on the right.  */
2481			for (; pad > 0; pad--)
2482			  *p++ = ' ';
2483		      }
2484		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
2485		      {
2486			/* Pad with zeroes.  */
2487			DCHAR_T *q = end;
2488
2489			while (p > pad_ptr)
2490			  *--q = *--p;
2491			for (; pad > 0; pad--)
2492			  *p++ = '0';
2493		      }
2494		    else
2495		      {
2496			/* Pad with spaces on the left.  */
2497			DCHAR_T *q = end;
2498
2499			while (p > tmp)
2500			  *--q = *--p;
2501			for (; pad > 0; pad--)
2502			  *p++ = ' ';
2503		      }
2504
2505		    p = end;
2506		  }
2507
2508		{
2509		  size_t count = p - tmp;
2510
2511		  if (count >= tmp_length)
2512		    /* tmp_length was incorrectly calculated - fix the
2513		       code above!  */
2514		    abort ();
2515
2516		  /* Make room for the result.  */
2517		  if (count >= allocated - length)
2518		    {
2519		      size_t n = xsum (length, count);
2520
2521		      ENSURE_ALLOCATION (n);
2522		    }
2523
2524		  /* Append the result.  */
2525		  memcpy (result + length, tmp, count * sizeof (DCHAR_T));
2526		  if (tmp != tmpbuf)
2527		    free (tmp);
2528		  length += count;
2529		}
2530	      }
2531#endif
2532#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
2533	    else if ((dp->conversion == 'f' || dp->conversion == 'F'
2534		      || dp->conversion == 'e' || dp->conversion == 'E'
2535		      || dp->conversion == 'g' || dp->conversion == 'G'
2536		      || dp->conversion == 'a' || dp->conversion == 'A')
2537		     && (0
2538# if NEED_PRINTF_DOUBLE
2539			 || a.arg[dp->arg_index].type == TYPE_DOUBLE
2540# elif NEED_PRINTF_INFINITE_DOUBLE
2541			 || (a.arg[dp->arg_index].type == TYPE_DOUBLE
2542			     /* The systems (mingw) which produce wrong output
2543				for Inf, -Inf, and NaN also do so for -0.0.
2544				Therefore we treat this case here as well.  */
2545			     && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
2546# endif
2547# if NEED_PRINTF_LONG_DOUBLE
2548			 || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
2549# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
2550			 || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
2551			     /* Some systems produce wrong output for Inf,
2552				-Inf, and NaN.  */
2553			     && is_infinitel (a.arg[dp->arg_index].a.a_longdouble))
2554# endif
2555			))
2556	      {
2557# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
2558		arg_type type = a.arg[dp->arg_index].type;
2559# endif
2560		int flags = dp->flags;
2561		int has_width;
2562		size_t width;
2563		int has_precision;
2564		size_t precision;
2565		size_t tmp_length;
2566		DCHAR_T tmpbuf[700];
2567		DCHAR_T *tmp;
2568		DCHAR_T *pad_ptr;
2569		DCHAR_T *p;
2570
2571		has_width = 0;
2572		width = 0;
2573		if (dp->width_start != dp->width_end)
2574		  {
2575		    if (dp->width_arg_index != ARG_NONE)
2576		      {
2577			int arg;
2578
2579			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
2580			  abort ();
2581			arg = a.arg[dp->width_arg_index].a.a_int;
2582			if (arg < 0)
2583			  {
2584			    /* "A negative field width is taken as a '-' flag
2585			        followed by a positive field width."  */
2586			    flags |= FLAG_LEFT;
2587			    width = (unsigned int) (-arg);
2588			  }
2589			else
2590			  width = arg;
2591		      }
2592		    else
2593		      {
2594			const FCHAR_T *digitp = dp->width_start;
2595
2596			do
2597			  width = xsum (xtimes (width, 10), *digitp++ - '0');
2598			while (digitp != dp->width_end);
2599		      }
2600		    has_width = 1;
2601		  }
2602
2603		has_precision = 0;
2604		precision = 0;
2605		if (dp->precision_start != dp->precision_end)
2606		  {
2607		    if (dp->precision_arg_index != ARG_NONE)
2608		      {
2609			int arg;
2610
2611			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
2612			  abort ();
2613			arg = a.arg[dp->precision_arg_index].a.a_int;
2614			/* "A negative precision is taken as if the precision
2615			    were omitted."  */
2616			if (arg >= 0)
2617			  {
2618			    precision = arg;
2619			    has_precision = 1;
2620			  }
2621		      }
2622		    else
2623		      {
2624			const FCHAR_T *digitp = dp->precision_start + 1;
2625
2626			precision = 0;
2627			while (digitp != dp->precision_end)
2628			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
2629			has_precision = 1;
2630		      }
2631		  }
2632
2633		/* POSIX specifies the default precision to be 6 for %f, %F,
2634		   %e, %E, but not for %g, %G.  Implementations appear to use
2635		   the same default precision also for %g, %G.  */
2636		if (!has_precision)
2637		  precision = 6;
2638
2639		/* Allocate a temporary buffer of sufficient size.  */
2640# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
2641		tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
2642# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
2643		tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
2644# elif NEED_PRINTF_LONG_DOUBLE
2645		tmp_length = LDBL_DIG + 1;
2646# elif NEED_PRINTF_DOUBLE
2647		tmp_length = DBL_DIG + 1;
2648# else
2649		tmp_length = 0;
2650# endif
2651		if (tmp_length < precision)
2652		  tmp_length = precision;
2653# if NEED_PRINTF_LONG_DOUBLE
2654#  if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
2655		if (type == TYPE_LONGDOUBLE)
2656#  endif
2657		  if (dp->conversion == 'f' || dp->conversion == 'F')
2658		    {
2659		      long double arg = a.arg[dp->arg_index].a.a_longdouble;
2660		      if (!(isnanl (arg) || arg + arg == arg))
2661			{
2662			  /* arg is finite and nonzero.  */
2663			  int exponent = floorlog10l (arg < 0 ? -arg : arg);
2664			  if (exponent >= 0 && tmp_length < exponent + precision)
2665			    tmp_length = exponent + precision;
2666			}
2667		    }
2668# endif
2669# if NEED_PRINTF_DOUBLE
2670#  if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
2671		if (type == TYPE_DOUBLE)
2672#  endif
2673		  if (dp->conversion == 'f' || dp->conversion == 'F')
2674		    {
2675		      double arg = a.arg[dp->arg_index].a.a_double;
2676		      if (!(isnan (arg) || arg + arg == arg))
2677			{
2678			  /* arg is finite and nonzero.  */
2679			  int exponent = floorlog10 (arg < 0 ? -arg : arg);
2680			  if (exponent >= 0 && tmp_length < exponent + precision)
2681			    tmp_length = exponent + precision;
2682			}
2683		    }
2684# endif
2685		/* Account for sign, decimal point etc. */
2686		tmp_length = xsum (tmp_length, 12);
2687
2688		if (tmp_length < width)
2689		  tmp_length = width;
2690
2691		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
2692
2693		if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
2694		  tmp = tmpbuf;
2695		else
2696		  {
2697		    size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
2698
2699		    if (size_overflow_p (tmp_memsize))
2700		      /* Overflow, would lead to out of memory.  */
2701		      goto out_of_memory;
2702		    tmp = (DCHAR_T *) malloc (tmp_memsize);
2703		    if (tmp == NULL)
2704		      /* Out of memory.  */
2705		      goto out_of_memory;
2706		  }
2707
2708		pad_ptr = NULL;
2709		p = tmp;
2710
2711# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
2712#  if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
2713		if (type == TYPE_LONGDOUBLE)
2714#  endif
2715		  {
2716		    long double arg = a.arg[dp->arg_index].a.a_longdouble;
2717
2718		    if (isnanl (arg))
2719		      {
2720			if (dp->conversion >= 'A' && dp->conversion <= 'Z')
2721			  {
2722			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
2723			  }
2724			else
2725			  {
2726			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
2727			  }
2728		      }
2729		    else
2730		      {
2731			int sign = 0;
2732			DECL_LONG_DOUBLE_ROUNDING
2733
2734			BEGIN_LONG_DOUBLE_ROUNDING ();
2735
2736			if (signbit (arg)) /* arg < 0.0L or negative zero */
2737			  {
2738			    sign = -1;
2739			    arg = -arg;
2740			  }
2741
2742			if (sign < 0)
2743			  *p++ = '-';
2744			else if (flags & FLAG_SHOWSIGN)
2745			  *p++ = '+';
2746			else if (flags & FLAG_SPACE)
2747			  *p++ = ' ';
2748
2749			if (arg > 0.0L && arg + arg == arg)
2750			  {
2751			    if (dp->conversion >= 'A' && dp->conversion <= 'Z')
2752			      {
2753				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
2754			      }
2755			    else
2756			      {
2757				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
2758			      }
2759			  }
2760			else
2761			  {
2762#  if NEED_PRINTF_LONG_DOUBLE
2763			    pad_ptr = p;
2764
2765			    if (dp->conversion == 'f' || dp->conversion == 'F')
2766			      {
2767				char *digits;
2768				size_t ndigits;
2769
2770				digits =
2771				  scale10_round_decimal_long_double (arg, precision);
2772				if (digits == NULL)
2773				  {
2774				    END_LONG_DOUBLE_ROUNDING ();
2775				    goto out_of_memory;
2776				  }
2777				ndigits = strlen (digits);
2778
2779				if (ndigits > precision)
2780				  do
2781				    {
2782				      --ndigits;
2783				      *p++ = digits[ndigits];
2784				    }
2785				  while (ndigits > precision);
2786				else
2787				  *p++ = '0';
2788				/* Here ndigits <= precision.  */
2789				if ((flags & FLAG_ALT) || precision > 0)
2790				  {
2791				    *p++ = decimal_point_char ();
2792				    for (; precision > ndigits; precision--)
2793				      *p++ = '0';
2794				    while (ndigits > 0)
2795				      {
2796					--ndigits;
2797					*p++ = digits[ndigits];
2798				      }
2799				  }
2800
2801				free (digits);
2802			      }
2803			    else if (dp->conversion == 'e' || dp->conversion == 'E')
2804			      {
2805				int exponent;
2806
2807				if (arg == 0.0L)
2808				  {
2809				    exponent = 0;
2810				    *p++ = '0';
2811				    if ((flags & FLAG_ALT) || precision > 0)
2812				      {
2813					*p++ = decimal_point_char ();
2814					for (; precision > 0; precision--)
2815					  *p++ = '0';
2816				      }
2817				  }
2818				else
2819				  {
2820				    /* arg > 0.0L.  */
2821				    int adjusted;
2822				    char *digits;
2823				    size_t ndigits;
2824
2825				    exponent = floorlog10l (arg);
2826				    adjusted = 0;
2827				    for (;;)
2828				      {
2829					digits =
2830					  scale10_round_decimal_long_double (arg,
2831									     (int)precision - exponent);
2832					if (digits == NULL)
2833					  {
2834					    END_LONG_DOUBLE_ROUNDING ();
2835					    goto out_of_memory;
2836					  }
2837					ndigits = strlen (digits);
2838
2839					if (ndigits == precision + 1)
2840					  break;
2841					if (ndigits < precision
2842					    || ndigits > precision + 2)
2843					  /* The exponent was not guessed
2844					     precisely enough.  */
2845					  abort ();
2846					if (adjusted)
2847					  /* None of two values of exponent is
2848					     the right one.  Prevent an endless
2849					     loop.  */
2850					  abort ();
2851					free (digits);
2852					if (ndigits == precision)
2853					  exponent -= 1;
2854					else
2855					  exponent += 1;
2856					adjusted = 1;
2857				      }
2858
2859				    /* Here ndigits = precision+1.  */
2860				    *p++ = digits[--ndigits];
2861				    if ((flags & FLAG_ALT) || precision > 0)
2862				      {
2863					*p++ = decimal_point_char ();
2864					while (ndigits > 0)
2865					  {
2866					    --ndigits;
2867					    *p++ = digits[ndigits];
2868					  }
2869				      }
2870
2871				    free (digits);
2872				  }
2873
2874				*p++ = dp->conversion; /* 'e' or 'E' */
2875#   if WIDE_CHAR_VERSION
2876				{
2877				  static const wchar_t decimal_format[] =
2878				    { '%', '+', '.', '2', 'd', '\0' };
2879				  SNPRINTF (p, 6 + 1, decimal_format, exponent);
2880				}
2881				while (*p != '\0')
2882				  p++;
2883#   else
2884				if (sizeof (DCHAR_T) == 1)
2885				  {
2886				    sprintf ((char *) p, "%+.2d", exponent);
2887				    while (*p != '\0')
2888				      p++;
2889				  }
2890				else
2891				  {
2892				    char expbuf[6 + 1];
2893				    const char *ep;
2894				    sprintf (expbuf, "%+.2d", exponent);
2895				    for (ep = expbuf; (*p = *ep) != '\0'; ep++)
2896				      p++;
2897				  }
2898#   endif
2899			      }
2900			    else if (dp->conversion == 'g' || dp->conversion == 'G')
2901			      {
2902				if (precision == 0)
2903				  precision = 1;
2904				/* precision >= 1.  */
2905
2906				if (arg == 0.0L)
2907				  /* The exponent is 0, >= -4, < precision.
2908				     Use fixed-point notation.  */
2909				  {
2910				    size_t ndigits = precision;
2911				    /* Number of trailing zeroes that have to be
2912				       dropped.  */
2913				    size_t nzeroes =
2914				      (flags & FLAG_ALT ? 0 : precision - 1);
2915
2916				    --ndigits;
2917				    *p++ = '0';
2918				    if ((flags & FLAG_ALT) || ndigits > nzeroes)
2919				      {
2920					*p++ = decimal_point_char ();
2921					while (ndigits > nzeroes)
2922					  {
2923					    --ndigits;
2924					    *p++ = '0';
2925					  }
2926				      }
2927				  }
2928				else
2929				  {
2930				    /* arg > 0.0L.  */
2931				    int exponent;
2932				    int adjusted;
2933				    char *digits;
2934				    size_t ndigits;
2935				    size_t nzeroes;
2936
2937				    exponent = floorlog10l (arg);
2938				    adjusted = 0;
2939				    for (;;)
2940				      {
2941					digits =
2942					  scale10_round_decimal_long_double (arg,
2943									     (int)(precision - 1) - exponent);
2944					if (digits == NULL)
2945					  {
2946					    END_LONG_DOUBLE_ROUNDING ();
2947					    goto out_of_memory;
2948					  }
2949					ndigits = strlen (digits);
2950
2951					if (ndigits == precision)
2952					  break;
2953					if (ndigits < precision - 1
2954					    || ndigits > precision + 1)
2955					  /* The exponent was not guessed
2956					     precisely enough.  */
2957					  abort ();
2958					if (adjusted)
2959					  /* None of two values of exponent is
2960					     the right one.  Prevent an endless
2961					     loop.  */
2962					  abort ();
2963					free (digits);
2964					if (ndigits < precision)
2965					  exponent -= 1;
2966					else
2967					  exponent += 1;
2968					adjusted = 1;
2969				      }
2970				    /* Here ndigits = precision.  */
2971
2972				    /* Determine the number of trailing zeroes
2973				       that have to be dropped.  */
2974				    nzeroes = 0;
2975				    if ((flags & FLAG_ALT) == 0)
2976				      while (nzeroes < ndigits
2977					     && digits[nzeroes] == '0')
2978					nzeroes++;
2979
2980				    /* The exponent is now determined.  */
2981				    if (exponent >= -4
2982					&& exponent < (long)precision)
2983				      {
2984					/* Fixed-point notation:
2985					   max(exponent,0)+1 digits, then the
2986					   decimal point, then the remaining
2987					   digits without trailing zeroes.  */
2988					if (exponent >= 0)
2989					  {
2990					    size_t count = exponent + 1;
2991					    /* Note: count <= precision = ndigits.  */
2992					    for (; count > 0; count--)
2993					      *p++ = digits[--ndigits];
2994					    if ((flags & FLAG_ALT) || ndigits > nzeroes)
2995					      {
2996						*p++ = decimal_point_char ();
2997						while (ndigits > nzeroes)
2998						  {
2999						    --ndigits;
3000						    *p++ = digits[ndigits];
3001						  }
3002					      }
3003					  }
3004					else
3005					  {
3006					    size_t count = -exponent - 1;
3007					    *p++ = '0';
3008					    *p++ = decimal_point_char ();
3009					    for (; count > 0; count--)
3010					      *p++ = '0';
3011					    while (ndigits > nzeroes)
3012					      {
3013						--ndigits;
3014						*p++ = digits[ndigits];
3015					      }
3016					  }
3017				      }
3018				    else
3019				      {
3020					/* Exponential notation.  */
3021					*p++ = digits[--ndigits];
3022					if ((flags & FLAG_ALT) || ndigits > nzeroes)
3023					  {
3024					    *p++ = decimal_point_char ();
3025					    while (ndigits > nzeroes)
3026					      {
3027						--ndigits;
3028						*p++ = digits[ndigits];
3029					      }
3030					  }
3031					*p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
3032#   if WIDE_CHAR_VERSION
3033					{
3034					  static const wchar_t decimal_format[] =
3035					    { '%', '+', '.', '2', 'd', '\0' };
3036					  SNPRINTF (p, 6 + 1, decimal_format, exponent);
3037					}
3038					while (*p != '\0')
3039					  p++;
3040#   else
3041					if (sizeof (DCHAR_T) == 1)
3042					  {
3043					    sprintf ((char *) p, "%+.2d", exponent);
3044					    while (*p != '\0')
3045					      p++;
3046					  }
3047					else
3048					  {
3049					    char expbuf[6 + 1];
3050					    const char *ep;
3051					    sprintf (expbuf, "%+.2d", exponent);
3052					    for (ep = expbuf; (*p = *ep) != '\0'; ep++)
3053					      p++;
3054					  }
3055#   endif
3056				      }
3057
3058				    free (digits);
3059				  }
3060			      }
3061			    else
3062			      abort ();
3063#  else
3064			    /* arg is finite.  */
3065			    abort ();
3066#  endif
3067			  }
3068
3069			END_LONG_DOUBLE_ROUNDING ();
3070		      }
3071		  }
3072#  if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
3073		else
3074#  endif
3075# endif
3076# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
3077		  {
3078		    double arg = a.arg[dp->arg_index].a.a_double;
3079
3080		    if (isnan (arg))
3081		      {
3082			if (dp->conversion >= 'A' && dp->conversion <= 'Z')
3083			  {
3084			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
3085			  }
3086			else
3087			  {
3088			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
3089			  }
3090		      }
3091		    else
3092		      {
3093			int sign = 0;
3094
3095			if (signbit (arg)) /* arg < 0.0 or negative zero */
3096			  {
3097			    sign = -1;
3098			    arg = -arg;
3099			  }
3100
3101			if (sign < 0)
3102			  *p++ = '-';
3103			else if (flags & FLAG_SHOWSIGN)
3104			  *p++ = '+';
3105			else if (flags & FLAG_SPACE)
3106			  *p++ = ' ';
3107
3108			if (arg > 0.0 && arg + arg == arg)
3109			  {
3110			    if (dp->conversion >= 'A' && dp->conversion <= 'Z')
3111			      {
3112				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
3113			      }
3114			    else
3115			      {
3116				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
3117			      }
3118			  }
3119			else
3120			  {
3121#  if NEED_PRINTF_DOUBLE
3122			    pad_ptr = p;
3123
3124			    if (dp->conversion == 'f' || dp->conversion == 'F')
3125			      {
3126				char *digits;
3127				size_t ndigits;
3128
3129				digits =
3130				  scale10_round_decimal_double (arg, precision);
3131				if (digits == NULL)
3132				  goto out_of_memory;
3133				ndigits = strlen (digits);
3134
3135				if (ndigits > precision)
3136				  do
3137				    {
3138				      --ndigits;
3139				      *p++ = digits[ndigits];
3140				    }
3141				  while (ndigits > precision);
3142				else
3143				  *p++ = '0';
3144				/* Here ndigits <= precision.  */
3145				if ((flags & FLAG_ALT) || precision > 0)
3146				  {
3147				    *p++ = decimal_point_char ();
3148				    for (; precision > ndigits; precision--)
3149				      *p++ = '0';
3150				    while (ndigits > 0)
3151				      {
3152					--ndigits;
3153					*p++ = digits[ndigits];
3154				      }
3155				  }
3156
3157				free (digits);
3158			      }
3159			    else if (dp->conversion == 'e' || dp->conversion == 'E')
3160			      {
3161				int exponent;
3162
3163				if (arg == 0.0)
3164				  {
3165				    exponent = 0;
3166				    *p++ = '0';
3167				    if ((flags & FLAG_ALT) || precision > 0)
3168				      {
3169					*p++ = decimal_point_char ();
3170					for (; precision > 0; precision--)
3171					  *p++ = '0';
3172				      }
3173				  }
3174				else
3175				  {
3176				    /* arg > 0.0.  */
3177				    int adjusted;
3178				    char *digits;
3179				    size_t ndigits;
3180
3181				    exponent = floorlog10 (arg);
3182				    adjusted = 0;
3183				    for (;;)
3184				      {
3185					digits =
3186					  scale10_round_decimal_double (arg,
3187									(int)precision - exponent);
3188					if (digits == NULL)
3189					  goto out_of_memory;
3190					ndigits = strlen (digits);
3191
3192					if (ndigits == precision + 1)
3193					  break;
3194					if (ndigits < precision
3195					    || ndigits > precision + 2)
3196					  /* The exponent was not guessed
3197					     precisely enough.  */
3198					  abort ();
3199					if (adjusted)
3200					  /* None of two values of exponent is
3201					     the right one.  Prevent an endless
3202					     loop.  */
3203					  abort ();
3204					free (digits);
3205					if (ndigits == precision)
3206					  exponent -= 1;
3207					else
3208					  exponent += 1;
3209					adjusted = 1;
3210				      }
3211
3212				    /* Here ndigits = precision+1.  */
3213				    *p++ = digits[--ndigits];
3214				    if ((flags & FLAG_ALT) || precision > 0)
3215				      {
3216					*p++ = decimal_point_char ();
3217					while (ndigits > 0)
3218					  {
3219					    --ndigits;
3220					    *p++ = digits[ndigits];
3221					  }
3222				      }
3223
3224				    free (digits);
3225				  }
3226
3227				*p++ = dp->conversion; /* 'e' or 'E' */
3228#   if WIDE_CHAR_VERSION
3229				{
3230				  static const wchar_t decimal_format[] =
3231				    /* Produce the same number of exponent digits
3232				       as the native printf implementation.  */
3233#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
3234				    { '%', '+', '.', '3', 'd', '\0' };
3235#    else
3236				    { '%', '+', '.', '2', 'd', '\0' };
3237#    endif
3238				  SNPRINTF (p, 6 + 1, decimal_format, exponent);
3239				}
3240				while (*p != '\0')
3241				  p++;
3242#   else
3243				{
3244				  static const char decimal_format[] =
3245				    /* Produce the same number of exponent digits
3246				       as the native printf implementation.  */
3247#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
3248				    "%+.3d";
3249#    else
3250				    "%+.2d";
3251#    endif
3252				  if (sizeof (DCHAR_T) == 1)
3253				    {
3254				      sprintf ((char *) p, decimal_format, exponent);
3255				      while (*p != '\0')
3256					p++;
3257				    }
3258				  else
3259				    {
3260				      char expbuf[6 + 1];
3261				      const char *ep;
3262				      sprintf (expbuf, decimal_format, exponent);
3263				      for (ep = expbuf; (*p = *ep) != '\0'; ep++)
3264					p++;
3265				    }
3266				}
3267#   endif
3268			      }
3269			    else if (dp->conversion == 'g' || dp->conversion == 'G')
3270			      {
3271				if (precision == 0)
3272				  precision = 1;
3273				/* precision >= 1.  */
3274
3275				if (arg == 0.0)
3276				  /* The exponent is 0, >= -4, < precision.
3277				     Use fixed-point notation.  */
3278				  {
3279				    size_t ndigits = precision;
3280				    /* Number of trailing zeroes that have to be
3281				       dropped.  */
3282				    size_t nzeroes =
3283				      (flags & FLAG_ALT ? 0 : precision - 1);
3284
3285				    --ndigits;
3286				    *p++ = '0';
3287				    if ((flags & FLAG_ALT) || ndigits > nzeroes)
3288				      {
3289					*p++ = decimal_point_char ();
3290					while (ndigits > nzeroes)
3291					  {
3292					    --ndigits;
3293					    *p++ = '0';
3294					  }
3295				      }
3296				  }
3297				else
3298				  {
3299				    /* arg > 0.0.  */
3300				    int exponent;
3301				    int adjusted;
3302				    char *digits;
3303				    size_t ndigits;
3304				    size_t nzeroes;
3305
3306				    exponent = floorlog10 (arg);
3307				    adjusted = 0;
3308				    for (;;)
3309				      {
3310					digits =
3311					  scale10_round_decimal_double (arg,
3312									(int)(precision - 1) - exponent);
3313					if (digits == NULL)
3314					  goto out_of_memory;
3315					ndigits = strlen (digits);
3316
3317					if (ndigits == precision)
3318					  break;
3319					if (ndigits < precision - 1
3320					    || ndigits > precision + 1)
3321					  /* The exponent was not guessed
3322					     precisely enough.  */
3323					  abort ();
3324					if (adjusted)
3325					  /* None of two values of exponent is
3326					     the right one.  Prevent an endless
3327					     loop.  */
3328					  abort ();
3329					free (digits);
3330					if (ndigits < precision)
3331					  exponent -= 1;
3332					else
3333					  exponent += 1;
3334					adjusted = 1;
3335				      }
3336				    /* Here ndigits = precision.  */
3337
3338				    /* Determine the number of trailing zeroes
3339				       that have to be dropped.  */
3340				    nzeroes = 0;
3341				    if ((flags & FLAG_ALT) == 0)
3342				      while (nzeroes < ndigits
3343					     && digits[nzeroes] == '0')
3344					nzeroes++;
3345
3346				    /* The exponent is now determined.  */
3347				    if (exponent >= -4
3348					&& exponent < (long)precision)
3349				      {
3350					/* Fixed-point notation:
3351					   max(exponent,0)+1 digits, then the
3352					   decimal point, then the remaining
3353					   digits without trailing zeroes.  */
3354					if (exponent >= 0)
3355					  {
3356					    size_t count = exponent + 1;
3357					    /* Note: count <= precision = ndigits.  */
3358					    for (; count > 0; count--)
3359					      *p++ = digits[--ndigits];
3360					    if ((flags & FLAG_ALT) || ndigits > nzeroes)
3361					      {
3362						*p++ = decimal_point_char ();
3363						while (ndigits > nzeroes)
3364						  {
3365						    --ndigits;
3366						    *p++ = digits[ndigits];
3367						  }
3368					      }
3369					  }
3370					else
3371					  {
3372					    size_t count = -exponent - 1;
3373					    *p++ = '0';
3374					    *p++ = decimal_point_char ();
3375					    for (; count > 0; count--)
3376					      *p++ = '0';
3377					    while (ndigits > nzeroes)
3378					      {
3379						--ndigits;
3380						*p++ = digits[ndigits];
3381					      }
3382					  }
3383				      }
3384				    else
3385				      {
3386					/* Exponential notation.  */
3387					*p++ = digits[--ndigits];
3388					if ((flags & FLAG_ALT) || ndigits > nzeroes)
3389					  {
3390					    *p++ = decimal_point_char ();
3391					    while (ndigits > nzeroes)
3392					      {
3393						--ndigits;
3394						*p++ = digits[ndigits];
3395					      }
3396					  }
3397					*p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
3398#   if WIDE_CHAR_VERSION
3399					{
3400					  static const wchar_t decimal_format[] =
3401					    /* Produce the same number of exponent digits
3402					       as the native printf implementation.  */
3403#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
3404					    { '%', '+', '.', '3', 'd', '\0' };
3405#    else
3406					    { '%', '+', '.', '2', 'd', '\0' };
3407#    endif
3408					  SNPRINTF (p, 6 + 1, decimal_format, exponent);
3409					}
3410					while (*p != '\0')
3411					  p++;
3412#   else
3413					{
3414					  static const char decimal_format[] =
3415					    /* Produce the same number of exponent digits
3416					       as the native printf implementation.  */
3417#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
3418					    "%+.3d";
3419#    else
3420					    "%+.2d";
3421#    endif
3422					  if (sizeof (DCHAR_T) == 1)
3423					    {
3424					      sprintf ((char *) p, decimal_format, exponent);
3425					      while (*p != '\0')
3426						p++;
3427					    }
3428					  else
3429					    {
3430					      char expbuf[6 + 1];
3431					      const char *ep;
3432					      sprintf (expbuf, decimal_format, exponent);
3433					      for (ep = expbuf; (*p = *ep) != '\0'; ep++)
3434						p++;
3435					    }
3436					}
3437#   endif
3438				      }
3439
3440				    free (digits);
3441				  }
3442			      }
3443			    else
3444			      abort ();
3445#  else
3446			    /* arg is finite.  */
3447			    if (!(arg == 0.0))
3448			      abort ();
3449
3450			    pad_ptr = p;
3451
3452			    if (dp->conversion == 'f' || dp->conversion == 'F')
3453			      {
3454				*p++ = '0';
3455				if ((flags & FLAG_ALT) || precision > 0)
3456				  {
3457				    *p++ = decimal_point_char ();
3458				    for (; precision > 0; precision--)
3459				      *p++ = '0';
3460				  }
3461			      }
3462			    else if (dp->conversion == 'e' || dp->conversion == 'E')
3463			      {
3464				*p++ = '0';
3465				if ((flags & FLAG_ALT) || precision > 0)
3466				  {
3467				    *p++ = decimal_point_char ();
3468				    for (; precision > 0; precision--)
3469				      *p++ = '0';
3470				  }
3471				*p++ = dp->conversion; /* 'e' or 'E' */
3472				*p++ = '+';
3473				/* Produce the same number of exponent digits as
3474				   the native printf implementation.  */
3475#   if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
3476				*p++ = '0';
3477#   endif
3478				*p++ = '0';
3479				*p++ = '0';
3480			      }
3481			    else if (dp->conversion == 'g' || dp->conversion == 'G')
3482			      {
3483				*p++ = '0';
3484				if (flags & FLAG_ALT)
3485				  {
3486				    size_t ndigits =
3487				      (precision > 0 ? precision - 1 : 0);
3488				    *p++ = decimal_point_char ();
3489				    for (; ndigits > 0; --ndigits)
3490				      *p++ = '0';
3491				  }
3492			      }
3493			    else
3494			      abort ();
3495#  endif
3496			  }
3497		      }
3498		  }
3499# endif
3500
3501		/* The generated string now extends from tmp to p, with the
3502		   zero padding insertion point being at pad_ptr.  */
3503		if (has_width && p - tmp < width)
3504		  {
3505		    size_t pad = width - (p - tmp);
3506		    DCHAR_T *end = p + pad;
3507
3508		    if (flags & FLAG_LEFT)
3509		      {
3510			/* Pad with spaces on the right.  */
3511			for (; pad > 0; pad--)
3512			  *p++ = ' ';
3513		      }
3514		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
3515		      {
3516			/* Pad with zeroes.  */
3517			DCHAR_T *q = end;
3518
3519			while (p > pad_ptr)
3520			  *--q = *--p;
3521			for (; pad > 0; pad--)
3522			  *p++ = '0';
3523		      }
3524		    else
3525		      {
3526			/* Pad with spaces on the left.  */
3527			DCHAR_T *q = end;
3528
3529			while (p > tmp)
3530			  *--q = *--p;
3531			for (; pad > 0; pad--)
3532			  *p++ = ' ';
3533		      }
3534
3535		    p = end;
3536		  }
3537
3538		{
3539		  size_t count = p - tmp;
3540
3541		  if (count >= tmp_length)
3542		    /* tmp_length was incorrectly calculated - fix the
3543		       code above!  */
3544		    abort ();
3545
3546		  /* Make room for the result.  */
3547		  if (count >= allocated - length)
3548		    {
3549		      size_t n = xsum (length, count);
3550
3551		      ENSURE_ALLOCATION (n);
3552		    }
3553
3554		  /* Append the result.  */
3555		  memcpy (result + length, tmp, count * sizeof (DCHAR_T));
3556		  if (tmp != tmpbuf)
3557		    free (tmp);
3558		  length += count;
3559		}
3560	      }
3561#endif
3562	    else
3563	      {
3564		arg_type type = a.arg[dp->arg_index].type;
3565		int flags = dp->flags;
3566#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
3567		int has_width;
3568		size_t width;
3569#endif
3570#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
3571		int has_precision;
3572		size_t precision;
3573#endif
3574#if NEED_PRINTF_UNBOUNDED_PRECISION
3575		int prec_ourselves;
3576#else
3577#		define prec_ourselves 0
3578#endif
3579#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
3580		int pad_ourselves;
3581#else
3582#		define pad_ourselves 0
3583#endif
3584		TCHAR_T *fbp;
3585		unsigned int prefix_count;
3586		int prefixes[2];
3587#if !USE_SNPRINTF
3588		size_t tmp_length;
3589		TCHAR_T tmpbuf[700];
3590		TCHAR_T *tmp;
3591#endif
3592
3593#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
3594		has_width = 0;
3595		width = 0;
3596		if (dp->width_start != dp->width_end)
3597		  {
3598		    if (dp->width_arg_index != ARG_NONE)
3599		      {
3600			int arg;
3601
3602			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
3603			  abort ();
3604			arg = a.arg[dp->width_arg_index].a.a_int;
3605			if (arg < 0)
3606			  {
3607			    /* "A negative field width is taken as a '-' flag
3608			        followed by a positive field width."  */
3609			    flags |= FLAG_LEFT;
3610			    width = (unsigned int) (-arg);
3611			  }
3612			else
3613			  width = arg;
3614		      }
3615		    else
3616		      {
3617			const FCHAR_T *digitp = dp->width_start;
3618
3619			do
3620			  width = xsum (xtimes (width, 10), *digitp++ - '0');
3621			while (digitp != dp->width_end);
3622		      }
3623		    has_width = 1;
3624		  }
3625#endif
3626
3627#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
3628		has_precision = 0;
3629		precision = 6;
3630		if (dp->precision_start != dp->precision_end)
3631		  {
3632		    if (dp->precision_arg_index != ARG_NONE)
3633		      {
3634			int arg;
3635
3636			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
3637			  abort ();
3638			arg = a.arg[dp->precision_arg_index].a.a_int;
3639			/* "A negative precision is taken as if the precision
3640			    were omitted."  */
3641			if (arg >= 0)
3642			  {
3643			    precision = arg;
3644			    has_precision = 1;
3645			  }
3646		      }
3647		    else
3648		      {
3649			const FCHAR_T *digitp = dp->precision_start + 1;
3650
3651			precision = 0;
3652			while (digitp != dp->precision_end)
3653			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
3654			has_precision = 1;
3655		      }
3656		  }
3657#endif
3658
3659#if !USE_SNPRINTF
3660		/* Allocate a temporary buffer of sufficient size for calling
3661		   sprintf.  */
3662		{
3663		  switch (dp->conversion)
3664		    {
3665
3666		    case 'd': case 'i': case 'u':
3667# if HAVE_LONG_LONG_INT
3668		      if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
3669			tmp_length =
3670			  (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
3671					  * 0.30103 /* binary -> decimal */
3672					 )
3673			  + 1; /* turn floor into ceil */
3674		      else
3675# endif
3676		      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
3677			tmp_length =
3678			  (unsigned int) (sizeof (unsigned long) * CHAR_BIT
3679					  * 0.30103 /* binary -> decimal */
3680					 )
3681			  + 1; /* turn floor into ceil */
3682		      else
3683			tmp_length =
3684			  (unsigned int) (sizeof (unsigned int) * CHAR_BIT
3685					  * 0.30103 /* binary -> decimal */
3686					 )
3687			  + 1; /* turn floor into ceil */
3688		      if (tmp_length < precision)
3689			tmp_length = precision;
3690		      /* Multiply by 2, as an estimate for FLAG_GROUP.  */
3691		      tmp_length = xsum (tmp_length, tmp_length);
3692		      /* Add 1, to account for a leading sign.  */
3693		      tmp_length = xsum (tmp_length, 1);
3694		      break;
3695
3696		    case 'o':
3697# if HAVE_LONG_LONG_INT
3698		      if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
3699			tmp_length =
3700			  (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
3701					  * 0.333334 /* binary -> octal */
3702					 )
3703			  + 1; /* turn floor into ceil */
3704		      else
3705# endif
3706		      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
3707			tmp_length =
3708			  (unsigned int) (sizeof (unsigned long) * CHAR_BIT
3709					  * 0.333334 /* binary -> octal */
3710					 )
3711			  + 1; /* turn floor into ceil */
3712		      else
3713			tmp_length =
3714			  (unsigned int) (sizeof (unsigned int) * CHAR_BIT
3715					  * 0.333334 /* binary -> octal */
3716					 )
3717			  + 1; /* turn floor into ceil */
3718		      if (tmp_length < precision)
3719			tmp_length = precision;
3720		      /* Add 1, to account for a leading sign.  */
3721		      tmp_length = xsum (tmp_length, 1);
3722		      break;
3723
3724		    case 'x': case 'X':
3725# if HAVE_LONG_LONG_INT
3726		      if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
3727			tmp_length =
3728			  (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
3729					  * 0.25 /* binary -> hexadecimal */
3730					 )
3731			  + 1; /* turn floor into ceil */
3732		      else
3733# endif
3734		      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
3735			tmp_length =
3736			  (unsigned int) (sizeof (unsigned long) * CHAR_BIT
3737					  * 0.25 /* binary -> hexadecimal */
3738					 )
3739			  + 1; /* turn floor into ceil */
3740		      else
3741			tmp_length =
3742			  (unsigned int) (sizeof (unsigned int) * CHAR_BIT
3743					  * 0.25 /* binary -> hexadecimal */
3744					 )
3745			  + 1; /* turn floor into ceil */
3746		      if (tmp_length < precision)
3747			tmp_length = precision;
3748		      /* Add 2, to account for a leading sign or alternate form.  */
3749		      tmp_length = xsum (tmp_length, 2);
3750		      break;
3751
3752		    case 'f': case 'F':
3753		      if (type == TYPE_LONGDOUBLE)
3754			tmp_length =
3755			  (unsigned int) (LDBL_MAX_EXP
3756					  * 0.30103 /* binary -> decimal */
3757					  * 2 /* estimate for FLAG_GROUP */
3758					 )
3759			  + 1 /* turn floor into ceil */
3760			  + 10; /* sign, decimal point etc. */
3761		      else
3762			tmp_length =
3763			  (unsigned int) (DBL_MAX_EXP
3764					  * 0.30103 /* binary -> decimal */
3765					  * 2 /* estimate for FLAG_GROUP */
3766					 )
3767			  + 1 /* turn floor into ceil */
3768			  + 10; /* sign, decimal point etc. */
3769		      tmp_length = xsum (tmp_length, precision);
3770		      break;
3771
3772		    case 'e': case 'E': case 'g': case 'G':
3773		      tmp_length =
3774			12; /* sign, decimal point, exponent etc. */
3775		      tmp_length = xsum (tmp_length, precision);
3776		      break;
3777
3778		    case 'a': case 'A':
3779		      if (type == TYPE_LONGDOUBLE)
3780			tmp_length =
3781			  (unsigned int) (LDBL_DIG
3782					  * 0.831 /* decimal -> hexadecimal */
3783					 )
3784			  + 1; /* turn floor into ceil */
3785		      else
3786			tmp_length =
3787			  (unsigned int) (DBL_DIG
3788					  * 0.831 /* decimal -> hexadecimal */
3789					 )
3790			  + 1; /* turn floor into ceil */
3791		      if (tmp_length < precision)
3792			tmp_length = precision;
3793		      /* Account for sign, decimal point etc. */
3794		      tmp_length = xsum (tmp_length, 12);
3795		      break;
3796
3797		    case 'c':
3798# if HAVE_WINT_T && !WIDE_CHAR_VERSION
3799		      if (type == TYPE_WIDE_CHAR)
3800			tmp_length = MB_CUR_MAX;
3801		      else
3802# endif
3803			tmp_length = 1;
3804		      break;
3805
3806		    case 's':
3807# if HAVE_WCHAR_T
3808		      if (type == TYPE_WIDE_STRING)
3809			{
3810			  tmp_length =
3811			    local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
3812
3813#  if !WIDE_CHAR_VERSION
3814			  tmp_length = xtimes (tmp_length, MB_CUR_MAX);
3815#  endif
3816			}
3817		      else
3818# endif
3819			tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
3820		      break;
3821
3822		    case 'p':
3823		      tmp_length =
3824			(unsigned int) (sizeof (void *) * CHAR_BIT
3825					* 0.25 /* binary -> hexadecimal */
3826				       )
3827			  + 1 /* turn floor into ceil */
3828			  + 2; /* account for leading 0x */
3829		      break;
3830
3831		    default:
3832		      abort ();
3833		    }
3834
3835# if ENABLE_UNISTDIO
3836		  /* Padding considers the number of characters, therefore the
3837		     number of elements after padding may be
3838		       > max (tmp_length, width)
3839		     but is certainly
3840		       <= tmp_length + width.  */
3841		  tmp_length = xsum (tmp_length, width);
3842# else
3843		  /* Padding considers the number of elements, says POSIX.  */
3844		  if (tmp_length < width)
3845		    tmp_length = width;
3846# endif
3847
3848		  tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
3849		}
3850
3851		if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
3852		  tmp = tmpbuf;
3853		else
3854		  {
3855		    size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
3856
3857		    if (size_overflow_p (tmp_memsize))
3858		      /* Overflow, would lead to out of memory.  */
3859		      goto out_of_memory;
3860		    tmp = (TCHAR_T *) malloc (tmp_memsize);
3861		    if (tmp == NULL)
3862		      /* Out of memory.  */
3863		      goto out_of_memory;
3864		  }
3865#endif
3866
3867		/* Decide whether to handle the precision ourselves.  */
3868#if NEED_PRINTF_UNBOUNDED_PRECISION
3869		switch (dp->conversion)
3870		  {
3871		  case 'd': case 'i': case 'u':
3872		  case 'o':
3873		  case 'x': case 'X': case 'p':
3874		    prec_ourselves = has_precision && (precision > 0);
3875		    break;
3876		  default:
3877		    prec_ourselves = 0;
3878		    break;
3879		  }
3880#endif
3881
3882		/* Decide whether to perform the padding ourselves.  */
3883#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
3884		switch (dp->conversion)
3885		  {
3886# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
3887		  /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
3888		     to perform the padding after this conversion.  Functions
3889		     with unistdio extensions perform the padding based on
3890		     character count rather than element count.  */
3891		  case 'c': case 's':
3892# endif
3893# if NEED_PRINTF_FLAG_ZERO
3894		  case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
3895		  case 'a': case 'A':
3896# endif
3897		    pad_ourselves = 1;
3898		    break;
3899		  default:
3900		    pad_ourselves = prec_ourselves;
3901		    break;
3902		  }
3903#endif
3904
3905		/* Construct the format string for calling snprintf or
3906		   sprintf.  */
3907		fbp = buf;
3908		*fbp++ = '%';
3909#if NEED_PRINTF_FLAG_GROUPING
3910		/* The underlying implementation doesn't support the ' flag.
3911		   Produce no grouping characters in this case; this is
3912		   acceptable because the grouping is locale dependent.  */
3913#else
3914		if (flags & FLAG_GROUP)
3915		  *fbp++ = '\'';
3916#endif
3917		if (flags & FLAG_LEFT)
3918		  *fbp++ = '-';
3919		if (flags & FLAG_SHOWSIGN)
3920		  *fbp++ = '+';
3921		if (flags & FLAG_SPACE)
3922		  *fbp++ = ' ';
3923		if (flags & FLAG_ALT)
3924		  *fbp++ = '#';
3925		if (!pad_ourselves)
3926		  {
3927		    if (flags & FLAG_ZERO)
3928		      *fbp++ = '0';
3929		    if (dp->width_start != dp->width_end)
3930		      {
3931			size_t n = dp->width_end - dp->width_start;
3932			/* The width specification is known to consist only
3933			   of standard ASCII characters.  */
3934			if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
3935			  {
3936			    memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
3937			    fbp += n;
3938			  }
3939			else
3940			  {
3941			    const FCHAR_T *mp = dp->width_start;
3942			    do
3943			      *fbp++ = (unsigned char) *mp++;
3944			    while (--n > 0);
3945			  }
3946		      }
3947		  }
3948		if (!prec_ourselves)
3949		  {
3950		    if (dp->precision_start != dp->precision_end)
3951		      {
3952			size_t n = dp->precision_end - dp->precision_start;
3953			/* The precision specification is known to consist only
3954			   of standard ASCII characters.  */
3955			if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
3956			  {
3957			    memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
3958			    fbp += n;
3959			  }
3960			else
3961			  {
3962			    const FCHAR_T *mp = dp->precision_start;
3963			    do
3964			      *fbp++ = (unsigned char) *mp++;
3965			    while (--n > 0);
3966			  }
3967		      }
3968		  }
3969
3970		switch (type)
3971		  {
3972#if HAVE_LONG_LONG_INT
3973		  case TYPE_LONGLONGINT:
3974		  case TYPE_ULONGLONGINT:
3975# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
3976		    *fbp++ = 'I';
3977		    *fbp++ = '6';
3978		    *fbp++ = '4';
3979		    break;
3980# else
3981		    *fbp++ = 'l';
3982		    /*FALLTHROUGH*/
3983# endif
3984#endif
3985		  case TYPE_LONGINT:
3986		  case TYPE_ULONGINT:
3987#if HAVE_WINT_T
3988		  case TYPE_WIDE_CHAR:
3989#endif
3990#if HAVE_WCHAR_T
3991		  case TYPE_WIDE_STRING:
3992#endif
3993		    *fbp++ = 'l';
3994		    break;
3995		  case TYPE_LONGDOUBLE:
3996		    *fbp++ = 'L';
3997		    break;
3998		  default:
3999		    break;
4000		  }
4001#if NEED_PRINTF_DIRECTIVE_F
4002		if (dp->conversion == 'F')
4003		  *fbp = 'f';
4004		else
4005#endif
4006		  *fbp = dp->conversion;
4007#if USE_SNPRINTF
4008# if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3))
4009		fbp[1] = '%';
4010		fbp[2] = 'n';
4011		fbp[3] = '\0';
4012# else
4013		/* On glibc2 systems from glibc >= 2.3 - probably also older
4014		   ones - we know that snprintf's returns value conforms to
4015		   ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes.
4016		   Therefore we can avoid using %n in this situation.
4017		   On glibc2 systems from 2004-10-18 or newer, the use of %n
4018		   in format strings in writable memory may crash the program
4019		   (if compiled with _FORTIFY_SOURCE=2), so we should avoid it
4020		   in this situation.  */
4021		fbp[1] = '\0';
4022# endif
4023#else
4024		fbp[1] = '\0';
4025#endif
4026
4027		/* Construct the arguments for calling snprintf or sprintf.  */
4028		prefix_count = 0;
4029		if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
4030		  {
4031		    if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
4032		      abort ();
4033		    prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
4034		  }
4035		if (dp->precision_arg_index != ARG_NONE)
4036		  {
4037		    if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
4038		      abort ();
4039		    prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
4040		  }
4041
4042#if USE_SNPRINTF
4043		/* The SNPRINTF result is appended after result[0..length].
4044		   The latter is an array of DCHAR_T; SNPRINTF appends an
4045		   array of TCHAR_T to it.  This is possible because
4046		   sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
4047		   alignof (TCHAR_T) <= alignof (DCHAR_T).  */
4048# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
4049		/* Prepare checking whether snprintf returns the count
4050		   via %n.  */
4051		ENSURE_ALLOCATION (xsum (length, 1));
4052		*(TCHAR_T *) (result + length) = '\0';
4053#endif
4054
4055		for (;;)
4056		  {
4057		    int count = -1;
4058
4059#if USE_SNPRINTF
4060		    int retcount = 0;
4061		    size_t maxlen = allocated - length;
4062		    /* SNPRINTF can fail if its second argument is
4063		       > INT_MAX.  */
4064		    if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
4065		      maxlen = INT_MAX / TCHARS_PER_DCHAR;
4066		    maxlen = maxlen * TCHARS_PER_DCHAR;
4067# define SNPRINTF_BUF(arg) \
4068		    switch (prefix_count)				    \
4069		      {							    \
4070		      case 0:						    \
4071			retcount = SNPRINTF ((TCHAR_T *) (result + length), \
4072					     maxlen, buf,		    \
4073					     arg, &count);		    \
4074			break;						    \
4075		      case 1:						    \
4076			retcount = SNPRINTF ((TCHAR_T *) (result + length), \
4077					     maxlen, buf,		    \
4078					     prefixes[0], arg, &count);	    \
4079			break;						    \
4080		      case 2:						    \
4081			retcount = SNPRINTF ((TCHAR_T *) (result + length), \
4082					     maxlen, buf,		    \
4083					     prefixes[0], prefixes[1], arg, \
4084					     &count);			    \
4085			break;						    \
4086		      default:						    \
4087			abort ();					    \
4088		      }
4089#else
4090# define SNPRINTF_BUF(arg) \
4091		    switch (prefix_count)				    \
4092		      {							    \
4093		      case 0:						    \
4094			count = sprintf (tmp, buf, arg);		    \
4095			break;						    \
4096		      case 1:						    \
4097			count = sprintf (tmp, buf, prefixes[0], arg);	    \
4098			break;						    \
4099		      case 2:						    \
4100			count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
4101					 arg);				    \
4102			break;						    \
4103		      default:						    \
4104			abort ();					    \
4105		      }
4106#endif
4107
4108		    switch (type)
4109		      {
4110		      case TYPE_SCHAR:
4111			{
4112			  int arg = a.arg[dp->arg_index].a.a_schar;
4113			  SNPRINTF_BUF (arg);
4114			}
4115			break;
4116		      case TYPE_UCHAR:
4117			{
4118			  unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
4119			  SNPRINTF_BUF (arg);
4120			}
4121			break;
4122		      case TYPE_SHORT:
4123			{
4124			  int arg = a.arg[dp->arg_index].a.a_short;
4125			  SNPRINTF_BUF (arg);
4126			}
4127			break;
4128		      case TYPE_USHORT:
4129			{
4130			  unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
4131			  SNPRINTF_BUF (arg);
4132			}
4133			break;
4134		      case TYPE_INT:
4135			{
4136			  int arg = a.arg[dp->arg_index].a.a_int;
4137			  SNPRINTF_BUF (arg);
4138			}
4139			break;
4140		      case TYPE_UINT:
4141			{
4142			  unsigned int arg = a.arg[dp->arg_index].a.a_uint;
4143			  SNPRINTF_BUF (arg);
4144			}
4145			break;
4146		      case TYPE_LONGINT:
4147			{
4148			  long int arg = a.arg[dp->arg_index].a.a_longint;
4149			  SNPRINTF_BUF (arg);
4150			}
4151			break;
4152		      case TYPE_ULONGINT:
4153			{
4154			  unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
4155			  SNPRINTF_BUF (arg);
4156			}
4157			break;
4158#if HAVE_LONG_LONG_INT
4159		      case TYPE_LONGLONGINT:
4160			{
4161			  long long int arg = a.arg[dp->arg_index].a.a_longlongint;
4162			  SNPRINTF_BUF (arg);
4163			}
4164			break;
4165		      case TYPE_ULONGLONGINT:
4166			{
4167			  unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
4168			  SNPRINTF_BUF (arg);
4169			}
4170			break;
4171#endif
4172		      case TYPE_DOUBLE:
4173			{
4174			  double arg = a.arg[dp->arg_index].a.a_double;
4175			  SNPRINTF_BUF (arg);
4176			}
4177			break;
4178		      case TYPE_LONGDOUBLE:
4179			{
4180			  long double arg = a.arg[dp->arg_index].a.a_longdouble;
4181			  SNPRINTF_BUF (arg);
4182			}
4183			break;
4184		      case TYPE_CHAR:
4185			{
4186			  int arg = a.arg[dp->arg_index].a.a_char;
4187			  SNPRINTF_BUF (arg);
4188			}
4189			break;
4190#if HAVE_WINT_T
4191		      case TYPE_WIDE_CHAR:
4192			{
4193			  wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
4194			  SNPRINTF_BUF (arg);
4195			}
4196			break;
4197#endif
4198		      case TYPE_STRING:
4199			{
4200			  const char *arg = a.arg[dp->arg_index].a.a_string;
4201			  SNPRINTF_BUF (arg);
4202			}
4203			break;
4204#if HAVE_WCHAR_T
4205		      case TYPE_WIDE_STRING:
4206			{
4207			  const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
4208			  SNPRINTF_BUF (arg);
4209			}
4210			break;
4211#endif
4212		      case TYPE_POINTER:
4213			{
4214			  void *arg = a.arg[dp->arg_index].a.a_pointer;
4215			  SNPRINTF_BUF (arg);
4216			}
4217			break;
4218		      default:
4219			abort ();
4220		      }
4221
4222#if USE_SNPRINTF
4223		    /* Portability: Not all implementations of snprintf()
4224		       are ISO C 99 compliant.  Determine the number of
4225		       bytes that snprintf() has produced or would have
4226		       produced.  */
4227		    if (count >= 0)
4228		      {
4229			/* Verify that snprintf() has NUL-terminated its
4230			   result.  */
4231			if (count < maxlen
4232			    && ((TCHAR_T *) (result + length)) [count] != '\0')
4233			  abort ();
4234			/* Portability hack.  */
4235			if (retcount > count)
4236			  count = retcount;
4237		      }
4238		    else
4239		      {
4240			/* snprintf() doesn't understand the '%n'
4241			   directive.  */
4242			if (fbp[1] != '\0')
4243			  {
4244			    /* Don't use the '%n' directive; instead, look
4245			       at the snprintf() return value.  */
4246			    fbp[1] = '\0';
4247			    continue;
4248			  }
4249			else
4250			  {
4251			    /* Look at the snprintf() return value.  */
4252			    if (retcount < 0)
4253			      {
4254				/* HP-UX 10.20 snprintf() is doubly deficient:
4255				   It doesn't understand the '%n' directive,
4256				   *and* it returns -1 (rather than the length
4257				   that would have been required) when the
4258				   buffer is too small.  */
4259				size_t bigger_need =
4260				  xsum (xtimes (allocated, 2), 12);
4261				ENSURE_ALLOCATION (bigger_need);
4262				continue;
4263			      }
4264			    else
4265			      count = retcount;
4266			  }
4267		      }
4268#endif
4269
4270		    /* Attempt to handle failure.  */
4271		    if (count < 0)
4272		      {
4273			if (!(result == resultbuf || result == NULL))
4274			  free (result);
4275			if (buf_malloced != NULL)
4276			  free (buf_malloced);
4277			CLEANUP ();
4278			errno = EINVAL;
4279			return NULL;
4280		      }
4281
4282#if USE_SNPRINTF
4283		    /* Handle overflow of the allocated buffer.
4284		       If such an overflow occurs, a C99 compliant snprintf()
4285		       returns a count >= maxlen.  However, a non-compliant
4286		       snprintf() function returns only count = maxlen - 1.  To
4287		       cover both cases, test whether count >= maxlen - 1.  */
4288		    if ((unsigned int) count + 1 >= maxlen)
4289		      {
4290			/* If maxlen already has attained its allowed maximum,
4291			   allocating more memory will not increase maxlen.
4292			   Instead of looping, bail out.  */
4293			if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
4294			  goto overflow;
4295			else
4296			  {
4297			    /* Need at least count * sizeof (TCHAR_T) bytes.
4298			       But allocate proportionally, to avoid looping
4299			       eternally if snprintf() reports a too small
4300			       count.  */
4301			    size_t n =
4302			      xmax (xsum (length,
4303					  (count + TCHARS_PER_DCHAR - 1)
4304					  / TCHARS_PER_DCHAR),
4305				    xtimes (allocated, 2));
4306
4307			    ENSURE_ALLOCATION (n);
4308			    continue;
4309			  }
4310		      }
4311#endif
4312
4313#if NEED_PRINTF_UNBOUNDED_PRECISION
4314		    if (prec_ourselves)
4315		      {
4316			/* Handle the precision.  */
4317			TCHAR_T *prec_ptr =
4318# if USE_SNPRINTF
4319			  (TCHAR_T *) (result + length);
4320# else
4321			  tmp;
4322# endif
4323			size_t prefix_count;
4324			size_t move;
4325
4326			prefix_count = 0;
4327			/* Put the additional zeroes after the sign.  */
4328			if (count >= 1
4329			    && (*prec_ptr == '-' || *prec_ptr == '+'
4330				|| *prec_ptr == ' '))
4331			  prefix_count = 1;
4332			/* Put the additional zeroes after the 0x prefix if
4333			   (flags & FLAG_ALT) || (dp->conversion == 'p').  */
4334			else if (count >= 2
4335				 && prec_ptr[0] == '0'
4336				 && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
4337			  prefix_count = 2;
4338
4339			move = count - prefix_count;
4340			if (precision > move)
4341			  {
4342			    /* Insert zeroes.  */
4343			    size_t insert = precision - move;
4344			    TCHAR_T *prec_end;
4345
4346# if USE_SNPRINTF
4347			    size_t n =
4348			      xsum (length,
4349				    (count + insert + TCHARS_PER_DCHAR - 1)
4350				    / TCHARS_PER_DCHAR);
4351			    length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
4352			    ENSURE_ALLOCATION (n);
4353			    length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
4354			    prec_ptr = (TCHAR_T *) (result + length);
4355# endif
4356
4357			    prec_end = prec_ptr + count;
4358			    prec_ptr += prefix_count;
4359
4360			    while (prec_end > prec_ptr)
4361			      {
4362				prec_end--;
4363				prec_end[insert] = prec_end[0];
4364			      }
4365
4366			    prec_end += insert;
4367			    do
4368			      *--prec_end = '0';
4369			    while (prec_end > prec_ptr);
4370
4371			    count += insert;
4372			  }
4373		      }
4374#endif
4375
4376#if !DCHAR_IS_TCHAR
4377# if !USE_SNPRINTF
4378		    if (count >= tmp_length)
4379		      /* tmp_length was incorrectly calculated - fix the
4380			 code above!  */
4381		      abort ();
4382# endif
4383
4384		    /* Convert from TCHAR_T[] to DCHAR_T[].  */
4385		    if (dp->conversion == 'c' || dp->conversion == 's')
4386		      {
4387			/* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
4388			   TYPE_WIDE_STRING.
4389			   The result string is not certainly ASCII.  */
4390			const TCHAR_T *tmpsrc;
4391			DCHAR_T *tmpdst;
4392			size_t tmpdst_len;
4393			/* This code assumes that TCHAR_T is 'char'.  */
4394			typedef int TCHAR_T_verify
4395				    [2 * (sizeof (TCHAR_T) == 1) - 1];
4396# if USE_SNPRINTF
4397			tmpsrc = (TCHAR_T *) (result + length);
4398# else
4399			tmpsrc = tmp;
4400# endif
4401			tmpdst = NULL;
4402			tmpdst_len = 0;
4403			if (DCHAR_CONV_FROM_ENCODING (locale_charset (),
4404						      iconveh_question_mark,
4405						      tmpsrc, count,
4406						      NULL,
4407						      &tmpdst, &tmpdst_len)
4408			    < 0)
4409			  {
4410			    int saved_errno = errno;
4411			    if (!(result == resultbuf || result == NULL))
4412			      free (result);
4413			    if (buf_malloced != NULL)
4414			      free (buf_malloced);
4415			    CLEANUP ();
4416			    errno = saved_errno;
4417			    return NULL;
4418			  }
4419			ENSURE_ALLOCATION (xsum (length, tmpdst_len));
4420			DCHAR_CPY (result + length, tmpdst, tmpdst_len);
4421			free (tmpdst);
4422			count = tmpdst_len;
4423		      }
4424		    else
4425		      {
4426			/* The result string is ASCII.
4427			   Simple 1:1 conversion.  */
4428# if USE_SNPRINTF
4429			/* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
4430			   no-op conversion, in-place on the array starting
4431			   at (result + length).  */
4432			if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
4433# endif
4434			  {
4435			    const TCHAR_T *tmpsrc;
4436			    DCHAR_T *tmpdst;
4437			    size_t n;
4438
4439# if USE_SNPRINTF
4440			    if (result == resultbuf)
4441			      {
4442				tmpsrc = (TCHAR_T *) (result + length);
4443				/* ENSURE_ALLOCATION will not move tmpsrc
4444				   (because it's part of resultbuf).  */
4445				ENSURE_ALLOCATION (xsum (length, count));
4446			      }
4447			    else
4448			      {
4449				/* ENSURE_ALLOCATION will move the array
4450				   (because it uses realloc().  */
4451				ENSURE_ALLOCATION (xsum (length, count));
4452				tmpsrc = (TCHAR_T *) (result + length);
4453			      }
4454# else
4455			    tmpsrc = tmp;
4456			    ENSURE_ALLOCATION (xsum (length, count));
4457# endif
4458			    tmpdst = result + length;
4459			    /* Copy backwards, because of overlapping.  */
4460			    tmpsrc += count;
4461			    tmpdst += count;
4462			    for (n = count; n > 0; n--)
4463			      *--tmpdst = (unsigned char) *--tmpsrc;
4464			  }
4465		      }
4466#endif
4467
4468#if DCHAR_IS_TCHAR && !USE_SNPRINTF
4469		    /* Make room for the result.  */
4470		    if (count > allocated - length)
4471		      {
4472			/* Need at least count elements.  But allocate
4473			   proportionally.  */
4474			size_t n =
4475			  xmax (xsum (length, count), xtimes (allocated, 2));
4476
4477			ENSURE_ALLOCATION (n);
4478		      }
4479#endif
4480
4481		    /* Here count <= allocated - length.  */
4482
4483		    /* Perform padding.  */
4484#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
4485		    if (pad_ourselves && has_width)
4486		      {
4487			size_t w;
4488# if ENABLE_UNISTDIO
4489			/* Outside POSIX, it's preferrable to compare the width
4490			   against the number of _characters_ of the converted
4491			   value.  */
4492			w = DCHAR_MBSNLEN (result + length, count);
4493# else
4494			/* The width is compared against the number of _bytes_
4495			   of the converted value, says POSIX.  */
4496			w = count;
4497# endif
4498			if (w < width)
4499			  {
4500			    size_t pad = width - w;
4501# if USE_SNPRINTF
4502			    /* Make room for the result.  */
4503			    if (xsum (count, pad) > allocated - length)
4504			      {
4505				/* Need at least count + pad elements.  But
4506				   allocate proportionally.  */
4507				size_t n =
4508				  xmax (xsum3 (length, count, pad),
4509					xtimes (allocated, 2));
4510
4511				length += count;
4512				ENSURE_ALLOCATION (n);
4513				length -= count;
4514			      }
4515			    /* Here count + pad <= allocated - length.  */
4516# endif
4517			    {
4518# if !DCHAR_IS_TCHAR || USE_SNPRINTF
4519			      DCHAR_T * const rp = result + length;
4520# else
4521			      DCHAR_T * const rp = tmp;
4522# endif
4523			      DCHAR_T *p = rp + count;
4524			      DCHAR_T *end = p + pad;
4525# if NEED_PRINTF_FLAG_ZERO
4526			      DCHAR_T *pad_ptr;
4527#  if !DCHAR_IS_TCHAR
4528			      if (dp->conversion == 'c'
4529				  || dp->conversion == 's')
4530				/* No zero-padding for string directives.  */
4531				pad_ptr = NULL;
4532			      else
4533#  endif
4534				{
4535				  pad_ptr = (*rp == '-' ? rp + 1 : rp);
4536				  /* No zero-padding of "inf" and "nan".  */
4537				  if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
4538				      || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
4539				    pad_ptr = NULL;
4540				}
4541# endif
4542			      /* The generated string now extends from rp to p,
4543				 with the zero padding insertion point being at
4544				 pad_ptr.  */
4545
4546			      count = count + pad; /* = end - rp */
4547
4548			      if (flags & FLAG_LEFT)
4549				{
4550				  /* Pad with spaces on the right.  */
4551				  for (; pad > 0; pad--)
4552				    *p++ = ' ';
4553				}
4554# if NEED_PRINTF_FLAG_ZERO
4555			      else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
4556				{
4557				  /* Pad with zeroes.  */
4558				  DCHAR_T *q = end;
4559
4560				  while (p > pad_ptr)
4561				    *--q = *--p;
4562				  for (; pad > 0; pad--)
4563				    *p++ = '0';
4564				}
4565# endif
4566			      else
4567				{
4568				  /* Pad with spaces on the left.  */
4569				  DCHAR_T *q = end;
4570
4571				  while (p > rp)
4572				    *--q = *--p;
4573				  for (; pad > 0; pad--)
4574				    *p++ = ' ';
4575				}
4576			    }
4577			  }
4578		      }
4579#endif
4580
4581#if DCHAR_IS_TCHAR && !USE_SNPRINTF
4582		    if (count >= tmp_length)
4583		      /* tmp_length was incorrectly calculated - fix the
4584			 code above!  */
4585		      abort ();
4586#endif
4587
4588		    /* Here still count <= allocated - length.  */
4589
4590#if !DCHAR_IS_TCHAR || USE_SNPRINTF
4591		    /* The snprintf() result did fit.  */
4592#else
4593		    /* Append the sprintf() result.  */
4594		    memcpy (result + length, tmp, count * sizeof (DCHAR_T));
4595#endif
4596#if !USE_SNPRINTF
4597		    if (tmp != tmpbuf)
4598		      free (tmp);
4599#endif
4600
4601#if NEED_PRINTF_DIRECTIVE_F
4602		    if (dp->conversion == 'F')
4603		      {
4604			/* Convert the %f result to upper case for %F.  */
4605			DCHAR_T *rp = result + length;
4606			size_t rc;
4607			for (rc = count; rc > 0; rc--, rp++)
4608			  if (*rp >= 'a' && *rp <= 'z')
4609			    *rp = *rp - 'a' + 'A';
4610		      }
4611#endif
4612
4613		    length += count;
4614		    break;
4615		  }
4616	      }
4617	  }
4618      }
4619
4620    /* Add the final NUL.  */
4621    ENSURE_ALLOCATION (xsum (length, 1));
4622    result[length] = '\0';
4623
4624    if (result != resultbuf && length + 1 < allocated)
4625      {
4626	/* Shrink the allocated memory if possible.  */
4627	DCHAR_T *memory;
4628
4629	memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
4630	if (memory != NULL)
4631	  result = memory;
4632      }
4633
4634    if (buf_malloced != NULL)
4635      free (buf_malloced);
4636    CLEANUP ();
4637    *lengthp = length;
4638    /* Note that we can produce a big string of a length > INT_MAX.  POSIX
4639       says that snprintf() fails with errno = EOVERFLOW in this case, but
4640       that's only because snprintf() returns an 'int'.  This function does
4641       not have this limitation.  */
4642    return result;
4643
4644  overflow:
4645    if (!(result == resultbuf || result == NULL))
4646      free (result);
4647    if (buf_malloced != NULL)
4648      free (buf_malloced);
4649    CLEANUP ();
4650    errno = EOVERFLOW;
4651    return NULL;
4652
4653  out_of_memory:
4654    if (!(result == resultbuf || result == NULL))
4655      free (result);
4656    if (buf_malloced != NULL)
4657      free (buf_malloced);
4658  out_of_memory_1:
4659    CLEANUP ();
4660    errno = ENOMEM;
4661    return NULL;
4662  }
4663}
4664
4665#undef TCHARS_PER_DCHAR
4666#undef SNPRINTF
4667#undef USE_SNPRINTF
4668#undef DCHAR_CPY
4669#undef PRINTF_PARSE
4670#undef DIRECTIVES
4671#undef DIRECTIVE
4672#undef DCHAR_IS_TCHAR
4673#undef TCHAR_T
4674#undef DCHAR_T
4675#undef FCHAR_T
4676#undef VASNPRINTF
4677