github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/demos/expr/run-expr.c (about)

     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  }