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