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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_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.     { "abc", 10, "0", 0 },
  36.     { "ghi", 16, "0", 0 },
  37.     {  "ff", 16,  "255", 2 },
  38.     { "-ff", 16, "-255", 3 },
  39.     {  "FF", 16,  "255", 2 },
  40.     { "-FF", 16, "-255", 3 },
  41.     { "z", 36, "35", 1 },
  42.     { "Z", 36, "35", 1 },
  43.     {  "0x0",    0,   "0", 3 },
  44.     {  "0x10",   0,  "16", 4 },
  45.     { "-0x0",    0,   "0", 4 },
  46.     { "-0x10",   0, "-16", 5 },
  47.     {  "00",   0,  "0", 2 },
  48.     {  "010",  0,  "8", 3 },
  49.     { "-00",   0,  "0", 3 },
  50.     { "-010",  0, "-8", 4 },
  51.     {  "0x",     0,   "0", 2 },
  52.     {  "0",      0,   "0", 1 },
  53.   };
  54.   mpz_t  got, want;
  55.   long   ftell_nread;
  56.   int    i, pre, post, j, got_nread, want_nread;
  57.   FILE   *fp;
  58.   mpz_init (got);
  59.   mpz_init (want);
  60.   for (i = 0; i < numberof (data); i++)
  61.     {
  62.       for (pre = 0; pre <= 3; pre++)
  63. {
  64.   for (post = 0; post <= 2; post++)
  65.     {
  66.       mpz_set_str_or_abort (want, data[i].want, 0);
  67.       MPZ_CHECK_FORMAT (want);
  68.       /* create the file new each time to ensure its length is what
  69.  we want */
  70.       fp = fopen (FILENAME, "w+");
  71.       ASSERT_ALWAYS (fp != NULL);
  72.       for (j = 0; j < pre; j++)
  73. putc (' ', fp);
  74.       fputs (data[i].inp, fp);
  75.       for (j = 0; j < post; j++)
  76. putc (' ', fp);
  77.       fflush (fp);
  78.       ASSERT_ALWAYS (! ferror(fp));
  79.       rewind (fp);
  80.       got_nread = mpz_inp_str (got, fp, data[i].base);
  81.       if (got_nread != 0)
  82. {
  83.   ftell_nread = ftell (fp);
  84.   if (got_nread != ftell_nread)
  85.     {
  86.       printf ("mpz_inp_str nread wrongn");
  87.       printf ("  inp          "%s"n", data[i].inp);
  88.       printf ("  base         %dn", data[i].base);
  89.       printf ("  pre          %dn", pre);
  90.       printf ("  post         %dn", post);
  91.       printf ("  got_nread    %dn", got_nread);
  92.       printf ("  ftell_nread  %ldn", ftell_nread);
  93.       abort ();
  94.     }
  95. }
  96.       /* if data[i].inp is a whole string to read and there's no post
  97.  whitespace then expect to have EOF */
  98.       if (post == 0 && data[i].want_nread == strlen(data[i].inp))
  99. {
  100.   int  c = getc(fp);
  101.   if (c != EOF)
  102.     {
  103.       printf ("mpz_inp_str didn't read to EOFn");
  104.       printf ("  inp   "%s"n", data[i].inp);
  105.       printf ("  base  %dn", data[i].base);
  106.       printf ("  pre   %dn", pre);
  107.       printf ("  post  %dn", post);
  108.       printf ("  c     '%c' %#xn", c, c);
  109.       abort ();
  110.     }
  111. }
  112.       /* only expect "pre" included in the count when non-zero */
  113.       want_nread = data[i].want_nread;
  114.       if (want_nread != 0)
  115. want_nread += pre;
  116.       if (got_nread != want_nread)
  117. {
  118.   printf ("mpz_inp_str nread wrongn");
  119.   printf ("  inp         "%s"n", data[i].inp);
  120.   printf ("  base        %dn", data[i].base);
  121.   printf ("  pre         %dn", pre);
  122.   printf ("  post        %dn", post);
  123.   printf ("  got_nread   %dn", got_nread);
  124.   printf ("  want_nread  %dn", want_nread);
  125.   abort ();
  126. }
  127.       MPZ_CHECK_FORMAT (got);
  128.       if (mpz_cmp (got, want) != 0)
  129. {
  130.   printf ("mpz_inp_str wrong resultn");
  131.   printf ("  inp   "%s"n", data[i].inp);
  132.   printf ("  base  %dn", data[i].base);
  133.   mpz_trace ("  got ",  got);
  134.   mpz_trace ("  want", want);
  135.   abort ();
  136. }
  137.       ASSERT_ALWAYS (fclose (fp) == 0);
  138.     }
  139. }
  140.     }
  141.   mpz_clear (got);
  142.   mpz_clear (want);
  143. }
  144. int
  145. main (void)
  146. {
  147.   tests_start ();
  148.   check_data ();
  149.   unlink (FILENAME);
  150.   tests_end ();
  151.   exit (0);
  152. }