Blame demos/expr/t-expr.c

Packit 5c3484
/* Test expression evaluation (print nothing and exit 0 if successful).
Packit 5c3484
Packit 5c3484
Copyright 2000-2004 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library.
Packit 5c3484
Packit 5c3484
The GNU MP Library is free software; you can redistribute it and/or modify
Packit 5c3484
it under the terms of either:
Packit 5c3484
Packit 5c3484
  * the GNU Lesser General Public License as published by the Free
Packit 5c3484
    Software Foundation; either version 3 of the License, or (at your
Packit 5c3484
    option) any later version.
Packit 5c3484
Packit 5c3484
or
Packit 5c3484
Packit 5c3484
  * the GNU General Public License as published by the Free Software
Packit 5c3484
    Foundation; either version 2 of the License, or (at your option) any
Packit 5c3484
    later version.
Packit 5c3484
Packit 5c3484
or both in parallel, as here.
Packit 5c3484
Packit 5c3484
The GNU MP Library is distributed in the hope that it will be useful, but
Packit 5c3484
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 5c3484
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 5c3484
for more details.
Packit 5c3484
Packit 5c3484
You should have received copies of the GNU General Public License and the
Packit 5c3484
GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 5c3484
see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
#include <stdio.h>
Packit 5c3484
#include <stdlib.h>
Packit 5c3484
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "tests.h"
Packit 5c3484
#include "expr-impl.h"
Packit 5c3484
Packit 5c3484
Packit 5c3484
int  option_trace = 0;
Packit 5c3484
Packit 5c3484
Packit 5c3484
struct data_t {
Packit 5c3484
  int         base;
Packit 5c3484
  const char  *expr;
Packit 5c3484
  const char  *want;
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
#define numberof(x)  (sizeof (x) / sizeof ((x)[0]))
Packit 5c3484
Packit 5c3484
Packit 5c3484
/* These data_xxx[] arrays are tables to be tested with one or more of the
Packit 5c3484
   mp?_t types.  z=mpz_t, q=mpz_t, f=mpf_t.  */
