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

数学计算

开发平台:

Unix_Linux

  1. /* mpf_inp_str(dest_float, stream, base) -- Input a number in base
  2.    BASE from stdio stream STREAM and store the result in DEST_FLOAT.
  3. Copyright 1996, 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
  4. This file is part of the GNU MP Library.
  5. The GNU MP Library is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU Lesser General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or (at your
  8. option) any later version.
  9. The GNU MP Library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. License for more details.
  13. You should have received a copy of the GNU Lesser General Public License
  14. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  15. #include <stdio.h>
  16. #include <ctype.h>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. size_t
  20. mpf_inp_str (mpf_ptr rop, FILE *stream, int base)
  21. {
  22.   char *str;
  23.   size_t alloc_size, str_size;
  24.   int c;
  25.   int res;
  26.   size_t nread;
  27.   if (stream == 0)
  28.     stream = stdin;
  29.   alloc_size = 100;
  30.   str = (char *) (*__gmp_allocate_func) (alloc_size);
  31.   str_size = 0;
  32.   nread = 0;
  33.   /* Skip whitespace.  */
  34.   do
  35.     {
  36.       c = getc (stream);
  37.       nread++;
  38.     }
  39.   while (isspace (c));
  40.   for (;;)
  41.     {
  42.       if (str_size >= alloc_size)
  43. {
  44.   size_t old_alloc_size = alloc_size;
  45.   alloc_size = alloc_size * 3 / 2;
  46.   str = (char *) (*__gmp_reallocate_func) (str, old_alloc_size, alloc_size);
  47. }
  48.       if (c == EOF || isspace (c))
  49. break;
  50.       str[str_size++] = c;
  51.       c = getc (stream);
  52.     }
  53.   ungetc (c, stream);
  54.   nread--;
  55.   if (str_size >= alloc_size)
  56.     {
  57.       size_t old_alloc_size = alloc_size;
  58.       alloc_size = alloc_size * 3 / 2;
  59.       str = (char *) (*__gmp_reallocate_func) (str, old_alloc_size, alloc_size);
  60.     }
  61.   str[str_size] = 0;
  62.   res = mpf_set_str (rop, str, base);
  63.   (*__gmp_free_func) (str, alloc_size);
  64.   if (res == -1)
  65.     return 0; /* error */
  66.   return str_size + nread;
  67. }