(root)/
gmp-6.3.0/
demos/
expr/
run-expr.c
       1  /* Demo program to run expression evaluation.
       2  
       3  Copyright 2000-2002, 2004 Free Software Foundation, Inc.
       4  
       5  This file is part of the GNU MP Library.
       6  
       7  The GNU MP Library is free software; you can redistribute it and/or modify
       8  it under the terms of either:
       9  
      10    * the GNU Lesser General Public License as published by the Free
      11      Software Foundation; either version 3 of the License, or (at your
      12      option) any later version.
      13  
      14  or
      15  
      16    * the GNU General Public License as published by the Free Software
      17      Foundation; either version 2 of the License, or (at your option) any
      18      later version.
      19  
      20  or both in parallel, as here.
      21  
      22  The GNU MP Library is distributed in the hope that it will be useful, but
      23  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      24  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      25  for more details.
      26  
      27  You should have received copies of the GNU General Public License and the
      28  GNU Lesser General Public License along with the GNU MP Library.  If not,
      29  see https://www.gnu.org/licenses/.  */
      30  
      31  
      32  /* Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression...
      33  
      34     Evaluate each argument as a simple expression.  By default this is in mpz
      35     integers, but -q selects mpq or -f selects mpf.  For mpf the float
      36     precision can be set with -p.  In all cases the input base can be set
      37     with -b, or the default is "0" meaning decimal with "0x" allowed.
      38  
      39     This is a pretty trivial program, it's just an easy way to experiment
      40     with the evaluation functions.  */
      41  
      42  
      43  #include <stdio.h>
      44  #include <stdlib.h>
      45  
      46  #include "gmp.h"
      47  #include "expr.h"
      48  
      49  
      50  void
      51  run_expr (int type, int base, unsigned long prec, char *str)
      52  {
      53    int  outbase = (base == 0 ? 10 : base);
      54    int  ret;
      55  
      56    switch (type) {
      57    case 'z':
      58    default:
      59      {
      60        mpz_t  res, var_a, var_b;
      61  
      62        mpz_init (res);
      63        mpz_init_set_ui (var_a, 55L);
      64        mpz_init_set_ui (var_b, 99L);
      65  
      66        ret = mpz_expr (res, base, str, var_a, var_b, NULL);
      67        printf ("\"%s\" base %d: ", str, base);
      68        if (ret == MPEXPR_RESULT_OK)
      69          {
      70            printf ("result ");
      71            mpz_out_str (stdout, outbase, res);
      72            printf ("\n");
      73          }
      74        else
      75          printf ("invalid (return code %d)\n", ret);
      76  
      77        mpz_clear (res);
      78        mpz_clear (var_a);
      79        mpz_clear (var_b);
      80      }
      81      break;
      82  
      83    case 'q':
      84      {
      85        mpq_t  res, var_a, var_b;
      86  
      87        mpq_init (res);
      88        mpq_init (var_a);
      89        mpq_init (var_b);
      90  
      91        mpq_set_ui (var_a, 55L, 1);
      92        mpq_set_ui (var_b, 99L, 1);
      93  
      94        ret = mpq_expr (res, base, str, var_a, var_b, NULL);
      95        printf ("\"%s\" base %d: ", str, base);
      96        if (ret == MPEXPR_RESULT_OK)
      97          {
      98            printf ("result ");
      99            mpq_out_str (stdout, outbase, res);
     100            printf ("\n");
     101          }
     102        else
     103          printf ("invalid (return code %d)\n", ret);
     104  
     105        mpq_clear (res);
     106        mpq_clear (var_a);
     107        mpq_clear (var_b);
     108      }
     109      break;
     110  
     111    case 'f':
     112      {
     113        mpf_t  res, var_a, var_b;
     114  
     115        mpf_init2 (res, prec);
     116        mpf_init_set_ui (var_a, 55L);
     117        mpf_init_set_ui (var_b, 99L);
     118  
     119        ret = mpf_expr (res, base, str, var_a, var_b, NULL);
     120        printf ("\"%s\" base %d: ", str, base);
     121        if (ret == MPEXPR_RESULT_OK)
     122          {
     123            printf ("result ");
     124            mpf_out_str (stdout, outbase, (size_t) 0, res);
     125            printf ("\n");
     126          }
     127        else
     128          printf ("invalid (return code %d)\n", ret);
     129  
     130        mpf_clear (res);
     131        mpf_clear (var_a);
     132        mpf_clear (var_b);
     133      }
     134      break;
     135    }
     136  }
     137  
     138  int
     139  main (int argc, char *argv[])
     140  {
     141    int            type = 'z';
     142    int            base = 0;
     143    unsigned long  prec = 64;
     144    int            seen_expr = 0;
     145    int            opt;
     146    char           *arg;
     147  
     148    for (;;)
     149      {
     150        argv++;
     151        arg = argv[0];
     152        if (arg == NULL)
     153          break;
     154  
     155        if (arg[0] == '-')
     156          {
     157            for (;;)
     158              {
     159                arg++;
     160                opt = arg[0];
     161  
     162                switch (opt) {
     163                case '\0':
     164                  goto end_opt;
     165  
     166                case 'f':
     167                case 'q':
     168                case 'z':
     169                  type = opt;
     170                  break;
     171  
     172                case 'b':
     173                  arg++;
     174                  if (arg[0] == '\0')
     175                    {
     176                      argv++;
     177                      arg = argv[0];
     178                      if (arg == NULL)
     179                        {
     180                        need_arg:
     181                          fprintf (stderr, "Need argument for -%c\n", opt);
     182                          exit (1);
     183                        }
     184                    }
     185                  base = atoi (arg);
     186                  goto end_opt;
     187  
     188                case 'p':
     189                  arg++;
     190                  if (arg[0] == '\0')
     191                    {
     192                      argv++;
     193                      arg = argv[0];
     194                      if (arg == NULL)
     195                        goto need_arg;
     196                    }
     197                  prec = atoi (arg);
     198                  goto end_opt;
     199  
     200                case '-':
     201                  arg++;
     202                  if (arg[0] != '\0')
     203                    {
     204                      /* no "--foo" options */
     205                      fprintf (stderr, "Unrecognised option --%s\n", arg);
     206                      exit (1);
     207                    }
     208                  /* stop option interpretation at "--" */
     209                  for (;;)
     210                    {
     211                      argv++;
     212                      arg = argv[0];
     213                      if (arg == NULL)
     214                        goto done;
     215                      run_expr (type, base, prec, arg);
     216                      seen_expr = 1;
     217                    }
     218  
     219                default:
     220                  fprintf (stderr, "Unrecognised option -%c\n", opt);
     221                  exit (1);
     222                }
     223              }
     224          end_opt:
     225            ;
     226          }
     227        else
     228          {
     229            run_expr (type, base, prec, arg);
     230            seen_expr = 1;
     231          }
     232      }
     233  
     234   done:
     235    if (! seen_expr)
     236      {
     237        printf ("Usage: %s [-z] [-q] [-f] [-p prec] [-b base] expression...\n", argv[0]);
     238        exit (1);
     239      }
     240  
     241    return 0;
     242  }