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 }