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