Merge branch 'vendor/MDOCML'
[dragonfly.git] / contrib / mpfr / src / vasprintf.c
1 /* mpfr_vasprintf -- main function for the printf functions family
2    plus helper macros & functions.
3
4 Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
5 Contributed by the AriC and Caramel projects, INRIA.
6
7 This file is part of the GNU MPFR Library.
8
9 The GNU MPFR Library is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or (at your
12 option) any later version.
13
14 The GNU MPFR Library is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
17 License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
21 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
22 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 /* The mpfr_printf-like functions are defined only if <stdarg.h> exists */
29 #ifdef HAVE_STDARG
30
31 #include <stdarg.h>
32
33 #ifndef HAVE_VA_COPY
34 # ifdef HAVE___VA_COPY
35 #  define va_copy(dst,src) __va_copy(dst, src)
36 # else
37 /* autoconf manual advocates this fallback.
38    This is also the solution chosen by gmp */
39 #  define va_copy(dst,src) \
40   do { memcpy(&(dst), &(src), sizeof(va_list)); } while (0)
41 # endif /* HAVE___VA_COPY */
42 #endif /* HAVE_VA_COPY */
43
44 #ifdef HAVE_WCHAR_H
45 #include <wchar.h>
46 #endif
47
48 #if defined (__cplusplus)
49 #include <cstddef>
50 #define __STDC_LIMIT_MACROS   /* SIZE_MAX defined with <stdint.h> inclusion */
51 #else
52 #include <stddef.h>             /* for ptrdiff_t */
53 #endif
54
55 #define MPFR_NEED_LONGLONG_H
56 #include "mpfr-intmax.h"
57 #include "mpfr-impl.h"
58
59 /* Define a length modifier corresponding to mpfr_prec_t.
60    We use literal string instead of literal character so as to permit future
61    extension to long long int ("ll"). */
62 #if   _MPFR_PREC_FORMAT == 1
63 #define MPFR_PREC_FORMAT_TYPE "h"
64 #define MPFR_PREC_FORMAT_SIZE 1
65 #elif _MPFR_PREC_FORMAT == 2
66 #define MPFR_PREC_FORMAT_TYPE ""
67 #define MPFR_PREC_FORMAT_SIZE 0
68 #elif _MPFR_PREC_FORMAT == 3
69 #define MPFR_PREC_FORMAT_TYPE "l"
70 #define MPFR_PREC_FORMAT_SIZE 1
71 #else
72 #error "mpfr_prec_t size not supported"
73 #endif
74
75 /* Output for special values defined in the C99 standard */
76 #define MPFR_NAN_STRING_LC "nan"
77 #define MPFR_NAN_STRING_UC "NAN"
78 #define MPFR_NAN_STRING_LENGTH 3
79 #define MPFR_INF_STRING_LC "inf"
80 #define MPFR_INF_STRING_UC "INF"
81 #define MPFR_INF_STRING_LENGTH 3
82
83 /* The implicit \0 is useless, but we do not write num_to_text[16]
84    otherwise g++ complains. */
85 static const char num_to_text[] = "0123456789abcdef";
86
87 /* some macro and functions for parsing format string */
88
89 /* Read an integer; saturate to INT_MAX. */
90 #define READ_INT(ap, format, specinfo, field, label_out)                \
91   do {                                                                  \
92     while (*(format))                                                   \
93       {                                                                 \
94         int _i;                                                         \
95         switch (*(format))                                              \
96           {                                                             \
97           case '0':                                                     \
98           case '1':                                                     \
99           case '2':                                                     \
100           case '3':                                                     \
101           case '4':                                                     \
102           case '5':                                                     \
103           case '6':                                                     \
104           case '7':                                                     \
105           case '8':                                                     \
106           case '9':                                                     \
107             specinfo.field = (specinfo.field <= INT_MAX / 10) ?         \
108               specinfo.field * 10 : INT_MAX;                            \
109             _i = *(format) - '0';                                       \
110             MPFR_ASSERTN (_i >= 0 && _i <= 9);                          \
111             specinfo.field = (specinfo.field <= INT_MAX - _i) ?         \
112               specinfo.field + _i : INT_MAX;                            \
113             ++(format);                                                 \
114             break;                                                      \
115           case '*':                                                     \
116             specinfo.field = va_arg ((ap), int);                        \
117             ++(format);                                                 \
118           default:                                                      \
119             goto label_out;                                             \
120           }                                                             \
121       }                                                                 \
122   } while (0)
123
124 /* arg_t contains all the types described by the 'type' field of the
125    format string */
126 enum arg_t
127   {
128     NONE,
129     CHAR_ARG,
130     SHORT_ARG,
131     LONG_ARG,
132     LONG_LONG_ARG,
133     INTMAX_ARG,
134     SIZE_ARG,
135     PTRDIFF_ARG,
136     LONG_DOUBLE_ARG,
137     MPF_ARG,
138     MPQ_ARG,
139     MP_LIMB_ARG,
140     MP_LIMB_ARRAY_ARG,
141     MPZ_ARG,
142     MPFR_PREC_ARG,
143     MPFR_ARG,
144     UNSUPPORTED
145   };
146
147 /* Each conversion specification of the format string will be translated in a
148    printf_spec structure by the parser.
149    This structure is adapted from the GNU libc one. */
150 struct printf_spec
151 {
152   unsigned int alt:1;           /* # flag */
153   unsigned int space:1;         /* Space flag */
154   unsigned int left:1;          /* - flag */
155   unsigned int showsign:1;      /* + flag */
156   unsigned int group:1;         /* ' flag */
157
158   int width;                    /* Width */
159   int prec;                     /* Precision */
160
161   enum arg_t arg_type;          /* Type of argument */
162   mpfr_rnd_t rnd_mode;            /* Rounding mode */
163   char spec;                    /* Conversion specifier */
164
165   char pad;                     /* Padding character */
166 };
167
168 static void
169 specinfo_init (struct printf_spec *specinfo)
170 {
171   specinfo->alt = 0;
172   specinfo->space = 0;
173   specinfo->left = 0;
174   specinfo->showsign = 0;
175   specinfo->group = 0;
176   specinfo->width = 0;
177   specinfo->prec = 0;
178   specinfo->arg_type = NONE;
179   specinfo->rnd_mode = MPFR_RNDN;
180   specinfo->spec = '\0';
181   specinfo->pad = ' ';
182 }
183
184 #define FLOATING_POINT_ARG_TYPE(at) \
185   ((at) == MPFR_ARG || (at) == MPF_ARG || (at) == LONG_DOUBLE_ARG)
186
187 #define INTEGER_LIKE_ARG_TYPE(at)                                       \
188   ((at) == SHORT_ARG || (at) == LONG_ARG || (at) == LONG_LONG_ARG       \
189    || (at) == INTMAX_ARG  || (at) == MPFR_PREC_ARG || (at) == MPZ_ARG   \
190    || (at) == MPQ_ARG || (at) == MP_LIMB_ARG || (at) == MP_LIMB_ARRAY_ARG \
191    || (at) == CHAR_ARG || (at) == SIZE_ARG || (at) == PTRDIFF_ARG)
192
193 static int
194 specinfo_is_valid (struct printf_spec spec)
195 {
196   switch (spec.spec)
197     {
198     case 'n':
199       return -1;
200
201     case 'a':    case 'A':
202     case 'e':    case 'E':
203     case 'f':    case 'F':
204     case 'g':    case 'G':
205       return (spec.arg_type == NONE
206               || FLOATING_POINT_ARG_TYPE (spec.arg_type));
207
208     case 'b':
209       return spec.arg_type == MPFR_ARG;
210
211     case 'd':    case 'i':
212     case 'u':    case 'o':
213     case 'x':    case 'X':
214       return (spec.arg_type == NONE
215               || INTEGER_LIKE_ARG_TYPE (spec.arg_type));
216
217     case 'c':
218     case 's':
219       return (spec.arg_type == NONE || spec.arg_type == LONG_ARG);
220
221     case 'p':
222       return spec.arg_type == NONE;
223
224     default:
225       return 0;
226     }
227 }
228
229 static const char *
230 parse_flags (const char *format, struct printf_spec *specinfo)
231 {
232   while (*format)
233     {
234       switch (*format)
235         {
236         case '0':
237           specinfo->pad = '0';
238           ++format;
239           break;
240         case '#':
241           specinfo->alt = 1;
242           ++format;
243           break;
244         case '+':
245           specinfo->showsign = 1;
246           ++format;
247           break;
248         case ' ':
249           specinfo->space = 1;
250           ++format;
251           break;
252         case '-':
253           specinfo->left = 1;
254           ++format;
255           break;
256         case '\'':
257           /* Single UNIX Specification for thousand separator */
258           specinfo->group = 1;
259           ++format;
260           break;
261         default:
262           return format;
263         }
264     }
265   return format;
266 }
267
268 static const char *
269 parse_arg_type (const char *format, struct printf_spec *specinfo)
270 {
271   switch (*format)
272     {
273     case '\0':
274       break;
275     case 'h':
276       if (*++format == 'h')
277 #ifndef NPRINTF_HH
278         {
279           ++format;
280           specinfo->arg_type = CHAR_ARG;
281         }
282 #else
283         specinfo->arg_type = UNSUPPORTED;
284 #endif
285       else
286         specinfo->arg_type = SHORT_ARG;
287       break;
288     case 'l':
289       if (*++format == 'l')
290         {
291           ++format;
292 #if defined (HAVE_LONG_LONG) && !defined(NPRINTF_LL)
293           specinfo->arg_type = LONG_LONG_ARG;
294 #else
295           specinfo->arg_type = UNSUPPORTED;
296 #endif
297           break;
298         }
299       else
300         {
301           specinfo->arg_type = LONG_ARG;
302           break;
303         }
304     case 'j':
305       ++format;
306 #if defined(_MPFR_H_HAVE_INTMAX_T) && !defined(NPRINTF_J)
307       specinfo->arg_type = INTMAX_ARG;
308 #else
309       specinfo->arg_type = UNSUPPORTED;
310 #endif
311       break;
312     case 'z':
313       ++format;
314       specinfo->arg_type = SIZE_ARG;
315       break;
316     case 't':
317       ++format;
318 #ifndef NPRINTF_T
319       specinfo->arg_type = PTRDIFF_ARG;
320 #else
321       specinfo->arg_type = UNSUPPORTED;
322 #endif
323       break;
324     case 'L':
325       ++format;
326 #ifndef NPRINTF_L
327       specinfo->arg_type = LONG_DOUBLE_ARG;
328 #else
329       specinfo->arg_type = UNSUPPORTED;
330 #endif
331       break;
332     case 'F':
333       ++format;
334       specinfo->arg_type = MPF_ARG;
335       break;
336     case 'Q':
337       ++format;
338       specinfo->arg_type = MPQ_ARG;
339       break;
340     case 'M':
341       ++format;
342       /* The 'M' specifier was added in gmp 4.2.0 */
343       specinfo->arg_type = MP_LIMB_ARG;
344       break;
345     case 'N':
346       ++format;
347       specinfo->arg_type = MP_LIMB_ARRAY_ARG;
348       break;
349     case 'Z':
350       ++format;
351       specinfo->arg_type = MPZ_ARG;
352       break;
353
354       /* mpfr specific specifiers */
355     case 'P':
356       ++format;
357       specinfo->arg_type = MPFR_PREC_ARG;
358       break;
359     case 'R':
360       ++format;
361       specinfo->arg_type = MPFR_ARG;
362     }
363   return format;
364 }
365
366
367 /* some macros and functions filling the buffer */
368
369 /* CONSUME_VA_ARG removes from va_list AP the type expected by SPECINFO */
370
371 /* With a C++ compiler wchar_t and enumeration in va_list are converted to
372    integer type : int, unsigned int, long or unsigned long (unfortunately,
373    this is implementation dependant).
374    We follow gmp which assumes in print/doprnt.c that wchar_t is converted
375    to int (because wchar_t <= int).
376    For wint_t, we assume that the case WINT_MAX < INT_MAX yields an
377    integer promotion. */
378 #ifdef HAVE_WCHAR_H
379 #if defined(WINT_MAX) && WINT_MAX < INT_MAX
380 typedef int    mpfr_va_wint;  /* integer promotion */
381 #else
382 typedef wint_t mpfr_va_wint;
383 #endif
384 #define CASE_LONG_ARG(specinfo, ap)                                     \
385   case LONG_ARG:                                                        \
386   if (((specinfo).spec == 'd') || ((specinfo).spec == 'i')              \
387       || ((specinfo).spec == 'o') || ((specinfo).spec == 'u')           \
388       || ((specinfo).spec == 'x') || ((specinfo).spec == 'X'))          \
389     (void) va_arg ((ap), long);                                         \
390   else if ((specinfo).spec == 'c')                                      \
391     (void) va_arg ((ap), mpfr_va_wint);                                 \
392   else if ((specinfo).spec == 's')                                      \
393     (void) va_arg ((ap), int); /* we assume integer promotion */        \
394   break;
395 #else
396 #define CASE_LONG_ARG(specinfo, ap)             \
397   case LONG_ARG:                                \
398   (void) va_arg ((ap), long);                   \
399   break;
400 #endif
401
402 #if defined(_MPFR_H_HAVE_INTMAX_T)
403 #define CASE_INTMAX_ARG(specinfo, ap)           \
404   case INTMAX_ARG:                              \
405   (void) va_arg ((ap), intmax_t);               \
406   break;
407 #else
408 #define CASE_INTMAX_ARG(specinfo, ap)
409 #endif
410
411 #ifdef HAVE_LONG_LONG
412 #define CASE_LONG_LONG_ARG(specinfo, ap)        \
413   case LONG_LONG_ARG:                           \
414   (void) va_arg ((ap), long long);              \
415   break;
416 #else
417 #define CASE_LONG_LONG_ARG(specinfo, ap)
418 #endif
419
420 #define CONSUME_VA_ARG(specinfo, ap)            \
421   do {                                          \
422     switch ((specinfo).arg_type)                \
423       {                                         \
424       case CHAR_ARG:                            \
425       case SHORT_ARG:                           \
426         (void) va_arg ((ap), int);              \
427         break;                                  \
428       CASE_LONG_ARG (specinfo, ap)              \
429       CASE_LONG_LONG_ARG (specinfo, ap)         \
430       CASE_INTMAX_ARG (specinfo, ap)            \
431       case SIZE_ARG:                            \
432         (void) va_arg ((ap), size_t);           \
433         break;                                  \
434       case PTRDIFF_ARG:                         \
435         (void) va_arg ((ap), ptrdiff_t);        \
436         break;                                  \
437       case LONG_DOUBLE_ARG:                     \
438         (void) va_arg ((ap), long double);      \
439         break;                                  \
440       case MPF_ARG:                             \
441         (void) va_arg ((ap), mpf_srcptr);       \
442         break;                                  \
443       case MPQ_ARG:                             \
444         (void) va_arg ((ap), mpq_srcptr);       \
445         break;                                  \
446       case MP_LIMB_ARG:                         \
447         (void) va_arg ((ap), mp_limb_t);        \
448         break;                                  \
449       case MP_LIMB_ARRAY_ARG:                   \
450         (void) va_arg ((ap), mpfr_limb_ptr);    \
451         (void) va_arg ((ap), mp_size_t);        \
452         break;                                  \
453       case MPZ_ARG:                             \
454         (void) va_arg ((ap), mpz_srcptr);       \
455         break;                                  \
456       default:                                  \
457         switch ((specinfo).spec)                \
458           {                                     \
459           case 'd':                             \
460           case 'i':                             \
461           case 'o':                             \
462           case 'u':                             \
463           case 'x':                             \
464           case 'X':                             \
465           case 'c':                             \
466             (void) va_arg ((ap), int);          \
467             break;                              \
468           case 'f':                             \
469           case 'F':                             \
470           case 'e':                             \
471           case 'E':                             \
472           case 'g':                             \
473           case 'G':                             \
474           case 'a':                             \
475           case 'A':                             \
476             (void) va_arg ((ap), double);       \
477             break;                              \
478           case 's':                             \
479             (void) va_arg ((ap), char *);       \
480             break;                              \
481           case 'p':                             \
482             (void) va_arg ((ap), void *);       \
483           }                                     \
484       }                                         \
485   } while (0)
486
487 /* process the format part which does not deal with mpfr types,
488    jump to external label 'error' if gmp_asprintf return -1. */
489 #define FLUSH(flag, start, end, ap, buf_ptr)                            \
490   do {                                                                  \
491     const size_t n = (end) - (start);                                   \
492     if ((flag))                                                         \
493       /* previous specifiers are understood by gmp_printf */            \
494       {                                                                 \
495         MPFR_TMP_DECL (marker);                                         \
496         char *fmt_copy;                                                 \
497         MPFR_TMP_MARK (marker);                                         \
498         fmt_copy = (char*) MPFR_TMP_ALLOC (n + 1);                      \
499         strncpy (fmt_copy, (start), n);                                 \
500         fmt_copy[n] = '\0';                                             \
501         if (sprntf_gmp ((buf_ptr), (fmt_copy), (ap)) == -1)             \
502           {                                                             \
503             MPFR_TMP_FREE (marker);                                     \
504             goto error;                                                 \
505           }                                                             \
506         (flag) = 0;                                                     \
507         MPFR_TMP_FREE (marker);                                         \
508       }                                                                 \
509     else if ((start) != (end))                                          \
510       /* no conversion specification, just simple characters */         \
511       buffer_cat ((buf_ptr), (start), n);                               \
512   } while (0)
513
514 struct string_buffer
515 {
516   char *start;                  /* beginning of the buffer */
517   char *curr;                   /* null terminating character */
518   size_t size;                  /* buffer capacity */
519 };
520
521 static void
522 buffer_init (struct string_buffer *b, size_t s)
523 {
524   b->start = (char *) (*__gmp_allocate_func) (s);
525   b->start[0] = '\0';
526   b->curr = b->start;
527   b->size = s;
528 }
529
530 /* Increase buffer size by a number of character being the least multiple of
531    4096 greater than LEN+1. */
532 static void
533 buffer_widen (struct string_buffer *b, size_t len)
534 {
535   const size_t pos = b->curr - b->start;
536   const size_t n = 0x1000 + (len & ~((size_t) 0xfff));
537   MPFR_ASSERTD (pos < b->size);
538
539   MPFR_ASSERTN ((len & ~((size_t) 4095)) <= (size_t)(SIZE_MAX - 4096));
540   MPFR_ASSERTN (b->size < SIZE_MAX - n);
541
542   b->start =
543     (char *) (*__gmp_reallocate_func) (b->start, b->size, b->size + n);
544   b->size += n;
545   b->curr = b->start + pos;
546
547   MPFR_ASSERTD (pos < b->size);
548   MPFR_ASSERTD (*b->curr == '\0');
549 }
550
551 /* Concatenate the LEN first characters of the string S to the buffer B and
552    expand it if needed. */
553 static void
554 buffer_cat (struct string_buffer *b, const char *s, size_t len)
555 {
556   MPFR_ASSERTD (len != 0);
557   MPFR_ASSERTD (len <= strlen (s));
558
559   if (MPFR_UNLIKELY ((b->curr + len) >= (b->start + b->size)))
560     buffer_widen (b, len);
561
562   strncat (b->curr, s, len);
563   b->curr += len;
564
565   MPFR_ASSERTD (b->curr < b->start + b->size);
566   MPFR_ASSERTD (*b->curr == '\0');
567 }
568
569 /* Add N characters C to the end of buffer B */
570 static void
571 buffer_pad (struct string_buffer *b, const char c, const size_t n)
572 {
573   MPFR_ASSERTD (n != 0);
574
575   MPFR_ASSERTN (b->size < SIZE_MAX - n - 1);
576   if (MPFR_UNLIKELY ((b->curr + n + 1) > (b->start + b->size)))
577     buffer_widen (b, n);
578
579   if (n == 1)
580     *b->curr = c;
581   else
582     memset (b->curr, c, n);
583   b->curr += n;
584   *b->curr = '\0';
585
586   MPFR_ASSERTD (b->curr < b->start + b->size);
587 }
588
589 /* Form a string by concatenating the first LEN characters of STR to TZ
590    zero(s), insert into one character C each 3 characters starting from end
591    to begining and concatenate the result to the buffer B. */
592 static void
593 buffer_sandwich (struct string_buffer *b, char *str, size_t len,
594                  const size_t tz, const char c)
595 {
596   const size_t step = 3;
597   const size_t size = len + tz;
598   const size_t r = size % step == 0 ? step : size % step;
599   const size_t q = size % step == 0 ? size / step - 1 : size / step;
600   size_t i;
601
602   MPFR_ASSERTD (size != 0);
603   if (c == '\0')
604     {
605       buffer_cat (b, str, len);
606       buffer_pad (b, '0', tz);
607       return;
608     }
609
610   MPFR_ASSERTN (b->size < SIZE_MAX - size - 1 - q);
611   MPFR_ASSERTD (len <= strlen (str));
612   if (MPFR_UNLIKELY ((b->curr + size + 1 + q) > (b->start + b->size)))
613     buffer_widen (b, size + q);
614
615   /* first R significant digits */
616   memcpy (b->curr, str, r);
617   b->curr += r;
618   str += r;
619   len -= r;
620
621   /* blocks of thousands. Warning: STR might end in the middle of a block */
622   for (i = 0; i < q; ++i)
623     {
624       *b->curr++ = c;
625       if (MPFR_LIKELY (len > 0))
626         {
627           if (MPFR_LIKELY (len >= step))
628             /* step significant digits */
629             {
630               memcpy (b->curr, str, step);
631               len -= step;
632             }
633           else
634             /* last digits in STR, fill up thousand block with zeros */
635             {
636               memcpy (b->curr, str, len);
637               memset (b->curr + len, '0', step - len);
638               len = 0;
639             }
640         }
641       else
642         /* trailing zeros */
643         memset (b->curr, '0', step);
644
645       b->curr += step;
646       str += step;
647     }
648
649   *b->curr = '\0';
650
651   MPFR_ASSERTD (b->curr < b->start + b->size);
652 }
653
654 /* let gmp_xprintf process the part it can understand */
655 static int
656 sprntf_gmp (struct string_buffer *b, const char *fmt, va_list ap)
657 {
658   int length;
659   char *s;
660
661   length = gmp_vasprintf (&s, fmt, ap);
662   if (length > 0)
663     buffer_cat (b, s, length);
664
665   mpfr_free_str (s);
666   return length;
667 }
668
669 /* Helper struct and functions for temporary strings management */
670 /* struct for easy string clearing */
671 struct string_list
672 {
673   char *string;
674   struct string_list *next; /* NULL in last node */
675 };
676
677 /* initialisation */
678 static void
679 init_string_list (struct string_list *sl)
680 {
681   sl->string = NULL;
682   sl->next = NULL;
683 }
684
685 /* clear all strings in the list */
686 static void
687 clear_string_list (struct string_list *sl)
688 {
689   struct string_list *n;
690
691   while (sl)
692     {
693       if (sl->string)
694         mpfr_free_str (sl->string);
695       n = sl->next;
696       (*__gmp_free_func) (sl, sizeof(struct string_list));
697       sl = n;
698     }
699 }
700
701 /* add a string in the list */
702 static char *
703 register_string (struct string_list *sl, char *new_string)
704 {
705   /* look for the last node */
706   while (sl->next)
707     sl = sl->next;
708
709   sl->next = (struct string_list*)
710     (*__gmp_allocate_func) (sizeof (struct string_list));
711
712   sl = sl->next;
713   sl->next = NULL;
714   return sl->string = new_string;
715 }
716
717 /* padding type: where are the padding characters */
718 enum pad_t
719   {
720     LEFT,          /* spaces in left hand side for right justification */
721     LEADING_ZEROS, /* padding with '0' characters in integral part */
722     RIGHT          /* spaces in right hand side for left justification */
723   };
724
725 /* number_parts details how much characters are needed in each part of a float
726    print.  */
727 struct number_parts
728 {
729   enum pad_t pad_type;    /* Padding type */
730   size_t pad_size;        /* Number of padding characters */
731
732   char sign;              /* Sign character */
733
734   char *prefix_ptr;       /* Pointer to prefix part */
735   size_t prefix_size;     /* Number of characters in *prefix_ptr */
736
737   char thousands_sep;     /* Thousands separator (only with style 'f') */
738
739   char *ip_ptr;           /* Pointer to integral part characters*/
740   size_t ip_size;         /* Number of digits in *ip_ptr */
741   int ip_trailing_zeros;  /* Number of additional null digits in integral
742                              part */
743
744   char point;             /* Decimal point character */
745
746   int fp_leading_zeros;   /* Number of additional leading zeros in fractional
747                              part */
748   char *fp_ptr;           /* Pointer to fractional part characters */
749   size_t fp_size;         /* Number of digits in *fp_ptr */
750   int fp_trailing_zeros;  /* Number of additional trailing zeros in fractional
751                              part */
752
753   char *exp_ptr;          /* Pointer to exponent part */
754   size_t exp_size;        /* Number of characters in *exp_ptr */
755
756   struct string_list *sl; /* List of string buffers in use: we need such a
757                              mechanism because fp_ptr may point into the same
758                              string as ip_ptr */
759 };
760
761 /* For a real non zero number x, what is the base exponent f when rounding x
762    with rounding mode r to r(x) = m*b^f, where m is a digit and 1 <= m < b ?
763    Return non zero value if x is rounded up to b^f, return zero otherwise */
764 static int
765 next_base_power_p (mpfr_srcptr x, int base, mpfr_rnd_t rnd)
766 {
767   mpfr_prec_t nbits;
768   mp_limb_t pm;
769   mp_limb_t xm;
770
771   MPFR_ASSERTD (MPFR_IS_PURE_FP (x));
772   MPFR_ASSERTD (base == 2 || base == 16);
773
774   /* Warning: the decimal point is AFTER THE FIRST DIGIT in this output
775      representation. */
776   nbits = base == 2 ? 1 : 4;
777
778   if (rnd == MPFR_RNDZ
779       || (rnd == MPFR_RNDD && MPFR_IS_POS (x))
780       || (rnd == MPFR_RNDU && MPFR_IS_NEG (x))
781       || MPFR_PREC (x) <= nbits)
782     /* no rounding when printing x with 1 digit */
783     return 0;
784
785   xm = MPFR_MANT (x) [MPFR_LIMB_SIZE (x) - 1];
786   pm = MPFR_LIMB_MASK (GMP_NUMB_BITS - nbits);
787   if ((xm & ~pm) ^ ~pm)
788     /* do no round up if some of the nbits first bits are 0s. */
789     return 0;
790
791   if (rnd == MPFR_RNDN)
792     /* mask for rounding bit */
793     pm = (MPFR_LIMB_ONE << (GMP_NUMB_BITS - nbits - 1));
794
795   /* round up if some remaining bits are 1 */
796   /* warning: the return value must be an int */
797   return xm & pm ? 1 : 0;
798 }
799
800 /* Record information from mpfr_get_str() so as to avoid multiple
801    calls to this expensive function. */
802 struct decimal_info
803 {
804   mpfr_exp_t exp;
805   char *str;
806 };
807
808 /* For a real non zero number x, what is the exponent f so that
809    10^f <= x < 10^(f+1). */
810 static mpfr_exp_t
811 floor_log10 (mpfr_srcptr x)
812 {
813   mpfr_t y;
814   mpfr_exp_t exp;
815
816   /* make sure first that y can represent a mpfr_exp_t exactly
817      and can compare with x */
818   mpfr_prec_t prec = sizeof (mpfr_exp_t) * CHAR_BIT;
819   mpfr_init2 (y, MAX (prec, MPFR_PREC (x)));
820
821   exp = mpfr_ceil_mul (MPFR_GET_EXP (x), 10, 1) - 1;
822   mpfr_set_exp_t (y, exp, MPFR_RNDU);
823   /* The following call to mpfr_ui_pow should be fast: y is an integer
824      (not too large), so that mpfr_pow_z will be used internally. */
825   mpfr_ui_pow (y, 10, y, MPFR_RNDU);
826   if (mpfr_cmpabs (x, y) < 0)
827     exp--;
828
829   mpfr_clear (y);
830   return exp;
831 }
832
833 /* Determine the different parts of the string representation of the regular
834    number P when SPEC.SPEC is 'a', 'A', or 'b'.
835
836    return -1 if some field > INT_MAX */
837 static int
838 regular_ab (struct number_parts *np, mpfr_srcptr p,
839             const struct printf_spec spec)
840 {
841   int uppercase;
842   int base;
843   char *str;
844   mpfr_exp_t exp;
845
846   uppercase = spec.spec == 'A';
847
848   /* sign */
849   if (MPFR_IS_NEG (p))
850     np->sign = '-';
851   else if (spec.showsign || spec.space)
852     np->sign = spec.showsign ? '+' : ' ';
853
854   if (spec.spec == 'a' || spec.spec == 'A')
855     /* prefix part */
856     {
857       np->prefix_size = 2;
858       str = (char *) (*__gmp_allocate_func) (1 + np->prefix_size);
859       str[0] = '0';
860       str[1] = uppercase ? 'X' : 'x';
861       str[2] = '\0';
862       np->prefix_ptr = register_string (np->sl, str);
863     }
864
865   /* integral part */
866   np->ip_size = 1;
867   base = (spec.spec == 'b') ? 2 : 16;
868
869   if (spec.prec != 0)
870     {
871       size_t nsd;
872
873       /* Number of significant digits:
874          - if no given precision, let mpfr_get_str determine it;
875          - if a non-zero precision is specified, then one digit before decimal
876          point plus SPEC.PREC after it. */
877       nsd = spec.prec < 0 ? 0 : spec.prec + np->ip_size;
878       str = mpfr_get_str (0, &exp, base, nsd, p, spec.rnd_mode);
879       register_string (np->sl, str);
880       np->ip_ptr = MPFR_IS_NEG (p) ? ++str : str;  /* skip sign if any */
881
882       if (base == 16)
883         /* EXP is the exponent for radix sixteen with decimal point BEFORE the
884            first digit, we want the exponent for radix two and the decimal
885            point AFTER the first digit. */
886         {
887           MPFR_ASSERTN (exp > MPFR_EMIN_MIN /4); /* possible overflow */
888           exp = (exp - 1) * 4;
889         }
890       else
891         /* EXP is the exponent for decimal point BEFORE the first digit, we
892            want the exponent for decimal point AFTER the first digit. */
893         {
894           MPFR_ASSERTN (exp > MPFR_EMIN_MIN); /* possible overflow */
895           --exp;
896         }
897     }
898   else if (next_base_power_p (p, base, spec.rnd_mode))
899     {
900       str = (char *)(*__gmp_allocate_func) (2);
901       str[0] = '1';
902       str[1] = '\0';
903       np->ip_ptr = register_string (np->sl, str);
904
905       exp = MPFR_GET_EXP (p);
906     }
907   else if (base == 2)
908     {
909       str = (char *)(*__gmp_allocate_func) (2);
910       str[0] = '1';
911       str[1] = '\0';
912       np->ip_ptr = register_string (np->sl, str);
913
914       exp = MPFR_GET_EXP (p) - 1;
915     }
916   else
917     {
918       int digit;
919       mp_limb_t msl = MPFR_MANT (p)[MPFR_LIMB_SIZE (p) - 1];
920       int rnd_bit = GMP_NUMB_BITS - 5;
921
922       /* pick up the 4 first bits */
923       digit = msl >> (rnd_bit+1);
924       if (spec.rnd_mode == MPFR_RNDA
925           || (spec.rnd_mode == MPFR_RNDU && MPFR_IS_POS (p))
926           || (spec.rnd_mode == MPFR_RNDD && MPFR_IS_NEG (p))
927           || (spec.rnd_mode == MPFR_RNDN
928               && (msl & (MPFR_LIMB_ONE << rnd_bit))))
929         digit++;
930       MPFR_ASSERTD ((0 <= digit) && (digit <= 15));
931
932       str = (char *)(*__gmp_allocate_func) (1 + np->ip_size);
933       str[0] = num_to_text [digit];
934       str[1] = '\0';
935       np->ip_ptr = register_string (np->sl, str);
936
937       exp = MPFR_GET_EXP (p) - 4;
938     }
939
940   if (uppercase)
941     /* All digits in upper case */
942     {
943       char *s1 = str;
944       while (*s1)
945         {
946           switch (*s1)
947             {
948             case 'a':
949               *s1 = 'A';
950               break;
951             case 'b':
952               *s1 = 'B';
953               break;
954             case 'c':
955               *s1 = 'C';
956               break;
957             case 'd':
958               *s1 = 'D';
959               break;
960             case 'e':
961               *s1 = 'E';
962               break;
963             case 'f':
964               *s1 = 'F';
965               break;
966             }
967           s1++;
968         }
969     }
970
971   if (spec.spec == 'b' || spec.prec != 0)
972     /* compute the number of digits in fractional part */
973     {
974       char *ptr;
975       size_t str_len;
976
977       /* the sign has been skipped, skip also the first digit */
978       ++str;
979       str_len = strlen (str);
980       ptr = str + str_len - 1; /* points to the end of str */
981
982       if (spec.prec < 0)
983         /* remove trailing zeros, if any */
984         {
985           while ((*ptr == '0') && (str_len != 0))
986             {
987               --ptr;
988               --str_len;
989             }
990         }
991
992       if (str_len > INT_MAX)
993         /* too many digits in fractional part */
994         return -1;
995
996       if (str_len != 0)
997         /* there are some non-zero digits in fractional part */
998         {
999           np->fp_ptr = str;
1000           np->fp_size = str_len;
1001           if ((int) str_len < spec.prec)
1002             np->fp_trailing_zeros = spec.prec - str_len;
1003         }
1004     }
1005
1006   /* decimal point */
1007   if ((np->fp_size != 0) || spec.alt)
1008     np->point = MPFR_DECIMAL_POINT;
1009
1010   /* the exponent part contains the character 'p', or 'P' plus the sign
1011      character plus at least one digit and only as many more digits as
1012      necessary to represent the exponent.
1013      We assume that |EXP| < 10^INT_MAX. */
1014   np->exp_size = 3;
1015   {
1016     mpfr_uexp_t x;
1017
1018     x = SAFE_ABS (mpfr_uexp_t, exp);
1019     while (x > 9)
1020       {
1021         np->exp_size++;
1022         x /= 10;
1023       }
1024   }
1025   str = (char *) (*__gmp_allocate_func) (1 + np->exp_size);
1026   np->exp_ptr = register_string (np->sl, str);
1027   {
1028     char exp_fmt[8];  /* contains at most 7 characters like in "p%+.1i",
1029                          or "P%+.2li" */
1030
1031     exp_fmt[0] = uppercase ? 'P' : 'p';
1032     exp_fmt[1] = '\0';
1033     strcat (exp_fmt, "%+.1" MPFR_EXP_FSPEC "d");
1034
1035     if (sprintf (str, exp_fmt, (mpfr_eexp_t) exp) < 0)
1036       return -1;
1037   }
1038
1039   return 0;
1040 }
1041
1042 /* Determine the different parts of the string representation of the regular
1043    number P when SPEC.SPEC is 'e', 'E', 'g', or 'G'.
1044    DEC_INFO contains the previously computed exponent and string or is NULL.
1045
1046    return -1 if some field > INT_MAX */
1047 static int
1048 regular_eg (struct number_parts *np, mpfr_srcptr p,
1049             const struct printf_spec spec, struct decimal_info *dec_info)
1050 {
1051   char *str;
1052   mpfr_exp_t exp;
1053
1054   const int uppercase = spec.spec == 'E' || spec.spec == 'G';
1055   const int spec_g = spec.spec == 'g' || spec.spec == 'G';
1056   const int keep_trailing_zeros = (spec_g && spec.alt)
1057     || (!spec_g && (spec.prec > 0));
1058
1059   /* sign */
1060   if (MPFR_IS_NEG (p))
1061     np->sign = '-';
1062   else if (spec.showsign || spec.space)
1063     np->sign = spec.showsign ? '+' : ' ';
1064
1065   /* integral part */
1066   np->ip_size = 1;
1067   if (dec_info == NULL)
1068     {
1069       size_t nsd;
1070
1071       /* Number of significant digits:
1072          - if no given precision, then let mpfr_get_str determine it,
1073          - if a precision is specified, then one digit before decimal point
1074          plus SPEC.PREC after it.
1075          We use the fact here that mpfr_get_str allows us to ask for only one
1076          significant digit when the base is not a power of 2. */
1077       nsd = (spec.prec < 0) ? 0 : spec.prec + np->ip_size;
1078       str = mpfr_get_str (0, &exp, 10, nsd, p, spec.rnd_mode);
1079       register_string (np->sl, str);
1080     }
1081   else
1082     {
1083       exp = dec_info->exp;
1084       str = dec_info->str;
1085     }
1086   np->ip_ptr = MPFR_IS_NEG (p) ? ++str : str;  /* skip sign if any */
1087
1088   if (spec.prec != 0)
1089     /* compute the number of digits in fractional part */
1090     {
1091       char *ptr;
1092       size_t str_len;
1093
1094       /* the sign has been skipped, skip also the first digit */
1095       ++str;
1096       str_len = strlen (str);
1097       ptr = str + str_len - 1; /* points to the end of str */
1098
1099       if (!keep_trailing_zeros)
1100         /* remove trailing zeros, if any */
1101         {
1102           while ((*ptr == '0') && (str_len != 0))
1103             {
1104               --ptr;
1105               --str_len;
1106             }
1107         }
1108
1109       if (str_len > INT_MAX)
1110         /* too many digits in fractional part */
1111         return -1;
1112
1113       if (str_len != 0)
1114         /* there are some non-zero digits in fractional part */
1115         {
1116           np->fp_ptr = str;
1117           np->fp_size = str_len;
1118           if ((!spec_g || spec.alt) && (spec.prec > 0)
1119               && ((int)str_len < spec.prec))
1120             /* add missing trailing zeros */
1121             np->fp_trailing_zeros = spec.prec - str_len;
1122         }
1123     }
1124
1125   /* decimal point */
1126   if (np->fp_size != 0 || spec.alt)
1127     np->point = MPFR_DECIMAL_POINT;
1128
1129   /* EXP is the exponent for decimal point BEFORE the first digit, we want
1130      the exponent for decimal point AFTER the first digit.
1131      Here, no possible overflow because exp < MPFR_EXP (p) / 3 */
1132   exp--;
1133
1134   /* the exponent part contains the character 'e', or 'E' plus the sign
1135      character plus at least two digits and only as many more digits as
1136      necessary to represent the exponent.
1137      We assume that |EXP| < 10^INT_MAX. */
1138   np->exp_size = 3;
1139   {
1140     mpfr_uexp_t x;
1141
1142     x = SAFE_ABS (mpfr_uexp_t, exp);
1143     while (x > 9)
1144       {
1145         np->exp_size++;
1146         x /= 10;
1147       }
1148   }
1149   if (np->exp_size < 4)
1150     np->exp_size = 4;
1151
1152   str = (char *) (*__gmp_allocate_func) (1 + np->exp_size);
1153   np->exp_ptr = register_string (np->sl, str);
1154
1155   {
1156     char exp_fmt[8];  /* e.g. "e%+.2i", or "E%+.2li" */
1157
1158     exp_fmt[0] = uppercase ? 'E' : 'e';
1159     exp_fmt[1] = '\0';
1160     strcat (exp_fmt, "%+.2" MPFR_EXP_FSPEC "d");
1161
1162     if (sprintf (str, exp_fmt, (mpfr_eexp_t) exp) < 0)
1163       return -1;
1164   }
1165
1166   return 0;
1167 }
1168
1169 /* Determine the different parts of the string representation of the regular
1170    number P when SPEC.SPEC is 'f', 'F', 'g', or 'G'.
1171    DEC_INFO contains the previously computed exponent and string or is NULL.
1172
1173    return -1 if some field of number_parts is greater than INT_MAX */
1174 static int
1175 regular_fg (struct number_parts *np, mpfr_srcptr p,
1176             const struct printf_spec spec, struct decimal_info *dec_info)
1177 {
1178   mpfr_exp_t exp;
1179   char * str;
1180   const int spec_g = (spec.spec == 'g' || spec.spec == 'G');
1181   const int keep_trailing_zeros = !spec_g || spec.alt;
1182
1183   /* WARNING: an empty precision field is forbidden (it means precision = 6
1184      and it should have been changed to 6 before the function call) */
1185   MPFR_ASSERTD (spec.prec >= 0);
1186
1187   /* sign */
1188   if (MPFR_IS_NEG (p))
1189     np->sign = '-';
1190   else if (spec.showsign || spec.space)
1191     np->sign = spec.showsign ? '+' : ' ';
1192
1193   if (MPFR_GET_EXP (p) <= 0)
1194     /* 0 < |p| < 1 */
1195     {
1196       /* Most of the time, integral part is 0 */
1197       np->ip_size = 1;
1198       str = (char *) (*__gmp_allocate_func) (1 + np->ip_size);
1199       str[0] = '0';
1200       str[1] = '\0';
1201       np->ip_ptr = register_string (np->sl, str);
1202
1203       if (spec.prec == 0)
1204         /* only two possibilities: either 1 or 0. */
1205         {
1206           mpfr_t y;
1207           /* y = abs(p) */
1208           MPFR_ALIAS (y, p, 1, MPFR_EXP (p));
1209
1210           if (spec.rnd_mode == MPFR_RNDA
1211               || (spec.rnd_mode == MPFR_RNDD && MPFR_IS_NEG (p))
1212               || (spec.rnd_mode == MPFR_RNDU && MPFR_IS_POS (p))
1213               || (spec.rnd_mode == MPFR_RNDN && mpfr_cmp_d (y, 0.5) > 0))
1214             /* rounded up to 1: one digit '1' in integral part.
1215                note that 0.5 is rounded to 0 with RNDN (round ties to even) */
1216             np->ip_ptr[0] = '1';
1217         }
1218       else
1219         {
1220           /* exp =  position of the most significant decimal digit. */
1221           exp = floor_log10 (p);
1222           MPFR_ASSERTD (exp < 0);
1223
1224           if (exp < -spec.prec)
1225             /* only the last digit may be non zero */
1226             {
1227               int round_away;
1228               switch (spec.rnd_mode)
1229                 {
1230                 case MPFR_RNDA:
1231                   round_away = 1;
1232                   break;
1233                 case MPFR_RNDD:
1234                   round_away = MPFR_IS_NEG (p);
1235                   break;
1236                 case MPFR_RNDU:
1237                   round_away = MPFR_IS_POS (p);
1238                   break;
1239                 case MPFR_RNDN:
1240                   {
1241                     /* compare |p| to y = 0.5*10^(-spec.prec) */
1242                     mpfr_t y;
1243                     mpfr_exp_t e = MAX (MPFR_PREC (p), 56);
1244                     mpfr_init2 (y, e + 8);
1245                     do
1246                       {
1247                         /* find a lower approximation of
1248                            0.5*10^(-spec.prec) different from |p| */
1249                         e += 8;
1250                         mpfr_set_prec (y, e);
1251                         mpfr_set_si (y, -spec.prec, MPFR_RNDN);
1252                         mpfr_exp10 (y, y, MPFR_RNDD);
1253                         mpfr_div_2ui (y, y, 1, MPFR_RNDN);
1254                       } while (mpfr_cmpabs (y, p) == 0);
1255
1256                     round_away = mpfr_cmpabs (y, p) < 0;
1257                     mpfr_clear (y);
1258                   }
1259                   break;
1260                 default:
1261                   round_away = 0;
1262                 }
1263
1264               if (round_away)
1265                 /* round away from zero: the last output digit is '1' */
1266                 {
1267                   np->fp_leading_zeros = spec.prec - 1;
1268
1269                   np->fp_size = 1;
1270                   str =
1271                     (char *) (*__gmp_allocate_func) (1 + np->fp_size);
1272                   str[0] = '1';
1273                   str[1] = '\0';
1274                   np->fp_ptr = register_string (np->sl, str);
1275                 }
1276               else
1277                 /* only zeros in fractional part */
1278                 {
1279                   MPFR_ASSERTD (!spec_g);
1280                   np->fp_leading_zeros = spec.prec;
1281                 }
1282             }
1283           else
1284             /* the most significant digits are the last
1285                spec.prec + exp + 1 digits in fractional part */
1286             {
1287               char *ptr;
1288               size_t str_len;
1289               if (dec_info == NULL)
1290                 {
1291                   size_t nsd = spec.prec + exp + 1;
1292                   /* WARNING: nsd may equal 1, but here we use the
1293                      fact that mpfr_get_str can return one digit with
1294                      base ten (undocumented feature, see comments in
1295                      get_str.c) */
1296
1297                   str = mpfr_get_str (NULL, &exp, 10, nsd, p, spec.rnd_mode);
1298                   register_string (np->sl, str);
1299                 }
1300               else
1301                 {
1302                   exp = dec_info->exp;
1303                   str = dec_info->str;
1304                 }
1305               if (MPFR_IS_NEG (p))
1306                 /* skip sign */
1307                 ++str;
1308               if (exp == 1)
1309                 /* round up to 1 */
1310                 {
1311                   MPFR_ASSERTD (str[0] == '1');
1312                   np->ip_ptr[0] = '1';
1313                   if (!spec_g || spec.alt)
1314                     np->fp_leading_zeros = spec.prec;
1315                 }
1316               else
1317                 {
1318                   np->fp_ptr = str;
1319                   np->fp_leading_zeros = -exp;
1320                   MPFR_ASSERTD (exp <= 0);
1321
1322                   str_len = strlen (str); /* the sign has been skipped */
1323                   ptr = str + str_len - 1; /* points to the end of str */
1324
1325                   if (!keep_trailing_zeros)
1326                     /* remove trailing zeros, if any */
1327                     {
1328                       while ((*ptr == '0') && str_len)
1329                         {
1330                           --ptr;
1331                           --str_len;
1332                         }
1333                     }
1334
1335                   if (str_len > INT_MAX)
1336                     /* too many digits in fractional part */
1337                     return -1;
1338
1339                   MPFR_ASSERTD (str_len > 0);
1340                   np->fp_size = str_len;
1341
1342                   if ((!spec_g || spec.alt)
1343                       && spec.prec > 0
1344                       && (np->fp_leading_zeros + np->fp_size < spec.prec))
1345                     /* add missing trailing zeros */
1346                     np->fp_trailing_zeros = spec.prec - np->fp_leading_zeros
1347                       - np->fp_size;
1348                 }
1349             }
1350         }
1351
1352       if (spec.alt || np->fp_leading_zeros != 0 || np->fp_size != 0
1353           || np->fp_trailing_zeros != 0)
1354         np->point = MPFR_DECIMAL_POINT;
1355     }
1356   else
1357     /* 1 <= |p| */
1358     {
1359       size_t str_len;
1360
1361       /* Determine the position of the most significant decimal digit. */
1362       exp = floor_log10 (p);
1363       MPFR_ASSERTD (exp >= 0);
1364       if (exp > INT_MAX)
1365         /* P is too large to print all its integral part digits */
1366         return -1;
1367
1368       if (dec_info == NULL)
1369         { /* this case occurs with mpfr_printf ("%.0RUf", x) with x=9.5 */
1370           str =
1371             mpfr_get_str (NULL, &exp, 10, spec.prec+exp+1, p, spec.rnd_mode);
1372           register_string (np->sl, str);
1373         }
1374       else
1375         {
1376           exp = dec_info->exp;
1377           str = dec_info->str;
1378         }
1379       np->ip_ptr = MPFR_IS_NEG (p) ? ++str : str; /* skip sign */
1380       str_len = strlen (str);
1381
1382       /* integral part */
1383       if (exp > str_len)
1384         /* mpfr_get_str gives no trailing zero when p is rounded up to the next
1385            power of 10 (p integer, so no fractional part) */
1386         {
1387           np->ip_trailing_zeros = exp - str_len;
1388           np->ip_size = str_len;
1389         }
1390       else
1391         np->ip_size = exp;
1392
1393       if (spec.group)
1394         /* thousands separator in integral part */
1395         np->thousands_sep = MPFR_THOUSANDS_SEPARATOR;
1396
1397       /* fractional part */
1398       str += np->ip_size;
1399       str_len -= np->ip_size;
1400       if (!keep_trailing_zeros)
1401         /* remove trailing zeros, if any */
1402         {
1403           char *ptr = str + str_len - 1; /* pointer to the last digit of
1404                                             str */
1405           while ((*ptr == '0') && (str_len != 0))
1406             {
1407               --ptr;
1408               --str_len;
1409             }
1410         }
1411
1412       if (str_len > 0)
1413         /* some nonzero digits in fractional part */
1414         {
1415           if (str_len > INT_MAX)
1416             /* too many digits in fractional part */
1417             return -1;
1418
1419           np->point = MPFR_DECIMAL_POINT;
1420           np->fp_ptr = str;
1421           np->fp_size = str_len;
1422         }
1423
1424       if (keep_trailing_zeros && str_len < spec.prec)
1425         /* add missing trailing zeros */
1426         {
1427           np->point = MPFR_DECIMAL_POINT;
1428           np->fp_trailing_zeros = spec.prec - np->fp_size;
1429         }
1430
1431       if (spec.alt)
1432         /* add decimal point even if no digits follow it */
1433         np->point = MPFR_DECIMAL_POINT;
1434     }
1435
1436   return 0;
1437 }
1438
1439 /* partition_number determines the different parts of the string
1440    representation of the number p according to the given specification.
1441    partition_number initializes the given structure np, so all previous
1442    information in that variable is lost.
1443    return the total number of characters to be written.
1444    return -1 if an error occured, in that case np's fields are in an undefined
1445    state but all string buffers have been freed. */
1446 static int
1447 partition_number (struct number_parts *np, mpfr_srcptr p,
1448                   struct printf_spec spec)
1449 {
1450   char *str;
1451   long total;
1452   int uppercase;
1453
1454   /* WARNING: left justification means right space padding */
1455   np->pad_type = spec.left ? RIGHT : spec.pad == '0' ? LEADING_ZEROS : LEFT;
1456   np->pad_size = 0;
1457   np->sign = '\0';
1458   np->prefix_ptr =NULL;
1459   np->prefix_size = 0;
1460   np->thousands_sep = '\0';
1461   np->ip_ptr = NULL;
1462   np->ip_size = 0;
1463   np->ip_trailing_zeros = 0;
1464   np->point = '\0';
1465   np->fp_leading_zeros = 0;
1466   np->fp_ptr = NULL;
1467   np->fp_size = 0;
1468   np->fp_trailing_zeros = 0;
1469   np->exp_ptr = NULL;
1470   np->exp_size = 0;
1471   np->sl = (struct string_list *)
1472     (*__gmp_allocate_func) (sizeof (struct string_list));
1473   init_string_list (np->sl);
1474
1475   uppercase = spec.spec == 'A' || spec.spec == 'E' || spec.spec == 'F'
1476     || spec.spec == 'G';
1477
1478   if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (p)))
1479     {
1480       if (MPFR_IS_NAN (p))
1481         {
1482           if (np->pad_type == LEADING_ZEROS)
1483             /* don't want "0000nan", change to right justification padding
1484                with left spaces instead */
1485             np->pad_type = LEFT;
1486
1487           if (uppercase)
1488             {
1489               np->ip_size = MPFR_NAN_STRING_LENGTH;
1490               str = (char *) (*__gmp_allocate_func) (1 + np->ip_size);
1491               strcpy (str, MPFR_NAN_STRING_UC);
1492               np->ip_ptr = register_string (np->sl, str);
1493             }
1494           else
1495             {
1496               np->ip_size = MPFR_NAN_STRING_LENGTH;
1497               str = (char *) (*__gmp_allocate_func) (1 + np->ip_size);
1498               strcpy (str, MPFR_NAN_STRING_LC);
1499               np->ip_ptr = register_string (np->sl, str);
1500             }
1501         }
1502       else if (MPFR_IS_INF (p))
1503         {
1504           if (np->pad_type == LEADING_ZEROS)
1505             /* don't want "0000inf", change to right justification padding
1506                with left spaces instead */
1507             np->pad_type = LEFT;
1508
1509           if (MPFR_IS_NEG (p))
1510             np->sign = '-';
1511
1512           if (uppercase)
1513             {
1514               np->ip_size = MPFR_INF_STRING_LENGTH;
1515               str = (char *) (*__gmp_allocate_func) (1 + np->ip_size);
1516               strcpy (str, MPFR_INF_STRING_UC);
1517               np->ip_ptr = register_string (np->sl, str);
1518             }
1519           else
1520             {
1521               np->ip_size = MPFR_INF_STRING_LENGTH;
1522               str = (char *) (*__gmp_allocate_func) (1 + np->ip_size);
1523               strcpy (str, MPFR_INF_STRING_LC);
1524               np->ip_ptr = register_string (np->sl, str);
1525             }
1526         }
1527       else
1528         /* p == 0 */
1529         {
1530           /* note: for 'g' spec, zero is always displayed with 'f'-style with
1531              precision spec.prec - 1 and the trailing zeros are removed unless
1532              the flag '#' is used. */
1533           if (MPFR_IS_NEG (p))
1534             /* signed zero */
1535             np->sign = '-';
1536           else if (spec.showsign || spec.space)
1537             np->sign = spec.showsign ? '+' : ' ';
1538
1539           if (spec.spec == 'a' || spec.spec == 'A')
1540             /* prefix part */
1541             {
1542               np->prefix_size = 2;
1543               str = (char *) (*__gmp_allocate_func) (1 + np->prefix_size);
1544               str[0] = '0';
1545               str[1] = uppercase ? 'X' : 'x';
1546               str[2] = '\0';
1547               np->prefix_ptr = register_string (np->sl, str);
1548             }
1549
1550           /* integral part */
1551           np->ip_size = 1;
1552           str = (char *) (*__gmp_allocate_func) (1 + np->ip_size);
1553           str[0] = '0';
1554           str[1] = '\0';
1555           np->ip_ptr = register_string (np->sl, str);
1556
1557           if (spec.prec > 0
1558               && ((spec.spec != 'g' && spec.spec != 'G') || spec.alt))
1559             /* fractional part */
1560             {
1561               np->point = MPFR_DECIMAL_POINT;
1562               np->fp_trailing_zeros = (spec.spec == 'g' && spec.spec == 'G') ?
1563                 spec.prec - 1 : spec.prec;
1564             }
1565           else if (spec.alt)
1566             np->point = MPFR_DECIMAL_POINT;
1567
1568           if (spec.spec == 'a' || spec.spec == 'A' || spec.spec == 'b'
1569               || spec.spec == 'e' || spec.spec == 'E')
1570             /* exponent part */
1571             {
1572               np->exp_size = (spec.spec == 'e' || spec.spec == 'E') ? 4 : 3;
1573               str = (char *) (*__gmp_allocate_func) (1 + np->exp_size);
1574               if (spec.spec == 'e' || spec.spec == 'E')
1575                 strcpy (str, uppercase ? "E+00" : "e+00");
1576               else
1577                 strcpy (str, uppercase ? "P+0" : "p+0");
1578               np->exp_ptr = register_string (np->sl, str);
1579             }
1580         }
1581     }
1582   else
1583     /* regular p, p != 0 */
1584     {
1585       if (spec.spec == 'a' || spec.spec == 'A' || spec.spec == 'b')
1586         {
1587           if (regular_ab (np, p, spec) == -1)
1588             goto error;
1589         }
1590       else if (spec.spec == 'f' || spec.spec == 'F')
1591         {
1592           if (spec.prec == -1)
1593             spec.prec = 6;
1594           if (regular_fg (np, p, spec, NULL) == -1)
1595             goto error;
1596         }
1597       else if (spec.spec == 'e' || spec.spec == 'E')
1598         {
1599           if (regular_eg (np, p, spec, NULL) == -1)
1600             goto error;
1601         }
1602       else
1603         /* %g case */
1604         {
1605           /* Use the C99 rules:
1606              if T > X >= -4 then the conversion is with style 'f'/'F' and
1607              precision T-(X+1).
1608              otherwise, the conversion is with style 'e'/'E' and
1609              precision T-1.
1610              where T is the threshold computed below and X is the exponent
1611              that would be displayed with style 'e' and precision T-1. */
1612           int threshold;
1613           mpfr_exp_t x;
1614           struct decimal_info dec_info;
1615
1616           threshold = (spec.prec < 0) ? 6 : (spec.prec == 0) ? 1 : spec.prec;
1617           dec_info.str = mpfr_get_str (NULL, &dec_info.exp, 10, threshold,
1618                                         p, spec.rnd_mode);
1619           register_string (np->sl, dec_info.str);
1620           /* mpfr_get_str corresponds to a significand between 0.1 and 1,
1621              whereas here we want a significand between 1 and 10. */
1622           x = dec_info.exp - 1;
1623
1624           if (threshold > x && x >= -4)
1625             {
1626               /* the conversion is with style 'f' */
1627               spec.prec = threshold - x - 1;
1628
1629               if (regular_fg (np, p, spec, &dec_info) == -1)
1630                 goto error;
1631             }
1632           else
1633             {
1634               spec.prec = threshold - 1;
1635
1636               if (regular_eg (np, p, spec, &dec_info) == -1)
1637                 goto error;
1638             }
1639         }
1640     }
1641
1642   /* compute the number of characters to be written verifying it is not too
1643      much */
1644   total = np->sign ? 1 : 0;
1645   total += np->prefix_size;
1646   total += np->ip_size;
1647   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1648     goto error;
1649   total += np->ip_trailing_zeros;
1650   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1651     goto error;
1652   if (np->thousands_sep)
1653     /* ' flag, style f and the thousands separator in current locale is not
1654        reduced to the null character */
1655     total += (np->ip_size + np->ip_trailing_zeros) / 3;
1656   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1657     goto error;
1658   if (np->point)
1659     ++total;
1660   total += np->fp_leading_zeros;
1661   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1662     goto error;
1663   total += np->fp_size;
1664   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1665     goto error;
1666   total += np->fp_trailing_zeros;
1667   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1668     goto error;
1669   total += np->exp_size;
1670   if (MPFR_UNLIKELY (total < 0 || total > INT_MAX))
1671     goto error;
1672
1673   if (spec.width > total)
1674     /* pad with spaces or zeros depending on np->pad_type */
1675     {
1676       np->pad_size = spec.width - total;
1677       total += np->pad_size; /* here total == spec.width,
1678                                 so 0 < total < INT_MAX */
1679     }
1680
1681   return total;
1682
1683  error:
1684   clear_string_list (np->sl);
1685   np->prefix_ptr = NULL;
1686   np->ip_ptr = NULL;
1687   np->fp_ptr = NULL;
1688   np->exp_ptr = NULL;
1689   return -1;
1690 }
1691
1692 /* sprnt_fp prints a mpfr_t according to spec.spec specification.
1693
1694    return the size of the string (not counting the terminating '\0')
1695    return -1 if the built string is too long (i.e. has more than
1696    INT_MAX characters). */
1697 static int
1698 sprnt_fp (struct string_buffer *buf, mpfr_srcptr p,
1699           const struct printf_spec spec)
1700 {
1701   int length;
1702   struct number_parts np;
1703
1704   length = partition_number (&np, p, spec);
1705   if (length < 0)
1706     return -1;
1707
1708   /* right justification padding with left spaces */
1709   if (np.pad_type == LEFT && np.pad_size != 0)
1710     buffer_pad (buf, ' ', np.pad_size);
1711
1712   /* sign character (may be '-', '+', or ' ') */
1713   if (np.sign)
1714     buffer_pad (buf, np.sign, 1);
1715
1716   /* prefix part */
1717   if (np.prefix_ptr)
1718     buffer_cat (buf, np.prefix_ptr, np.prefix_size);
1719
1720   /* right justification  padding with leading zeros */
1721   if (np.pad_type == LEADING_ZEROS && np.pad_size != 0)
1722     buffer_pad (buf, '0', np.pad_size);
1723
1724   /* integral part (may also be "nan" or "inf") */
1725   MPFR_ASSERTN (np.ip_ptr != NULL); /* never empty */
1726   if (MPFR_UNLIKELY (np.thousands_sep))
1727     buffer_sandwich (buf, np.ip_ptr, np.ip_size, np.ip_trailing_zeros,
1728                      np.thousands_sep);
1729   else
1730     {
1731       buffer_cat (buf, np.ip_ptr, np.ip_size);
1732
1733       /* trailing zeros in integral part */
1734       if (np.ip_trailing_zeros != 0)
1735         buffer_pad (buf, '0', np.ip_trailing_zeros);
1736     }
1737
1738   /* decimal point */
1739   if (np.point)
1740     buffer_pad (buf, np.point, 1);
1741
1742   /* leading zeros in fractional part */
1743   if (np.fp_leading_zeros != 0)
1744     buffer_pad (buf, '0', np.fp_leading_zeros);
1745
1746   /* significant digits in fractional part */
1747   if (np.fp_ptr)
1748     buffer_cat (buf, np.fp_ptr, np.fp_size);
1749
1750   /* trailing zeros in fractional part */
1751   if (np.fp_trailing_zeros != 0)
1752     buffer_pad (buf, '0', np.fp_trailing_zeros);
1753
1754   /* exponent part */
1755   if (np.exp_ptr)
1756     buffer_cat (buf, np.exp_ptr, np.exp_size);
1757
1758   /* left justication padding with right spaces */
1759   if (np.pad_type == RIGHT && np.pad_size != 0)
1760     buffer_pad (buf, ' ', np.pad_size);
1761
1762   clear_string_list (np.sl);
1763   return length;
1764 }
1765
1766 int
1767 mpfr_vasprintf (char **ptr, const char *fmt, va_list ap)
1768 {
1769   struct string_buffer buf;
1770   size_t nbchar;
1771
1772   /* informations on the conversion specification filled by the parser */
1773   struct printf_spec spec;
1774   /* flag raised when previous part of fmt need to be processed by
1775      gmp_vsnprintf */
1776   int xgmp_fmt_flag;
1777   /* beginning and end of the previous unprocessed part of fmt */
1778   const char *start, *end;
1779   /* pointer to arguments for gmp_vasprintf */
1780   va_list ap2;
1781
1782   MPFR_SAVE_EXPO_DECL (expo);
1783   MPFR_SAVE_EXPO_MARK (expo);
1784
1785   nbchar = 0;
1786   buffer_init (&buf, 4096);
1787   xgmp_fmt_flag = 0;
1788   va_copy (ap2, ap);
1789   start = fmt;
1790   while (*fmt)
1791     {
1792       /* Look for the next format specification */
1793       while ((*fmt) && (*fmt != '%'))
1794         ++fmt;
1795
1796       if (*fmt == '\0')
1797         break;
1798
1799       if (*++fmt == '%')
1800         /* %%: go one step further otherwise the second '%' would be
1801            considered as a new conversion specification introducing
1802            character */
1803         {
1804           ++fmt;
1805           xgmp_fmt_flag = 1;
1806           continue;
1807         }
1808
1809       end = fmt - 1;
1810
1811       /* format string analysis */
1812       specinfo_init (&spec);
1813       fmt = parse_flags (fmt, &spec);
1814
1815       READ_INT (ap, fmt, spec, width, width_analysis);
1816     width_analysis:
1817       if (spec.width < 0)
1818         {
1819           spec.left = 1;
1820           spec.width = -spec.width;
1821           MPFR_ASSERTN (spec.width < INT_MAX);
1822         }
1823       if (*fmt == '.')
1824         {
1825           const char *f = ++fmt;
1826           READ_INT (ap, fmt, spec, prec, prec_analysis);
1827         prec_analysis:
1828           if (f == fmt)
1829             spec.prec = -1;
1830         }
1831       else
1832         spec.prec = -1;
1833
1834       fmt = parse_arg_type (fmt, &spec);
1835       if (spec.arg_type == UNSUPPORTED)
1836         /* the current architecture doesn't support this type */
1837         {
1838           goto error;
1839         }
1840       else if (spec.arg_type == MPFR_ARG)
1841         {
1842           switch (*fmt)
1843             {
1844             case '\0':
1845               break;
1846             case '*':
1847               ++fmt;
1848               spec.rnd_mode = (mpfr_rnd_t) va_arg (ap, int);
1849               break;
1850             case 'D':
1851               ++fmt;
1852               spec.rnd_mode = MPFR_RNDD;
1853               break;
1854             case 'U':
1855               ++fmt;
1856               spec.rnd_mode = MPFR_RNDU;
1857               break;
1858             case 'Y':
1859               ++fmt;
1860               spec.rnd_mode = MPFR_RNDA;
1861               break;
1862             case 'Z':
1863               ++fmt;
1864               spec.rnd_mode = MPFR_RNDZ;
1865               break;
1866             case 'N':
1867               ++fmt;
1868             default:
1869               spec.rnd_mode = MPFR_RNDN;
1870             }
1871         }
1872
1873       spec.spec = *fmt;
1874       if (!specinfo_is_valid (spec))
1875         goto error;
1876
1877       if (*fmt)
1878         fmt++;
1879
1880       /* Format processing */
1881       if (spec.spec == '\0')
1882         /* end of the format string */
1883         break;
1884       else if (spec.spec == 'n')
1885         /* put the number of characters written so far in the location pointed
1886            by the next va_list argument; the types of pointer accepted are the
1887            same as in GMP (except unsupported quad_t) plus pointer to a mpfr_t
1888            so as to be able to accept the same format strings. */
1889         {
1890           void *p;
1891           size_t nchar;
1892
1893           p = va_arg (ap, void *);
1894           FLUSH (xgmp_fmt_flag, start, end, ap2, &buf);
1895           va_end (ap2);
1896           start = fmt;
1897           nchar = buf.curr - buf.start;
1898
1899           switch (spec.arg_type)
1900             {
1901             case CHAR_ARG:
1902               *(char *) p = (char) nchar;
1903               break;
1904             case SHORT_ARG:
1905               *(short *) p = (short) nchar;
1906               break;
1907             case LONG_ARG:
1908               *(long *) p = (long) nchar;
1909               break;
1910 #ifdef HAVE_LONG_LONG
1911             case LONG_LONG_ARG:
1912               *(long long *) p = (long long) nchar;
1913               break;
1914 #endif
1915 #ifdef _MPFR_H_HAVE_INTMAX_T
1916             case INTMAX_ARG:
1917               *(intmax_t *) p = (intmax_t) nchar;
1918               break;
1919 #endif
1920             case SIZE_ARG:
1921               *(size_t *) p = nchar;
1922               break;
1923             case PTRDIFF_ARG:
1924               *(ptrdiff_t *) p = (ptrdiff_t) nchar;
1925               break;
1926             case MPF_ARG:
1927               mpf_set_ui ((mpf_ptr) p, (unsigned long) nchar);
1928               break;
1929             case MPQ_ARG:
1930               mpq_set_ui ((mpq_ptr) p, (unsigned long) nchar, 1L);
1931               break;
1932             case MP_LIMB_ARG:
1933               *(mp_limb_t *) p = (mp_limb_t) nchar;
1934               break;
1935             case MP_LIMB_ARRAY_ARG:
1936               {
1937                 mp_limb_t *q = (mp_limb_t *) p;
1938                 mp_size_t n;
1939                 n = va_arg (ap, mp_size_t);
1940                 if (n < 0)
1941                   n = -n;
1942                 else if (n == 0)
1943                   break;
1944
1945                 /* we assume here that mp_limb_t is wider than int */
1946                 *q = (mp_limb_t) nchar;
1947                 while (--n != 0)
1948                   {
1949                     q++;
1950                     *q = (mp_limb_t) 0;
1951                   }
1952               }
1953               break;
1954             case MPZ_ARG:
1955               mpz_set_ui ((mpz_ptr) p, (unsigned long) nchar);
1956               break;
1957
1958             case MPFR_ARG:
1959               mpfr_set_ui ((mpfr_ptr) p, (unsigned long) nchar,
1960                            spec.rnd_mode);
1961               break;
1962
1963             default:
1964               *(int *) p = (int) nchar;
1965             }
1966           va_copy (ap2, ap); /* after the switch, due to MP_LIMB_ARRAY_ARG
1967                                 case */
1968         }
1969       else if (spec.arg_type == MPFR_PREC_ARG)
1970         /* output mpfr_prec_t variable */
1971         {
1972           char *s;
1973           char format[MPFR_PREC_FORMAT_SIZE + 6]; /* see examples below */
1974           size_t length;
1975           mpfr_prec_t prec;
1976           prec = va_arg (ap, mpfr_prec_t);
1977
1978           FLUSH (xgmp_fmt_flag, start, end, ap2, &buf);
1979           va_end (ap2);
1980           va_copy (ap2, ap);
1981           start = fmt;
1982
1983           /* construct format string, like "%*.*hu" "%*.*u" or "%*.*lu" */
1984           format[0] = '%';
1985           format[1] = '*';
1986           format[2] = '.';
1987           format[3] = '*';
1988           format[4] = '\0';
1989           strcat (format, MPFR_PREC_FORMAT_TYPE);
1990           format[4 + MPFR_PREC_FORMAT_SIZE] = spec.spec;
1991           format[5 + MPFR_PREC_FORMAT_SIZE] = '\0';
1992           length = gmp_asprintf (&s, format, spec.width, spec.prec, prec);
1993           if (buf.size <= INT_MAX - length)
1994             {
1995               buffer_cat (&buf, s, length);
1996               mpfr_free_str (s);
1997             }
1998           else
1999             {
2000               mpfr_free_str (s);
2001               goto overflow_error;
2002             }
2003         }
2004       else if (spec.arg_type == MPFR_ARG)
2005         /* output a mpfr_t variable */
2006         {
2007           mpfr_srcptr p;
2008
2009           p = va_arg (ap, mpfr_srcptr);
2010
2011           FLUSH (xgmp_fmt_flag, start, end, ap2, &buf);
2012           va_end (ap2);
2013           va_copy (ap2, ap);
2014           start = fmt;
2015
2016           switch (spec.spec)
2017             {
2018             case 'a':
2019             case 'A':
2020             case 'b':
2021             case 'e':
2022             case 'E':
2023             case 'f':
2024             case 'F':
2025             case 'g':
2026             case 'G':
2027               if (sprnt_fp (&buf, p, spec) < 0)
2028                 goto overflow_error;
2029               break;
2030
2031             default:
2032               /* unsupported specifier */
2033               goto error;
2034             }
2035         }
2036       else
2037         /* gmp_printf specification, step forward in the va_list */
2038         {
2039           CONSUME_VA_ARG (spec, ap);
2040           xgmp_fmt_flag = 1;
2041         }
2042     }
2043
2044   if (start != fmt)
2045     FLUSH (xgmp_fmt_flag, start, fmt, ap2, &buf);
2046
2047   va_end (ap2);
2048   nbchar = buf.curr - buf.start;
2049   MPFR_ASSERTD (nbchar == strlen (buf.start));
2050   buf.start =
2051     (char *) (*__gmp_reallocate_func) (buf.start, buf.size, nbchar + 1);
2052   buf.size = nbchar + 1; /* update needed for __gmp_free_func below when
2053                             nbchar is too large (overflow_error) */
2054   *ptr = buf.start;
2055
2056   /* If nbchar is larger than INT_MAX, the ISO C99 standard is silent, but
2057      POSIX says concerning the snprintf() function:
2058      "[EOVERFLOW] The value of n is greater than {INT_MAX} or the
2059      number of bytes needed to hold the output excluding the
2060      terminating null is greater than {INT_MAX}." See:
2061      http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html
2062      But it doesn't say anything concerning the other printf-like functions.
2063      A defect report has been submitted to austin-review-l (item 2532).
2064      So, for the time being, we return a negative value and set the erange
2065      flag, and set errno to EOVERFLOW in POSIX system. */
2066   if (nbchar <= INT_MAX)
2067     {
2068       MPFR_SAVE_EXPO_FREE (expo);
2069       return nbchar;
2070     }
2071
2072  overflow_error:
2073   MPFR_SAVE_EXPO_UPDATE_FLAGS(expo, MPFR_FLAGS_ERANGE);
2074 #ifdef EOVERFLOW
2075   errno = EOVERFLOW;
2076 #endif
2077
2078  error:
2079   MPFR_SAVE_EXPO_FREE (expo);
2080   *ptr = NULL;
2081   (*__gmp_free_func) (buf.start, buf.size);
2082
2083   return -1;
2084 }
2085
2086 #endif /* HAVE_STDARG */