xref: /llvm-project/polly/lib/External/isl/imath/examples/basecvt.c (revision 658eb9e14264d48888ade0e3daf0b648f76c3f0e)
1*658eb9e1SMichael Kruse /*
2*658eb9e1SMichael Kruse   Name:     basecvt.c
3*658eb9e1SMichael Kruse   Purpose:  Convert integers and rationals from one base to another.
4*658eb9e1SMichael Kruse   Author:   M. J. Fromberger
5*658eb9e1SMichael Kruse 
6*658eb9e1SMichael Kruse   Copyright (C) 2004-2008 Michael J. Fromberger, All Rights Reserved.
7*658eb9e1SMichael Kruse 
8*658eb9e1SMichael Kruse   Permission is hereby granted, free of charge, to any person obtaining a copy
9*658eb9e1SMichael Kruse   of this software and associated documentation files (the "Software"), to deal
10*658eb9e1SMichael Kruse   in the Software without restriction, including without limitation the rights
11*658eb9e1SMichael Kruse   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12*658eb9e1SMichael Kruse   copies of the Software, and to permit persons to whom the Software is
13*658eb9e1SMichael Kruse   furnished to do so, subject to the following conditions:
14*658eb9e1SMichael Kruse 
15*658eb9e1SMichael Kruse   The above copyright notice and this permission notice shall be included in
16*658eb9e1SMichael Kruse   all copies or substantial portions of the Software.
17*658eb9e1SMichael Kruse 
18*658eb9e1SMichael Kruse   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*658eb9e1SMichael Kruse   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*658eb9e1SMichael Kruse   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
21*658eb9e1SMichael Kruse   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22*658eb9e1SMichael Kruse   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23*658eb9e1SMichael Kruse   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24*658eb9e1SMichael Kruse   SOFTWARE.
25*658eb9e1SMichael Kruse  */
26*658eb9e1SMichael Kruse 
27*658eb9e1SMichael Kruse #include <errno.h>
28*658eb9e1SMichael Kruse #include <stdio.h>
29*658eb9e1SMichael Kruse #include <stdlib.h>
30*658eb9e1SMichael Kruse #include <string.h>
31*658eb9e1SMichael Kruse 
32*658eb9e1SMichael Kruse #include "imath.h"
33*658eb9e1SMichael Kruse #include "imrat.h"
34*658eb9e1SMichael Kruse 
main(int argc,char * argv[])35*658eb9e1SMichael Kruse int main(int argc, char *argv[]) {
36*658eb9e1SMichael Kruse   mp_size in_rdx, out_rdx;
37*658eb9e1SMichael Kruse   mpq_t value;
38*658eb9e1SMichael Kruse   mp_result res;
39*658eb9e1SMichael Kruse   int ix;
40*658eb9e1SMichael Kruse 
41*658eb9e1SMichael Kruse   if (argc < 4) {
42*658eb9e1SMichael Kruse     fprintf(stderr, "Usage: basecvt <ibase> <obase> <values>+\n");
43*658eb9e1SMichael Kruse     return 1;
44*658eb9e1SMichael Kruse   }
45*658eb9e1SMichael Kruse 
46*658eb9e1SMichael Kruse   in_rdx = atoi(argv[1]);
47*658eb9e1SMichael Kruse   out_rdx = atoi(argv[2]);
48*658eb9e1SMichael Kruse 
49*658eb9e1SMichael Kruse   if (in_rdx < MP_MIN_RADIX || in_rdx > MP_MAX_RADIX) {
50*658eb9e1SMichael Kruse     fprintf(stderr,
51*658eb9e1SMichael Kruse             "basecvt: input radix %u not allowed (minimum %u, maximum %u)\n",
52*658eb9e1SMichael Kruse             in_rdx, MP_MIN_RADIX, MP_MAX_RADIX);
53*658eb9e1SMichael Kruse     return 3;
54*658eb9e1SMichael Kruse   }
55*658eb9e1SMichael Kruse   if (out_rdx < MP_MIN_RADIX || out_rdx > MP_MAX_RADIX) {
56*658eb9e1SMichael Kruse     fprintf(stderr,
57*658eb9e1SMichael Kruse             "basecvt: output radix %u not allowed (minimum %u, maximum %u)\n",
58*658eb9e1SMichael Kruse             out_rdx, MP_MIN_RADIX, MP_MAX_RADIX);
59*658eb9e1SMichael Kruse     return 3;
60*658eb9e1SMichael Kruse   }
61*658eb9e1SMichael Kruse 
62*658eb9e1SMichael Kruse   if ((res = mp_rat_init(&value)) != MP_OK) {
63*658eb9e1SMichael Kruse     fprintf(stderr, "basecvt: out of memory\n");
64*658eb9e1SMichael Kruse     return 2;
65*658eb9e1SMichael Kruse   }
66*658eb9e1SMichael Kruse 
67*658eb9e1SMichael Kruse   for (ix = 3; ix < argc; ++ix) {
68*658eb9e1SMichael Kruse     char *buf, *endp = NULL;
69*658eb9e1SMichael Kruse     mp_result len;
70*658eb9e1SMichael Kruse     int is_int;
71*658eb9e1SMichael Kruse 
72*658eb9e1SMichael Kruse     res = mp_rat_read_ustring(&value, in_rdx, argv[ix], &endp);
73*658eb9e1SMichael Kruse     if (res != MP_OK && res != MP_TRUNC) {
74*658eb9e1SMichael Kruse       fprintf(stderr, "basecvt:  error reading argument %d: %s\n", ix,
75*658eb9e1SMichael Kruse               mp_error_string(res));
76*658eb9e1SMichael Kruse       break;
77*658eb9e1SMichael Kruse     } else if (*endp != '\0') {
78*658eb9e1SMichael Kruse       fprintf(stderr, "basecvt:  argument %d contains '%s' not in base %u\n",
79*658eb9e1SMichael Kruse               ix, endp, in_rdx);
80*658eb9e1SMichael Kruse       continue;
81*658eb9e1SMichael Kruse     }
82*658eb9e1SMichael Kruse 
83*658eb9e1SMichael Kruse     is_int = mp_rat_is_integer(&value);
84*658eb9e1SMichael Kruse     if (is_int) {
85*658eb9e1SMichael Kruse       len = mp_int_string_len(MP_NUMER_P(&value), out_rdx);
86*658eb9e1SMichael Kruse     } else {
87*658eb9e1SMichael Kruse       len = mp_rat_string_len(&value, out_rdx);
88*658eb9e1SMichael Kruse     }
89*658eb9e1SMichael Kruse 
90*658eb9e1SMichael Kruse     if ((buf = malloc(len)) == NULL) {
91*658eb9e1SMichael Kruse       fprintf(stderr, "basecvt:  out of memory\n");
92*658eb9e1SMichael Kruse       break;
93*658eb9e1SMichael Kruse     }
94*658eb9e1SMichael Kruse 
95*658eb9e1SMichael Kruse     if (is_int) {
96*658eb9e1SMichael Kruse       res = mp_int_to_string(MP_NUMER_P(&value), out_rdx, buf, len);
97*658eb9e1SMichael Kruse     } else {
98*658eb9e1SMichael Kruse       res = mp_rat_to_string(&value, out_rdx, buf, len);
99*658eb9e1SMichael Kruse     }
100*658eb9e1SMichael Kruse 
101*658eb9e1SMichael Kruse     if (res != MP_OK) {
102*658eb9e1SMichael Kruse       fprintf(stderr, "basecvt:  error converting argument %d: %s\n", ix,
103*658eb9e1SMichael Kruse               mp_error_string(res));
104*658eb9e1SMichael Kruse       free(buf);
105*658eb9e1SMichael Kruse       break;
106*658eb9e1SMichael Kruse     }
107*658eb9e1SMichael Kruse 
108*658eb9e1SMichael Kruse     printf("%s\n", buf);
109*658eb9e1SMichael Kruse     free(buf);
110*658eb9e1SMichael Kruse   }
111*658eb9e1SMichael Kruse 
112*658eb9e1SMichael Kruse   mp_rat_clear(&value);
113*658eb9e1SMichael Kruse 
114*658eb9e1SMichael Kruse   return (res != MP_OK);
115*658eb9e1SMichael Kruse }
116*658eb9e1SMichael Kruse 
117*658eb9e1SMichael Kruse /* Here there be dragons */
118