1 /* Test mpq_inp_str.
2
3 Copyright 2001, 2002 Free Software Foundation, Inc.
4
5 This file is part of the GNU MP Library test suite.
6
7 The GNU MP Library test suite is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 3 of the License,
10 or (at your option) any later version.
11
12 The GNU MP Library test suite is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 Public License for more details.
16
17 You should have received a copy of the GNU General Public License along with
18 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
19
20 #include "config.h"
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #if HAVE_UNISTD_H
26 #include <unistd.h> /* for unlink */
27 #endif
28
29 #include "gmp-impl.h"
30 #include "tests.h"
31
32
33 #define FILENAME "t-inp_str.tmp"
34
35
36 void
check_data(void)37 check_data (void)
38 {
39 static const struct {
40 const char *inp;
41 int base;
42 const char *want;
43 int want_nread;
44
45 } data[] = {
46
47 { "0", 10, "0", 1 },
48 { "0/1", 10, "0", 3 },
49
50 { "0/", 10, "0", 0 },
51 { "/123", 10, "0", 0 },
52 { "blah", 10, "0", 0 },
53 { "123/blah", 10, "0", 0 },
54 { "5 /8", 10, "5", 1 },
55 { "5/ 8", 10, "0", 0 },
56
57 { "ff", 16, "255", 2 },
58 { "-ff", 16, "-255", 3 },
59 { "FF", 16, "255", 2 },
60 { "-FF", 16, "-255", 3 },
61
62 { "z", 36, "35", 1 },
63 { "Z", 36, "35", 1 },
64
65 { "0x0", 0, "0", 3 },
66 { "0x10", 0, "16", 4 },
67 { "-0x0", 0, "0", 4 },
68 { "-0x10", 0, "-16", 5 },
69 { "-0x10/5", 0, "-16/5", 7 },
70
71 { "00", 0, "0", 2 },
72 { "010", 0, "8", 3 },
73 { "-00", 0, "0", 3 },
74 { "-010", 0, "-8", 4 },
75 };
76
77 mpq_t got, want;
78 long ftell_nread;
79 int i, post, j, got_nread;
80 FILE *fp;
81
82 mpq_init (got);
83 mpq_init (want);
84
85 for (i = 0; i < numberof (data); i++)
86 {
87 for (post = 0; post <= 2; post++)
88 {
89 mpq_set_str_or_abort (want, data[i].want, 0);
90 MPQ_CHECK_FORMAT (want);
91
92 fp = fopen (FILENAME, "w+");
93 ASSERT_ALWAYS (fp != NULL);
94 fputs (data[i].inp, fp);
95 for (j = 0; j < post; j++)
96 putc (' ', fp);
97 fflush (fp);
98 ASSERT_ALWAYS (! ferror(fp));
99
100 rewind (fp);
101 got_nread = mpq_inp_str (got, fp, data[i].base);
102
103 if (got_nread != 0)
104 {
105 ftell_nread = ftell (fp);
106 if (got_nread != ftell_nread)
107 {
108 printf ("mpq_inp_str nread wrong\n");
109 printf (" inp \"%s\"\n", data[i].inp);
110 printf (" base %d\n", data[i].base);
111 printf (" got_nread %d\n", got_nread);
112 printf (" ftell_nread %ld\n", ftell_nread);
113 abort ();
114 }
115 }
116
117 if (post == 0 && data[i].want_nread == strlen(data[i].inp))
118 {
119 int c = getc(fp);
120 if (c != EOF)
121 {
122 printf ("mpq_inp_str didn't read to EOF\n");
123 printf (" inp \"%s\"\n", data[i].inp);
124 printf (" base %d\n", data[i].base);
125 printf (" c '%c' %#x\n", c, c);
126 abort ();
127 }
128 }
129
130 if (got_nread != data[i].want_nread)
131 {
132 printf ("mpq_inp_str nread wrong\n");
133 printf (" inp \"%s\"\n", data[i].inp);
134 printf (" base %d\n", data[i].base);
135 printf (" got_nread %d\n", got_nread);
136 printf (" want_nread %d\n", data[i].want_nread);
137 abort ();
138 }
139
140 MPQ_CHECK_FORMAT (got);
141
142 if (! mpq_equal (got, want))
143 {
144 printf ("mpq_inp_str wrong result\n");
145 printf (" inp \"%s\"\n", data[i].inp);
146 printf (" base %d\n", data[i].base);
147 mpq_trace (" got ", got);
148 mpq_trace (" want", want);
149 abort ();
150 }
151
152 ASSERT_ALWAYS (fclose (fp) == 0);
153 }
154 }
155
156 mpq_clear (got);
157 mpq_clear (want);
158 }
159
160 int
main(void)161 main (void)
162 {
163 tests_start ();
164
165 check_data ();
166
167 unlink (FILENAME);
168 tests_end ();
169
170 exit (0);
171 }
172