source: trunk/third/gmp/tests/mpz/t-inp_str.c @ 18191

Revision 18191, 5.4 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18190, which included commits to RCS files with non-trunk default branches.
Line 
1/* Test mpz_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 2.1 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; see the file COPYING.LIB.  If not, write to
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20MA 02111-1307, USA. */
21
22#include "config.h"
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#if HAVE_UNISTD_H
28#include <unistd.h>             /* for unlink */
29#endif
30
31#include "gmp.h"
32#include "gmp-impl.h"
33#include "tests.h"
34
35
36#define FILENAME  "t-inp_str.tmp"
37
38
39void
40check_data (void)
41{
42  static const struct {
43    const char  *inp;
44    int         base;
45    const char  *want;
46    int         want_nread;
47
48  } data[] = {
49
50    { "0",   10, "0", 1 },
51
52    { "abc", 10, "0", 0 },
53    { "ghi", 16, "0", 0 },
54
55    {  "ff", 16,  "255", 2 },
56    { "-ff", 16, "-255", 3 },
57    {  "FF", 16,  "255", 2 },
58    { "-FF", 16, "-255", 3 },
59
60    { "z", 36, "35", 1 },
61    { "Z", 36, "35", 1 },
62
63    {  "0x0",    0,   "0", 3 },
64    {  "0x10",   0,  "16", 4 },
65    { "-0x0",    0,   "0", 4 },
66    { "-0x10",   0, "-16", 5 },
67
68    {  "00",   0,  "0", 2 },
69    {  "010",  0,  "8", 3 },
70    { "-00",   0,  "0", 3 },
71    { "-010",  0, "-8", 4 },
72
73    {  "0x",     0,   "0", 2 },
74    {  "0",      0,   "0", 1 },
75  };
76
77  mpz_t  got, want;
78  long   ftell_nread;
79  int    i, pre, post, j, got_nread, want_nread;
80  FILE   *fp;
81
82  mpz_init (got);
83  mpz_init (want);
84
85  for (i = 0; i < numberof (data); i++)
86    {
87      for (pre = 0; pre <= 3; pre++)
88        {
89          for (post = 0; post <= 2; post++)
90            {
91              mpz_set_str_or_abort (want, data[i].want, 0);
92              MPZ_CHECK_FORMAT (want);
93
94              /* create the file new each time to ensure its length is what
95                 we want */
96              fp = fopen (FILENAME, "w+");
97              ASSERT_ALWAYS (fp != NULL);
98              for (j = 0; j < pre; j++)
99                putc (' ', fp);
100              fputs (data[i].inp, fp);
101              for (j = 0; j < post; j++)
102                putc (' ', fp);
103              fflush (fp);
104              ASSERT_ALWAYS (! ferror(fp));
105
106              rewind (fp);
107              got_nread = mpz_inp_str (got, fp, data[i].base);
108
109              if (got_nread != 0)
110                {
111                  ftell_nread = ftell (fp);
112                  if (got_nread != ftell_nread)
113                    {
114                      printf ("mpz_inp_str nread wrong\n");
115                      printf ("  inp          \"%s\"\n", data[i].inp);
116                      printf ("  base         %d\n", data[i].base);
117                      printf ("  pre          %d\n", pre);
118                      printf ("  post         %d\n", post);
119                      printf ("  got_nread    %d\n", got_nread);
120                      printf ("  ftell_nread  %ld\n", ftell_nread);
121                      abort ();
122                    }
123                }
124
125              /* if data[i].inp is a whole string to read and there's no post
126                 whitespace then expect to have EOF */
127              if (post == 0 && data[i].want_nread == strlen(data[i].inp))
128                {
129                  int  c = getc(fp);
130                  if (c != EOF)
131                    {
132                      printf ("mpz_inp_str didn't read to EOF\n");
133                      printf ("  inp   \"%s\"\n", data[i].inp);
134                      printf ("  base  %d\n", data[i].base);
135                      printf ("  pre   %d\n", pre);
136                      printf ("  post  %d\n", post);
137                      printf ("  c     '%c' %#x\n", c, c);
138                      abort ();
139                    }
140                }
141
142              /* only expect "pre" included in the count when non-zero */
143              want_nread = data[i].want_nread;
144              if (want_nread != 0)
145                want_nread += pre;
146
147              if (got_nread != want_nread)
148                {
149                  printf ("mpz_inp_str nread wrong\n");
150                  printf ("  inp         \"%s\"\n", data[i].inp);
151                  printf ("  base        %d\n", data[i].base);
152                  printf ("  pre         %d\n", pre);
153                  printf ("  post        %d\n", post);
154                  printf ("  got_nread   %d\n", got_nread);
155                  printf ("  want_nread  %d\n", want_nread);
156                  abort ();
157                }
158
159              MPZ_CHECK_FORMAT (got);
160     
161              if (mpz_cmp (got, want) != 0)
162                {
163                  printf ("mpz_inp_str wrong result\n");
164                  printf ("  inp   \"%s\"\n", data[i].inp);
165                  printf ("  base  %d\n", data[i].base);
166                  mpz_trace ("  got ",  got);
167                  mpz_trace ("  want", want);
168                  abort ();
169                }
170
171              ASSERT_ALWAYS (fclose (fp) == 0);
172            }
173        }
174    }
175
176  mpz_clear (got);
177  mpz_clear (want);
178}
179
180int
181main (void)
182{
183  tests_start ();
184
185  check_data ();
186
187  unlink (FILENAME);
188  tests_end ();
189  exit (0);
190}
Note: See TracBrowser for help on using the repository browser.