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