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

数学计算

开发平台:

Unix_Linux

  1. /* Auxiliary functions for C++-style input of GMP types.
  2. Copyright 2001 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 <cctype>
  15. #include <iostream>
  16. #include <string>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. using namespace std;
  20. int
  21. __gmp_istream_set_base (istream &i, char &c, bool &zero, bool &showbase)
  22. {
  23.   int base;
  24.   zero = showbase = false;
  25.   switch (i.flags() & ios::basefield)
  26.     {
  27.     case ios::dec:
  28.       base = 10;
  29.       break;
  30.     case ios::hex:
  31.       base = 16;
  32.       break;
  33.     case ios::oct:
  34.       base = 8;
  35.       break;
  36.     default:
  37.       showbase = true; // look for initial "0" or "0x" or "0X"
  38.       if (c == '0')
  39. {
  40.   if (! i.get(c))
  41.     c = 0; // reset or we might loop indefinitely
  42.   if (c == 'x' || c == 'X')
  43.     {
  44.       base = 16;
  45.       i.get(c);
  46.     }
  47.   else
  48.     {
  49.       base = 8;
  50.       zero = true; // if no other digit is read, the "0" counts
  51.     }
  52. }
  53.       else
  54. base = 10;
  55.       break;
  56.     }
  57.   return base;
  58. }
  59. void
  60. __gmp_istream_set_digits (string &s, istream &i, char &c, bool &ok, int base)
  61. {
  62.   switch (base)
  63.     {
  64.     case 10:
  65.       while (isdigit(c))
  66. {
  67.   ok = true; // at least a valid digit was read
  68.   s += c;
  69.   if (! i.get(c))
  70.     break;
  71. }
  72.       break;
  73.     case 8:
  74.       while (isdigit(c) && c != '8' && c != '9')
  75. {
  76.   ok = true; // at least a valid digit was read
  77.   s += c;
  78.   if (! i.get(c))
  79.     break;
  80. }
  81.       break;
  82.     case 16:
  83.       while (isxdigit(c))
  84. {
  85.   ok = true; // at least a valid digit was read
  86.   s += c;
  87.   if (! i.get(c))
  88.     break;
  89. }
  90.       break;
  91.     }
  92. }