xref: /llvm-project/polly/lib/External/isl/imath/tests/bintest.c (revision 658eb9e14264d48888ade0e3daf0b648f76c3f0e)
1*658eb9e1SMichael Kruse /*
2*658eb9e1SMichael Kruse   Name:     bintest.c
3*658eb9e1SMichael Kruse   Purpose:  Test driver for binary input/output formats from IMath.
4*658eb9e1SMichael Kruse   Author:   M. J. Fromberger
5*658eb9e1SMichael Kruse 
6*658eb9e1SMichael Kruse   Copyright (C) 2002-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 <stdio.h>
28*658eb9e1SMichael Kruse #include <stdlib.h>
29*658eb9e1SMichael Kruse #include <string.h>
30*658eb9e1SMichael Kruse 
31*658eb9e1SMichael Kruse #include "imath.h"
32*658eb9e1SMichael Kruse 
main(int argc,char * argv[])33*658eb9e1SMichael Kruse int main(int argc, char *argv[]) {
34*658eb9e1SMichael Kruse   unsigned char buf[512];
35*658eb9e1SMichael Kruse   mpz_t v, w;
36*658eb9e1SMichael Kruse   mp_result res;
37*658eb9e1SMichael Kruse   int len;
38*658eb9e1SMichael Kruse 
39*658eb9e1SMichael Kruse   if (argc < 2 || argv[1][0] == '\0') {
40*658eb9e1SMichael Kruse     fprintf(stderr, "Usage: bintest <value>\n");
41*658eb9e1SMichael Kruse     return 1;
42*658eb9e1SMichael Kruse   }
43*658eb9e1SMichael Kruse 
44*658eb9e1SMichael Kruse   mp_int_init(&v);
45*658eb9e1SMichael Kruse   mp_int_init(&w);
46*658eb9e1SMichael Kruse   res = mp_int_read_string(&v, 10, argv[1]);
47*658eb9e1SMichael Kruse   printf("Result code from mp_int_read_string() = %d (%s)\n", res,
48*658eb9e1SMichael Kruse          mp_error_string(res));
49*658eb9e1SMichael Kruse 
50*658eb9e1SMichael Kruse   len = mp_int_binary_len(&v);
51*658eb9e1SMichael Kruse   printf("%d bytes needed to write this value in 2's complement.\n", len);
52*658eb9e1SMichael Kruse 
53*658eb9e1SMichael Kruse   res = mp_int_to_binary(&v, buf, sizeof(buf));
54*658eb9e1SMichael Kruse   printf("Result code from mp_int_to_binary() = %d (%s)\n", res,
55*658eb9e1SMichael Kruse          mp_error_string(res));
56*658eb9e1SMichael Kruse   if (res != MP_OK) {
57*658eb9e1SMichael Kruse     return 1;
58*658eb9e1SMichael Kruse   }
59*658eb9e1SMichael Kruse   int ix;
60*658eb9e1SMichael Kruse   for (ix = 0; ix < (len - 1); ++ix) {
61*658eb9e1SMichael Kruse     printf("%d.", buf[ix]);
62*658eb9e1SMichael Kruse   }
63*658eb9e1SMichael Kruse   printf("%d\n", buf[ix]);
64*658eb9e1SMichael Kruse 
65*658eb9e1SMichael Kruse   /* Try converting back... */
66*658eb9e1SMichael Kruse   res = mp_int_read_binary(&w, buf, len);
67*658eb9e1SMichael Kruse   printf("Result code from mp_int_read_binary() = %d (%s)\n", res,
68*658eb9e1SMichael Kruse          mp_error_string(res));
69*658eb9e1SMichael Kruse   if (res == MP_OK) {
70*658eb9e1SMichael Kruse     mp_int_to_string(&w, 10, (char *)buf, sizeof(buf));
71*658eb9e1SMichael Kruse 
72*658eb9e1SMichael Kruse     printf("[%s]\n\n", buf);
73*658eb9e1SMichael Kruse   }
74*658eb9e1SMichael Kruse 
75*658eb9e1SMichael Kruse   len = mp_int_unsigned_len(&v);
76*658eb9e1SMichael Kruse   printf("%d bytes needed to write this value as unsigned.\n", len);
77*658eb9e1SMichael Kruse 
78*658eb9e1SMichael Kruse   res = mp_int_to_unsigned(&v, buf, sizeof(buf));
79*658eb9e1SMichael Kruse   printf("Result code from mp_int_to_unsigned() = %d\n", res);
80*658eb9e1SMichael Kruse   if (res == MP_OK) {
81*658eb9e1SMichael Kruse     int ix;
82*658eb9e1SMichael Kruse 
83*658eb9e1SMichael Kruse     for (ix = 0; ix < (len - 1); ++ix) {
84*658eb9e1SMichael Kruse       printf("%d.", buf[ix]);
85*658eb9e1SMichael Kruse     }
86*658eb9e1SMichael Kruse 
87*658eb9e1SMichael Kruse     printf("%d\n", buf[ix]);
88*658eb9e1SMichael Kruse   } else {
89*658eb9e1SMichael Kruse     return 1;
90*658eb9e1SMichael Kruse   }
91*658eb9e1SMichael Kruse 
92*658eb9e1SMichael Kruse   res = mp_int_read_unsigned(&w, buf, len);
93*658eb9e1SMichael Kruse   printf("Result code from mp_int_read_unsigned() = %d (%s)\n", res,
94*658eb9e1SMichael Kruse          mp_error_string(res));
95*658eb9e1SMichael Kruse   if (res == MP_OK) {
96*658eb9e1SMichael Kruse     mp_int_to_string(&w, 10, (char *)buf, sizeof(buf));
97*658eb9e1SMichael Kruse 
98*658eb9e1SMichael Kruse     printf("[%s]\n\n", buf);
99*658eb9e1SMichael Kruse   }
100*658eb9e1SMichael Kruse 
101*658eb9e1SMichael Kruse   mp_int_clear(&v);
102*658eb9e1SMichael Kruse   mp_int_clear(&w);
103*658eb9e1SMichael Kruse   return 0;
104*658eb9e1SMichael Kruse }
105