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