Home | History | Annotate | Line # | Download | only in expr
      1      1.1  mrg /* Test expression evaluation (print nothing and exit 0 if successful).
      2      1.1  mrg 
      3  1.1.1.2  mrg Copyright 2000-2004 Free Software Foundation, Inc.
      4      1.1  mrg 
      5      1.1  mrg This file is part of the GNU MP Library.
      6      1.1  mrg 
      7      1.1  mrg The GNU MP Library is free software; you can redistribute it and/or modify
      8  1.1.1.2  mrg it under the terms of either:
      9  1.1.1.2  mrg 
     10  1.1.1.2  mrg   * the GNU Lesser General Public License as published by the Free
     11  1.1.1.2  mrg     Software Foundation; either version 3 of the License, or (at your
     12  1.1.1.2  mrg     option) any later version.
     13  1.1.1.2  mrg 
     14  1.1.1.2  mrg or
     15  1.1.1.2  mrg 
     16  1.1.1.2  mrg   * the GNU General Public License as published by the Free Software
     17  1.1.1.2  mrg     Foundation; either version 2 of the License, or (at your option) any
     18  1.1.1.2  mrg     later version.
     19  1.1.1.2  mrg 
     20  1.1.1.2  mrg or both in parallel, as here.
     21      1.1  mrg 
     22      1.1  mrg The GNU MP Library is distributed in the hope that it will be useful, but
     23      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     24  1.1.1.2  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     25  1.1.1.2  mrg for more details.
     26      1.1  mrg 
     27  1.1.1.2  mrg You should have received copies of the GNU General Public License and the
     28  1.1.1.2  mrg GNU Lesser General Public License along with the GNU MP Library.  If not,
     29  1.1.1.2  mrg see https://www.gnu.org/licenses/.  */
     30      1.1  mrg 
     31      1.1  mrg #include <stdio.h>
     32      1.1  mrg #include <stdlib.h>
     33      1.1  mrg 
     34  1.1.1.3  mrg #include "gmp-impl.h"
     35      1.1  mrg #include "tests.h"
     36      1.1  mrg #include "expr-impl.h"
     37      1.1  mrg 
     38      1.1  mrg 
     39      1.1  mrg int  option_trace = 0;
     40      1.1  mrg 
     41      1.1  mrg 
     42      1.1  mrg struct data_t {
     43      1.1  mrg   int         base;
     44      1.1  mrg   const char  *expr;
     45      1.1  mrg   const char  *want;
     46      1.1  mrg };
     47      1.1  mrg 
     48      1.1  mrg #define numberof(x)  (sizeof (x) / sizeof ((x)[0]))
     49      1.1  mrg 
     50      1.1  mrg 
     51      1.1  mrg /* These data_xxx[] arrays are tables to be tested with one or more of the
     52      1.1  mrg    mp?_t types.  z=mpz_t, q=mpz_t, f=mpf_t.  */
     53      1.1  mrg 
     54      1.1  mrg struct data_t  data_zqf[] = {
     55      1.1  mrg 
     56      1.1  mrg   /* various deliberately wrong expressions */
     57      1.1  mrg   { 0, "", NULL },
     58      1.1  mrg   { 0, "1+", NULL },
     59      1.1  mrg   { 0, "+2", NULL },
     60      1.1  mrg   { 0, "1,2", NULL },
     61      1.1  mrg   { 0, "foo(1,2)", NULL },
     62      1.1  mrg   { 0, "1+foo", NULL },
     63      1.1  mrg   { 10, "0fff", NULL },
     64      1.1  mrg   { 0, "!", NULL },
     65      1.1  mrg   { 0, "10!", NULL },
     66      1.1  mrg   { 0, "-10!", NULL },
     67      1.1  mrg   { 0, "gcd((4,6))", NULL },
     68      1.1  mrg   { 0, "()", NULL },
     69      1.1  mrg   { 0, "fac(2**1000)", NULL },
     70      1.1  mrg   { 0, "$", NULL },
     71      1.1  mrg   { 0, "$-", NULL },
     72      1.1  mrg 
     73      1.1  mrg   /* some basics */
     74      1.1  mrg   { 10, "123", "123" },
     75      1.1  mrg   { 10, "-123", "-123" },
     76      1.1  mrg   { 10, "1+2", "3" },
     77      1.1  mrg   { 10, "1+2+3", "6" },
     78      1.1  mrg   { 10, "1+2*3", "7" },
     79      1.1  mrg   { 10, "3*2+1", "7" },
     80      1.1  mrg   { 10, "$a", "55" },
     81      1.1  mrg   { 10, "b", "99" },
     82      1.1  mrg   { 16, "b", "11" },
     83      1.1  mrg   { 10, "4**3 * 2 + 1", "129" },
     84      1.1  mrg   { 10, "1<2", "1" },
     85      1.1  mrg   { 10, "1>2", "0" },
     86      1.1  mrg 
     87      1.1  mrg   { 10, "(123)", "123" },
     88      1.1  mrg 
     89      1.1  mrg   { 10, "sgn(-123)", "-1" },
     90      1.1  mrg   { 10, "5-7", "-2" },
     91      1.1  mrg 
     92      1.1  mrg   { 0, "cmp(0,0)", "0" },
     93      1.1  mrg   { 0, "cmp(1,0)", "1" },
     94      1.1  mrg   { 0, "cmp(0,1)", "-1" },
     95      1.1  mrg   { 0, "cmp(-1,0)", "-1" },
     96      1.1  mrg   { 0, "cmp(0,-1)", "1" },
     97      1.1  mrg 
     98      1.1  mrg   { 10, "0 ? 123 : 456", "456" },
     99      1.1  mrg   { 10, "1 ? 4+5 : 6+7", "9" },
    100      1.1  mrg 
    101      1.1  mrg   { 10, "(123)", "123" },
    102      1.1  mrg   { 10, "(2+3)", "5" },
    103      1.1  mrg   { 10, "(4+5)*(5+6)", "99" },
    104      1.1  mrg 
    105      1.1  mrg   { 0, "1 << 16", "65536" },
    106      1.1  mrg   { 0, "256 >> 4", "16" },
    107      1.1  mrg   { 0, "-256 >> 4", "-16" },
    108      1.1  mrg 
    109      1.1  mrg   { 0, "!1", "0" },
    110      1.1  mrg   { 0, "!9", "0" },
    111      1.1  mrg   { 0, "!0", "1" },
    112      1.1  mrg 
    113      1.1  mrg   { 0, "2**2**2", "16" },
    114      1.1  mrg   { 0, "-2**2**2", "-16" },
    115      1.1  mrg 
    116      1.1  mrg   { 0, "0x100", "256" },
    117      1.1  mrg   { 10, "0x100", NULL },
    118      1.1  mrg   { 10, "0x 100", NULL },
    119      1.1  mrg 
    120      1.1  mrg   { 0, " max ( 1, 2, 3, 4, 5, 6, 7, 8)", "8" },
    121      1.1  mrg   { 0, " max ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "9" },
    122      1.1  mrg   { 0, " min ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "1" },
    123      1.1  mrg 
    124      1.1  mrg   { 10, "abs(123)",  "123" },
    125      1.1  mrg   { 10, "abs(-123)", "123" },
    126      1.1  mrg   { 10, "abs(0)",    "0" },
    127      1.1  mrg 
    128      1.1  mrg   /* filling data stack */
    129      1.1  mrg   { 0, "1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))", "16" },
    130      1.1  mrg 
    131      1.1  mrg   /* filling control stack */
    132      1.1  mrg   { 0, "----------------------------------------------------1", "1" },
    133      1.1  mrg };
    134      1.1  mrg 
    135      1.1  mrg 
    136      1.1  mrg const struct data_t  data_z[] = {
    137      1.1  mrg   { 0, "divisible_p(333,3)", "1" },
    138      1.1  mrg   { 0, "congruent_p(7,1,3)", "1" },
    139      1.1  mrg 
    140      1.1  mrg   { 0, "cmpabs(0,0)", "0" },
    141      1.1  mrg   { 0, "cmpabs(1,0)", "1" },
    142      1.1  mrg   { 0, "cmpabs(0,1)", "-1" },
    143      1.1  mrg   { 0, "cmpabs(-1,0)", "1" },
    144      1.1  mrg   { 0, "cmpabs(0,-1)", "-1" },
    145      1.1  mrg 
    146      1.1  mrg   { 0, "odd_p(1)", "1" },
    147      1.1  mrg   { 0, "odd_p(0)", "0" },
    148      1.1  mrg   { 0, "odd_p(-1)", "1" },
    149      1.1  mrg 
    150      1.1  mrg   { 0, "even_p(1)", "0" },
    151      1.1  mrg   { 0, "even_p(0)", "1" },
    152      1.1  mrg   { 0, "even_p(-1)", "0" },
    153      1.1  mrg 
    154      1.1  mrg   { 0, "fac(0)",  "1" },
    155      1.1  mrg   { 0, "fac(1)",  "1" },
    156      1.1  mrg   { 0, "fac(2)",  "2" },
    157      1.1  mrg   { 0, "fac(3)",  "6" },
    158      1.1  mrg   { 0, "fac(10)", "3628800" },
    159      1.1  mrg 
    160      1.1  mrg   { 10, "root(81,4)", "3" },
    161      1.1  mrg 
    162      1.1  mrg   { 10, "gcd(4,6)", "2" },
    163      1.1  mrg   { 10, "gcd(4,6,9)", "1" },
    164      1.1  mrg 
    165      1.1  mrg   { 10, "powm(3,2,9)", "0" },
    166      1.1  mrg   { 10, "powm(3,2,8)", "1" },
    167      1.1  mrg 
    168      1.1  mrg   /* filling data stack */
    169      1.1  mrg   { 0, "1 ? 1 : 1 || 1 && 1 | 1 ^ 1 & 1 == 1 >= 1 << 1 - 1 * 1 ** 1", "1" },
    170      1.1  mrg 
    171      1.1  mrg   /* filling control stack */
    172      1.1  mrg   { 0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1", "1" },
    173      1.1  mrg 
    174      1.1  mrg   { 0, "fib(10)", "55" },
    175      1.1  mrg 
    176      1.1  mrg   { 0, "setbit(0,5)", "32" },
    177      1.1  mrg   { 0, "clrbit(32,5)", "0" },
    178      1.1  mrg   { 0, "tstbit(32,5)", "1" },
    179      1.1  mrg   { 0, "tstbit(32,4)", "0" },
    180      1.1  mrg   { 0, "scan0(7,0)", "3" },
    181      1.1  mrg   { 0, "scan1(7,0)", "0" },
    182      1.1  mrg };
    183      1.1  mrg 
    184      1.1  mrg const struct data_t  data_zq[] = {
    185      1.1  mrg   /* expecting failure */
    186      1.1  mrg   { 0, "1.2", NULL },
    187      1.1  mrg };
    188      1.1  mrg 
    189      1.1  mrg const struct data_t  data_q[] = {
    190      1.1  mrg   { 10,  "(1/2 + 1/3 + 1/4 + 1/5 + 1/6)*20", "29" },
    191      1.1  mrg   { 0, "num(5/9)", "5" },
    192      1.1  mrg   { 0, "den(5/9)", "9" },
    193      1.1  mrg };
    194      1.1  mrg 
    195      1.1  mrg const struct data_t  data_zf[] = {
    196      1.1  mrg   { 10, "sqrt ( 49 )", "7" },
    197      1.1  mrg   { 10, "sqrt ( 49 ) + 1", "8" },
    198      1.1  mrg   { 10, "sqrt((49))", "7" },
    199      1.1  mrg   { 10, "sqrt((((((((49))))))))", "7" },
    200      1.1  mrg };
    201      1.1  mrg 
    202      1.1  mrg const struct data_t  data_f[] = {
    203      1.1  mrg   { 0, "1@10",    "10000000000" },
    204      1.1  mrg   { 0, "1.5@10",  "15000000000" },
    205      1.1  mrg   { 0, "1000@-1", "100" },
    206      1.1  mrg   { 0, "10.00@-1", "1" },
    207      1.1  mrg 
    208      1.1  mrg   { 0, "1e10",     "10000000000" },
    209      1.1  mrg   { 0, "1.5e10",   "15000000000" },
    210      1.1  mrg   { 0, "1000e-1",  "100" },
    211      1.1  mrg   { 0, "10.00e-1", "1" },
    212      1.1  mrg 
    213      1.1  mrg   { 16, "1@9",  "68719476736" },
    214      1.1  mrg 
    215      1.1  mrg   { 16,  "1@10", "18446744073709551616" },
    216      1.1  mrg   { -16, "1@10", "1099511627776" },
    217      1.1  mrg 
    218      1.1  mrg   { 0, "ceil(0)",           "0" },
    219      1.1  mrg   { 0, "ceil(0.25)",        "1" },
    220      1.1  mrg   { 0, "ceil(0.5)",         "1" },
    221      1.1  mrg   { 0, "ceil(1.5)",         "2" },
    222      1.1  mrg   { 0, "ceil(-0.5)",        "0" },
    223      1.1  mrg   { 0, "ceil(-1.5)",        "-1" },
    224      1.1  mrg 
    225      1.1  mrg   /* only simple cases because mpf_eq currently only works on whole limbs */
    226      1.1  mrg   { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,64)", "1" },
    227      1.1  mrg   { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,128)", "0" },
    228      1.1  mrg 
    229      1.1  mrg   { 0, "floor(0)",           "0" },
    230      1.1  mrg   { 0, "floor(0.25)",        "0" },
    231      1.1  mrg   { 0, "floor(0.5)",         "0" },
    232      1.1  mrg   { 0, "floor(1.5)",         "1" },
    233      1.1  mrg   { 0, "floor(-0.5)",        "-1" },
    234      1.1  mrg   { 0, "floor(-1.5)",        "-2" },
    235      1.1  mrg 
    236      1.1  mrg   { 0, "integer_p(1)",   "1" },
    237      1.1  mrg   { 0, "integer_p(0.5)", "0" },
    238      1.1  mrg 
    239      1.1  mrg   { 0, "trunc(0)",           "0" },
    240      1.1  mrg   { 0, "trunc(0.25)",        "0" },
    241      1.1  mrg   { 0, "trunc(0.5)",         "0" },
    242      1.1  mrg   { 0, "trunc(1.5)",         "1" },
    243      1.1  mrg   { 0, "trunc(-0.5)",        "0" },
    244      1.1  mrg   { 0, "trunc(-1.5)",        "-1" },
    245      1.1  mrg };
    246      1.1  mrg 
    247      1.1  mrg struct datalist_t {
    248      1.1  mrg   const struct data_t  *data;
    249      1.1  mrg   int                  num;
    250      1.1  mrg };
    251      1.1  mrg 
    252      1.1  mrg #define DATALIST(data)  { data, numberof (data) }
    253      1.1  mrg 
    254      1.1  mrg struct datalist_t  list_z[] = {
    255      1.1  mrg   DATALIST (data_z),
    256      1.1  mrg   DATALIST (data_zq),
    257      1.1  mrg   DATALIST (data_zf),
    258      1.1  mrg   DATALIST (data_zqf),
    259      1.1  mrg };
    260      1.1  mrg 
    261      1.1  mrg struct datalist_t  list_q[] = {
    262      1.1  mrg   DATALIST (data_q),
    263      1.1  mrg   DATALIST (data_zq),
    264      1.1  mrg   DATALIST (data_zqf),
    265      1.1  mrg };
    266      1.1  mrg 
    267      1.1  mrg struct datalist_t  list_f[] = {
    268      1.1  mrg   DATALIST (data_zf),
    269      1.1  mrg   DATALIST (data_zqf),
    270      1.1  mrg   DATALIST (data_f),
    271      1.1  mrg };
    272      1.1  mrg 
    273      1.1  mrg 
    274      1.1  mrg void
    275      1.1  mrg check_z (void)
    276      1.1  mrg {
    277      1.1  mrg   const struct data_t  *data;
    278      1.1  mrg   mpz_t  a, b, got, want;
    279      1.1  mrg   int    l, i, ret;
    280      1.1  mrg 
    281      1.1  mrg   mpz_init (got);
    282      1.1  mrg   mpz_init (want);
    283      1.1  mrg   mpz_init_set_ui (a, 55);
    284      1.1  mrg   mpz_init_set_ui (b, 99);
    285      1.1  mrg 
    286      1.1  mrg   for (l = 0; l < numberof (list_z); l++)
    287      1.1  mrg     {
    288      1.1  mrg       data = list_z[l].data;
    289      1.1  mrg 
    290      1.1  mrg       for (i = 0; i < list_z[l].num; i++)
    291      1.1  mrg         {
    292      1.1  mrg           if (option_trace)
    293      1.1  mrg             printf ("mpz_expr \"%s\"\n", data[i].expr);
    294      1.1  mrg 
    295      1.1  mrg           ret = mpz_expr (got, data[i].base, data[i].expr, a, b, NULL);
    296      1.1  mrg 
    297      1.1  mrg           if (data[i].want == NULL)
    298      1.1  mrg             {
    299      1.1  mrg               /* expect to fail */
    300      1.1  mrg               if (ret == MPEXPR_RESULT_OK)
    301      1.1  mrg                 {
    302      1.1  mrg                   printf ("mpz_expr wrong return value, got %d, expected failure\n", ret);
    303      1.1  mrg                   goto error;
    304      1.1  mrg                 }
    305      1.1  mrg             }
    306      1.1  mrg           else
    307      1.1  mrg             {
    308      1.1  mrg               if (mpz_set_str (want, data[i].want, 0) != 0)
    309      1.1  mrg                 {
    310      1.1  mrg                   printf ("Cannot parse wanted value string\n");
    311      1.1  mrg                   goto error;
    312      1.1  mrg                 }
    313      1.1  mrg               if (ret != MPEXPR_RESULT_OK)
    314      1.1  mrg                 {
    315      1.1  mrg                   printf ("mpz_expr failed unexpectedly\n");
    316      1.1  mrg                   printf ("   return value %d\n", ret);
    317      1.1  mrg                   goto error;
    318      1.1  mrg                 }
    319      1.1  mrg               if (mpz_cmp (got, want) != 0)
    320      1.1  mrg                 {
    321      1.1  mrg                   printf ("mpz_expr wrong result\n");
    322      1.1  mrg                   printf ("   got  "); mpz_out_str (stdout, 10, got);
    323      1.1  mrg                   printf ("\n");
    324      1.1  mrg                   printf ("   want "); mpz_out_str (stdout, 10, want);
    325      1.1  mrg                   printf ("\n");
    326      1.1  mrg                   goto error;
    327      1.1  mrg                 }
    328      1.1  mrg             }
    329      1.1  mrg         }
    330      1.1  mrg     }
    331      1.1  mrg   mpz_clear (a);
    332      1.1  mrg   mpz_clear (b);
    333      1.1  mrg   mpz_clear (got);
    334      1.1  mrg   mpz_clear (want);
    335      1.1  mrg   return;
    336      1.1  mrg 
    337      1.1  mrg  error:
    338      1.1  mrg   printf ("   base %d\n", data[i].base);
    339      1.1  mrg   printf ("   expr \"%s\"\n", data[i].expr);
    340      1.1  mrg   if (data[i].want != NULL)
    341      1.1  mrg     printf ("   want \"%s\"\n", data[i].want);
    342      1.1  mrg   abort ();
    343      1.1  mrg }
    344      1.1  mrg 
    345      1.1  mrg void
    346      1.1  mrg check_q (void)
    347      1.1  mrg {
    348      1.1  mrg   const struct data_t  *data;
    349      1.1  mrg   mpq_t  a, b, got, want;
    350      1.1  mrg   int    l, i, ret;
    351      1.1  mrg 
    352      1.1  mrg   mpq_init (got);
    353      1.1  mrg   mpq_init (want);
    354      1.1  mrg   mpq_init (a);
    355      1.1  mrg   mpq_init (b);
    356      1.1  mrg 
    357      1.1  mrg   mpq_set_ui (a, 55, 1);
    358      1.1  mrg   mpq_set_ui (b, 99, 1);
    359      1.1  mrg 
    360      1.1  mrg   for (l = 0; l < numberof (list_q); l++)
    361      1.1  mrg     {
    362      1.1  mrg       data = list_q[l].data;
    363      1.1  mrg 
    364      1.1  mrg       for (i = 0; i < list_q[l].num; i++)
    365      1.1  mrg         {
    366      1.1  mrg           if (option_trace)
    367      1.1  mrg             printf ("mpq_expr \"%s\"\n", data[i].expr);
    368      1.1  mrg 
    369      1.1  mrg           ret = mpq_expr (got, data[i].base, data[i].expr, a, b, NULL);
    370      1.1  mrg 
    371      1.1  mrg           if (data[i].want == NULL)
    372      1.1  mrg             {
    373      1.1  mrg               /* expect to fail */
    374      1.1  mrg               if (ret == MPEXPR_RESULT_OK)
    375      1.1  mrg                 {
    376      1.1  mrg                   printf ("mpq_expr wrong return value, got %d, expected failure\n", ret);
    377      1.1  mrg                   goto error;
    378      1.1  mrg                 }
    379      1.1  mrg             }
    380      1.1  mrg           else
    381      1.1  mrg             {
    382      1.1  mrg               if (mpz_set_str (mpq_numref(want), data[i].want, 0) != 0)
    383      1.1  mrg                 {
    384      1.1  mrg                   printf ("Cannot parse wanted value string\n");
    385      1.1  mrg                   goto error;
    386      1.1  mrg                 }
    387      1.1  mrg               mpz_set_ui (mpq_denref(want), 1);
    388      1.1  mrg 
    389      1.1  mrg               if (ret != MPEXPR_RESULT_OK)
    390      1.1  mrg                 {
    391      1.1  mrg                   printf ("mpq_expr failed unexpectedly\n");
    392      1.1  mrg                   printf ("   return value %d\n", ret);
    393      1.1  mrg                   goto error;
    394      1.1  mrg                 }
    395      1.1  mrg               if (mpq_cmp (got, want) != 0)
    396      1.1  mrg                 {
    397      1.1  mrg                   printf ("mpq_expr wrong result\n");
    398      1.1  mrg                   printf ("   got  "); mpq_out_str (stdout, 10, got);
    399      1.1  mrg                   printf ("\n");
    400      1.1  mrg                   printf ("   want "); mpq_out_str (stdout, 10, want);
    401      1.1  mrg                   printf ("\n");
    402      1.1  mrg                   goto error;
    403      1.1  mrg                 }
    404      1.1  mrg             }
    405      1.1  mrg         }
    406      1.1  mrg     }
    407      1.1  mrg   mpq_clear (a);
    408      1.1  mrg   mpq_clear (b);
    409      1.1  mrg   mpq_clear (got);
    410      1.1  mrg   mpq_clear (want);
    411      1.1  mrg   return;
    412      1.1  mrg 
    413      1.1  mrg  error:
    414      1.1  mrg   printf ("   base %d\n", data[i].base);
    415      1.1  mrg   printf ("   expr \"%s\"\n", data[i].expr);
    416      1.1  mrg   if (data[i].want != NULL)
    417      1.1  mrg     printf ("   want \"%s\"\n", data[i].want);
    418      1.1  mrg   abort ();
    419      1.1  mrg }
    420      1.1  mrg 
    421      1.1  mrg void
    422      1.1  mrg check_f (void)
    423      1.1  mrg {
    424      1.1  mrg   const struct data_t  *data;
    425      1.1  mrg   mpf_t  a, b, got, want;
    426      1.1  mrg   int    l, i, ret;
    427      1.1  mrg 
    428      1.1  mrg   mpf_set_default_prec (200L);
    429      1.1  mrg 
    430      1.1  mrg   mpf_init (got);
    431      1.1  mrg   mpf_init (want);
    432      1.1  mrg   mpf_init_set_ui (a, 55);
    433      1.1  mrg   mpf_init_set_ui (b, 99);
    434      1.1  mrg 
    435      1.1  mrg   for (l = 0; l < numberof (list_f); l++)
    436      1.1  mrg     {
    437      1.1  mrg       data = list_f[l].data;
    438      1.1  mrg 
    439      1.1  mrg       for (i = 0; i < list_f[l].num; i++)
    440      1.1  mrg         {
    441      1.1  mrg           if (option_trace)
    442      1.1  mrg             printf ("mpf_expr \"%s\"\n", data[i].expr);
    443      1.1  mrg 
    444      1.1  mrg           ret = mpf_expr (got, data[i].base, data[i].expr, a, b, NULL);
    445      1.1  mrg 
    446      1.1  mrg           if (data[i].want == NULL)
    447      1.1  mrg             {
    448      1.1  mrg               /* expect to fail */
    449      1.1  mrg               if (ret == MPEXPR_RESULT_OK)
    450      1.1  mrg                 {
    451      1.1  mrg                   printf ("mpf_expr wrong return value, got %d, expected failure\n", ret);
    452      1.1  mrg                   goto error;
    453      1.1  mrg                 }
    454      1.1  mrg             }
    455      1.1  mrg           else
    456      1.1  mrg             {
    457      1.1  mrg               if (mpf_set_str (want, data[i].want, 0) != 0)
    458      1.1  mrg                 {
    459      1.1  mrg                   printf ("Cannot parse wanted value string\n");
    460      1.1  mrg                   goto error;
    461      1.1  mrg                 }
    462      1.1  mrg 
    463      1.1  mrg               if (ret != MPEXPR_RESULT_OK)
    464      1.1  mrg                 {
    465      1.1  mrg                   printf ("mpf_expr failed unexpectedly\n");
    466      1.1  mrg                   printf ("   return value %d\n", ret);
    467      1.1  mrg                   goto error;
    468      1.1  mrg                 }
    469      1.1  mrg               if (mpf_cmp (got, want) != 0)
    470      1.1  mrg                 {
    471      1.1  mrg                   printf ("mpf_expr wrong result\n");
    472      1.1  mrg                   printf ("   got  "); mpf_out_str (stdout, 10, 20, got);
    473      1.1  mrg                   printf ("\n");
    474      1.1  mrg                   printf ("   want "); mpf_out_str (stdout, 10, 20, want);
    475      1.1  mrg                   printf ("\n");
    476      1.1  mrg                   goto error;
    477      1.1  mrg                 }
    478      1.1  mrg             }
    479      1.1  mrg         }
    480      1.1  mrg     }
    481      1.1  mrg   mpf_clear (a);
    482      1.1  mrg   mpf_clear (b);
    483      1.1  mrg   mpf_clear (got);
    484      1.1  mrg   mpf_clear (want);
    485      1.1  mrg   return;
    486      1.1  mrg 
    487      1.1  mrg  error:
    488      1.1  mrg   printf ("   base %d\n", data[i].base);
    489      1.1  mrg   printf ("   expr \"%s\"\n", data[i].expr);
    490      1.1  mrg   if (data[i].want != NULL)
    491      1.1  mrg     printf ("   want \"%s\"\n", data[i].want);
    492      1.1  mrg   abort ();
    493      1.1  mrg }
    494      1.1  mrg 
    495      1.1  mrg 
    496      1.1  mrg int
    497      1.1  mrg main (int argc, char *argv[])
    498      1.1  mrg {
    499      1.1  mrg   tests_start ();
    500      1.1  mrg 
    501      1.1  mrg   if (argc >= 2)
    502      1.1  mrg     option_trace = 1;
    503      1.1  mrg 
    504      1.1  mrg   check_z ();
    505      1.1  mrg   check_q ();
    506      1.1  mrg   check_f ();
    507      1.1  mrg 
    508      1.1  mrg   tests_end ();
    509      1.1  mrg   exit (0);
    510      1.1  mrg }
    511