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