github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpq/t-inp_str.c (about)

     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.h"
    30  #include "gmp-impl.h"
    31  #include "tests.h"
    32  
    33  
    34  #define FILENAME  "t-inp_str.tmp"
    35  
    36  
    37  void
    38  check_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  
   161  int
   162  main (void)
   163  {
   164    tests_start ();
   165  
   166    check_data ();
   167  
   168    unlink (FILENAME);
   169    tests_end ();
   170  
   171    exit (0);
   172  }