t-inp_str.c revision 1.1 1 1.1 mrg /* Test mpf_inp_str.
2 1.1 mrg
3 1.1 mrg Copyright 2001, 2002 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 #include "config.h"
21 1.1 mrg
22 1.1 mrg #include <stdio.h>
23 1.1 mrg #include <stdlib.h>
24 1.1 mrg #include <string.h>
25 1.1 mrg #if HAVE_UNISTD_H
26 1.1 mrg #include <unistd.h> /* for unlink */
27 1.1 mrg #endif
28 1.1 mrg
29 1.1 mrg #include "gmp.h"
30 1.1 mrg #include "gmp-impl.h"
31 1.1 mrg #include "tests.h"
32 1.1 mrg
33 1.1 mrg
34 1.1 mrg #define FILENAME "t-inp_str.tmp"
35 1.1 mrg
36 1.1 mrg
37 1.1 mrg void
38 1.1 mrg check_data (void)
39 1.1 mrg {
40 1.1 mrg static const struct {
41 1.1 mrg const char *inp;
42 1.1 mrg int base;
43 1.1 mrg const char *want;
44 1.1 mrg int want_nread;
45 1.1 mrg
46 1.1 mrg } data[] = {
47 1.1 mrg
48 1.1 mrg { "0", 10, "0", 1 },
49 1.1 mrg
50 1.1 mrg { "abc", 10, "0", 0 },
51 1.1 mrg { "ghi", 16, "0", 0 },
52 1.1 mrg
53 1.1 mrg { "125", 10, "125", 3 },
54 1.1 mrg { "125e1", 10, "1250", 5 },
55 1.1 mrg { "125e-1", 10, "12.5", 6 },
56 1.1 mrg
57 1.1 mrg { "ff", 16, "255", 2 },
58 1.1 mrg { "-ff", 16, "-255", 3 },
59 1.1 mrg { "FF", 16, "255", 2 },
60 1.1 mrg { "-FF", 16, "-255", 3 },
61 1.1 mrg
62 1.1 mrg { "100", 16, "256", 3 },
63 1.1 mrg { "100@1", 16, "4096", 5 },
64 1.1 mrg { "100@10", 16, "4722366482869645213696", 6 },
65 1.1 mrg { "100@10", -16, "281474976710656", 6 },
66 1.1 mrg { "100@-1", 16, "16", 6 },
67 1.1 mrg { "10000000000000000@-10", 16, "1", 21 },
68 1.1 mrg { "10000000000@-10", -16, "1", 15 },
69 1.1 mrg
70 1.1 mrg { "z", 36, "35", 1 },
71 1.1 mrg { "Z", 36, "35", 1 },
72 1.1 mrg { "z@1", 36, "1260", 3 },
73 1.1 mrg { "Z@1", 36, "1260", 3 },
74 1.1 mrg
75 1.1 mrg { "0", 0, "0", 1 },
76 1.1 mrg };
77 1.1 mrg
78 1.1 mrg mpf_t got, want;
79 1.1 mrg long ftell_nread;
80 1.1 mrg int i, pre, post, j, got_nread, want_nread;
81 1.1 mrg FILE *fp;
82 1.1 mrg
83 1.1 mrg mpf_init (got);
84 1.1 mrg mpf_init (want);
85 1.1 mrg
86 1.1 mrg for (i = 0; i < numberof (data); i++)
87 1.1 mrg {
88 1.1 mrg for (pre = 0; pre <= 3; pre++)
89 1.1 mrg {
90 1.1 mrg for (post = 0; post <= 2; post++)
91 1.1 mrg {
92 1.1 mrg mpf_set_str_or_abort (want, data[i].want, 10);
93 1.1 mrg MPF_CHECK_FORMAT (want);
94 1.1 mrg
95 1.1 mrg /* create the file new each time to ensure its length is what
96 1.1 mrg we want */
97 1.1 mrg fp = fopen (FILENAME, "w+");
98 1.1 mrg ASSERT_ALWAYS (fp != NULL);
99 1.1 mrg for (j = 0; j < pre; j++)
100 1.1 mrg putc (' ', fp);
101 1.1 mrg fputs (data[i].inp, fp);
102 1.1 mrg for (j = 0; j < post; j++)
103 1.1 mrg putc (' ', fp);
104 1.1 mrg fflush (fp);
105 1.1 mrg ASSERT_ALWAYS (! ferror(fp));
106 1.1 mrg
107 1.1 mrg rewind (fp);
108 1.1 mrg got_nread = mpf_inp_str (got, fp, data[i].base);
109 1.1 mrg
110 1.1 mrg if (got_nread != 0)
111 1.1 mrg {
112 1.1 mrg ftell_nread = ftell (fp);
113 1.1 mrg if (got_nread != ftell_nread)
114 1.1 mrg {
115 1.1 mrg printf ("mpf_inp_str nread wrong\n");
116 1.1 mrg printf (" inp \"%s\"\n", data[i].inp);
117 1.1 mrg printf (" base %d\n", data[i].base);
118 1.1 mrg printf (" pre %d\n", pre);
119 1.1 mrg printf (" post %d\n", post);
120 1.1 mrg printf (" got_nread %d\n", got_nread);
121 1.1 mrg printf (" ftell_nread %ld\n", ftell_nread);
122 1.1 mrg abort ();
123 1.1 mrg }
124 1.1 mrg }
125 1.1 mrg
126 1.1 mrg /* if data[i].inp is a whole string to read and there's no post
127 1.1 mrg whitespace then expect to have EOF */
128 1.1 mrg if (post == 0 && data[i].want_nread == strlen(data[i].inp))
129 1.1 mrg {
130 1.1 mrg int c = getc(fp);
131 1.1 mrg if (c != EOF)
132 1.1 mrg {
133 1.1 mrg printf ("mpf_inp_str didn't read to EOF\n");
134 1.1 mrg printf (" inp \"%s\"\n", data[i].inp);
135 1.1 mrg printf (" base %d\n", data[i].base);
136 1.1 mrg printf (" pre %d\n", pre);
137 1.1 mrg printf (" post %d\n", post);
138 1.1 mrg printf (" c '%c' %#x\n", c, c);
139 1.1 mrg abort ();
140 1.1 mrg }
141 1.1 mrg }
142 1.1 mrg
143 1.1 mrg /* only expect "pre" included in the count when non-zero */
144 1.1 mrg want_nread = data[i].want_nread;
145 1.1 mrg if (want_nread != 0)
146 1.1 mrg want_nread += pre;
147 1.1 mrg
148 1.1 mrg if (got_nread != want_nread)
149 1.1 mrg {
150 1.1 mrg printf ("mpf_inp_str nread wrong\n");
151 1.1 mrg printf (" inp \"%s\"\n", data[i].inp);
152 1.1 mrg printf (" base %d\n", data[i].base);
153 1.1 mrg printf (" pre %d\n", pre);
154 1.1 mrg printf (" post %d\n", post);
155 1.1 mrg printf (" got_nread %d\n", got_nread);
156 1.1 mrg printf (" want_nread %d\n", want_nread);
157 1.1 mrg abort ();
158 1.1 mrg }
159 1.1 mrg
160 1.1 mrg MPF_CHECK_FORMAT (got);
161 1.1 mrg
162 1.1 mrg if (mpf_cmp (got, want) != 0)
163 1.1 mrg {
164 1.1 mrg printf ("mpf_inp_str wrong result\n");
165 1.1 mrg printf (" inp \"%s\"\n", data[i].inp);
166 1.1 mrg printf (" base %d\n", data[i].base);
167 1.1 mrg mpf_trace (" got ", got);
168 1.1 mrg mpf_trace (" want", want);
169 1.1 mrg abort ();
170 1.1 mrg }
171 1.1 mrg
172 1.1 mrg ASSERT_ALWAYS (fclose (fp) == 0);
173 1.1 mrg }
174 1.1 mrg }
175 1.1 mrg }
176 1.1 mrg
177 1.1 mrg mpf_clear (got);
178 1.1 mrg mpf_clear (want);
179 1.1 mrg }
180 1.1 mrg
181 1.1 mrg int
182 1.1 mrg main (void)
183 1.1 mrg {
184 1.1 mrg tests_start ();
185 1.1 mrg
186 1.1 mrg check_data ();
187 1.1 mrg
188 1.1 mrg unlink (FILENAME);
189 1.1 mrg tests_end ();
190 1.1 mrg exit (0);
191 1.1 mrg }
192