Home | History | Annotate | Line # | Download | only in expr
run-expr.c revision 1.1.1.2
      1      1.1  mrg /* Demo program to run expression evaluation.
      2      1.1  mrg 
      3  1.1.1.2  mrg Copyright 2000-2002, 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 
     32      1.1  mrg /* Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression...
     33      1.1  mrg 
     34      1.1  mrg    Evaluate each argument as a simple expression.  By default this is in mpz
     35      1.1  mrg    integers, but -q selects mpq or -f selects mpf.  For mpf the float
     36      1.1  mrg    precision can be set with -p.  In all cases the input base can be set
     37      1.1  mrg    with -b, or the default is "0" meaning decimal with "0x" allowed.
     38      1.1  mrg 
     39      1.1  mrg    This is a pretty trivial program, it's just an easy way to experiment
     40      1.1  mrg    with the evaluation functions.  */
     41      1.1  mrg 
     42      1.1  mrg 
     43      1.1  mrg #include <stdio.h>
     44      1.1  mrg #include <stdlib.h>
     45      1.1  mrg 
     46      1.1  mrg #include "gmp.h"
     47      1.1  mrg #include "expr.h"
     48      1.1  mrg 
     49      1.1  mrg 
     50      1.1  mrg void
     51      1.1  mrg run_expr (int type, int base, unsigned long prec, char *str)
     52      1.1  mrg {
     53      1.1  mrg   int  outbase = (base == 0 ? 10 : base);
     54      1.1  mrg   int  ret;
     55      1.1  mrg 
     56      1.1  mrg   switch (type) {
     57      1.1  mrg   case 'z':
     58      1.1  mrg   default:
     59      1.1  mrg     {
     60      1.1  mrg       mpz_t  res, var_a, var_b;
     61      1.1  mrg 
     62      1.1  mrg       mpz_init (res);
     63      1.1  mrg       mpz_init_set_ui (var_a, 55L);
     64      1.1  mrg       mpz_init_set_ui (var_b, 99L);
     65      1.1  mrg 
     66      1.1  mrg       ret = mpz_expr (res, base, str, var_a, var_b, NULL);
     67      1.1  mrg       printf ("\"%s\" base %d: ", str, base);
     68      1.1  mrg       if (ret == MPEXPR_RESULT_OK)
     69      1.1  mrg         {
     70      1.1  mrg           printf ("result ");
     71      1.1  mrg           mpz_out_str (stdout, outbase, res);
     72      1.1  mrg           printf ("\n");
     73      1.1  mrg         }
     74      1.1  mrg       else
     75      1.1  mrg         printf ("invalid (return code %d)\n", ret);
     76      1.1  mrg 
     77      1.1  mrg       mpz_clear (res);
     78      1.1  mrg       mpz_clear (var_a);
     79      1.1  mrg       mpz_clear (var_b);
     80      1.1  mrg     }
     81      1.1  mrg     break;
     82      1.1  mrg 
     83      1.1  mrg   case 'q':
     84      1.1  mrg     {
     85      1.1  mrg       mpq_t  res, var_a, var_b;
     86      1.1  mrg 
     87      1.1  mrg       mpq_init (res);
     88      1.1  mrg       mpq_init (var_a);
     89      1.1  mrg       mpq_init (var_b);
     90      1.1  mrg 
     91      1.1  mrg       mpq_set_ui (var_a, 55L, 1);
     92      1.1  mrg       mpq_set_ui (var_b, 99L, 1);
     93      1.1  mrg 
     94      1.1  mrg       ret = mpq_expr (res, base, str, var_a, var_b, NULL);
     95      1.1  mrg       printf ("\"%s\" base %d: ", str, base);
     96      1.1  mrg       if (ret == MPEXPR_RESULT_OK)
     97      1.1  mrg         {
     98      1.1  mrg           printf ("result ");
     99      1.1  mrg           mpq_out_str (stdout, outbase, res);
    100      1.1  mrg           printf ("\n");
    101      1.1  mrg         }
    102      1.1  mrg       else
    103      1.1  mrg         printf ("invalid (return code %d)\n", ret);
    104      1.1  mrg 
    105      1.1  mrg       mpq_clear (res);
    106      1.1  mrg       mpq_clear (var_a);
    107      1.1  mrg       mpq_clear (var_b);
    108      1.1  mrg     }
    109      1.1  mrg     break;
    110      1.1  mrg 
    111      1.1  mrg   case 'f':
    112      1.1  mrg     {
    113      1.1  mrg       mpf_t  res, var_a, var_b;
    114      1.1  mrg 
    115      1.1  mrg       mpf_init2 (res, prec);
    116      1.1  mrg       mpf_init_set_ui (var_a, 55L);
    117      1.1  mrg       mpf_init_set_ui (var_b, 99L);
    118      1.1  mrg 
    119      1.1  mrg       ret = mpf_expr (res, base, str, var_a, var_b, NULL);
    120      1.1  mrg       printf ("\"%s\" base %d: ", str, base);
    121      1.1  mrg       if (ret == MPEXPR_RESULT_OK)
    122      1.1  mrg         {
    123      1.1  mrg           printf ("result ");
    124      1.1  mrg           mpf_out_str (stdout, outbase, (size_t) 0, res);
    125      1.1  mrg           printf ("\n");
    126      1.1  mrg         }
    127      1.1  mrg       else
    128      1.1  mrg         printf ("invalid (return code %d)\n", ret);
    129      1.1  mrg 
    130      1.1  mrg       mpf_clear (res);
    131      1.1  mrg       mpf_clear (var_a);
    132      1.1  mrg       mpf_clear (var_b);
    133      1.1  mrg     }
    134      1.1  mrg     break;
    135      1.1  mrg   }
    136      1.1  mrg }
    137      1.1  mrg 
    138      1.1  mrg int
    139      1.1  mrg main (int argc, char *argv[])
    140      1.1  mrg {
    141      1.1  mrg   int            type = 'z';
    142      1.1  mrg   int            base = 0;
    143      1.1  mrg   unsigned long  prec = 64;
    144      1.1  mrg   int            seen_expr = 0;
    145      1.1  mrg   int            opt;
    146      1.1  mrg   char           *arg;
    147      1.1  mrg 
    148      1.1  mrg   for (;;)
    149      1.1  mrg     {
    150      1.1  mrg       argv++;
    151      1.1  mrg       arg = argv[0];
    152      1.1  mrg       if (arg == NULL)
    153      1.1  mrg         break;
    154      1.1  mrg 
    155      1.1  mrg       if (arg[0] == '-')
    156      1.1  mrg         {
    157      1.1  mrg           for (;;)
    158      1.1  mrg             {
    159      1.1  mrg               arg++;
    160      1.1  mrg               opt = arg[0];
    161      1.1  mrg 
    162      1.1  mrg               switch (opt) {
    163      1.1  mrg               case '\0':
    164      1.1  mrg                 goto end_opt;
    165      1.1  mrg 
    166      1.1  mrg               case 'f':
    167      1.1  mrg               case 'q':
    168      1.1  mrg               case 'z':
    169      1.1  mrg                 type = opt;
    170      1.1  mrg                 break;
    171      1.1  mrg 
    172      1.1  mrg               case 'b':
    173      1.1  mrg                 arg++;
    174      1.1  mrg                 if (arg[0] == '\0')
    175      1.1  mrg                   {
    176      1.1  mrg                     argv++;
    177      1.1  mrg                     arg = argv[0];
    178      1.1  mrg                     if (arg == NULL)
    179      1.1  mrg                       {
    180      1.1  mrg                       need_arg:
    181      1.1  mrg                         fprintf (stderr, "Need argument for -%c\n", opt);
    182      1.1  mrg                         exit (1);
    183      1.1  mrg                       }
    184      1.1  mrg                   }
    185      1.1  mrg                 base = atoi (arg);
    186      1.1  mrg                 goto end_opt;
    187      1.1  mrg 
    188      1.1  mrg               case 'p':
    189      1.1  mrg                 arg++;
    190      1.1  mrg                 if (arg[0] == '\0')
    191      1.1  mrg                   {
    192      1.1  mrg                     argv++;
    193      1.1  mrg                     arg = argv[0];
    194      1.1  mrg                     if (arg == NULL)
    195      1.1  mrg                       goto need_arg;
    196      1.1  mrg                   }
    197      1.1  mrg                 prec = atoi (arg);
    198      1.1  mrg                 goto end_opt;
    199      1.1  mrg 
    200      1.1  mrg               case '-':
    201      1.1  mrg                 arg++;
    202      1.1  mrg                 if (arg[0] != '\0')
    203      1.1  mrg                   {
    204      1.1  mrg                     /* no "--foo" options */
    205      1.1  mrg                     fprintf (stderr, "Unrecognised option --%s\n", arg);
    206      1.1  mrg                     exit (1);
    207      1.1  mrg                   }
    208      1.1  mrg                 /* stop option interpretation at "--" */
    209      1.1  mrg                 for (;;)
    210      1.1  mrg                   {
    211      1.1  mrg                     argv++;
    212      1.1  mrg                     arg = argv[0];
    213      1.1  mrg                     if (arg == NULL)
    214      1.1  mrg                       goto done;
    215      1.1  mrg                     run_expr (type, base, prec, arg);
    216      1.1  mrg                     seen_expr = 1;
    217      1.1  mrg                   }
    218      1.1  mrg 
    219      1.1  mrg               default:
    220      1.1  mrg                 fprintf (stderr, "Unrecognised option -%c\n", opt);
    221      1.1  mrg                 exit (1);
    222      1.1  mrg               }
    223      1.1  mrg             }
    224      1.1  mrg         end_opt:
    225      1.1  mrg           ;
    226      1.1  mrg         }
    227      1.1  mrg       else
    228      1.1  mrg         {
    229      1.1  mrg           run_expr (type, base, prec, arg);
    230      1.1  mrg           seen_expr = 1;
    231      1.1  mrg         }
    232      1.1  mrg     }
    233      1.1  mrg 
    234      1.1  mrg  done:
    235      1.1  mrg   if (! seen_expr)
    236      1.1  mrg     {
    237      1.1  mrg       printf ("Usage: %s [-z] [-q] [-f] [-p prec] [-b base] expression...\n", argv[0]);
    238      1.1  mrg       exit (1);
    239      1.1  mrg     }
    240      1.1  mrg 
    241      1.1  mrg   return 0;
    242      1.1  mrg }
    243