t-inp_str.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:4k
源码类别:

数学计算

开发平台:

Unix_Linux

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