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