Packit 5c3484
Packit 5c3484
struct data_t  data_zqf[] = {
Packit 5c3484
Packit 5c3484
  /* various deliberately wrong expressions */
Packit 5c3484
  { 0, "", NULL },
Packit 5c3484
  { 0, "1+", NULL },
Packit 5c3484
  { 0, "+2", NULL },
Packit 5c3484
  { 0, "1,2", NULL },
Packit 5c3484
  { 0, "foo(1,2)", NULL },
Packit 5c3484
  { 0, "1+foo", NULL },
Packit 5c3484
  { 10, "0fff", NULL },
Packit 5c3484
  { 0, "!", NULL },
Packit 5c3484
  { 0, "10!", NULL },
Packit 5c3484
  { 0, "-10!", NULL },
Packit 5c3484
  { 0, "gcd((4,6))", NULL },
Packit 5c3484
  { 0, "()", NULL },
Packit 5c3484
  { 0, "fac(2**1000)", NULL },
Packit 5c3484
  { 0, "$", NULL },
Packit 5c3484
  { 0, "$-", NULL },
Packit 5c3484
Packit 5c3484
  /* some basics */
Packit 5c3484
  { 10, "123", "123" },
Packit 5c3484
  { 10, "-123", "-123" },
Packit 5c3484
  { 10, "1+2", "3" },
Packit 5c3484
  { 10, "1+2+3", "6" },
Packit 5c3484
  { 10, "1+2*3", "7" },
Packit 5c3484
  { 10, "3*2+1", "7" },
Packit 5c3484
  { 10, "$a", "55" },
Packit 5c3484
  { 10, "b", "99" },
Packit 5c3484
  { 16, "b", "11" },
Packit 5c3484
  { 10, "4**3 * 2 + 1", "129" },
Packit 5c3484
  { 10, "1<2", "1" },
Packit 5c3484
  { 10, "1>2", "0" },
Packit 5c3484
Packit 5c3484
  { 10, "(123)", "123" },
Packit 5c3484
Packit 5c3484
  { 10, "sgn(-123)", "-1" },
Packit 5c3484
  { 10, "5-7", "-2" },
Packit 5c3484
Packit 5c3484
  { 0, "cmp(0,0)", "0" },
Packit 5c3484
  { 0, "cmp(1,0)", "1" },
Packit 5c3484
  { 0, "cmp(0,1)", "-1" },
Packit 5c3484
  { 0, "cmp(-1,0)", "-1" },
Packit 5c3484
  { 0, "cmp(0,-1)", "1" },
Packit 5c3484
Packit 5c3484
  { 10, "0 ? 123 : 456", "456" },
Packit 5c3484
  { 10, "1 ? 4+5 : 6+7", "9" },
Packit 5c3484
Packit 5c3484
  { 10, "(123)", "123" },
Packit 5c3484
  { 10, "(2+3)", "5" },
Packit 5c3484
  { 10, "(4+5)*(5+6)", "99" },
Packit 5c3484
Packit 5c3484
  { 0, "1 << 16", "65536" },
Packit 5c3484
  { 0, "256 >> 4", "16" },
Packit 5c3484
  { 0, "-256 >> 4", "-16" },
Packit 5c3484
Packit 5c3484
  { 0, "!1", "0" },
Packit 5c3484
  { 0, "!9", "0" },
Packit 5c3484
  { 0, "!0", "1" },
Packit 5c3484
Packit 5c3484
  { 0, "2**2**2", "16" },
Packit 5c3484
  { 0, "-2**2**2", "-16" },
Packit 5c3484
Packit 5c3484
  { 0, "0x100", "256" },
Packit 5c3484
  { 10, "0x100", NULL },
Packit 5c3484
  { 10, "0x 100", NULL },
Packit 5c3484
Packit 5c3484
  { 0, " max ( 1, 2, 3, 4, 5, 6, 7, 8)", "8" },
Packit 5c3484
  { 0, " max ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "9" },
Packit 5c3484
  { 0, " min ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "1" },
Packit 5c3484
Packit 5c3484
  { 10, "abs(123)",  "123" },
Packit 5c3484
  { 10, "abs(-123)", "123" },
Packit 5c3484
  { 10, "abs(0)",    "0" },
Packit 5c3484
Packit 5c3484
  /* filling data stack */
Packit 5c3484
  { 0, "1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))", "16" },
Packit 5c3484
Packit 5c3484
  /* filling control stack */
Packit 5c3484
  { 0, "----------------------------------------------------1", "1" },
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
Packit 5c3484
const struct data_t  data_z[] = {
Packit 5c3484
  { 0, "divisible_p(333,3)", "1" },
Packit 5c3484
  { 0, "congruent_p(7,1,3)", "1" },
Packit 5c3484
Packit 5c3484
  { 0, "cmpabs(0,0)", "0" },
Packit 5c3484
  { 0, "cmpabs(1,0)", "1" },
Packit 5c3484
  { 0, "cmpabs(0,1)", "-1" },
Packit 5c3484
  { 0, "cmpabs(-1,0)", "1" },
Packit 5c3484
  { 0, "cmpabs(0,-1)", "-1" },
Packit 5c3484
Packit 5c3484
  { 0, "odd_p(1)", "1" },
Packit 5c3484
  { 0, "odd_p(0)", "0" },
Packit 5c3484
  { 0, "odd_p(-1)", "1" },
Packit 5c3484
Packit 5c3484
  { 0, "even_p(1)", "0" },
Packit 5c3484
  { 0, "even_p(0)", "1" },
Packit 5c3484
  { 0, "even_p(-1)", "0" },
Packit 5c3484
Packit 5c3484
  { 0, "fac(0)",  "1" },
Packit 5c3484
  { 0, "fac(1)",  "1" },
Packit 5c3484
  { 0, "fac(2)",  "2" },
Packit 5c3484
  { 0, "fac(3)",  "6" },
Packit 5c3484
  { 0, "fac(10)", "3628800" },
Packit 5c3484
Packit 5c3484
  { 10, "root(81,4)", "3" },
Packit 5c3484
Packit 5c3484
  { 10, "gcd(4,6)", "2" },
Packit 5c3484
  { 10, "gcd(4,6,9)", "1" },
Packit 5c3484
Packit 5c3484
  { 10, "powm(3,2,9)", "0" },
Packit 5c3484
  { 10, "powm(3,2,8)", "1" },
Packit 5c3484
Packit 5c3484
  /* filling data stack */
Packit 5c3484
  { 0, "1 ? 1 : 1 || 1 && 1 | 1 ^ 1 & 1 == 1 >= 1 << 1 - 1 * 1 ** 1", "1" },
Packit 5c3484
Packit 5c3484
  /* filling control stack */
Packit 5c3484
  { 0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1", "1" },
Packit 5c3484
Packit 5c3484
  { 0, "fib(10)", "55" },
Packit 5c3484
Packit 5c3484
  { 0, "setbit(0,5)", "32" },
Packit 5c3484
  { 0, "clrbit(32,5)", "0" },
Packit 5c3484
  { 0, "tstbit(32,5)", "1" },
Packit 5c3484
  { 0, "tstbit(32,4)", "0" },
Packit 5c3484
  { 0, "scan0(7,0)", "3" },
Packit 5c3484
  { 0, "scan1(7,0)", "0" },
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
const struct data_t  data_zq[] = {
Packit 5c3484
  /* expecting failure */
Packit 5c3484
  { 0, "1.2", NULL },
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
const struct data_t  data_q[] = {
Packit 5c3484
  { 10,  "(1/2 + 1/3 + 1/4 + 1/5 + 1/6)*20", "29" },
Packit 5c3484
  { 0, "num(5/9)", "5" },
Packit 5c3484
  { 0, "den(5/9)", "9" },
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
const struct data_t  data_zf[] = {
Packit 5c3484
  { 10, "sqrt ( 49 )", "7" },
Packit 5c3484
  { 10, "sqrt ( 49 ) + 1", "8" },
Packit 5c3484
  { 10, "sqrt((49))", "7" },
Packit 5c3484
  { 10, "sqrt((((((((49))))))))", "7" },
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
const struct data_t  data_f[] = {
Packit 5c3484
  { 0, "1@10",    "10000000000" },
Packit 5c3484
  { 0, "1.5@10",  "15000000000" },
Packit 5c3484
  { 0, "1000@-1", "100" },
Packit 5c3484
  { 0, "10.00@-1", "1" },
Packit 5c3484
Packit 5c3484
  { 0, "1e10",     "10000000000" },
Packit 5c3484
  { 0, "1.5e10",   "15000000000" },
Packit 5c3484
  { 0, "1000e-1",  "100" },
Packit 5c3484
  { 0, "10.00e-1", "1" },
Packit 5c3484
Packit 5c3484
  { 16, "1@9",  "68719476736" },
Packit 5c3484
Packit 5c3484
  { 16,  "1@10", "18446744073709551616" },
Packit 5c3484
  { -16, "1@10", "1099511627776" },
Packit 5c3484
Packit 5c3484
  { 0, "ceil(0)",           "0" },
Packit 5c3484
  { 0, "ceil(0.25)",        "1" },
Packit 5c3484
  { 0, "ceil(0.5)",         "1" },
Packit 5c3484
  { 0, "ceil(1.5)",         "2" },
Packit 5c3484
  { 0, "ceil(-0.5)",        "0" },
Packit 5c3484
  { 0, "ceil(-1.5)",        "-1" },
Packit 5c3484
Packit 5c3484
  /* only simple cases because mpf_eq currently only works on whole limbs */
Packit 5c3484
  { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,64)", "1" },
Packit 5c3484
  { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,128)", "0" },
Packit 5c3484
Packit 5c3484
  { 0, "floor(0)",           "0" },
Packit 5c3484
  { 0, "floor(0.25)",        "0" },
Packit 5c3484
  { 0, "floor(0.5)",         "0" },
Packit 5c3484
  { 0, "floor(1.5)",         "1" },
Packit 5c3484
  { 0, "floor(-0.5)",        "-1" },
Packit 5c3484
  { 0, "floor(-1.5)",        "-2" },
Packit 5c3484
Packit 5c3484
  { 0, "integer_p(1)",   "1" },
Packit 5c3484
  { 0, "integer_p(0.5)", "0" },
Packit 5c3484
Packit 5c3484
  { 0, "trunc(0)",           "0" },
Packit 5c3484
  { 0, "trunc(0.25)",        "0" },
Packit 5c3484
  { 0, "trunc(0.5)",         "0" },
Packit 5c3484
  { 0, "trunc(1.5)",         "1" },
Packit 5c3484
  { 0, "trunc(-0.5)",        "0" },
Packit 5c3484
  { 0, "trunc(-1.5)",        "-1" },
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
struct datalist_t {
Packit 5c3484
  const struct data_t  *data;
Packit 5c3484
  int                  num;
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
#define DATALIST(data)  { data, numberof (data) }
Packit 5c3484
Packit 5c3484
struct datalist_t  list_z[] = {
Packit 5c3484
  DATALIST (data_z),
Packit 5c3484
  DATALIST (data_zq),
Packit 5c3484
  DATALIST (data_zf),
Packit 5c3484
  DATALIST (data_zqf),
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
struct datalist_t  list_q[] = {
Packit 5c3484
  DATALIST (data_q),
Packit 5c3484
  DATALIST (data_zq),
Packit 5c3484
  DATALIST (data_zqf),
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
struct datalist_t  list_f[] = {
Packit 5c3484
  DATALIST (data_zf),
Packit 5c3484
  DATALIST (data_zqf),
Packit 5c3484
  DATALIST (data_f),
Packit 5c3484
};
Packit 5c3484
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_z (void)
Packit 5c3484
{
Packit 5c3484
  const struct data_t  *data;
Packit 5c3484
  mpz_t  a, b, got, want;
Packit 5c3484
  int    l, i, ret;
Packit 5c3484
Packit 5c3484
  mpz_init (got);
Packit 5c3484
  mpz_init (want);
Packit 5c3484
  mpz_init_set_ui (a, 55);
Packit 5c3484
  mpz_init_set_ui (b, 99);
Packit 5c3484
Packit 5c3484
  for (l = 0; l < numberof (list_z); l++)
Packit 5c3484
    {
Packit 5c3484
      data = list_z[l].data;
Packit 5c3484
Packit 5c3484
      for (i = 0; i < list_z[l].num; i++)
Packit 5c3484
        {
Packit 5c3484
          if (option_trace)
Packit 5c3484
            printf ("mpz_expr \"%s\"\n", data[i].expr);
Packit 5c3484
Packit 5c3484
          ret = mpz_expr (got, data[i].base, data[i].expr, a, b, NULL);
Packit 5c3484
Packit 5c3484
          if (data[i].want == NULL)
Packit 5c3484
            {
Packit 5c3484
              /* expect to fail */
Packit 5c3484
              if (ret == MPEXPR_RESULT_OK)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpz_expr wrong return value, got %d, expected failure\n", ret);
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
            }
Packit 5c3484
          else
Packit 5c3484
            {
Packit 5c3484
              if (mpz_set_str (want, data[i].want, 0) != 0)
Packit 5c3484
                {
Packit 5c3484
                  printf ("Cannot parse wanted value string\n");
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
              if (ret != MPEXPR_RESULT_OK)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpz_expr failed unexpectedly\n");
Packit 5c3484
                  printf ("   return value %d\n", ret);
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
              if (mpz_cmp (got, want) != 0)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpz_expr wrong result\n");
Packit 5c3484
                  printf ("   got  "); mpz_out_str (stdout, 10, got);
Packit 5c3484
                  printf ("\n");
Packit 5c3484
                  printf ("   want "); mpz_out_str (stdout, 10, want);
Packit 5c3484
                  printf ("\n");
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
            }
Packit 5c3484
        }
Packit 5c3484
    }
Packit 5c3484
  mpz_clear (a);
Packit 5c3484
  mpz_clear (b);
Packit 5c3484
  mpz_clear (got);
Packit 5c3484
  mpz_clear (want);
Packit 5c3484
  return;
Packit 5c3484
Packit 5c3484
 error:
Packit 5c3484
  printf ("   base %d\n", data[i].base);
Packit 5c3484
  printf ("   expr \"%s\"\n", data[i].expr);
Packit 5c3484
  if (data[i].want != NULL)
Packit 5c3484
    printf ("   want \"%s\"\n", data[i].want);
Packit 5c3484
  abort ();
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_q (void)
Packit 5c3484
{
Packit 5c3484
  const struct data_t  *data;
Packit 5c3484
  mpq_t  a, b, got, want;
Packit 5c3484
  int    l, i, ret;
Packit 5c3484
Packit 5c3484
  mpq_init (got);
Packit 5c3484
  mpq_init (want);
Packit 5c3484
  mpq_init (a);
Packit 5c3484
  mpq_init (b);
Packit 5c3484
Packit 5c3484
  mpq_set_ui (a, 55, 1);
Packit 5c3484
  mpq_set_ui (b, 99, 1);
Packit 5c3484
Packit 5c3484
  for (l = 0; l < numberof (list_q); l++)
Packit 5c3484
    {
Packit 5c3484
      data = list_q[l].data;
Packit 5c3484
Packit 5c3484
      for (i = 0; i < list_q[l].num; i++)
Packit 5c3484
        {
Packit 5c3484
          if (option_trace)
Packit 5c3484
            printf ("mpq_expr \"%s\"\n", data[i].expr);
Packit 5c3484
Packit 5c3484
          ret = mpq_expr (got, data[i].base, data[i].expr, a, b, NULL);
Packit 5c3484
Packit 5c3484
          if (data[i].want == NULL)
Packit 5c3484
            {
Packit 5c3484
              /* expect to fail */
Packit 5c3484
              if (ret == MPEXPR_RESULT_OK)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpq_expr wrong return value, got %d, expected failure\n", ret);
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
            }
Packit 5c3484
          else
Packit 5c3484
            {
Packit 5c3484
              if (mpz_set_str (mpq_numref(want), data[i].want, 0) != 0)
Packit 5c3484
                {
Packit 5c3484
                  printf ("Cannot parse wanted value string\n");
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
              mpz_set_ui (mpq_denref(want), 1);
Packit 5c3484
Packit 5c3484
              if (ret != MPEXPR_RESULT_OK)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpq_expr failed unexpectedly\n");
Packit 5c3484
                  printf ("   return value %d\n", ret);
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
              if (mpq_cmp (got, want) != 0)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpq_expr wrong result\n");
Packit 5c3484
                  printf ("   got  "); mpq_out_str (stdout, 10, got);
Packit 5c3484
                  printf ("\n");
Packit 5c3484
                  printf ("   want "); mpq_out_str (stdout, 10, want);
Packit 5c3484
                  printf ("\n");
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
            }
Packit 5c3484
        }
Packit 5c3484
    }
Packit 5c3484
  mpq_clear (a);
Packit 5c3484
  mpq_clear (b);
Packit 5c3484
  mpq_clear (got);
Packit 5c3484
  mpq_clear (want);
Packit 5c3484
  return;
Packit 5c3484
Packit 5c3484
 error:
Packit 5c3484
  printf ("   base %d\n", data[i].base);
Packit 5c3484
  printf ("   expr \"%s\"\n", data[i].expr);
Packit 5c3484
  if (data[i].want != NULL)
Packit 5c3484
    printf ("   want \"%s\"\n", data[i].want);
Packit 5c3484
  abort ();
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_f (void)
Packit 5c3484
{
Packit 5c3484
  const struct data_t  *data;
Packit 5c3484
  mpf_t  a, b, got, want;
Packit 5c3484
  int    l, i, ret;
Packit 5c3484
Packit 5c3484
  mpf_set_default_prec (200L);
Packit 5c3484
Packit 5c3484
  mpf_init (got);
Packit 5c3484
  mpf_init (want);
Packit 5c3484
  mpf_init_set_ui (a, 55);
Packit 5c3484
  mpf_init_set_ui (b, 99);
Packit 5c3484
Packit 5c3484
  for (l = 0; l < numberof (list_f); l++)
Packit 5c3484
    {
Packit 5c3484
      data = list_f[l].data;
Packit 5c3484
Packit 5c3484
      for (i = 0; i < list_f[l].num; i++)
Packit 5c3484
        {
Packit 5c3484
          if (option_trace)
Packit 5c3484
            printf ("mpf_expr \"%s\"\n", data[i].expr);
Packit 5c3484
Packit 5c3484
          ret = mpf_expr (got, data[i].base, data[i].expr, a, b, NULL);
Packit 5c3484
Packit 5c3484
          if (data[i].want == NULL)
Packit 5c3484
            {
Packit 5c3484
              /* expect to fail */
Packit 5c3484
              if (ret == MPEXPR_RESULT_OK)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpf_expr wrong return value, got %d, expected failure\n", ret);
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
            }
Packit 5c3484
          else
Packit 5c3484
            {
Packit 5c3484
              if (mpf_set_str (want, data[i].want, 0) != 0)
Packit 5c3484
                {
Packit 5c3484
                  printf ("Cannot parse wanted value string\n");
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
Packit 5c3484
              if (ret != MPEXPR_RESULT_OK)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpf_expr failed unexpectedly\n");
Packit 5c3484
                  printf ("   return value %d\n", ret);
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
              if (mpf_cmp (got, want) != 0)
Packit 5c3484
                {
Packit 5c3484
                  printf ("mpf_expr wrong result\n");
Packit 5c3484
                  printf ("   got  "); mpf_out_str (stdout, 10, 20, got);
Packit 5c3484
                  printf ("\n");
Packit 5c3484
                  printf ("   want "); mpf_out_str (stdout, 10, 20, want);
Packit 5c3484
                  printf ("\n");
Packit 5c3484
                  goto error;
Packit 5c3484
                }
Packit 5c3484
            }
Packit 5c3484
        }
Packit 5c3484
    }
Packit 5c3484
  mpf_clear (a);
Packit 5c3484
  mpf_clear (b);
Packit 5c3484
  mpf_clear (got);
Packit 5c3484
  mpf_clear (want);
Packit 5c3484
  return;
Packit 5c3484
Packit 5c3484
 error:
Packit 5c3484
  printf ("   base %d\n", data[i].base);
Packit 5c3484
  printf ("   expr \"%s\"\n", data[i].expr);
Packit 5c3484
  if (data[i].want != NULL)
Packit 5c3484
    printf ("   want \"%s\"\n", data[i].want);
Packit 5c3484
  abort ();
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (int argc, char *argv[])
Packit 5c3484
{
Packit 5c3484
  tests_start ();
Packit 5c3484
Packit 5c3484
  if (argc >= 2)
Packit 5c3484
    option_trace = 1;
Packit 5c3484
Packit 5c3484
  check_z ();
Packit 5c3484
  check_q ();
Packit 5c3484
  check_f ();
Packit 5c3484
Packit 5c3484
  tests_end ();
Packit 5c3484
  exit (0);
Packit 5c3484
}