Home | History | Annotate | Line # | Download | only in tests
tsprintf.c revision 1.1.1.6
      1      1.1  mrg /* tsprintf.c -- test file for mpfr_sprintf, mpfr_vsprintf, mpfr_snprintf,
      2      1.1  mrg    and mpfr_vsnprintf
      3      1.1  mrg 
      4  1.1.1.6  mrg Copyright 2007-2023 Free Software Foundation, Inc.
      5  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      6  1.1.1.2  mrg 
      7  1.1.1.2  mrg This file is part of the GNU MPFR Library.
      8      1.1  mrg 
      9      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
     10      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     11      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     12      1.1  mrg option) any later version.
     13      1.1  mrg 
     14      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     15      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     17      1.1  mrg License for more details.
     18      1.1  mrg 
     19      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     20      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     21  1.1.1.5  mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     22      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     23      1.1  mrg 
     24  1.1.1.6  mrg /* Note: If you use a C99-compatible implementation and GMP (or MPIR)
     25  1.1.1.6  mrg  * has been compiled without HAVE_VSNPRINTF defined, then this test
     26  1.1.1.6  mrg  * may fail with an error like
     27  1.1.1.6  mrg  *   repl-vsnprintf.c:389: GNU MP assertion failed: len < total_width
     28  1.1.1.6  mrg  *
     29  1.1.1.6  mrg  * The reason is that __gmp_replacement_vsnprintf does not support %a/%A,
     30  1.1.1.6  mrg  * even though the C library supports it.
     31  1.1.1.6  mrg  *
     32  1.1.1.6  mrg  * References:
     33  1.1.1.6  mrg  *   https://sympa.inria.fr/sympa/arc/mpfr/2022-10/msg00001.html
     34  1.1.1.6  mrg  *   https://sympa.inria.fr/sympa/arc/mpfr/2022-10/msg00027.html
     35  1.1.1.6  mrg  *   https://gmplib.org/list-archives/gmp-bugs/2022-October/005200.html
     36  1.1.1.6  mrg  */
     37  1.1.1.6  mrg 
     38  1.1.1.5  mrg /* Needed due to the tests on HAVE_STDARG and MPFR_USE_MINI_GMP */
     39  1.1.1.4  mrg #ifdef HAVE_CONFIG_H
     40  1.1.1.4  mrg # include "config.h"
     41  1.1.1.4  mrg #endif
     42  1.1.1.4  mrg 
     43  1.1.1.4  mrg #if defined(HAVE_STDARG) && !defined(MPFR_USE_MINI_GMP)
     44      1.1  mrg #include <stdarg.h>
     45      1.1  mrg 
     46      1.1  mrg #include <float.h>
     47  1.1.1.5  mrg #include <errno.h>
     48      1.1  mrg 
     49      1.1  mrg #ifdef HAVE_LOCALE_H
     50      1.1  mrg #include <locale.h>
     51      1.1  mrg #endif
     52      1.1  mrg 
     53      1.1  mrg #include "mpfr-test.h"
     54      1.1  mrg 
     55      1.1  mrg const int prec_max_printf = 5000; /* limit for random precision in
     56      1.1  mrg                                      random_double() */
     57      1.1  mrg #define BUF_SIZE 65536
     58      1.1  mrg 
     59      1.1  mrg const char pinf_str[] = "inf";
     60      1.1  mrg const char pinf_uc_str[] = "INF";
     61      1.1  mrg const char minf_str[] = "-inf";
     62      1.1  mrg const char minf_uc_str[] = "-INF";
     63      1.1  mrg const char nan_str[] = "nan";
     64      1.1  mrg const char nan_uc_str[] = "NAN";
     65      1.1  mrg 
     66  1.1.1.4  mrg int randsize;
     67  1.1.1.4  mrg 
     68      1.1  mrg /* 1. compare expected string with the string BUFFER returned by
     69      1.1  mrg    mpfr_sprintf(buffer, fmt, x)
     70      1.1  mrg    2. then test mpfr_snprintf (buffer, p, fmt, x) with a random p. */
     71  1.1.1.6  mrg static void
     72      1.1  mrg check_sprintf (const char *expected, const char *fmt, mpfr_srcptr x)
     73      1.1  mrg {
     74  1.1.1.4  mrg   int n0, n1;
     75      1.1  mrg   char buffer[BUF_SIZE];
     76      1.1  mrg 
     77      1.1  mrg   /* test mpfr_sprintf */
     78      1.1  mrg   n0 = mpfr_sprintf (buffer, fmt, x);
     79      1.1  mrg   if (strcmp (buffer, expected) != 0)
     80      1.1  mrg     {
     81      1.1  mrg       printf ("Error in mpfr_sprintf (s, \"%s\", x);\n", fmt);
     82      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", expected, buffer);
     83      1.1  mrg 
     84      1.1  mrg       exit (1);
     85      1.1  mrg     }
     86      1.1  mrg 
     87      1.1  mrg   /* test mpfr_snprintf */
     88  1.1.1.4  mrg   randsize = (int) (randlimb () % (n0 + 3)) - 3;  /* between -3 and n0 - 1 */
     89  1.1.1.4  mrg   if (randsize < 0)
     90      1.1  mrg     {
     91      1.1  mrg       n1 = mpfr_snprintf (NULL, 0, fmt, x);
     92      1.1  mrg     }
     93      1.1  mrg   else
     94      1.1  mrg     {
     95  1.1.1.4  mrg       buffer[randsize] = 17;
     96  1.1.1.4  mrg       n1 = mpfr_snprintf (buffer, randsize, fmt, x);
     97  1.1.1.4  mrg       if (buffer[randsize] != 17)
     98      1.1  mrg         {
     99  1.1.1.4  mrg           printf ("Buffer overflow in mpfr_snprintf for randsize = %d!\n",
    100  1.1.1.4  mrg                   randsize);
    101      1.1  mrg           exit (1);
    102      1.1  mrg         }
    103      1.1  mrg     }
    104      1.1  mrg   if (n0 != n1)
    105      1.1  mrg     {
    106      1.1  mrg       printf ("Error in mpfr_snprintf (s, %d, \"%s\", x) return value\n",
    107  1.1.1.4  mrg               randsize, fmt);
    108  1.1.1.4  mrg       printf ("expected: %d\ngot:      %d\nx='", n0, n1);
    109  1.1.1.4  mrg       mpfr_printf (fmt, x);
    110  1.1.1.4  mrg       printf ("'\n");
    111      1.1  mrg       exit (1);
    112      1.1  mrg     }
    113  1.1.1.4  mrg   if ((randsize > 1 && strncmp (expected, buffer, randsize - 1) != 0)
    114  1.1.1.4  mrg       || (randsize == 1 && buffer[0] != '\0'))
    115      1.1  mrg     {
    116      1.1  mrg       char part_expected[BUF_SIZE];
    117  1.1.1.4  mrg       strncpy (part_expected, expected, randsize);
    118  1.1.1.4  mrg       part_expected[randsize - 1] = '\0';
    119  1.1.1.4  mrg       printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n",
    120  1.1.1.4  mrg               randsize, fmt);
    121      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", part_expected, buffer);
    122      1.1  mrg       exit (1);
    123      1.1  mrg     }
    124      1.1  mrg }
    125      1.1  mrg 
    126      1.1  mrg /* 1. compare expected string with the string BUFFER returned by
    127      1.1  mrg    mpfr_vsprintf(buffer, fmt, ...)
    128      1.1  mrg    2. then, test mpfr_vsnprintf. */
    129      1.1  mrg static int
    130      1.1  mrg check_vsprintf (const char *expected, const char *fmt, ...)
    131      1.1  mrg {
    132  1.1.1.4  mrg   int n0, n1;
    133      1.1  mrg   char buffer[BUF_SIZE];
    134      1.1  mrg   va_list ap0, ap1;
    135      1.1  mrg 
    136  1.1.1.4  mrg   va_start (ap0, fmt);
    137      1.1  mrg   n0 = mpfr_vsprintf (buffer, fmt, ap0);
    138  1.1.1.4  mrg   va_end (ap0);
    139  1.1.1.4  mrg 
    140      1.1  mrg   if (strcmp (buffer, expected) != 0)
    141      1.1  mrg     {
    142      1.1  mrg       printf ("Error in mpfr_vsprintf (s, \"%s\", ...);\n", fmt);
    143      1.1  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", expected, buffer);
    144      1.1  mrg       exit (1);
    145      1.1  mrg     }
    146  1.1.1.4  mrg 
    147  1.1.1.4  mrg   va_start (ap1, fmt);
    148      1.1  mrg 
    149      1.1  mrg   /* test mpfr_snprintf */
    150  1.1.1.4  mrg   randsize = (int) (randlimb () % (n0 + 3)) - 3;  /* between -3 and n0 - 1 */
    151  1.1.1.4  mrg   if (randsize < 0)
    152      1.1  mrg     {
    153      1.1  mrg       n1 = mpfr_vsnprintf (NULL, 0, fmt, ap1);
    154      1.1  mrg     }
    155      1.1  mrg   else
    156      1.1  mrg     {
    157  1.1.1.4  mrg       buffer[randsize] = 17;
    158  1.1.1.4  mrg       n1 = mpfr_vsnprintf (buffer, randsize, fmt, ap1);
    159  1.1.1.4  mrg       if (buffer[randsize] != 17)
    160      1.1  mrg         {
    161  1.1.1.4  mrg           printf ("Buffer overflow in mpfr_vsnprintf for randsize = %d!\n",
    162  1.1.1.4  mrg                   randsize);
    163      1.1  mrg           exit (1);
    164      1.1  mrg         }
    165      1.1  mrg     }
    166  1.1.1.4  mrg 
    167  1.1.1.4  mrg   va_end (ap1);
    168  1.1.1.4  mrg 
    169      1.1  mrg   if (n0 != n1)
    170      1.1  mrg     {
    171      1.1  mrg       printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...) return value\n",
    172  1.1.1.4  mrg               randsize, fmt);
    173      1.1  mrg       printf ("expected: %d\ngot:      %d\n", n0, n1);
    174      1.1  mrg       exit (1);
    175      1.1  mrg     }
    176  1.1.1.4  mrg   if ((randsize > 1 && strncmp (expected, buffer, randsize - 1) != 0)
    177  1.1.1.4  mrg       || (randsize == 1 && buffer[0] != '\0'))
    178      1.1  mrg     {
    179      1.1  mrg       char part_expected[BUF_SIZE];
    180      1.1  mrg 
    181  1.1.1.4  mrg       strncpy (part_expected, expected, randsize);
    182  1.1.1.4  mrg       part_expected[randsize - 1] = '\0';
    183  1.1.1.4  mrg       printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n",
    184  1.1.1.4  mrg               randsize, fmt);
    185  1.1.1.4  mrg       printf ("expected: \"%s\"\ngot:      \"%s\"\n", part_expected, buffer);
    186      1.1  mrg       exit (1);
    187      1.1  mrg     }
    188      1.1  mrg 
    189      1.1  mrg   return n0;
    190      1.1  mrg }
    191      1.1  mrg 
    192      1.1  mrg static void
    193      1.1  mrg native_types (void)
    194      1.1  mrg {
    195      1.1  mrg   int c = 'a';
    196      1.1  mrg   int i = -1;
    197      1.1  mrg   unsigned int ui = 1;
    198  1.1.1.6  mrg   double d[] = { -1.25, 7.62939453125e-6 /* 2^(-17) */ };
    199      1.1  mrg   char s[] = "test";
    200      1.1  mrg   char buf[255];
    201  1.1.1.6  mrg   int k;
    202      1.1  mrg 
    203      1.1  mrg   sprintf (buf, "%c", c);
    204      1.1  mrg   check_vsprintf (buf, "%c", c);
    205      1.1  mrg 
    206      1.1  mrg   sprintf (buf, "%d", i);
    207      1.1  mrg   check_vsprintf (buf, "%d", i);
    208      1.1  mrg 
    209  1.1.1.6  mrg   check_vsprintf ("0", "%d", 0);
    210  1.1.1.6  mrg   check_vsprintf ("", "%.d", 0);
    211  1.1.1.6  mrg   check_vsprintf ("", "%.0d", 0);
    212      1.1  mrg 
    213      1.1  mrg   sprintf (buf, "%i", i);
    214      1.1  mrg   check_vsprintf (buf, "%i", i);
    215      1.1  mrg 
    216  1.1.1.6  mrg   check_vsprintf ("0", "%i", 0);
    217  1.1.1.6  mrg   check_vsprintf ("", "%.i", 0);
    218  1.1.1.6  mrg   check_vsprintf ("", "%.0i", 0);
    219  1.1.1.6  mrg 
    220  1.1.1.6  mrg   for (k = 0; k < numberof(d); k++)
    221  1.1.1.6  mrg     {
    222  1.1.1.6  mrg       sprintf (buf, "%e", d[k]);
    223  1.1.1.6  mrg       check_vsprintf (buf, "%e", d[k]);
    224  1.1.1.6  mrg 
    225  1.1.1.6  mrg       sprintf (buf, "%E", d[k]);
    226  1.1.1.6  mrg       check_vsprintf (buf, "%E", d[k]);
    227  1.1.1.6  mrg 
    228  1.1.1.6  mrg       sprintf (buf, "%f", d[k]);
    229  1.1.1.6  mrg       check_vsprintf (buf, "%f", d[k]);
    230  1.1.1.6  mrg 
    231  1.1.1.6  mrg       sprintf (buf, "%g", d[k]);
    232  1.1.1.6  mrg       check_vsprintf (buf, "%g", d[k]);
    233  1.1.1.6  mrg 
    234  1.1.1.6  mrg       sprintf (buf, "%G", d[k]);
    235  1.1.1.6  mrg       check_vsprintf (buf, "%G", d[k]);
    236  1.1.1.6  mrg 
    237  1.1.1.6  mrg #if __MPFR_STDC (199901L)
    238  1.1.1.6  mrg 
    239  1.1.1.6  mrg       gmp_sprintf (buf, "%a", d[k]);
    240  1.1.1.6  mrg       check_vsprintf (buf, "%a", d[k]);
    241  1.1.1.6  mrg 
    242  1.1.1.6  mrg       gmp_sprintf (buf, "%A", d[k]);
    243  1.1.1.6  mrg       check_vsprintf (buf, "%A", d[k]);
    244  1.1.1.6  mrg 
    245  1.1.1.6  mrg       gmp_sprintf (buf, "%la", d[k]);
    246  1.1.1.6  mrg       check_vsprintf (buf, "%la", d[k]);
    247  1.1.1.6  mrg 
    248  1.1.1.6  mrg       gmp_sprintf (buf, "%lA", d[k]);
    249  1.1.1.6  mrg       check_vsprintf (buf, "%lA", d[k]);
    250  1.1.1.6  mrg 
    251  1.1.1.6  mrg       sprintf (buf, "%le", d[k]);
    252  1.1.1.6  mrg       check_vsprintf (buf, "%le", d[k]);
    253  1.1.1.6  mrg 
    254  1.1.1.6  mrg       sprintf (buf, "%lE", d[k]);
    255  1.1.1.6  mrg       check_vsprintf (buf, "%lE", d[k]);
    256  1.1.1.6  mrg 
    257  1.1.1.6  mrg       sprintf (buf, "%lf", d[k]);
    258  1.1.1.6  mrg       check_vsprintf (buf, "%lf", d[k]);
    259  1.1.1.6  mrg 
    260  1.1.1.6  mrg       sprintf (buf, "%lg", d[k]);
    261  1.1.1.6  mrg       check_vsprintf (buf, "%lg", d[k]);
    262  1.1.1.6  mrg 
    263  1.1.1.6  mrg       sprintf (buf, "%lG", d[k]);
    264  1.1.1.6  mrg       check_vsprintf (buf, "%lG", d[k]);
    265  1.1.1.6  mrg 
    266  1.1.1.6  mrg #endif
    267  1.1.1.6  mrg     }
    268      1.1  mrg 
    269      1.1  mrg   sprintf (buf, "%o", i);
    270      1.1  mrg   check_vsprintf (buf, "%o", i);
    271      1.1  mrg 
    272      1.1  mrg   sprintf (buf, "%s", s);
    273      1.1  mrg   check_vsprintf (buf, "%s", s);
    274      1.1  mrg 
    275      1.1  mrg   sprintf (buf, "--%s++", "");
    276      1.1  mrg   check_vsprintf (buf, "--%s++", "");
    277      1.1  mrg 
    278      1.1  mrg   sprintf (buf, "%u", ui);
    279      1.1  mrg   check_vsprintf (buf, "%u", ui);
    280      1.1  mrg 
    281      1.1  mrg   sprintf (buf, "%x", ui);
    282      1.1  mrg   check_vsprintf (buf, "%x", ui);
    283      1.1  mrg }
    284      1.1  mrg 
    285  1.1.1.6  mrg static void
    286      1.1  mrg decimal (void)
    287      1.1  mrg {
    288      1.1  mrg   mpfr_prec_t p = 128;
    289  1.1.1.5  mrg   mpfr_t x, y, z;
    290  1.1.1.5  mrg 
    291      1.1  mrg   /* specifier 'P' for precision */
    292      1.1  mrg   check_vsprintf ("128", "%Pu", p);
    293      1.1  mrg   check_vsprintf ("00128", "%.5Pu", p);
    294  1.1.1.5  mrg   check_vsprintf ("  128", "%5Pu", p);
    295  1.1.1.5  mrg   check_vsprintf ("000128", "%06Pu", p);
    296  1.1.1.5  mrg   check_vsprintf ("128    :", "%-7Pu:", p);
    297  1.1.1.5  mrg   check_vsprintf ("000128:", "%-2.6Pd:", p);
    298  1.1.1.5  mrg   check_vsprintf ("  000128:", "%8.6Pd:", p);
    299  1.1.1.5  mrg   check_vsprintf ("000128  :", "%-8.6Pd:", p);
    300  1.1.1.5  mrg   check_vsprintf ("+128:", "%+Pd:", p);
    301  1.1.1.5  mrg   check_vsprintf (" 128:", "% Pd:", p);
    302  1.1.1.5  mrg   check_vsprintf ("80:", "% Px:", p);
    303  1.1.1.5  mrg   check_vsprintf ("0x80:", "% #Px:", p);
    304  1.1.1.5  mrg   check_vsprintf ("0x80:", "%0#+ -Px:", p);
    305  1.1.1.5  mrg   check_vsprintf ("0200:", "%0#+ -Po:", p);
    306  1.1.1.5  mrg   check_vsprintf ("+0000128 :", "%0+ *.*Pd:", -9, 7, p);
    307  1.1.1.5  mrg   check_vsprintf ("+12345   :", "%0+ -*.*Pd:", -9, -3, (mpfr_prec_t) 12345);
    308  1.1.1.6  mrg   check_vsprintf ("0", "%Pu", (mpfr_prec_t) 0);
    309  1.1.1.5  mrg   /* Do not add a test like "%05.1Pd" as MS Windows is buggy: when
    310  1.1.1.5  mrg      a precision is given, the '0' flag must be ignored. */
    311      1.1  mrg 
    312  1.1.1.6  mrg   /* specifier 'P' with precision field 0 */
    313  1.1.1.6  mrg   check_vsprintf ("128", "%.Pu", p);
    314  1.1.1.6  mrg   check_vsprintf ("128", "%.0Pd", p);
    315  1.1.1.6  mrg   check_vsprintf ("", "%.Pu", (mpfr_prec_t) 0);
    316  1.1.1.6  mrg   check_vsprintf ("", "%.0Pd", (mpfr_prec_t) 0);
    317  1.1.1.6  mrg 
    318  1.1.1.6  mrg   mpfr_init (z);
    319  1.1.1.6  mrg   mpfr_init2 (x, 128);
    320  1.1.1.6  mrg 
    321      1.1  mrg   /* special numbers */
    322      1.1  mrg   mpfr_set_inf (x, 1);
    323      1.1  mrg   check_sprintf (pinf_str, "%Re", x);
    324      1.1  mrg   check_sprintf (pinf_str, "%RUe", x);
    325      1.1  mrg   check_sprintf (pinf_uc_str, "%RE", x);
    326      1.1  mrg   check_sprintf (pinf_uc_str, "%RDE", x);
    327      1.1  mrg   check_sprintf (pinf_str, "%Rf", x);
    328      1.1  mrg   check_sprintf (pinf_str, "%RYf", x);
    329      1.1  mrg   check_sprintf (pinf_uc_str, "%RF", x);
    330      1.1  mrg   check_sprintf (pinf_uc_str, "%RZF", x);
    331      1.1  mrg   check_sprintf (pinf_str, "%Rg", x);
    332      1.1  mrg   check_sprintf (pinf_str, "%RNg", x);
    333      1.1  mrg   check_sprintf (pinf_uc_str, "%RG", x);
    334      1.1  mrg   check_sprintf (pinf_uc_str, "%RUG", x);
    335      1.1  mrg   check_sprintf ("       inf", "%010Re", x);
    336      1.1  mrg   check_sprintf ("       inf", "%010RDe", x);
    337      1.1  mrg 
    338      1.1  mrg   mpfr_set_inf (x, -1);
    339      1.1  mrg   check_sprintf (minf_str, "%Re", x);
    340      1.1  mrg   check_sprintf (minf_str, "%RYe", x);
    341      1.1  mrg   check_sprintf (minf_uc_str, "%RE", x);
    342      1.1  mrg   check_sprintf (minf_uc_str, "%RZE", x);
    343      1.1  mrg   check_sprintf (minf_str, "%Rf", x);
    344      1.1  mrg   check_sprintf (minf_str, "%RNf", x);
    345      1.1  mrg   check_sprintf (minf_uc_str, "%RF", x);
    346      1.1  mrg   check_sprintf (minf_uc_str, "%RUF", x);
    347      1.1  mrg   check_sprintf (minf_str, "%Rg", x);
    348      1.1  mrg   check_sprintf (minf_str, "%RDg", x);
    349      1.1  mrg   check_sprintf (minf_uc_str, "%RG", x);
    350      1.1  mrg   check_sprintf (minf_uc_str, "%RYG", x);
    351      1.1  mrg   check_sprintf ("      -inf", "%010Re", x);
    352      1.1  mrg   check_sprintf ("      -inf", "%010RZe", x);
    353      1.1  mrg 
    354      1.1  mrg   mpfr_set_nan (x);
    355      1.1  mrg   check_sprintf (nan_str, "%Re", x);
    356      1.1  mrg   check_sprintf (nan_str, "%RNe", x);
    357      1.1  mrg   check_sprintf (nan_uc_str, "%RE", x);
    358      1.1  mrg   check_sprintf (nan_uc_str, "%RUE", x);
    359      1.1  mrg   check_sprintf (nan_str, "%Rf", x);
    360      1.1  mrg   check_sprintf (nan_str, "%RDf", x);
    361      1.1  mrg   check_sprintf (nan_uc_str, "%RF", x);
    362      1.1  mrg   check_sprintf (nan_uc_str, "%RYF", x);
    363      1.1  mrg   check_sprintf (nan_str, "%Rg", x);
    364      1.1  mrg   check_sprintf (nan_str, "%RZg", x);
    365      1.1  mrg   check_sprintf (nan_uc_str, "%RG", x);
    366      1.1  mrg   check_sprintf (nan_uc_str, "%RNG", x);
    367      1.1  mrg   check_sprintf ("       nan", "%010Re", x);
    368      1.1  mrg 
    369      1.1  mrg   /* positive numbers */
    370      1.1  mrg   mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
    371  1.1.1.5  mrg   mpfr_init2 (y, 59);
    372  1.1.1.5  mrg   mpfr_set (y, x, MPFR_RNDN);
    373      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDD);
    374      1.1  mrg 
    375      1.1  mrg   /* simplest case right justified */
    376  1.1.1.5  mrg   check_sprintf ("1.899347461279296875000000000000000000000e+07", "%30Re", x);
    377  1.1.1.5  mrg   check_sprintf ("      1.899347461279296875e+07", "%30Re", y);
    378      1.1  mrg   check_sprintf ("                         2e+07", "%30.0Re", x);
    379      1.1  mrg   check_sprintf ("               18993474.612793", "%30Rf", x);
    380      1.1  mrg   check_sprintf ("              18993474.6127930", "%30.7Rf", x);
    381      1.1  mrg   check_sprintf ("                   1.89935e+07", "%30Rg", x);
    382      1.1  mrg   check_sprintf ("                         2e+07", "%30.0Rg", x);
    383      1.1  mrg   check_sprintf ("          18993474.61279296875", "%30.19Rg", x);
    384  1.1.1.5  mrg   check_sprintf ("        0.0000000000000000e+00", "%30Re", z);
    385  1.1.1.5  mrg   check_sprintf ("                      0.000000", "%30Rf", z);
    386  1.1.1.5  mrg   check_sprintf ("                             0", "%30Rg", z);
    387  1.1.1.5  mrg   check_sprintf ("                       0.00000", "%#30Rg", z);
    388      1.1  mrg   check_sprintf ("                         0e+00", "%30.0Re", z);
    389      1.1  mrg   check_sprintf ("                             0", "%30.0Rf", z);
    390      1.1  mrg   check_sprintf ("                        0.0000", "%30.4Rf", z);
    391      1.1  mrg   check_sprintf ("                             0", "%30.0Rg", z);
    392      1.1  mrg   check_sprintf ("                             0", "%30.4Rg", z);
    393      1.1  mrg   /* sign or space, pad with leading zeros */
    394  1.1.1.5  mrg   check_sprintf (" 1.899347461279296875000000000000000000000E+07", "% 030RE", x);
    395  1.1.1.5  mrg   check_sprintf (" 000001.899347461279296875E+07", "% 030RE", y);
    396      1.1  mrg   check_sprintf (" 0000000000000000001.89935E+07", "% 030RG", x);
    397      1.1  mrg   check_sprintf (" 0000000000000000000000002E+07", "% 030.0RE", x);
    398      1.1  mrg   check_sprintf (" 0000000000000000000000000E+00", "% 030.0RE", z);
    399      1.1  mrg   check_sprintf (" 00000000000000000000000000000", "% 030.0RF", z);
    400      1.1  mrg   /* sign + or -, left justified */
    401  1.1.1.5  mrg   check_sprintf ("+1.899347461279296875000000000000000000000e+07", "%+-30Re", x);
    402  1.1.1.5  mrg   check_sprintf ("+1.899347461279296875e+07     ", "%+-30Re", y);
    403      1.1  mrg   check_sprintf ("+2e+07                        ", "%+-30.0Re", x);
    404      1.1  mrg   check_sprintf ("+0e+00                        ", "%+-30.0Re", z);
    405      1.1  mrg   check_sprintf ("+0                            ", "%+-30.0Rf", z);
    406      1.1  mrg   /* decimal point, left justified, precision and rounding parameter */
    407      1.1  mrg   check_vsprintf ("1.9E+07   ", "%#-10.*R*E", 1, MPFR_RNDN, x);
    408      1.1  mrg   check_vsprintf ("2.E+07    ", "%#*.*R*E", -10, 0, MPFR_RNDN, x);
    409      1.1  mrg   check_vsprintf ("2.E+07    ", "%#-10.*R*G", 0, MPFR_RNDN, x);
    410      1.1  mrg   check_vsprintf ("0.E+00    ", "%#-10.*R*E", 0, MPFR_RNDN, z);
    411      1.1  mrg   check_vsprintf ("0.        ", "%#-10.*R*F", 0, MPFR_RNDN, z);
    412      1.1  mrg   check_vsprintf ("0.        ", "%#-10.*R*G", 0, MPFR_RNDN, z);
    413      1.1  mrg   /* sign or space */
    414      1.1  mrg   check_sprintf (" 1.899e+07", "% .3RNe", x);
    415      1.1  mrg   check_sprintf (" 2e+07",     "% .0RNe", x);
    416      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    417      1.1  mrg   check_sprintf ("+0001.8E+07", "%0+#11.1RZE", x);
    418      1.1  mrg   check_sprintf ("+00001.E+07", "%0+#11.0RZE", x);
    419      1.1  mrg   check_sprintf ("+0000.0E+00", "%0+#11.1RZE", z);
    420      1.1  mrg   check_sprintf ("+00000000.0", "%0+#11.1RZF", z);
    421      1.1  mrg   /* pad with leading zero */
    422  1.1.1.5  mrg   check_sprintf ("1.899347461279296875000000000000000000000e+07", "%030RDe", x);
    423  1.1.1.5  mrg   check_sprintf ("0000001.899347461279296875e+07", "%030RDe", y);
    424      1.1  mrg   check_sprintf ("00000000000000000000000001e+07", "%030.0RDe", x);
    425      1.1  mrg   /* sign or space, decimal point, left justified */
    426      1.1  mrg   check_sprintf (" 1.8E+07   ", "%- #11.1RDE", x);
    427      1.1  mrg   check_sprintf (" 1.E+07    ", "%- #11.0RDE", x);
    428  1.1.1.4  mrg   /* large requested precision */
    429  1.1.1.4  mrg   check_sprintf ("18993474.61279296875", "%.2147483647Rg", x);
    430      1.1  mrg 
    431      1.1  mrg   /* negative numbers */
    432      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    433      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    434      1.1  mrg 
    435      1.1  mrg   /* sign + or - */
    436      1.1  mrg   check_sprintf ("  -1.8e+07", "%+10.1RUe", x);
    437      1.1  mrg   check_sprintf ("    -1e+07", "%+10.0RUe", x);
    438      1.1  mrg   check_sprintf ("    -0e+00", "%+10.0RUe", z);
    439      1.1  mrg   check_sprintf ("        -0", "%+10.0RUf", z);
    440      1.1  mrg 
    441      1.1  mrg   /* neighborhood of 1 */
    442      1.1  mrg   mpfr_set_str (x, "0.99993896484375", 10, MPFR_RNDN);
    443  1.1.1.5  mrg   mpfr_set_prec (y, 43);
    444  1.1.1.5  mrg   mpfr_set (y, x, MPFR_RNDN);
    445  1.1.1.5  mrg   check_sprintf ("9.999389648437500000000000000000000000000E-01", "%-20RE", x);
    446  1.1.1.5  mrg   check_sprintf ("9.9993896484375E-01 ", "%-20RE", y);
    447  1.1.1.6  mrg   check_sprintf ("1E+00               ", "%-20.RE", x);
    448  1.1.1.6  mrg   check_sprintf ("1E+00               ", "%-20.RE", y);
    449      1.1  mrg   check_sprintf ("1E+00               ", "%-20.0RE", x);
    450      1.1  mrg   check_sprintf ("1.0E+00             ", "%-20.1RE", x);
    451      1.1  mrg   check_sprintf ("1.00E+00            ", "%-20.2RE", x);
    452      1.1  mrg   check_sprintf ("9.999E-01           ", "%-20.3RE", x);
    453      1.1  mrg   check_sprintf ("9.9994E-01          ", "%-20.4RE", x);
    454      1.1  mrg   check_sprintf ("0.999939            ", "%-20RF", x);
    455  1.1.1.6  mrg   check_sprintf ("1                   ", "%-20.RF", x);
    456      1.1  mrg   check_sprintf ("1                   ", "%-20.0RF", x);
    457      1.1  mrg   check_sprintf ("1.0                 ", "%-20.1RF", x);
    458      1.1  mrg   check_sprintf ("1.00                ", "%-20.2RF", x);
    459      1.1  mrg   check_sprintf ("1.000               ", "%-20.3RF", x);
    460      1.1  mrg   check_sprintf ("0.9999              ", "%-20.4RF", x);
    461      1.1  mrg   check_sprintf ("0.999939            ", "%-#20RF", x);
    462  1.1.1.6  mrg   check_sprintf ("1.                  ", "%-#20.RF", x);
    463      1.1  mrg   check_sprintf ("1.                  ", "%-#20.0RF", x);
    464      1.1  mrg   check_sprintf ("1.0                 ", "%-#20.1RF", x);
    465      1.1  mrg   check_sprintf ("1.00                ", "%-#20.2RF", x);
    466      1.1  mrg   check_sprintf ("1.000               ", "%-#20.3RF", x);
    467      1.1  mrg   check_sprintf ("0.9999              ", "%-#20.4RF", x);
    468  1.1.1.6  mrg   check_sprintf ("0.999939            ", "%-20RG", x);
    469  1.1.1.6  mrg   check_sprintf ("1                   ", "%-20.RG", x);
    470      1.1  mrg   check_sprintf ("1                   ", "%-20.0RG", x);
    471      1.1  mrg   check_sprintf ("1                   ", "%-20.1RG", x);
    472      1.1  mrg   check_sprintf ("1                   ", "%-20.2RG", x);
    473      1.1  mrg   check_sprintf ("1                   ", "%-20.3RG", x);
    474      1.1  mrg   check_sprintf ("0.9999              ", "%-20.4RG", x);
    475      1.1  mrg   check_sprintf ("0.999939            ", "%-#20RG", x);
    476  1.1.1.6  mrg   check_sprintf ("1.                  ", "%-#20.RG", x);
    477      1.1  mrg   check_sprintf ("1.                  ", "%-#20.0RG", x);
    478      1.1  mrg   check_sprintf ("1.                  ", "%-#20.1RG", x);
    479      1.1  mrg   check_sprintf ("1.0                 ", "%-#20.2RG", x);
    480      1.1  mrg   check_sprintf ("1.00                ", "%-#20.3RG", x);
    481      1.1  mrg   check_sprintf ("0.9999              ", "%-#20.4RG", x);
    482      1.1  mrg 
    483  1.1.1.5  mrg   /* powers of 10 */
    484      1.1  mrg   mpfr_set_str (x, "1e17", 10, MPFR_RNDN);
    485  1.1.1.5  mrg   check_sprintf ("1.000000000000000000000000000000000000000e+17", "%Re", x);
    486      1.1  mrg   check_sprintf ("1.000e+17", "%.3Re", x);
    487  1.1.1.6  mrg   check_sprintf ("100000000000000000", "%.Rf", x);
    488      1.1  mrg   check_sprintf ("100000000000000000", "%.0Rf", x);
    489      1.1  mrg   check_sprintf ("100000000000000000.0", "%.1Rf", x);
    490      1.1  mrg   check_sprintf ("100000000000000000.000000", "%'Rf", x);
    491      1.1  mrg   check_sprintf ("100000000000000000.0", "%'.1Rf", x);
    492      1.1  mrg 
    493      1.1  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN); /* x=1e-17 */
    494  1.1.1.5  mrg   check_sprintf ("1.000000000000000000000000000000000000000e-17", "%Re", x);
    495      1.1  mrg   check_sprintf ("0.000000", "%Rf", x);
    496      1.1  mrg   check_sprintf ("1e-17", "%Rg", x);
    497      1.1  mrg   check_sprintf ("0.0", "%.1RDf", x);
    498      1.1  mrg   check_sprintf ("0.0", "%.1RZf", x);
    499      1.1  mrg   check_sprintf ("0.1", "%.1RUf", x);
    500      1.1  mrg   check_sprintf ("0.1", "%.1RYf", x);
    501      1.1  mrg   check_sprintf ("0", "%.0RDf", x);
    502      1.1  mrg   check_sprintf ("0", "%.0RZf", x);
    503      1.1  mrg   check_sprintf ("1", "%.0RUf", x);
    504      1.1  mrg   check_sprintf ("1", "%.0RYf", x);
    505      1.1  mrg 
    506  1.1.1.5  mrg   /* powers of 10 with 'g' style */
    507  1.1.1.2  mrg   mpfr_set_str (x, "10", 10, MPFR_RNDN);
    508  1.1.1.2  mrg   check_sprintf ("10", "%Rg", x);
    509  1.1.1.2  mrg   check_sprintf ("1e+01", "%.0Rg", x);
    510  1.1.1.2  mrg   check_sprintf ("1e+01", "%.1Rg", x);
    511  1.1.1.2  mrg   check_sprintf ("10", "%.2Rg", x);
    512  1.1.1.2  mrg 
    513  1.1.1.2  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN);
    514  1.1.1.2  mrg   check_sprintf ("0.1", "%Rg", x);
    515  1.1.1.2  mrg   check_sprintf ("0.1", "%.0Rg", x);
    516  1.1.1.2  mrg   check_sprintf ("0.1", "%.1Rg", x);
    517  1.1.1.2  mrg 
    518  1.1.1.2  mrg   mpfr_set_str (x, "1000", 10, MPFR_RNDN);
    519  1.1.1.2  mrg   check_sprintf ("1000", "%Rg", x);
    520  1.1.1.2  mrg   check_sprintf ("1e+03", "%.0Rg", x);
    521  1.1.1.2  mrg   check_sprintf ("1e+03", "%.3Rg", x);
    522  1.1.1.2  mrg   check_sprintf ("1000", "%.4Rg", x);
    523  1.1.1.5  mrg   check_sprintf ("1e+03", "%.3Rg", x);
    524  1.1.1.5  mrg   check_sprintf ("1000", "%.4Rg", x);
    525  1.1.1.5  mrg   check_sprintf ("    1e+03", "%9.3Rg", x);
    526  1.1.1.5  mrg   check_sprintf ("     1000", "%9.4Rg", x);
    527  1.1.1.5  mrg   check_sprintf ("00001e+03", "%09.3Rg", x);
    528  1.1.1.5  mrg   check_sprintf ("000001000", "%09.4Rg", x);
    529  1.1.1.2  mrg 
    530  1.1.1.2  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN);
    531  1.1.1.2  mrg   check_sprintf ("0.001", "%Rg", x);
    532  1.1.1.2  mrg   check_sprintf ("0.001", "%.0Rg", x);
    533  1.1.1.2  mrg   check_sprintf ("0.001", "%.1Rg", x);
    534  1.1.1.2  mrg 
    535  1.1.1.2  mrg   mpfr_set_str (x, "100000", 10, MPFR_RNDN);
    536  1.1.1.2  mrg   check_sprintf ("100000", "%Rg", x);
    537  1.1.1.2  mrg   check_sprintf ("1e+05", "%.0Rg", x);
    538  1.1.1.2  mrg   check_sprintf ("1e+05", "%.5Rg", x);
    539  1.1.1.2  mrg   check_sprintf ("100000", "%.6Rg", x);
    540  1.1.1.5  mrg   check_sprintf ("            1e+05", "%17.5Rg", x);
    541  1.1.1.5  mrg   check_sprintf ("           100000", "%17.6Rg", x);
    542  1.1.1.5  mrg   check_sprintf ("0000000000001e+05", "%017.5Rg", x);
    543  1.1.1.5  mrg   check_sprintf ("00000000000100000", "%017.6Rg", x);
    544  1.1.1.2  mrg 
    545  1.1.1.2  mrg   mpfr_ui_div (x, 1, x, MPFR_RNDN);
    546  1.1.1.2  mrg   check_sprintf ("1e-05", "%Rg", x);
    547  1.1.1.2  mrg   check_sprintf ("1e-05", "%.0Rg", x);
    548  1.1.1.2  mrg   check_sprintf ("1e-05", "%.1Rg", x);
    549  1.1.1.2  mrg 
    550      1.1  mrg   /* check rounding mode */
    551      1.1  mrg   mpfr_set_str (x, "0.0076", 10, MPFR_RNDN);
    552      1.1  mrg   check_sprintf ("0.007", "%.3RDF", x);
    553      1.1  mrg   check_sprintf ("0.007", "%.3RZF", x);
    554      1.1  mrg   check_sprintf ("0.008", "%.3RF", x);
    555      1.1  mrg   check_sprintf ("0.008", "%.3RUF", x);
    556      1.1  mrg   check_sprintf ("0.008", "%.3RYF", x);
    557      1.1  mrg   check_vsprintf ("0.008", "%.3R*F", MPFR_RNDA, x);
    558      1.1  mrg 
    559      1.1  mrg   /* check limit between %f-style and %g-style */
    560      1.1  mrg   mpfr_set_str (x, "0.0000999", 10, MPFR_RNDN);
    561      1.1  mrg   check_sprintf ("0.0001",   "%.0Rg", x);
    562      1.1  mrg   check_sprintf ("9e-05",    "%.0RDg", x);
    563      1.1  mrg   check_sprintf ("0.0001",   "%.1Rg", x);
    564      1.1  mrg   check_sprintf ("0.0001",   "%.2Rg", x);
    565      1.1  mrg   check_sprintf ("9.99e-05", "%.3Rg", x);
    566      1.1  mrg 
    567      1.1  mrg   /* trailing zeros */
    568      1.1  mrg   mpfr_set_si_2exp (x, -1, -15, MPFR_RNDN); /* x=-2^-15 */
    569      1.1  mrg   check_sprintf ("-3.0517578125e-05", "%.30Rg", x);
    570      1.1  mrg   check_sprintf ("-3.051757812500000000000000000000e-05", "%.30Re", x);
    571      1.1  mrg   check_sprintf ("-3.05175781250000000000000000000e-05", "%#.30Rg", x);
    572      1.1  mrg   check_sprintf ("-0.000030517578125000000000000000", "%.30Rf", x);
    573      1.1  mrg 
    574      1.1  mrg   /* bug 20081023 */
    575      1.1  mrg   check_sprintf ("-3.0517578125e-05", "%.30Rg", x);
    576      1.1  mrg   mpfr_set_str (x, "1.9999", 10, MPFR_RNDN);
    577      1.1  mrg   check_sprintf ("1.999900  ", "%-#10.7RG", x);
    578      1.1  mrg   check_sprintf ("1.9999    ", "%-10.7RG", x);
    579      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    580  1.1.1.3  mrg   check_sprintf ("1.", "%#.1Rg", x);
    581  1.1.1.3  mrg   check_sprintf ("1.   ", "%-#5.1Rg", x);
    582  1.1.1.3  mrg   check_sprintf ("  1.0", "%#5.2Rg", x);
    583      1.1  mrg   check_sprintf ("1.00000000000000000000000000000", "%#.30Rg", x);
    584      1.1  mrg   check_sprintf ("1", "%.30Rg", x);
    585      1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
    586  1.1.1.3  mrg   check_sprintf ("0.", "%#.1Rg", x);
    587  1.1.1.3  mrg   check_sprintf ("0.   ", "%-#5.1Rg", x);
    588  1.1.1.3  mrg   check_sprintf ("  0.0", "%#5.2Rg", x);
    589  1.1.1.3  mrg   check_sprintf ("0.00000000000000000000000000000", "%#.30Rg", x);
    590      1.1  mrg   check_sprintf ("0", "%.30Rg", x);
    591      1.1  mrg 
    592      1.1  mrg   /* following tests with precision 53 bits */
    593      1.1  mrg   mpfr_set_prec (x, 53);
    594      1.1  mrg 
    595      1.1  mrg   /* Exponent zero has a plus sign */
    596      1.1  mrg   mpfr_set_str (x, "-9.95645044213728791504536275169812142849e-01", 10,
    597      1.1  mrg                 MPFR_RNDN);
    598      1.1  mrg   check_sprintf ("-1.0e+00", "%- #0.1Re", x);
    599      1.1  mrg 
    600      1.1  mrg   /* Decimal point and no figure after it with '#' flag and 'G' style */
    601      1.1  mrg   mpfr_set_str (x, "-9.90597761233942053494e-01", 10, MPFR_RNDN);
    602      1.1  mrg   check_sprintf ("-1.", "%- #0.1RG", x);
    603      1.1  mrg 
    604      1.1  mrg   /* precision zero */
    605  1.1.1.2  mrg   mpfr_set_d (x, 9.5, MPFR_RNDN);
    606  1.1.1.2  mrg   check_sprintf ("9",    "%.0RDf", x);
    607  1.1.1.2  mrg   check_sprintf ("10",    "%.0RUf", x);
    608  1.1.1.2  mrg 
    609  1.1.1.2  mrg   mpfr_set_d (x, 19.5, MPFR_RNDN);
    610  1.1.1.2  mrg   check_sprintf ("19",    "%.0RDf", x);
    611  1.1.1.2  mrg   check_sprintf ("20",    "%.0RUf", x);
    612  1.1.1.2  mrg 
    613  1.1.1.2  mrg   mpfr_set_d (x, 99.5, MPFR_RNDN);
    614  1.1.1.2  mrg   check_sprintf ("99",    "%.0RDf", x);
    615  1.1.1.2  mrg   check_sprintf ("100",   "%.0RUf", x);
    616  1.1.1.2  mrg 
    617      1.1  mrg   mpfr_set_d (x, -9.5, MPFR_RNDN);
    618      1.1  mrg   check_sprintf ("-10",    "%.0RDf", x);
    619      1.1  mrg   check_sprintf ("-10",    "%.0RYf", x);
    620      1.1  mrg   check_sprintf ("-10",    "%.0Rf", x);
    621      1.1  mrg   check_sprintf ("-1e+01", "%.0Re", x);
    622      1.1  mrg   check_sprintf ("-1e+01", "%.0Rg", x);
    623      1.1  mrg   mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN);
    624      1.1  mrg   check_sprintf ("0",      "%.0Rf", x);
    625      1.1  mrg   check_sprintf ("5e-01",  "%.0Re", x);
    626      1.1  mrg   check_sprintf ("0.5",    "%.0Rg", x);
    627      1.1  mrg   mpfr_set_ui_2exp (x, 3, -1, MPFR_RNDN);
    628      1.1  mrg   check_sprintf ("2",      "%.0Rf", x);
    629      1.1  mrg   mpfr_set_ui_2exp (x, 5, -1, MPFR_RNDN);
    630      1.1  mrg   check_sprintf ("2",      "%.0Rf", x);
    631      1.1  mrg   mpfr_set_ui (x, 0x1f, MPFR_RNDN);
    632      1.1  mrg   check_sprintf ("0x1p+5", "%.0Ra", x);
    633      1.1  mrg   mpfr_set_ui (x, 3, MPFR_RNDN);
    634      1.1  mrg   check_sprintf ("1p+2",   "%.0Rb", x);
    635      1.1  mrg 
    636      1.1  mrg   /* round to next ten power with %f but not with %g */
    637      1.1  mrg   mpfr_set_str (x, "-6.64464380544039223686e-02", 10, MPFR_RNDN);
    638      1.1  mrg   check_sprintf ("-0.1",  "%.1Rf", x);
    639      1.1  mrg   check_sprintf ("-0.0",  "%.1RZf", x);
    640      1.1  mrg   check_sprintf ("-0.07", "%.1Rg", x);
    641      1.1  mrg   check_sprintf ("-0.06", "%.1RZg", x);
    642      1.1  mrg 
    643      1.1  mrg   /* round to next ten power and do not remove trailing zeros */
    644      1.1  mrg   mpfr_set_str (x, "9.98429393291486722006e-02", 10, MPFR_RNDN);
    645      1.1  mrg   check_sprintf ("0.1",   "%#.1Rg", x);
    646      1.1  mrg   check_sprintf ("0.10",  "%#.2Rg", x);
    647      1.1  mrg   check_sprintf ("0.099", "%#.2RZg", x);
    648      1.1  mrg 
    649      1.1  mrg   /* Halfway cases */
    650      1.1  mrg   mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
    651      1.1  mrg   check_sprintf ("2e+00", "%.0Re", x);
    652      1.1  mrg   mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
    653      1.1  mrg   check_sprintf ("2e+00", "%.0Re", x);
    654      1.1  mrg   mpfr_set_str (x, "9.5", 10, MPFR_RNDN);
    655      1.1  mrg   check_sprintf ("1e+01", "%.0Re", x);
    656      1.1  mrg   mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
    657      1.1  mrg   check_sprintf ("1.2e+00", "%.1Re", x);
    658      1.1  mrg   mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
    659      1.1  mrg   check_sprintf ("1.8e+00", "%.1Re", x);
    660      1.1  mrg   mpfr_set_str (x, "-0.5", 10, MPFR_RNDN);
    661      1.1  mrg   check_sprintf ("-0", "%.0Rf", x);
    662      1.1  mrg   mpfr_set_str (x, "1.25", 10, MPFR_RNDN);
    663      1.1  mrg   check_sprintf ("1.2", "%.1Rf", x);
    664      1.1  mrg   mpfr_set_str (x, "1.75", 10, MPFR_RNDN);
    665      1.1  mrg   check_sprintf ("1.8", "%.1Rf", x);
    666      1.1  mrg   mpfr_set_str (x, "1.5", 10, MPFR_RNDN);
    667      1.1  mrg   check_sprintf ("2", "%.1Rg", x);
    668      1.1  mrg   mpfr_set_str (x, "2.5", 10, MPFR_RNDN);
    669      1.1  mrg   check_sprintf ("2", "%.1Rg", x);
    670      1.1  mrg   mpfr_set_str (x, "9.25", 10, MPFR_RNDN);
    671      1.1  mrg   check_sprintf ("9.2", "%.2Rg", x);
    672      1.1  mrg   mpfr_set_str (x, "9.75", 10, MPFR_RNDN);
    673      1.1  mrg   check_sprintf ("9.8", "%.2Rg", x);
    674      1.1  mrg 
    675      1.1  mrg   /* assertion failure in r6320 */
    676      1.1  mrg   mpfr_set_str (x, "-9.996", 10, MPFR_RNDN);
    677      1.1  mrg   check_sprintf ("-10.0", "%.1Rf", x);
    678      1.1  mrg 
    679  1.1.1.4  mrg   /* regression in MPFR 3.1.0 (bug introduced in r7761, fixed in r7931) */
    680  1.1.1.4  mrg   check_sprintf ("-10", "%.2Rg", x);
    681  1.1.1.4  mrg 
    682  1.1.1.5  mrg   mpfr_clears (x, y, z, (mpfr_ptr) 0);
    683      1.1  mrg }
    684      1.1  mrg 
    685  1.1.1.6  mrg static void
    686      1.1  mrg hexadecimal (void)
    687      1.1  mrg {
    688      1.1  mrg   mpfr_t x, z;
    689  1.1.1.6  mrg 
    690      1.1  mrg   mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
    691      1.1  mrg 
    692      1.1  mrg   /* special */
    693      1.1  mrg   mpfr_set_inf (x, 1);
    694      1.1  mrg   check_sprintf (pinf_str, "%Ra", x);
    695      1.1  mrg   check_sprintf (pinf_str, "%RUa", x);
    696      1.1  mrg   check_sprintf (pinf_str, "%RDa", x);
    697      1.1  mrg   check_sprintf (pinf_uc_str, "%RA", x);
    698      1.1  mrg   check_sprintf (pinf_uc_str, "%RYA", x);
    699      1.1  mrg   check_sprintf (pinf_uc_str, "%RZA", x);
    700      1.1  mrg   check_sprintf (pinf_uc_str, "%RNA", x);
    701      1.1  mrg 
    702      1.1  mrg   mpfr_set_inf (x, -1);
    703      1.1  mrg   check_sprintf (minf_str, "%Ra", x);
    704      1.1  mrg   check_sprintf (minf_str, "%RYa", x);
    705      1.1  mrg   check_sprintf (minf_str, "%RZa", x);
    706      1.1  mrg   check_sprintf (minf_str, "%RNa", x);
    707      1.1  mrg   check_sprintf (minf_uc_str, "%RA", x);
    708      1.1  mrg   check_sprintf (minf_uc_str, "%RUA", x);
    709      1.1  mrg   check_sprintf (minf_uc_str, "%RDA", x);
    710      1.1  mrg 
    711      1.1  mrg   mpfr_set_nan (x);
    712      1.1  mrg   check_sprintf (nan_str, "%Ra", x);
    713      1.1  mrg   check_sprintf (nan_uc_str, "%RA", x);
    714      1.1  mrg 
    715      1.1  mrg   /* regular numbers */
    716      1.1  mrg   mpfr_set_str (x, "FEDCBA9.87654321", 16, MPFR_RNDN);
    717      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDZ);
    718      1.1  mrg 
    719      1.1  mrg   /* simplest case right justified */
    720      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25Ra", x);
    721      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RUa", x);
    722      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RDa", x);
    723      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RYa", x);
    724      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RZa", x);
    725      1.1  mrg   check_sprintf ("   0xf.edcba987654321p+24", "%25RNa", x);
    726      1.1  mrg   check_sprintf ("                  0x1p+28", "%25.0Ra", x);
    727      1.1  mrg   check_sprintf ("                   0x0p+0", "%25.0Ra", z);
    728  1.1.1.5  mrg   check_sprintf ("                   0x0p+0", "%25Ra", z);
    729  1.1.1.5  mrg   check_sprintf ("                  0x0.p+0", "%#25Ra", z);
    730      1.1  mrg   /* sign or space, pad with leading zeros */
    731      1.1  mrg   check_sprintf (" 0X00F.EDCBA987654321P+24", "% 025RA", x);
    732      1.1  mrg   check_sprintf (" 0X000000000000000001P+28", "% 025.0RA", x);
    733      1.1  mrg   check_sprintf (" 0X0000000000000000000P+0", "% 025.0RA", z);
    734      1.1  mrg   /* sign + or -, left justified */
    735      1.1  mrg   check_sprintf ("+0xf.edcba987654321p+24  ", "%+-25Ra", x);
    736      1.1  mrg   check_sprintf ("+0x1p+28                 ", "%+-25.0Ra", x);
    737      1.1  mrg   check_sprintf ("+0x0p+0                  ", "%+-25.0Ra", z);
    738      1.1  mrg   /* decimal point, left justified, precision and rounding parameter */
    739      1.1  mrg   check_vsprintf ("0XF.FP+24 ", "%#-10.*R*A", 1, MPFR_RNDN, x);
    740      1.1  mrg   check_vsprintf ("0X1.P+28  ", "%#-10.*R*A", 0, MPFR_RNDN, x);
    741      1.1  mrg   check_vsprintf ("0X0.P+0   ", "%#-10.*R*A", 0, MPFR_RNDN, z);
    742      1.1  mrg   /* sign or space */
    743      1.1  mrg   check_sprintf (" 0xf.eddp+24", "% .3RNa", x);
    744      1.1  mrg   check_sprintf (" 0x1p+28",     "% .0RNa", x);
    745      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    746      1.1  mrg   check_sprintf ("+0X0F.EP+24", "%0+#11.1RZA", x);
    747      1.1  mrg   check_sprintf ("+0X00F.P+24", "%0+#11.0RZA", x);
    748      1.1  mrg   check_sprintf ("+0X000.0P+0", "%0+#11.1RZA", z);
    749      1.1  mrg   /* pad with leading zero */
    750      1.1  mrg   check_sprintf ("0x0000f.edcba987654321p+24", "%026RDa", x);
    751      1.1  mrg   check_sprintf ("0x0000000000000000000fp+24", "%026.0RDa", x);
    752      1.1  mrg   /* sign or space, decimal point, left justified */
    753  1.1.1.6  mrg   check_sprintf (" 0XF.EP+24 ", "%- #11.1RDA", x);
    754  1.1.1.6  mrg   check_sprintf (" 0XF.P+24  ", "%- #11.0RDA", x);
    755      1.1  mrg 
    756      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    757      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    758      1.1  mrg 
    759      1.1  mrg   /* sign + or - */
    760      1.1  mrg   check_sprintf ("-0xf.ep+24", "%+10.1RUa", x);
    761      1.1  mrg   check_sprintf ("  -0xfp+24", "%+10.0RUa", x);
    762      1.1  mrg   check_sprintf ("   -0x0p+0", "%+10.0RUa", z);
    763      1.1  mrg 
    764      1.1  mrg   /* rounding bit is zero */
    765      1.1  mrg   mpfr_set_str (x, "0xF.7", 16, MPFR_RNDN);
    766      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    767      1.1  mrg   /* tie case in round to nearest mode */
    768      1.1  mrg   mpfr_set_str (x, "0x0.8800000000000000p+3", 16, MPFR_RNDN);
    769      1.1  mrg   check_sprintf ("0x9.p-1", "%#.0RNa", x);
    770      1.1  mrg   mpfr_set_str (x, "-0x0.9800000000000000p+3", 16, MPFR_RNDN);
    771      1.1  mrg   check_sprintf ("-0xap-1", "%.0RNa", x);
    772      1.1  mrg   /* trailing zeros in fractional part */
    773      1.1  mrg   check_sprintf ("-0X4.C0000000000000000000P+0", "%.20RNA", x);
    774      1.1  mrg   /* rounding bit is one and the first non zero bit is far away */
    775      1.1  mrg   mpfr_set_prec (x, 1024);
    776      1.1  mrg   mpfr_set_ui_2exp (x, 29, -1, MPFR_RNDN);
    777      1.1  mrg   mpfr_nextabove (x);
    778      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    779      1.1  mrg 
    780      1.1  mrg   /* with more than one limb */
    781      1.1  mrg   mpfr_set_prec (x, 300);
    782      1.1  mrg   mpfr_set_str (x, "0xf.ffffffffffffffffffffffffffffffffffffffffffffffffffff"
    783      1.1  mrg                 "fffffffffffffffff", 16, MPFR_RNDN);
    784      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RNa [300]", x);
    785      1.1  mrg   check_sprintf ("0xfp+0 [300]", "%.0RZa [300]", x);
    786      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RYa [300]", x);
    787      1.1  mrg   check_sprintf ("0xfp+0 [300]", "%.0RDa [300]", x);
    788      1.1  mrg   check_sprintf ("0x1p+4 [300]", "%.0RUa [300]", x);
    789      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    790      1.1  mrg                  "%.40RNa", x);
    791      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
    792      1.1  mrg                  "%.40RZa", x);
    793      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    794      1.1  mrg                  "%.40RYa", x);
    795      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffffffp+0",
    796      1.1  mrg                  "%.40RDa", x);
    797      1.1  mrg   check_sprintf ("0x1.0000000000000000000000000000000000000000p+4",
    798      1.1  mrg                  "%.40RUa", x);
    799      1.1  mrg 
    800      1.1  mrg   mpfr_set_str (x, "0xf.7fffffffffffffffffffffffffffffffffffffffffffffffffff"
    801      1.1  mrg                 "ffffffffffffffffff", 16, MPFR_RNDN);
    802      1.1  mrg   check_sprintf ("0XFP+0", "%.0RNA", x);
    803      1.1  mrg   check_sprintf ("0XFP+0", "%.0RZA", x);
    804      1.1  mrg   check_sprintf ("0X1P+4", "%.0RYA", x);
    805      1.1  mrg   check_sprintf ("0XFP+0", "%.0RDA", x);
    806      1.1  mrg   check_sprintf ("0X1P+4", "%.0RUA", x);
    807      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RNA", x);
    808      1.1  mrg   check_sprintf ("0XF.7P+0", "%.1RZA", x);
    809      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RYA", x);
    810      1.1  mrg   check_sprintf ("0XF.7P+0", "%.1RDA", x);
    811      1.1  mrg   check_sprintf ("0XF.8P+0", "%.1RUA", x);
    812      1.1  mrg 
    813      1.1  mrg   /* do not round up to the next power of the base */
    814      1.1  mrg   mpfr_set_str (x, "0xf.fffffffffffffffffffffffffffffffffffffeffffffffffffff"
    815      1.1  mrg                 "ffffffffffffffffff", 16, MPFR_RNDN);
    816      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    817      1.1  mrg                  "%.40RNa", x);
    818      1.1  mrg   check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
    819      1.1  mrg                  "%.40RZa", x);
    820      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    821      1.1  mrg                  "%.40RYa", x);
    822      1.1  mrg   check_sprintf ("0xf.fffffffffffffffffffffffffffffffffffffeffp+0",
    823      1.1  mrg                  "%.40RDa", x);
    824      1.1  mrg   check_sprintf ("0xf.ffffffffffffffffffffffffffffffffffffff00p+0",
    825      1.1  mrg                  "%.40RUa", x);
    826      1.1  mrg 
    827      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    828      1.1  mrg }
    829      1.1  mrg 
    830  1.1.1.6  mrg static void
    831      1.1  mrg binary (void)
    832      1.1  mrg {
    833      1.1  mrg   mpfr_t x;
    834      1.1  mrg   mpfr_t z;
    835  1.1.1.6  mrg 
    836      1.1  mrg   mpfr_inits2 (64, x, z, (mpfr_ptr) 0);
    837      1.1  mrg 
    838      1.1  mrg   /* special */
    839      1.1  mrg   mpfr_set_inf (x, 1);
    840      1.1  mrg   check_sprintf (pinf_str, "%Rb", x);
    841      1.1  mrg 
    842      1.1  mrg   mpfr_set_inf (x, -1);
    843      1.1  mrg   check_sprintf (minf_str, "%Rb", x);
    844      1.1  mrg 
    845      1.1  mrg   mpfr_set_nan (x);
    846      1.1  mrg   check_sprintf (nan_str, "%Rb", x);
    847      1.1  mrg 
    848      1.1  mrg   /* regular numbers */
    849      1.1  mrg   mpfr_set_str (x, "1110010101.1001101", 2, MPFR_RNDN);
    850      1.1  mrg   mpfr_set_ui (z, 0, MPFR_RNDN);
    851      1.1  mrg 
    852      1.1  mrg   /* simplest case: right justified */
    853      1.1  mrg   check_sprintf ("    1.1100101011001101p+9", "%25Rb", x);
    854      1.1  mrg   check_sprintf ("                     0p+0", "%25Rb", z);
    855  1.1.1.5  mrg   check_sprintf ("                    0.p+0", "%#25Rb", z);
    856      1.1  mrg   /* sign or space, pad with leading zeros */
    857      1.1  mrg   check_sprintf (" 0001.1100101011001101p+9", "% 025Rb", x);
    858      1.1  mrg   check_sprintf (" 000000000000000000000p+0", "% 025Rb", z);
    859      1.1  mrg   /* sign + or -, left justified */
    860      1.1  mrg   check_sprintf ("+1.1100101011001101p+9   ", "%+-25Rb", x);
    861      1.1  mrg   check_sprintf ("+0p+0                    ", "%+-25Rb", z);
    862      1.1  mrg   /* sign or space */
    863      1.1  mrg   check_sprintf (" 1.110p+9",  "% .3RNb", x);
    864      1.1  mrg   check_sprintf (" 1.1101p+9", "% .4RNb", x);
    865      1.1  mrg   check_sprintf (" 0.0000p+0", "% .4RNb", z);
    866      1.1  mrg   /* sign + or -, decimal point, pad with leading zeros */
    867      1.1  mrg   check_sprintf ("+00001.1p+9", "%0+#11.1RZb", x);
    868      1.1  mrg   check_sprintf ("+0001.0p+10", "%0+#11.1RNb", x);
    869      1.1  mrg   check_sprintf ("+000000.p+0", "%0+#11.0RNb", z);
    870      1.1  mrg   /* pad with leading zero */
    871      1.1  mrg   check_sprintf ("00001.1100101011001101p+9", "%025RDb", x);
    872      1.1  mrg   /* sign or space, decimal point (unused), left justified */
    873      1.1  mrg   check_sprintf (" 1.1p+9    ", "%- #11.1RDb", x);
    874      1.1  mrg   check_sprintf (" 1.p+9     ", "%- #11.0RDb", x);
    875      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RUb", x);
    876      1.1  mrg   check_sprintf (" 1.p+9     ", "%- #11.0RZb", x);
    877      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RYb", x);
    878      1.1  mrg   check_sprintf (" 1.p+10    ", "%- #11.0RNb", x);
    879      1.1  mrg 
    880      1.1  mrg   mpfr_mul_si (x, x, -1, MPFR_RNDD);
    881      1.1  mrg   mpfr_mul_si (z, z, -1, MPFR_RNDD);
    882      1.1  mrg 
    883      1.1  mrg   /* sign + or - */
    884      1.1  mrg   check_sprintf ("   -1.1p+9", "%+10.1RUb", x);
    885      1.1  mrg   check_sprintf ("   -0.0p+0", "%+10.1RUb", z);
    886      1.1  mrg 
    887      1.1  mrg   /* precision 0 */
    888      1.1  mrg   check_sprintf ("-1p+10", "%.0RNb", x);
    889      1.1  mrg   check_sprintf ("-1p+10", "%.0RDb", x);
    890      1.1  mrg   check_sprintf ("-1p+9",  "%.0RUb", x);
    891      1.1  mrg   check_sprintf ("-1p+9",  "%.0RZb", x);
    892      1.1  mrg   check_sprintf ("-1p+10", "%.0RYb", x);
    893      1.1  mrg   /* round to next base power */
    894      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RNb", x);
    895      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RDb", x);
    896      1.1  mrg   check_sprintf ("-1.0p+10", "%.1RYb", x);
    897      1.1  mrg   /* do not round to next base power */
    898      1.1  mrg   check_sprintf ("-1.1p+9", "%.1RUb", x);
    899      1.1  mrg   check_sprintf ("-1.1p+9", "%.1RZb", x);
    900      1.1  mrg   /* rounding bit is zero */
    901      1.1  mrg   check_sprintf ("-1.11p+9", "%.2RNb", x);
    902      1.1  mrg   /* tie case in round to nearest mode */
    903      1.1  mrg   check_sprintf ("-1.1100101011001101p+9", "%.16RNb", x);
    904      1.1  mrg   /* trailing zeros in fractional part */
    905      1.1  mrg   check_sprintf ("-1.110010101100110100000000000000p+9", "%.30RNb", x);
    906      1.1  mrg 
    907      1.1  mrg   mpfr_clears (x, z, (mpfr_ptr) 0);
    908      1.1  mrg }
    909      1.1  mrg 
    910  1.1.1.6  mrg static void
    911      1.1  mrg mixed (void)
    912      1.1  mrg {
    913      1.1  mrg   int n1;
    914      1.1  mrg   int n2;
    915      1.1  mrg   int i = 121;
    916  1.1.1.4  mrg #ifdef PRINTF_L
    917      1.1  mrg   long double d = 1. / 31.;
    918  1.1.1.2  mrg #endif
    919      1.1  mrg   mpf_t mpf;
    920      1.1  mrg   mpq_t mpq;
    921      1.1  mrg   mpz_t mpz;
    922      1.1  mrg   mpfr_t x;
    923      1.1  mrg   mpfr_rnd_t rnd;
    924  1.1.1.4  mrg   int k;
    925      1.1  mrg 
    926      1.1  mrg   mpf_init (mpf);
    927      1.1  mrg   mpf_set_ui (mpf, 40);
    928      1.1  mrg   mpf_div_ui (mpf, mpf, 31); /* mpf = 40.0 / 31.0 */
    929      1.1  mrg   mpq_init (mpq);
    930      1.1  mrg   mpq_set_ui (mpq, 123456, 4567890);
    931      1.1  mrg   mpz_init (mpz);
    932      1.1  mrg   mpz_fib_ui (mpz, 64);
    933      1.1  mrg   mpfr_init (x);
    934      1.1  mrg   mpfr_set_str (x, "-12345678.875", 10, MPFR_RNDN);
    935      1.1  mrg   rnd = MPFR_RNDD;
    936      1.1  mrg 
    937      1.1  mrg   check_vsprintf ("121%", "%i%%", i);
    938  1.1.1.5  mrg   check_vsprintf ("121% -1.2345678875000000E+07", "%i%% %RNE", i, x);
    939      1.1  mrg   check_vsprintf ("121, -12345679", "%i, %.0Rf", i, x);
    940  1.1.1.5  mrg   check_vsprintf ("10610209857723, -1.2345678875000000e+07", "%Zi, %R*e", mpz, rnd,
    941      1.1  mrg                   x);
    942      1.1  mrg   check_vsprintf ("-12345678.9, 121", "%.1Rf, %i", x, i);
    943      1.1  mrg   check_vsprintf ("-12345678, 1e240/45b352", "%.0R*f, %Qx", MPFR_RNDZ, x, mpq);
    944  1.1.1.4  mrg 
    945  1.1.1.4  mrg   /* TODO: Systematically test with and without %n in check_vsprintf? */
    946  1.1.1.4  mrg   /* Do the test several times due to random parameters in check_vsprintf
    947  1.1.1.4  mrg      and the use of %n. In r11501, n2 is incorrect (seems random) when
    948  1.1.1.4  mrg      randsize <= 0, i.e. when the size argument of mpfr_vsnprintf is 0. */
    949  1.1.1.4  mrg   for (k = 0; k < 30; k++)
    950  1.1.1.4  mrg     {
    951  1.1.1.4  mrg       n2 = -17;
    952  1.1.1.4  mrg       /* If this value is obtained for n2 after the check_vsprintf call below,
    953  1.1.1.4  mrg          this probably means that n2 has not been written as expected. */
    954  1.1.1.4  mrg       n1 = check_vsprintf ("121, -12345678.875000000000, 1.290323",
    955  1.1.1.4  mrg                            "%i, %.*Rf, %Ff%n", i, 12, x, mpf, &n2);
    956  1.1.1.4  mrg       if (n1 != n2)
    957  1.1.1.4  mrg         {
    958  1.1.1.4  mrg           printf ("error in number of characters written by mpfr_vsprintf"
    959  1.1.1.4  mrg                   " for k = %d, randsize = %d\n", k, randsize);
    960  1.1.1.4  mrg           printf ("expected: %d\n", n2);
    961  1.1.1.4  mrg           printf ("     got: %d\n", n1);
    962  1.1.1.4  mrg           exit (1);
    963  1.1.1.4  mrg         }
    964      1.1  mrg     }
    965      1.1  mrg 
    966  1.1.1.4  mrg #ifdef PRINTF_L
    967  1.1.1.4  mrg   /* under MinGW, -D__USE_MINGW_ANSI_STDIO is required to support %Lf
    968  1.1.1.5  mrg      see https://gcc.gnu.org/legacy-ml/gcc/2013-03/msg00103.html */
    969  1.1.1.5  mrg   check_vsprintf ("00000010610209857723, -1.2345678875000000e+07, 0.032258",
    970      1.1  mrg                   "%.*Zi, %R*e, %Lf", 20, mpz, rnd, x, d);
    971      1.1  mrg #endif
    972      1.1  mrg 
    973  1.1.1.5  mrg   /* check invalid spec.spec */
    974  1.1.1.5  mrg   check_vsprintf ("%,", "%,");
    975  1.1.1.5  mrg   check_vsprintf ("%3*Rg", "%3*Rg");
    976  1.1.1.5  mrg 
    977  1.1.1.5  mrg   /* check empty format */
    978  1.1.1.5  mrg   check_vsprintf ("%", "%");
    979  1.1.1.5  mrg 
    980      1.1  mrg   mpf_clear (mpf);
    981      1.1  mrg   mpq_clear (mpq);
    982      1.1  mrg   mpz_clear (mpz);
    983      1.1  mrg   mpfr_clear (x);
    984      1.1  mrg }
    985      1.1  mrg 
    986  1.1.1.5  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE) && MPFR_LCONV_DPTS
    987  1.1.1.3  mrg 
    988  1.1.1.6  mrg /* Check with locale "da_DK.utf8" or "da_DK".
    989  1.1.1.6  mrg    On most platforms, decimal point is ',' and thousands separator is '.';
    990  1.1.1.6  mrg    if this is not the case or if the locale does not exist, the test is not
    991  1.1.1.6  mrg    performed (and if the MPFR_CHECK_LOCALES environment variable is set,
    992  1.1.1.6  mrg    the program fails). */
    993  1.1.1.5  mrg static void
    994      1.1  mrg locale_da_DK (void)
    995      1.1  mrg {
    996      1.1  mrg   mpfr_prec_t p = 128;
    997  1.1.1.5  mrg   mpfr_t x, y;
    998      1.1  mrg 
    999  1.1.1.6  mrg   if ((setlocale (LC_ALL, "da_DK.utf8") == 0 &&
   1000  1.1.1.6  mrg        setlocale (LC_ALL, "da_DK") == 0) ||
   1001      1.1  mrg       localeconv()->decimal_point[0] != ',' ||
   1002      1.1  mrg       localeconv()->thousands_sep[0] != '.')
   1003  1.1.1.5  mrg     {
   1004  1.1.1.5  mrg       setlocale (LC_ALL, "C");
   1005  1.1.1.5  mrg 
   1006  1.1.1.5  mrg       if (getenv ("MPFR_CHECK_LOCALES") == NULL)
   1007  1.1.1.5  mrg         return;
   1008  1.1.1.5  mrg 
   1009  1.1.1.5  mrg       fprintf (stderr,
   1010  1.1.1.5  mrg                "Cannot test the da_DK locale (not found or inconsistent).\n");
   1011  1.1.1.5  mrg       exit (1);
   1012  1.1.1.5  mrg     }
   1013      1.1  mrg 
   1014      1.1  mrg   mpfr_init2 (x, p);
   1015      1.1  mrg 
   1016      1.1  mrg   /* positive numbers */
   1017      1.1  mrg   mpfr_set_str (x, "18993474.61279296875", 10, MPFR_RNDN);
   1018  1.1.1.5  mrg   mpfr_init2 (y, 59);
   1019  1.1.1.5  mrg   mpfr_set (y, x, MPFR_RNDN);
   1020      1.1  mrg 
   1021      1.1  mrg   /* simplest case right justified with thousands separator */
   1022  1.1.1.5  mrg   check_sprintf ("1,899347461279296875000000000000000000000e+07", "%'30Re", x);
   1023  1.1.1.5  mrg   check_sprintf ("      1,899347461279296875e+07", "%'30Re", y);
   1024      1.1  mrg   check_sprintf ("                   1,89935e+07", "%'30Rg", x);
   1025      1.1  mrg   check_sprintf ("        18.993.474,61279296875", "%'30.19Rg", x);
   1026      1.1  mrg   check_sprintf ("             18.993.474,612793", "%'30Rf", x);
   1027      1.1  mrg 
   1028      1.1  mrg   /* sign or space, pad, thousands separator with leading zeros */
   1029  1.1.1.5  mrg   check_sprintf (" 1,899347461279296875000000000000000000000E+07", "%' 030RE", x);
   1030  1.1.1.5  mrg   check_sprintf (" 000001,899347461279296875E+07", "%' 030RE", y);
   1031      1.1  mrg   check_sprintf (" 0000000000000000001,89935E+07", "%' 030RG", x);
   1032      1.1  mrg   check_sprintf (" 000000018.993.474,61279296875", "%' 030.19RG", x);
   1033      1.1  mrg   check_sprintf (" 00000000000018.993.474,612793", "%' 030RF", x);
   1034      1.1  mrg 
   1035  1.1.1.4  mrg #define T1 "000"
   1036  1.1.1.4  mrg #define T2 ".000"
   1037  1.1.1.4  mrg #define S1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1
   1038  1.1.1.4  mrg #define S2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 T2 ","
   1039  1.1.1.4  mrg 
   1040  1.1.1.4  mrg   mpfr_set_ui (x, 48, MPFR_RNDN);
   1041      1.1  mrg   mpfr_exp10 (x, x, MPFR_RNDN);
   1042  1.1.1.4  mrg   check_sprintf ("1" S1, "%.0Rf", x);
   1043  1.1.1.4  mrg   check_sprintf ("1" S2, "%'#.0Rf", x);
   1044  1.1.1.4  mrg   check_sprintf ("1" S2 "0000", "%'.4Rf", x);
   1045  1.1.1.4  mrg   mpfr_mul_ui (x, x, 10, MPFR_RNDN);
   1046  1.1.1.4  mrg   check_sprintf ("10" S1, "%.0Rf", x);
   1047  1.1.1.4  mrg   check_sprintf ("10" S2, "%'#.0Rf", x);
   1048  1.1.1.4  mrg   check_sprintf ("10" S2 "0000", "%'.4Rf", x);
   1049  1.1.1.4  mrg   mpfr_mul_ui (x, x, 10, MPFR_RNDN);
   1050  1.1.1.4  mrg   check_sprintf ("100" S1, "%.0Rf", x);
   1051  1.1.1.4  mrg   check_sprintf ("100" S2, "%'#.0Rf", x);
   1052  1.1.1.4  mrg   check_sprintf ("100" S2 "0000", "%'.4Rf", x);
   1053      1.1  mrg 
   1054      1.1  mrg   mpfr_clear (x);
   1055  1.1.1.5  mrg   mpfr_clear (y);
   1056  1.1.1.5  mrg 
   1057  1.1.1.5  mrg   setlocale (LC_ALL, "C");
   1058      1.1  mrg }
   1059      1.1  mrg 
   1060  1.1.1.5  mrg #endif  /* ... && MPFR_LCONV_DPTS */
   1061  1.1.1.3  mrg 
   1062      1.1  mrg /* check concordance between mpfr_asprintf result with a regular mpfr float
   1063      1.1  mrg    and with a regular double float */
   1064  1.1.1.6  mrg static void
   1065      1.1  mrg random_double (void)
   1066      1.1  mrg {
   1067      1.1  mrg   mpfr_t x; /* random regular mpfr float */
   1068      1.1  mrg   double y; /* regular double float (equal to x) */
   1069      1.1  mrg 
   1070      1.1  mrg   char flag[] =
   1071      1.1  mrg     {
   1072      1.1  mrg       '-',
   1073      1.1  mrg       '+',
   1074      1.1  mrg       ' ',
   1075      1.1  mrg       '#',
   1076  1.1.1.4  mrg       '0', /* no ambiguity: first zeros are flag zero */
   1077  1.1.1.4  mrg       '\'' /* SUS extension */
   1078      1.1  mrg     };
   1079      1.1  mrg   /* no 'a': mpfr and glibc do not have the same semantic */
   1080      1.1  mrg   char specifier[] =
   1081      1.1  mrg     {
   1082      1.1  mrg       'e',
   1083      1.1  mrg       'f',
   1084      1.1  mrg       'g',
   1085      1.1  mrg       'E',
   1086      1.1  mrg       'f', /* SUSv2 doesn't accept %F, but %F and %f are the same for
   1087      1.1  mrg               regular numbers */
   1088      1.1  mrg       'G',
   1089      1.1  mrg     };
   1090      1.1  mrg   int spec; /* random index in specifier[] */
   1091      1.1  mrg   int prec; /* random value for precision field */
   1092      1.1  mrg 
   1093      1.1  mrg   /* in the format string for mpfr_t variable, the maximum length is
   1094      1.1  mrg      reached by something like "%-+ #0'.*Rf", that is 12 characters. */
   1095      1.1  mrg #define FMT_MPFR_SIZE 12
   1096      1.1  mrg   char fmt_mpfr[FMT_MPFR_SIZE];
   1097      1.1  mrg   char *ptr_mpfr;
   1098      1.1  mrg 
   1099      1.1  mrg   /* in the format string for double variable, the maximum length is
   1100      1.1  mrg      reached by something like "%-+ #0'.*f", that is 11 characters. */
   1101      1.1  mrg #define FMT_SIZE 11
   1102      1.1  mrg   char fmt[FMT_SIZE];
   1103      1.1  mrg   char *ptr;
   1104      1.1  mrg 
   1105      1.1  mrg   int xi;
   1106      1.1  mrg   char *xs;
   1107      1.1  mrg   int yi;
   1108      1.1  mrg   char *ys;
   1109      1.1  mrg 
   1110      1.1  mrg   int i, j, jmax;
   1111      1.1  mrg 
   1112      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1113      1.1  mrg 
   1114      1.1  mrg   for (i = 0; i < 1000; ++i)
   1115      1.1  mrg     {
   1116      1.1  mrg       /* 1. random double */
   1117      1.1  mrg       do
   1118      1.1  mrg         {
   1119      1.1  mrg           y = DBL_RAND ();
   1120      1.1  mrg         }
   1121      1.1  mrg       while (ABS(y) < DBL_MIN);
   1122      1.1  mrg 
   1123  1.1.1.6  mrg       if (RAND_BOOL ())
   1124      1.1  mrg         y = -y;
   1125      1.1  mrg 
   1126      1.1  mrg       mpfr_set_d (x, y, MPFR_RNDN);
   1127      1.1  mrg       if (y != mpfr_get_d (x, MPFR_RNDN))
   1128      1.1  mrg         /* conversion error: skip this one */
   1129      1.1  mrg         continue;
   1130      1.1  mrg 
   1131      1.1  mrg       /* 2. build random format strings fmt_mpfr and fmt */
   1132      1.1  mrg       ptr_mpfr = fmt_mpfr;
   1133      1.1  mrg       ptr = fmt;
   1134      1.1  mrg       *ptr_mpfr++ = *ptr++ = '%';
   1135      1.1  mrg       /* random specifier 'e', 'f', 'g', 'E', 'F', or 'G' */
   1136      1.1  mrg       spec = (int) (randlimb() % 6);
   1137  1.1.1.4  mrg       /* random flags, but no ' flag with %e or with non-glibc */
   1138  1.1.1.4  mrg #if __MPFR_GLIBC(1,0)
   1139      1.1  mrg       jmax = (spec == 0 || spec == 3) ? 5 : 6;
   1140  1.1.1.4  mrg #else
   1141  1.1.1.4  mrg       jmax = 5;
   1142  1.1.1.4  mrg #endif
   1143      1.1  mrg       for (j = 0; j < jmax; j++)
   1144      1.1  mrg         {
   1145      1.1  mrg           if (randlimb() % 3 == 0)
   1146      1.1  mrg             *ptr_mpfr++ = *ptr++ = flag[j];
   1147      1.1  mrg         }
   1148      1.1  mrg       *ptr_mpfr++ = *ptr++ = '.';
   1149      1.1  mrg       *ptr_mpfr++ = *ptr++ = '*';
   1150      1.1  mrg       *ptr_mpfr++ = 'R';
   1151      1.1  mrg       *ptr_mpfr++ = *ptr++ = specifier[spec];
   1152      1.1  mrg       *ptr_mpfr = *ptr = '\0';
   1153      1.1  mrg       MPFR_ASSERTN (ptr - fmt < FMT_SIZE);
   1154      1.1  mrg       MPFR_ASSERTN (ptr_mpfr - fmt_mpfr < FMT_MPFR_SIZE);
   1155      1.1  mrg 
   1156      1.1  mrg       /* advantage small precision */
   1157  1.1.1.6  mrg       prec = RAND_BOOL () ? 10 : prec_max_printf;
   1158  1.1.1.6  mrg       prec = (int) (randlimb () % prec);
   1159      1.1  mrg 
   1160      1.1  mrg       /* 3. calls and checks */
   1161      1.1  mrg       /* the double float case is handled by the libc asprintf through
   1162      1.1  mrg          gmp_asprintf */
   1163      1.1  mrg       xi = mpfr_asprintf (&xs, fmt_mpfr, prec, x);
   1164      1.1  mrg       yi = mpfr_asprintf (&ys, fmt, prec, y);
   1165      1.1  mrg 
   1166      1.1  mrg       /* test if XS and YS differ, beware that ISO C99 doesn't specify
   1167      1.1  mrg          the sign of a zero exponent (the C99 rationale says: "The sign
   1168      1.1  mrg          of a zero exponent in %e format is unspecified.  The committee
   1169      1.1  mrg          knows of different implementations and choose not to require
   1170  1.1.1.4  mrg          implementations to document their behavior in this case
   1171      1.1  mrg          (by making this be implementation defined behaviour).  Most
   1172      1.1  mrg          implementations use a "+" sign, e.g., 1.2e+00; but there is at
   1173      1.1  mrg          least one implementation that uses the sign of the unlimited
   1174      1.1  mrg          precision result, e.g., the 0.987 would be 9.87e-01, so could
   1175      1.1  mrg          end up as 1e-00 after rounding to one digit of precision."),
   1176      1.1  mrg          while mpfr always uses '+' */
   1177      1.1  mrg       if (xi != yi
   1178      1.1  mrg           || ((strcmp (xs, ys) != 0)
   1179      1.1  mrg               && (spec == 1 || spec == 4
   1180      1.1  mrg                   || ((strstr (xs, "e+00") == NULL
   1181      1.1  mrg                        || strstr (ys, "e-00") == NULL)
   1182      1.1  mrg                       && (strstr (xs, "E+00") == NULL
   1183      1.1  mrg                           || strstr (ys, "E-00") == NULL)))))
   1184      1.1  mrg         {
   1185      1.1  mrg           mpfr_printf ("Error in mpfr_asprintf(\"%s\", %d, %Re)\n",
   1186      1.1  mrg                        fmt_mpfr, prec, x);
   1187      1.1  mrg           printf ("expected: %s\n", ys);
   1188      1.1  mrg           printf ("     got: %s\n", xs);
   1189      1.1  mrg           printf ("xi=%d yi=%d spec=%d\n", xi, yi, spec);
   1190      1.1  mrg 
   1191      1.1  mrg           exit (1);
   1192      1.1  mrg         }
   1193      1.1  mrg 
   1194      1.1  mrg       mpfr_free_str (xs);
   1195      1.1  mrg       mpfr_free_str (ys);
   1196      1.1  mrg     }
   1197      1.1  mrg 
   1198      1.1  mrg   mpfr_clear (x);
   1199      1.1  mrg }
   1200      1.1  mrg 
   1201      1.1  mrg static void
   1202      1.1  mrg bug20080610 (void)
   1203      1.1  mrg {
   1204      1.1  mrg   /* bug on icc found on June 10, 2008 */
   1205      1.1  mrg   /* this is not a bug but a different implementation choice: ISO C99 doesn't
   1206      1.1  mrg      specify the sign of a zero exponent (see note in random_double above). */
   1207      1.1  mrg   mpfr_t x;
   1208      1.1  mrg   double y;
   1209      1.1  mrg   int xi;
   1210      1.1  mrg   char *xs;
   1211      1.1  mrg   int yi;
   1212      1.1  mrg   char *ys;
   1213      1.1  mrg 
   1214      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1215      1.1  mrg 
   1216      1.1  mrg   y = -9.95645044213728791504536275169812142849e-01;
   1217      1.1  mrg   mpfr_set_d (x, y, MPFR_RNDN);
   1218      1.1  mrg 
   1219      1.1  mrg   xi = mpfr_asprintf (&xs, "%- #0.*Re", 1, x);
   1220      1.1  mrg   yi = mpfr_asprintf (&ys, "%- #0.*e", 1, y);
   1221      1.1  mrg 
   1222      1.1  mrg   if (xi != yi || strcmp (xs, ys) != 0)
   1223      1.1  mrg     {
   1224      1.1  mrg       printf ("Error in bug20080610\n");
   1225      1.1  mrg       printf ("expected: %s\n", ys);
   1226      1.1  mrg       printf ("     got: %s\n", xs);
   1227      1.1  mrg       printf ("xi=%d yi=%d\n", xi, yi);
   1228      1.1  mrg 
   1229      1.1  mrg       exit (1);
   1230      1.1  mrg     }
   1231      1.1  mrg 
   1232      1.1  mrg   mpfr_free_str (xs);
   1233      1.1  mrg   mpfr_free_str (ys);
   1234      1.1  mrg   mpfr_clear (x);
   1235      1.1  mrg }
   1236      1.1  mrg 
   1237      1.1  mrg static void
   1238      1.1  mrg bug20081214 (void)
   1239      1.1  mrg {
   1240      1.1  mrg  /* problem with glibc 2.3.6, December 14, 2008:
   1241      1.1  mrg     the system asprintf outputs "-1.0" instead of "-1.". */
   1242      1.1  mrg   mpfr_t x;
   1243      1.1  mrg   double y;
   1244      1.1  mrg   int xi;
   1245      1.1  mrg   char *xs;
   1246      1.1  mrg   int yi;
   1247      1.1  mrg   char *ys;
   1248      1.1  mrg 
   1249      1.1  mrg   mpfr_init2 (x, MPFR_LDBL_MANT_DIG);
   1250      1.1  mrg 
   1251      1.1  mrg   y = -9.90597761233942053494e-01;
   1252      1.1  mrg   mpfr_set_d (x, y, MPFR_RNDN);
   1253      1.1  mrg 
   1254      1.1  mrg   xi = mpfr_asprintf (&xs, "%- #0.*RG", 1, x);
   1255      1.1  mrg   yi = mpfr_asprintf (&ys, "%- #0.*G", 1, y);
   1256      1.1  mrg 
   1257      1.1  mrg   if (xi != yi || strcmp (xs, ys) != 0)
   1258      1.1  mrg     {
   1259      1.1  mrg       mpfr_printf ("Error in bug20081214\n"
   1260      1.1  mrg                    "mpfr_asprintf(\"%- #0.*Re\", 1, %Re)\n", x);
   1261      1.1  mrg       printf ("expected: %s\n", ys);
   1262      1.1  mrg       printf ("     got: %s\n", xs);
   1263      1.1  mrg       printf ("xi=%d yi=%d\n", xi, yi);
   1264      1.1  mrg 
   1265      1.1  mrg       exit (1);
   1266      1.1  mrg     }
   1267      1.1  mrg 
   1268      1.1  mrg   mpfr_free_str (xs);
   1269      1.1  mrg   mpfr_free_str (ys);
   1270      1.1  mrg   mpfr_clear (x);
   1271      1.1  mrg }
   1272      1.1  mrg 
   1273  1.1.1.2  mrg static void
   1274  1.1.1.2  mrg bug20111102 (void)
   1275  1.1.1.2  mrg {
   1276  1.1.1.2  mrg   mpfr_t t;
   1277  1.1.1.2  mrg   char s[100];
   1278  1.1.1.2  mrg 
   1279  1.1.1.2  mrg   mpfr_init2 (t, 84);
   1280  1.1.1.2  mrg   mpfr_set_str (t, "999.99999999999999999999", 10, MPFR_RNDN);
   1281  1.1.1.2  mrg   mpfr_sprintf (s, "%.20RNg", t);
   1282  1.1.1.2  mrg   if (strcmp (s, "1000") != 0)
   1283  1.1.1.2  mrg     {
   1284  1.1.1.2  mrg       printf ("Error in bug20111102, expected 1000, got %s\n", s);
   1285  1.1.1.2  mrg       exit (1);
   1286  1.1.1.2  mrg     }
   1287  1.1.1.2  mrg   mpfr_clear (t);
   1288  1.1.1.2  mrg }
   1289  1.1.1.2  mrg 
   1290      1.1  mrg /* In particular, the following test makes sure that the rounding
   1291      1.1  mrg  * for %Ra and %Rb is not done on the MPFR number itself (as it
   1292      1.1  mrg  * would overflow). Note: it has been reported on comp.std.c that
   1293      1.1  mrg  * some C libraries behave differently on %a, but this is a bug.
   1294      1.1  mrg  */
   1295      1.1  mrg static void
   1296      1.1  mrg check_emax_aux (mpfr_exp_t e)
   1297      1.1  mrg {
   1298      1.1  mrg   mpfr_t x;
   1299      1.1  mrg   char *s1, s2[256];
   1300      1.1  mrg   int i;
   1301      1.1  mrg   mpfr_exp_t emax;
   1302      1.1  mrg 
   1303      1.1  mrg   MPFR_ASSERTN (e <= LONG_MAX);
   1304      1.1  mrg   emax = mpfr_get_emax ();
   1305      1.1  mrg   set_emax (e);
   1306      1.1  mrg 
   1307      1.1  mrg   mpfr_init2 (x, 16);
   1308      1.1  mrg 
   1309      1.1  mrg   mpfr_set_inf (x, 1);
   1310      1.1  mrg   mpfr_nextbelow (x);
   1311      1.1  mrg 
   1312      1.1  mrg   i = mpfr_asprintf (&s1, "%Ra %.2Ra", x, x);
   1313      1.1  mrg   MPFR_ASSERTN (i > 0);
   1314      1.1  mrg 
   1315      1.1  mrg   mpfr_snprintf (s2, 256, "0x7.fff8p+%ld 0x8.00p+%ld", e-3, e-3);
   1316      1.1  mrg 
   1317      1.1  mrg   if (strcmp (s1, s2) != 0)
   1318      1.1  mrg     {
   1319  1.1.1.2  mrg       printf ("Error in check_emax_aux for emax = ");
   1320  1.1.1.2  mrg       if (e > LONG_MAX)
   1321  1.1.1.2  mrg         printf ("(>LONG_MAX)\n");
   1322  1.1.1.2  mrg       else
   1323  1.1.1.2  mrg         printf ("%ld\n", (long) e);
   1324  1.1.1.4  mrg       printf ("Expected '%s'\n", s2);
   1325  1.1.1.4  mrg       printf ("Got      '%s'\n", s1);
   1326      1.1  mrg       exit (1);
   1327      1.1  mrg     }
   1328      1.1  mrg 
   1329      1.1  mrg   mpfr_free_str (s1);
   1330      1.1  mrg 
   1331      1.1  mrg   i = mpfr_asprintf (&s1, "%Rb %.2Rb", x, x);
   1332      1.1  mrg   MPFR_ASSERTN (i > 0);
   1333      1.1  mrg 
   1334      1.1  mrg   mpfr_snprintf (s2, 256, "1.111111111111111p+%ld 1.00p+%ld", e-1, e);
   1335      1.1  mrg 
   1336      1.1  mrg   if (strcmp (s1, s2) != 0)
   1337      1.1  mrg     {
   1338  1.1.1.2  mrg       printf ("Error in check_emax_aux for emax = ");
   1339  1.1.1.2  mrg       if (e > LONG_MAX)
   1340  1.1.1.2  mrg         printf ("(>LONG_MAX)\n");
   1341  1.1.1.2  mrg       else
   1342  1.1.1.2  mrg         printf ("%ld\n", (long) e);
   1343      1.1  mrg       printf ("Expected %s\n", s2);
   1344      1.1  mrg       printf ("Got      %s\n", s1);
   1345      1.1  mrg       exit (1);
   1346      1.1  mrg     }
   1347      1.1  mrg 
   1348      1.1  mrg   mpfr_free_str (s1);
   1349      1.1  mrg 
   1350      1.1  mrg   mpfr_clear (x);
   1351      1.1  mrg   set_emax (emax);
   1352      1.1  mrg }
   1353      1.1  mrg 
   1354      1.1  mrg static void
   1355      1.1  mrg check_emax (void)
   1356      1.1  mrg {
   1357      1.1  mrg   check_emax_aux (15);
   1358      1.1  mrg   check_emax_aux (MPFR_EMAX_MAX);
   1359      1.1  mrg }
   1360      1.1  mrg 
   1361  1.1.1.3  mrg static void
   1362  1.1.1.3  mrg check_emin_aux (mpfr_exp_t e)
   1363  1.1.1.3  mrg {
   1364  1.1.1.3  mrg   mpfr_t x;
   1365  1.1.1.3  mrg   char *s1, s2[256];
   1366  1.1.1.3  mrg   int i;
   1367  1.1.1.3  mrg   mpfr_exp_t emin;
   1368  1.1.1.3  mrg   mpz_t ee;
   1369  1.1.1.3  mrg 
   1370  1.1.1.3  mrg   MPFR_ASSERTN (e >= LONG_MIN);
   1371  1.1.1.3  mrg   emin = mpfr_get_emin ();
   1372  1.1.1.3  mrg   set_emin (e);
   1373  1.1.1.3  mrg 
   1374  1.1.1.3  mrg   mpfr_init2 (x, 16);
   1375  1.1.1.3  mrg   mpz_init (ee);
   1376  1.1.1.3  mrg 
   1377  1.1.1.3  mrg   mpfr_setmin (x, e);
   1378  1.1.1.3  mrg   mpz_set_si (ee, e);
   1379  1.1.1.3  mrg   mpz_sub_ui (ee, ee, 1);
   1380  1.1.1.3  mrg 
   1381  1.1.1.3  mrg   i = mpfr_asprintf (&s1, "%Ra", x);
   1382  1.1.1.3  mrg   MPFR_ASSERTN (i > 0);
   1383  1.1.1.3  mrg 
   1384  1.1.1.3  mrg   gmp_snprintf (s2, 256, "0x1p%Zd", ee);
   1385  1.1.1.3  mrg 
   1386  1.1.1.3  mrg   if (strcmp (s1, s2) != 0)
   1387  1.1.1.3  mrg     {
   1388  1.1.1.3  mrg       printf ("Error in check_emin_aux for emin = %ld\n", (long) e);
   1389  1.1.1.3  mrg       printf ("Expected %s\n", s2);
   1390  1.1.1.3  mrg       printf ("Got      %s\n", s1);
   1391  1.1.1.3  mrg       exit (1);
   1392  1.1.1.3  mrg     }
   1393  1.1.1.3  mrg 
   1394  1.1.1.3  mrg   mpfr_free_str (s1);
   1395  1.1.1.3  mrg 
   1396  1.1.1.3  mrg   i = mpfr_asprintf (&s1, "%Rb", x);
   1397  1.1.1.3  mrg   MPFR_ASSERTN (i > 0);
   1398  1.1.1.3  mrg 
   1399  1.1.1.3  mrg   gmp_snprintf (s2, 256, "1p%Zd", ee);
   1400  1.1.1.3  mrg 
   1401  1.1.1.3  mrg   if (strcmp (s1, s2) != 0)
   1402  1.1.1.3  mrg     {
   1403  1.1.1.3  mrg       printf ("Error in check_emin_aux for emin = %ld\n", (long) e);
   1404  1.1.1.3  mrg       printf ("Expected %s\n", s2);
   1405  1.1.1.3  mrg       printf ("Got      %s\n", s1);
   1406  1.1.1.3  mrg       exit (1);
   1407  1.1.1.3  mrg     }
   1408  1.1.1.3  mrg 
   1409  1.1.1.3  mrg   mpfr_free_str (s1);
   1410  1.1.1.3  mrg 
   1411  1.1.1.3  mrg   mpfr_clear (x);
   1412  1.1.1.3  mrg   mpz_clear (ee);
   1413  1.1.1.3  mrg   set_emin (emin);
   1414  1.1.1.3  mrg }
   1415  1.1.1.3  mrg 
   1416  1.1.1.3  mrg static void
   1417  1.1.1.3  mrg check_emin (void)
   1418  1.1.1.3  mrg {
   1419  1.1.1.3  mrg   check_emin_aux (-15);
   1420  1.1.1.3  mrg   check_emin_aux (mpfr_get_emin ());
   1421  1.1.1.3  mrg   check_emin_aux (MPFR_EMIN_MIN);
   1422  1.1.1.3  mrg }
   1423  1.1.1.3  mrg 
   1424  1.1.1.4  mrg static void
   1425  1.1.1.4  mrg test20161214 (void)
   1426  1.1.1.4  mrg {
   1427  1.1.1.4  mrg   mpfr_t x;
   1428  1.1.1.4  mrg   char buf[32];
   1429  1.1.1.4  mrg   const char s[] = "0x0.fffffffffffff8p+1024";
   1430  1.1.1.4  mrg   int r;
   1431  1.1.1.4  mrg 
   1432  1.1.1.4  mrg   mpfr_init2 (x, 64);
   1433  1.1.1.4  mrg   mpfr_set_str (x, s, 16, MPFR_RNDN);
   1434  1.1.1.4  mrg   r = mpfr_snprintf (buf, 32, "%.*RDf", -2, x);
   1435  1.1.1.4  mrg   MPFR_ASSERTN(r == 316);
   1436  1.1.1.4  mrg   r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN + 1, x);
   1437  1.1.1.4  mrg   MPFR_ASSERTN(r == 316);
   1438  1.1.1.4  mrg   r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN, x);
   1439  1.1.1.4  mrg   MPFR_ASSERTN(r == 316);
   1440  1.1.1.4  mrg   mpfr_clear (x);
   1441  1.1.1.4  mrg }
   1442  1.1.1.4  mrg 
   1443  1.1.1.4  mrg /* http://gforge.inria.fr/tracker/index.php?func=detail&aid=21056 */
   1444  1.1.1.4  mrg static void
   1445  1.1.1.4  mrg bug21056 (void)
   1446  1.1.1.4  mrg {
   1447  1.1.1.4  mrg   mpfr_t x;
   1448  1.1.1.4  mrg   const char s[] = "0x0.fffffffffffff8p+1024";
   1449  1.1.1.4  mrg   int ndigits, r;
   1450  1.1.1.4  mrg 
   1451  1.1.1.4  mrg   mpfr_init2 (x, 64);
   1452  1.1.1.4  mrg 
   1453  1.1.1.4  mrg   mpfr_set_str (x, s, 16, MPFR_RNDN);
   1454  1.1.1.4  mrg 
   1455  1.1.1.4  mrg   ndigits = 1000;
   1456  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%.*RDf", ndigits, x);
   1457  1.1.1.4  mrg   /* the return value should be ndigits + 310 */
   1458  1.1.1.4  mrg   MPFR_ASSERTN(r == ndigits + 310);
   1459  1.1.1.4  mrg 
   1460  1.1.1.4  mrg   ndigits = INT_MAX - 310;
   1461  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%.*RDf", ndigits, x);
   1462  1.1.1.4  mrg   MPFR_ASSERTN(r == INT_MAX);
   1463  1.1.1.4  mrg 
   1464  1.1.1.4  mrg   ndigits = INT_MAX - 10;
   1465  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%.*RDa", ndigits, x);
   1466  1.1.1.4  mrg   MPFR_ASSERTN(r == INT_MAX);
   1467  1.1.1.4  mrg 
   1468  1.1.1.4  mrg   ndigits = INT_MAX - 7;
   1469  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%.*RDe", ndigits, x);
   1470  1.1.1.4  mrg   MPFR_ASSERTN(r == INT_MAX);
   1471  1.1.1.4  mrg 
   1472  1.1.1.4  mrg   ndigits = 1000;
   1473  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%.*RDg", ndigits, x);
   1474  1.1.1.4  mrg   /* since trailing zeros are removed with %g, we get less digits */
   1475  1.1.1.4  mrg   MPFR_ASSERTN(r == 309);
   1476  1.1.1.4  mrg 
   1477  1.1.1.4  mrg   ndigits = INT_MAX;
   1478  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%.*RDg", ndigits, x);
   1479  1.1.1.4  mrg   /* since trailing zeros are removed with %g, we get less digits */
   1480  1.1.1.4  mrg   MPFR_ASSERTN(r == 309);
   1481  1.1.1.4  mrg 
   1482  1.1.1.4  mrg   ndigits = INT_MAX - 1;
   1483  1.1.1.4  mrg   r = mpfr_snprintf (0, 0, "%#.*RDg", ndigits, x);
   1484  1.1.1.4  mrg   MPFR_ASSERTN(r == ndigits + 1);
   1485  1.1.1.4  mrg 
   1486  1.1.1.4  mrg   mpfr_clear (x);
   1487  1.1.1.4  mrg }
   1488  1.1.1.4  mrg 
   1489  1.1.1.4  mrg /* Fails for i = 5, i.e. t[i] = (size_t) UINT_MAX + 1,
   1490  1.1.1.4  mrg    with r11427 on 64-bit machines (4-byte int, 8-byte size_t).
   1491  1.1.1.4  mrg    On such machines, t[5] converted to int typically gives 0.
   1492  1.1.1.4  mrg    Note: the assumed behavior corresponds to the snprintf behavior
   1493  1.1.1.4  mrg    in ISO C, but this conflicts with POSIX:
   1494  1.1.1.4  mrg      https://sourceware.org/bugzilla/show_bug.cgi?id=14771#c2
   1495  1.1.1.6  mrg      https://austingroupbugs.net/view.php?id=761
   1496  1.1.1.6  mrg      https://austingroupbugs.net/view.php?id=1219
   1497  1.1.1.5  mrg      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87096
   1498  1.1.1.5  mrg    Fixed in r11429.
   1499  1.1.1.4  mrg */
   1500  1.1.1.4  mrg static void
   1501  1.1.1.4  mrg snprintf_size (void)
   1502  1.1.1.4  mrg {
   1503  1.1.1.4  mrg   mpfr_t x;
   1504  1.1.1.4  mrg   char buf[12];
   1505  1.1.1.4  mrg   const char s[] = "17.00000000";
   1506  1.1.1.4  mrg   size_t t[] = { 11, 12, 64, INT_MAX, (size_t) INT_MAX + 1,
   1507  1.1.1.4  mrg                  (size_t) UINT_MAX + 1, (size_t) UINT_MAX + 2,
   1508  1.1.1.4  mrg                  (size_t) -1 };
   1509  1.1.1.4  mrg   int i, r;
   1510  1.1.1.4  mrg 
   1511  1.1.1.4  mrg   mpfr_init2 (x, 64);
   1512  1.1.1.4  mrg   mpfr_set_ui (x, 17, MPFR_RNDN);
   1513  1.1.1.4  mrg 
   1514  1.1.1.4  mrg   for (i = 0; i < sizeof (t) / sizeof (*t); i++)
   1515  1.1.1.4  mrg     {
   1516  1.1.1.4  mrg       memset (buf, 0, sizeof (buf));
   1517  1.1.1.4  mrg       /* r = snprintf (buf, t[i], "%.8f", 17.0); */
   1518  1.1.1.4  mrg       r = mpfr_snprintf (buf, t[i], "%.8Rf", x);
   1519  1.1.1.4  mrg       if (r != 11 || (t[i] > 11 && strcmp (buf, s) != 0))
   1520  1.1.1.4  mrg         {
   1521  1.1.1.4  mrg           printf ("Error in snprintf_size for i = %d:\n", i);
   1522  1.1.1.4  mrg           printf ("expected r = 11, \"%s\"\n", s);
   1523  1.1.1.4  mrg           printf ("got      r = %d, \"%s\"\n", r, buf);
   1524  1.1.1.4  mrg           exit (1);
   1525  1.1.1.4  mrg         }
   1526  1.1.1.4  mrg     }
   1527  1.1.1.4  mrg 
   1528  1.1.1.4  mrg   mpfr_clear (x);
   1529  1.1.1.4  mrg }
   1530  1.1.1.4  mrg 
   1531  1.1.1.4  mrg /* With r11516, n2 gets a random value for i = 0 only!
   1532  1.1.1.4  mrg    valgrind detects a problem for "nchar = buf.curr - buf.start;"
   1533  1.1.1.4  mrg    in the spec.spec == 'n' case. Indeed, there is no buffer when
   1534  1.1.1.4  mrg    size is 0. */
   1535  1.1.1.4  mrg static void
   1536  1.1.1.4  mrg percent_n (void)
   1537  1.1.1.4  mrg {
   1538  1.1.1.4  mrg   int err = 0, i, j;
   1539  1.1.1.4  mrg 
   1540  1.1.1.4  mrg   for (i = 0; i < 24; i++)
   1541  1.1.1.4  mrg     for (j = 0; j < 3; j++)
   1542  1.1.1.4  mrg       {
   1543  1.1.1.4  mrg         volatile int n1, n2;
   1544  1.1.1.4  mrg         char buffer[64];
   1545  1.1.1.4  mrg 
   1546  1.1.1.4  mrg         memset (buffer, 0, 64);
   1547  1.1.1.4  mrg         n2 = -17;
   1548  1.1.1.4  mrg         n1 = mpfr_snprintf (buffer, i % 8, "%d%n", 123, &n2);
   1549  1.1.1.4  mrg         if (n1 != 3 || n2 != 3)
   1550  1.1.1.4  mrg           {
   1551  1.1.1.4  mrg             printf ("Error 1 in percent_n: i = %d, n1 = %d, n2 = %d\n",
   1552  1.1.1.4  mrg                     i, n1, n2);
   1553  1.1.1.4  mrg             err = 1;
   1554  1.1.1.4  mrg           }
   1555  1.1.1.4  mrg       }
   1556  1.1.1.4  mrg 
   1557  1.1.1.4  mrg   if (err)
   1558  1.1.1.4  mrg     exit (1);
   1559  1.1.1.4  mrg }
   1560  1.1.1.4  mrg 
   1561  1.1.1.5  mrg struct clo
   1562  1.1.1.5  mrg {
   1563  1.1.1.5  mrg   const char *fmt;
   1564  1.1.1.5  mrg   int width, r, e;
   1565  1.1.1.5  mrg };
   1566  1.1.1.5  mrg 
   1567  1.1.1.5  mrg static void
   1568  1.1.1.5  mrg check_length_overflow (void)
   1569  1.1.1.5  mrg {
   1570  1.1.1.5  mrg   mpfr_t x;
   1571  1.1.1.5  mrg   int i, r, e;
   1572  1.1.1.5  mrg   struct clo t[] = {
   1573  1.1.1.5  mrg     { "%Rg", 0, 1, 0 },
   1574  1.1.1.5  mrg     { "%*Rg", 1, 1, 0 },
   1575  1.1.1.5  mrg     { "%*Rg", -1, 1, 0 },
   1576  1.1.1.5  mrg     { "%5Rg", 0, 5, 0 },
   1577  1.1.1.5  mrg     { "%*Rg", 5, 5, 0 },
   1578  1.1.1.5  mrg     { "%*Rg", -5, 5, 0 },
   1579  1.1.1.5  mrg #if INT_MAX == 2147483647
   1580  1.1.1.5  mrg     { "%2147483647Rg", 0, 2147483647, 0 },
   1581  1.1.1.5  mrg     { "%2147483647Rg ", 0, -1, 1 },
   1582  1.1.1.5  mrg     { "%2147483648Rg", 0, -1, 1 },
   1583  1.1.1.5  mrg     { "%18446744073709551616Rg", 0, -1, 1 },
   1584  1.1.1.5  mrg     { "%*Rg", 2147483647, 2147483647, 0 },
   1585  1.1.1.5  mrg     { "%*Rg", -2147483647, 2147483647, 0 },
   1586  1.1.1.5  mrg # if INT_MIN < -INT_MAX
   1587  1.1.1.5  mrg     { "%*Rg", INT_MIN, -1, 1 },
   1588  1.1.1.5  mrg # endif
   1589  1.1.1.5  mrg #endif
   1590  1.1.1.5  mrg   };
   1591  1.1.1.5  mrg 
   1592  1.1.1.5  mrg   mpfr_init2 (x, MPFR_PREC_MIN);
   1593  1.1.1.5  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
   1594  1.1.1.5  mrg 
   1595  1.1.1.5  mrg   for (i = 0; i < numberof (t); i++)
   1596  1.1.1.5  mrg     {
   1597  1.1.1.5  mrg       errno = 0;
   1598  1.1.1.5  mrg       r = t[i].width == 0 ?
   1599  1.1.1.5  mrg         mpfr_snprintf (NULL, 0, t[i].fmt, x) :
   1600  1.1.1.5  mrg         mpfr_snprintf (NULL, 0, t[i].fmt, t[i].width, x);
   1601  1.1.1.5  mrg       e = errno;
   1602  1.1.1.5  mrg       if ((t[i].r < 0 ? r >= 0 : r != t[i].r)
   1603  1.1.1.5  mrg #ifdef EOVERFLOW
   1604  1.1.1.5  mrg           || (t[i].e && e != EOVERFLOW)
   1605  1.1.1.5  mrg #endif
   1606  1.1.1.5  mrg           )
   1607  1.1.1.5  mrg         {
   1608  1.1.1.5  mrg           printf ("Error in check_length_overflow for i=%d (%s %d)\n",
   1609  1.1.1.5  mrg                   i, t[i].fmt, t[i].width);
   1610  1.1.1.5  mrg           printf ("Expected r=%d, got r=%d\n", t[i].r, r);
   1611  1.1.1.5  mrg #ifdef EOVERFLOW
   1612  1.1.1.5  mrg           if (t[i].e && e != EOVERFLOW)
   1613  1.1.1.5  mrg             printf ("Expected errno=EOVERFLOW=%d, got errno=%d\n",
   1614  1.1.1.5  mrg                     EOVERFLOW, e);
   1615  1.1.1.5  mrg #endif
   1616  1.1.1.5  mrg           exit (1);
   1617  1.1.1.5  mrg         }
   1618  1.1.1.5  mrg     }
   1619  1.1.1.5  mrg 
   1620  1.1.1.5  mrg   mpfr_clear (x);
   1621  1.1.1.5  mrg }
   1622  1.1.1.5  mrg 
   1623  1.1.1.5  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
   1624  1.1.1.5  mrg 
   1625  1.1.1.5  mrg /* The following tests should be equivalent to those from test_locale()
   1626  1.1.1.5  mrg    in tprintf.c (remove the \n at the end of the test strings). */
   1627  1.1.1.5  mrg 
   1628  1.1.1.5  mrg static void
   1629  1.1.1.5  mrg test_locale (void)
   1630  1.1.1.5  mrg {
   1631  1.1.1.5  mrg   const char * const tab_locale[] = {
   1632  1.1.1.5  mrg     "en_US",
   1633  1.1.1.5  mrg     "en_US.iso88591",
   1634  1.1.1.5  mrg     "en_US.iso885915",
   1635  1.1.1.5  mrg     "en_US.utf8"
   1636  1.1.1.5  mrg   };
   1637  1.1.1.5  mrg   int i;
   1638  1.1.1.5  mrg   mpfr_t x;
   1639  1.1.1.5  mrg   char v[] = "99999999999999999999999.5";
   1640  1.1.1.5  mrg 
   1641  1.1.1.5  mrg   for (i = 0; i < numberof(tab_locale); i++)
   1642  1.1.1.5  mrg     {
   1643  1.1.1.5  mrg       char *s;
   1644  1.1.1.5  mrg 
   1645  1.1.1.5  mrg       s = setlocale (LC_ALL, tab_locale[i]);
   1646  1.1.1.5  mrg 
   1647  1.1.1.5  mrg       if (s != NULL && MPFR_THOUSANDS_SEPARATOR == ',')
   1648  1.1.1.5  mrg         break;
   1649  1.1.1.5  mrg     }
   1650  1.1.1.5  mrg 
   1651  1.1.1.5  mrg   if (i == numberof(tab_locale))
   1652  1.1.1.5  mrg     {
   1653  1.1.1.5  mrg       if (getenv ("MPFR_CHECK_LOCALES") == NULL)
   1654  1.1.1.5  mrg         return;
   1655  1.1.1.5  mrg 
   1656  1.1.1.5  mrg       fprintf (stderr, "Cannot find a locale with ',' thousands separator.\n"
   1657  1.1.1.5  mrg                "Please install one of the en_US based locales.\n");
   1658  1.1.1.5  mrg       exit (1);
   1659  1.1.1.5  mrg     }
   1660  1.1.1.5  mrg 
   1661  1.1.1.5  mrg   mpfr_init2 (x, 113);
   1662  1.1.1.5  mrg   mpfr_set_ui (x, 10000, MPFR_RNDN);
   1663  1.1.1.5  mrg 
   1664  1.1.1.5  mrg   check_sprintf ("(1) 10000=10,000 ", "(1) 10000=%'Rg ", x);
   1665  1.1.1.5  mrg   check_sprintf ("(2) 10000=10,000.000000 ", "(2) 10000=%'Rf ", x);
   1666  1.1.1.5  mrg 
   1667  1.1.1.5  mrg   mpfr_set_ui (x, 1000, MPFR_RNDN);
   1668  1.1.1.5  mrg   check_sprintf ("(3) 1000=1,000.000000 ", "(3) 1000=%'Rf ", x);
   1669  1.1.1.5  mrg 
   1670  1.1.1.5  mrg   for (i = 1; i <= sizeof (v) - 3; i++)
   1671  1.1.1.5  mrg     {
   1672  1.1.1.5  mrg       char buf[64];
   1673  1.1.1.5  mrg       int j;
   1674  1.1.1.5  mrg 
   1675  1.1.1.5  mrg       strcpy (buf, "(4) 10^i=1");
   1676  1.1.1.5  mrg       for (j = i; j > 0; j--)
   1677  1.1.1.6  mrg         strcat (buf, (j % 3 == 0) ? ",0" : "0");
   1678  1.1.1.5  mrg       strcat (buf, " ");
   1679  1.1.1.5  mrg       mpfr_set_str (x, v + sizeof (v) - 3 - i, 10, MPFR_RNDN);
   1680  1.1.1.5  mrg       check_sprintf (buf, "(4) 10^i=%'.0Rf ", x);
   1681  1.1.1.5  mrg     }
   1682  1.1.1.5  mrg 
   1683  1.1.1.5  mrg #define N0 20
   1684  1.1.1.5  mrg 
   1685  1.1.1.5  mrg   for (i = 1; i <= N0; i++)
   1686  1.1.1.5  mrg     {
   1687  1.1.1.5  mrg       char s[N0+4], buf[64];
   1688  1.1.1.5  mrg       int j;
   1689  1.1.1.5  mrg 
   1690  1.1.1.5  mrg       s[0] = '1';
   1691  1.1.1.5  mrg       for (j = 1; j <= i; j++)
   1692  1.1.1.5  mrg         s[j] = '0';
   1693  1.1.1.5  mrg       s[i+1] = '\0';
   1694  1.1.1.5  mrg 
   1695  1.1.1.5  mrg       strcpy (buf, "(5) 10^i=1");
   1696  1.1.1.5  mrg       for (j = i; j > 0; j--)
   1697  1.1.1.6  mrg         strcat (buf, (j % 3 == 0) ? ",0" : "0");
   1698  1.1.1.5  mrg       strcat (buf, " ");
   1699  1.1.1.5  mrg 
   1700  1.1.1.5  mrg       mpfr_set_str (x, s, 10, MPFR_RNDN);
   1701  1.1.1.5  mrg 
   1702  1.1.1.5  mrg       check_sprintf (buf, "(5) 10^i=%'.0RNf ", x);
   1703  1.1.1.5  mrg       check_sprintf (buf, "(5) 10^i=%'.0RZf ", x);
   1704  1.1.1.5  mrg       check_sprintf (buf, "(5) 10^i=%'.0RUf ", x);
   1705  1.1.1.5  mrg       check_sprintf (buf, "(5) 10^i=%'.0RDf ", x);
   1706  1.1.1.5  mrg       check_sprintf (buf, "(5) 10^i=%'.0RYf ", x);
   1707  1.1.1.5  mrg 
   1708  1.1.1.5  mrg       strcat (s + (i + 1), ".5");
   1709  1.1.1.5  mrg       check_sprintf (buf, "(5) 10^i=%'.0Rf ", x);
   1710  1.1.1.5  mrg     }
   1711  1.1.1.5  mrg 
   1712  1.1.1.5  mrg   mpfr_set_str (x, "1000", 10, MPFR_RNDN);
   1713  1.1.1.5  mrg   check_sprintf ("00000001e+03", "%'012.3Rg", x);
   1714  1.1.1.5  mrg   check_sprintf ("00000001,000", "%'012.4Rg", x);
   1715  1.1.1.5  mrg   check_sprintf ("000000001,000", "%'013.4Rg", x);
   1716  1.1.1.5  mrg 
   1717  1.1.1.5  mrg #ifdef PRINTF_GROUPFLAG
   1718  1.1.1.5  mrg   check_vsprintf ("+01,234,567  :", "%0+ -'13.10Pd:", (mpfr_prec_t) 1234567);
   1719  1.1.1.5  mrg #endif
   1720  1.1.1.5  mrg 
   1721  1.1.1.5  mrg   mpfr_clear (x);
   1722  1.1.1.5  mrg }
   1723  1.1.1.5  mrg 
   1724  1.1.1.5  mrg #else
   1725  1.1.1.5  mrg 
   1726  1.1.1.5  mrg static void
   1727  1.1.1.5  mrg test_locale (void)
   1728  1.1.1.5  mrg {
   1729  1.1.1.5  mrg   if (getenv ("MPFR_CHECK_LOCALES") != NULL)
   1730  1.1.1.5  mrg     {
   1731  1.1.1.5  mrg       fprintf (stderr, "Cannot test locales.\n");
   1732  1.1.1.5  mrg       exit (1);
   1733  1.1.1.5  mrg     }
   1734  1.1.1.5  mrg }
   1735  1.1.1.5  mrg 
   1736  1.1.1.5  mrg #endif
   1737  1.1.1.5  mrg 
   1738      1.1  mrg int
   1739      1.1  mrg main (int argc, char **argv)
   1740      1.1  mrg {
   1741  1.1.1.4  mrg   int k;
   1742      1.1  mrg 
   1743      1.1  mrg   tests_start_mpfr ();
   1744      1.1  mrg 
   1745      1.1  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
   1746      1.1  mrg   /* currently, we just check with 'C' locale */
   1747  1.1.1.4  mrg   setlocale (LC_ALL, "C");
   1748      1.1  mrg #endif
   1749      1.1  mrg 
   1750  1.1.1.2  mrg   bug20111102 ();
   1751  1.1.1.4  mrg 
   1752  1.1.1.4  mrg   for (k = 0; k < 40; k++)
   1753  1.1.1.4  mrg     {
   1754  1.1.1.4  mrg       native_types ();
   1755  1.1.1.4  mrg       hexadecimal ();
   1756  1.1.1.4  mrg       binary ();
   1757  1.1.1.4  mrg       decimal ();
   1758      1.1  mrg 
   1759  1.1.1.5  mrg #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE) && MPFR_LCONV_DPTS
   1760  1.1.1.4  mrg       locale_da_DK ();
   1761  1.1.1.5  mrg #else
   1762  1.1.1.5  mrg       if (getenv ("MPFR_CHECK_LOCALES") != NULL)
   1763  1.1.1.5  mrg         {
   1764  1.1.1.5  mrg           fprintf (stderr, "Cannot test locales.\n");
   1765  1.1.1.5  mrg           exit (1);
   1766  1.1.1.5  mrg         }
   1767      1.1  mrg #endif
   1768  1.1.1.4  mrg     }
   1769  1.1.1.4  mrg 
   1770  1.1.1.4  mrg   check_emax ();
   1771  1.1.1.4  mrg   check_emin ();
   1772  1.1.1.4  mrg   test20161214 ();
   1773  1.1.1.4  mrg   bug21056 ();
   1774  1.1.1.4  mrg   snprintf_size ();
   1775  1.1.1.4  mrg   percent_n ();
   1776  1.1.1.4  mrg   mixed ();
   1777  1.1.1.5  mrg   check_length_overflow ();
   1778  1.1.1.5  mrg   test_locale ();
   1779      1.1  mrg 
   1780      1.1  mrg   if (getenv ("MPFR_CHECK_LIBC_PRINTF"))
   1781      1.1  mrg     {
   1782      1.1  mrg       /* check against libc */
   1783      1.1  mrg       random_double ();
   1784      1.1  mrg       bug20081214 ();
   1785      1.1  mrg       bug20080610 ();
   1786      1.1  mrg     }
   1787      1.1  mrg 
   1788      1.1  mrg   tests_end_mpfr ();
   1789      1.1  mrg   return 0;
   1790      1.1  mrg }
   1791      1.1  mrg 
   1792      1.1  mrg #else  /* HAVE_STDARG */
   1793      1.1  mrg 
   1794      1.1  mrg int
   1795      1.1  mrg main (void)
   1796      1.1  mrg {
   1797      1.1  mrg   /* We have nothing to test. */
   1798  1.1.1.2  mrg   return 77;
   1799      1.1  mrg }
   1800      1.1  mrg 
   1801      1.1  mrg #endif  /* HAVE_STDARG */
   1802