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