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