Blame demos/expr/run-expr.c

Packit 5c3484
/* Demo program to run expression evaluation.
Packit 5c3484
Packit 5c3484
Copyright 2000-2002, 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
Packit 5c3484
/* Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression...
Packit 5c3484
Packit 5c3484
   Evaluate each argument as a simple expression.  By default this is in mpz
Packit 5c3484
   integers, but -q selects mpq or -f selects mpf.  For mpf the float
Packit 5c3484
   precision can be set with -p.  In all cases the input base can be set
Packit 5c3484
   with -b, or the default is "0" meaning decimal with "0x" allowed.
Packit 5c3484
Packit 5c3484
   This is a pretty trivial program, it's just an easy way to experiment
Packit 5c3484
   with the evaluation functions.  */
Packit 5c3484
Packit 5c3484
Packit 5c3484
#include <stdio.h>
Packit 5c3484
#include <stdlib.h>
Packit 5c3484
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "expr.h"
Packit 5c3484
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
run_expr (int type, int base, unsigned long prec, char *str)
Packit 5c3484
{
Packit 5c3484
  int  outbase = (base == 0 ? 10 : base);
Packit 5c3484
  int  ret;
Packit 5c3484
Packit 5c3484
  switch (type) {
Packit 5c3484
  case 'z':
Packit 5c3484
  default:
Packit 5c3484
    {
Packit 5c3484
      mpz_t  res, var_a, var_b;
Packit 5c3484
Packit 5c3484
      mpz_init (res);
Packit 5c3484
      mpz_init_set_ui (var_a, 55L);
Packit 5c3484
      mpz_init_set_ui (var_b, 99L);
Packit 5c3484
Packit 5c3484
      ret = mpz_expr (res, base, str, var_a, var_b, NULL);
Packit 5c3484
      printf ("\"%s\" base %d: ", str, base);
Packit 5c3484
      if (ret == MPEXPR_RESULT_OK)
Packit 5c3484
        {
Packit 5c3484
          printf ("result ");
Packit 5c3484
          mpz_out_str (stdout, outbase, res);
Packit 5c3484
          printf ("\n");
Packit 5c3484
        }
Packit 5c3484
      else
Packit 5c3484
        printf ("invalid (return code %d)\n", ret);
Packit 5c3484
Packit 5c3484
      mpz_clear (res);
Packit 5c3484
      mpz_clear (var_a);
Packit 5c3484
      mpz_clear (var_b);
Packit 5c3484
    }
Packit 5c3484
    break;
Packit 5c3484
Packit 5c3484
  case 'q':
Packit 5c3484
    {
Packit 5c3484
      mpq_t  res, var_a, var_b;
Packit 5c3484
Packit 5c3484
      mpq_init (res);
Packit 5c3484
      mpq_init (var_a);
Packit 5c3484
      mpq_init (var_b);
Packit 5c3484
Packit 5c3484
      mpq_set_ui (var_a, 55L, 1);
Packit 5c3484
      mpq_set_ui (var_b, 99L, 1);
Packit 5c3484
Packit 5c3484
      ret = mpq_expr (res, base, str, var_a, var_b, NULL);
Packit 5c3484
      printf ("\"%s\" base %d: ", str, base);
Packit 5c3484
      if (ret == MPEXPR_RESULT_OK)
Packit 5c3484
        {
Packit 5c3484
          printf ("result ");
Packit 5c3484
          mpq_out_str (stdout, outbase, res);
Packit 5c3484
          printf ("\n");
Packit 5c3484
        }
Packit 5c3484
      else
Packit 5c3484
        printf ("invalid (return code %d)\n", ret);
Packit 5c3484
Packit 5c3484
      mpq_clear (res);
Packit 5c3484
      mpq_clear (var_a);
Packit 5c3484
      mpq_clear (var_b);
Packit 5c3484
    }
Packit 5c3484
    break;
Packit 5c3484
Packit 5c3484
  case 'f':
Packit 5c3484
    {
Packit 5c3484
      mpf_t  res, var_a, var_b;
Packit 5c3484
Packit 5c3484
      mpf_init2 (res, prec);
Packit 5c3484
      mpf_init_set_ui (var_a, 55L);
Packit 5c3484
      mpf_init_set_ui (var_b, 99L);
Packit 5c3484
Packit 5c3484
      ret = mpf_expr (res, base, str, var_a, var_b, NULL);
Packit 5c3484
      printf ("\"%s\" base %d: ", str, base);
Packit 5c3484
      if (ret == MPEXPR_RESULT_OK)
Packit 5c3484
        {
Packit 5c3484
          printf ("result ");
Packit 5c3484
          mpf_out_str (stdout, outbase, (size_t) 0, res);
Packit 5c3484
          printf ("\n");
Packit 5c3484
        }
Packit 5c3484
      else
Packit 5c3484
        printf ("invalid (return code %d)\n", ret);
Packit 5c3484
Packit 5c3484
      mpf_clear (res);
Packit 5c3484
      mpf_clear (var_a);
Packit 5c3484
      mpf_clear (var_b);
Packit 5c3484
    }
Packit 5c3484
    break;
Packit 5c3484
  }
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (int argc, char *argv[])
Packit 5c3484
{
Packit 5c3484
  int            type = 'z';
Packit 5c3484
  int            base = 0;
Packit 5c3484
  unsigned long  prec = 64;
Packit 5c3484
  int            seen_expr = 0;
Packit 5c3484
  int            opt;
Packit 5c3484
  char           *arg;
Packit 5c3484
Packit 5c3484
  for (;;)
Packit 5c3484
    {
Packit 5c3484
      argv++;
Packit 5c3484
      arg = argv[0];
Packit 5c3484
      if (arg == NULL)
Packit 5c3484
        break;
Packit 5c3484
Packit 5c3484
      if (arg[0] == '-')
Packit 5c3484
        {
Packit 5c3484
          for (;;)
Packit 5c3484
            {
Packit 5c3484
              arg++;
Packit 5c3484
              opt = arg[0];
Packit 5c3484
Packit 5c3484
              switch (opt) {
Packit 5c3484
              case '\0':
Packit 5c3484
                goto end_opt;
Packit 5c3484
Packit 5c3484
              case 'f':
Packit 5c3484
              case 'q':
Packit 5c3484
              case 'z':
Packit 5c3484
                type = opt;
Packit 5c3484
                break;
Packit 5c3484
Packit 5c3484
              case 'b':
Packit 5c3484
                arg++;
Packit 5c3484
                if (arg[0] == '\0')
Packit 5c3484
                  {
Packit 5c3484
                    argv++;
Packit 5c3484
                    arg = argv[0];
Packit 5c3484
                    if (arg == NULL)
Packit 5c3484
                      {
Packit 5c3484
                      need_arg:
Packit 5c3484
                        fprintf (stderr, "Need argument for -%c\n", opt);
Packit 5c3484
                        exit (1);
Packit 5c3484
                      }
Packit 5c3484
                  }
Packit 5c3484
                base = atoi (arg);
Packit 5c3484
                goto end_opt;
Packit 5c3484
Packit 5c3484
              case 'p':
Packit 5c3484
                arg++;
Packit 5c3484
                if (arg[0] == '\0')
Packit 5c3484
                  {
Packit 5c3484
                    argv++;
Packit 5c3484
                    arg = argv[0];
Packit 5c3484
                    if (arg == NULL)
Packit 5c3484
                      goto need_arg;
Packit 5c3484
                  }
Packit 5c3484
                prec = atoi (arg);
Packit 5c3484
                goto end_opt;
Packit 5c3484
Packit 5c3484
              case '-':
Packit 5c3484
                arg++;
Packit 5c3484
                if (arg[0] != '\0')
Packit 5c3484
                  {
Packit 5c3484
                    /* no "--foo" options */
Packit 5c3484
                    fprintf (stderr, "Unrecognised option --%s\n", arg);
Packit 5c3484
                    exit (1);
Packit 5c3484
                  }
Packit 5c3484
                /* stop option interpretation at "--" */
Packit 5c3484
                for (;;)
Packit 5c3484
                  {
Packit 5c3484
                    argv++;
Packit 5c3484
                    arg = argv[0];
Packit 5c3484
                    if (arg == NULL)
Packit 5c3484
                      goto done;
Packit 5c3484
                    run_expr (type, base, prec, arg);
Packit 5c3484
                    seen_expr = 1;
Packit 5c3484
                  }
Packit 5c3484
Packit 5c3484
              default:
Packit 5c3484
                fprintf (stderr, "Unrecognised option -%c\n", opt);
Packit 5c3484
                exit (1);
Packit 5c3484
              }
Packit 5c3484
            }
Packit 5c3484
        end_opt:
Packit 5c3484
          ;
Packit 5c3484
        }
Packit 5c3484
      else
Packit 5c3484
        {
Packit 5c3484
          run_expr (type, base, prec, arg);
Packit 5c3484
          seen_expr = 1;
Packit 5c3484
        }
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
 done:
Packit 5c3484
  if (! seen_expr)
Packit 5c3484
    {
Packit 5c3484
      printf ("Usage: %s [-z] [-q] [-f] [-p prec] [-b base] expression...\n", argv[0]);
Packit 5c3484
      exit (1);
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  return 0;
Packit 5c3484
}