(root)/
gmp-6.3.0/
tests/
mpz/
t-inp_str.c
       1  /* Test mpz_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  
      49      { "abc", 10, "0", 0 },
      50      { "0xf", 10, "0", 1 },
      51      { "ghi", 16, "0", 0 },
      52      { "100", 90, "0", 0 },
      53  
      54      {  "ff", 16,  "255", 2 },
      55      { "-ff", 16, "-255", 3 },
      56      {  "FF", 16,  "255", 2 },
      57      { "-FF", 16, "-255", 3 },
      58  
      59      {  "z", 36, "35", 1 },
      60      {  "Z", 36, "35", 1 },
      61      { "1B", 59, "70", 2 },
      62      {  "a", 60, "36", 1 },
      63      {  "A", 61, "10", 1 },
      64  
      65      {  "0x0",    0,   "0", 3 },
      66      {  "0X10",   0,  "16", 4 },
      67      { "-0X0",    0,   "0", 4 },
      68      { "-0x10",   0, "-16", 5 },
      69  
      70      {  "0b0",    0,  "0", 3 },
      71      {  "0B10",   0,  "2", 4 },
      72      { "-0B0",    0,  "0", 4 },
      73      { "-0b10",   0, "-2", 5 },
      74  
      75      {  "00",   0,  "0", 2 },
      76      {  "010",  0,  "8", 3 },
      77      { "-00",   0,  "0", 3 },
      78      { "-010",  0, "-8", 4 },
      79  
      80      {  "0x",     0,   "0", 2 },
      81      {  "0",      0,   "0", 1 },
      82      { " 030",   10,  "30", 4 },
      83    };
      84  
      85    mpz_t  got, want;
      86    long   ftell_nread;
      87    int    i, pre, post, j, got_nread, want_nread;
      88    FILE   *fp;
      89  
      90    mpz_init (got);
      91    mpz_init (want);
      92  
      93    for (i = 0; i < numberof (data); i++)
      94      {
      95        for (pre = 0; pre <= 3; pre++)
      96  	{
      97  	  for (post = 0; post <= 2; post++)
      98  	    {
      99  	      mpz_set_str_or_abort (want, data[i].want, 0);
     100  	      MPZ_CHECK_FORMAT (want);
     101  
     102  	      /* create the file new each time to ensure its length is what
     103  		 we want */
     104  	      fp = fopen (FILENAME, "w+");
     105  	      ASSERT_ALWAYS (fp != NULL);
     106  	      for (j = 0; j < pre; j++)
     107  		putc (' ', fp);
     108  	      fputs (data[i].inp, fp);
     109  	      for (j = 0; j < post; j++)
     110  		putc (' ', fp);
     111  	      fflush (fp);
     112  	      ASSERT_ALWAYS (! ferror(fp));
     113  
     114  	      rewind (fp);
     115  	      got_nread = mpz_inp_str (got, fp, data[i].base);
     116  
     117  	      if (got_nread != 0)
     118  		{
     119  		  ftell_nread = ftell (fp);
     120  		  if (got_nread != ftell_nread)
     121  		    {
     122  		      printf ("mpz_inp_str nread wrong\n");
     123  		      printf ("  inp          \"%s\"\n", data[i].inp);
     124  		      printf ("  base         %d\n", data[i].base);
     125  		      printf ("  pre          %d\n", pre);
     126  		      printf ("  post         %d\n", post);
     127  		      printf ("  got_nread    %d\n", got_nread);
     128  		      printf ("  ftell_nread  %ld\n", ftell_nread);
     129  		      abort ();
     130  		    }
     131  		}
     132  
     133  	      /* if data[i].inp is a whole string to read and there's no post
     134  		 whitespace then expect to have EOF */
     135  	      if (post == 0 && data[i].want_nread == strlen(data[i].inp))
     136  		{
     137  		  int  c = getc(fp);
     138  		  if (c != EOF)
     139  		    {
     140  		      printf ("mpz_inp_str didn't read to EOF\n");
     141  		      printf ("  inp   \"%s\"\n", data[i].inp);
     142  		      printf ("  base  %d\n", data[i].base);
     143  		      printf ("  pre   %d\n", pre);
     144  		      printf ("  post  %d\n", post);
     145  		      printf ("  c     '%c' %#x\n", c, c);
     146  		      abort ();
     147  		    }
     148  		}
     149  
     150  	      /* only expect "pre" included in the count when non-zero */
     151  	      want_nread = data[i].want_nread;
     152  	      if (want_nread != 0)
     153  		want_nread += pre;
     154  
     155  	      if (got_nread != want_nread)
     156  		{
     157  		  printf ("mpz_inp_str nread wrong\n");
     158  		  printf ("  inp         \"%s\"\n", data[i].inp);
     159  		  printf ("  base        %d\n", data[i].base);
     160  		  printf ("  pre         %d\n", pre);
     161  		  printf ("  post        %d\n", post);
     162  		  printf ("  got_nread   %d\n", got_nread);
     163  		  printf ("  want_nread  %d\n", want_nread);
     164  		  abort ();
     165  		}
     166  
     167  	      MPZ_CHECK_FORMAT (got);
     168  
     169  	      if (mpz_cmp (got, want) != 0)
     170  		{
     171  		  printf ("mpz_inp_str wrong result\n");
     172  		  printf ("  inp   \"%s\"\n", data[i].inp);
     173  		  printf ("  base  %d\n", data[i].base);
     174  		  mpz_trace ("  got ",  got);
     175  		  mpz_trace ("  want", want);
     176  		  abort ();
     177  		}
     178  
     179  	      ASSERT_ALWAYS (fclose (fp) == 0);
     180  	    }
     181  	}
     182      }
     183  
     184    mpz_clear (got);
     185    mpz_clear (want);
     186  }
     187  
     188  int
     189  main (void)
     190  {
     191    tests_start ();
     192  
     193    check_data ();
     194  
     195    unlink (FILENAME);
     196    tests_end ();
     197    exit (0);
     198  }