(root)/
gmp-6.3.0/
tests/
mpq/
t-inp_str.c
       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
      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
     161  main (void)
     162  {
     163    tests_start ();
     164  
     165    check_data ();
     166  
     167    unlink (FILENAME);
     168    tests_end ();
     169  
     170    exit (0);
     171  }