1/* Auxiliary functions for C++-style input of GMP types.
2
3Copyright 2001 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library.
6
7The GNU MP Library is free software; you can redistribute it and/or modify
8it under the terms of the GNU Lesser General Public License as published by
9the Free Software Foundation; either version 3 of the License, or (at your
10option) any later version.
11
12The GNU MP Library is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15License for more details.
16
17You should have received a copy of the GNU Lesser General Public License
18along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
19
20#include <cctype>
21#include <iostream>
22#include <string>
23#include "gmp.h"
24#include "gmp-impl.h"
25
26using namespace std;
27
28
29int
30__gmp_istream_set_base (istream &i, char &c, bool &zero, bool &showbase)
31{
32  int base;
33
34  zero = showbase = false;
35  switch (i.flags() & ios::basefield)
36    {
37    case ios::dec:
38      base = 10;
39      break;
40    case ios::hex:
41      base = 16;
42      break;
43    case ios::oct:
44      base = 8;
45      break;
46    default:
47      showbase = true; // look for initial "0" or "0x" or "0X"
48      if (c == '0')
49	{
50	  if (! i.get(c))
51	    c = 0; // reset or we might loop indefinitely
52
53	  if (c == 'x' || c == 'X')
54	    {
55	      base = 16;
56	      i.get(c);
57	    }
58	  else
59	    {
60	      base = 8;
61	      zero = true; // if no other digit is read, the "0" counts
62	    }
63	}
64      else
65	base = 10;
66      break;
67    }
68
69  return base;
70}
71
72void
73__gmp_istream_set_digits (string &s, istream &i, char &c, bool &ok, int base)
74{
75  switch (base)
76    {
77    case 10:
78      while (isdigit(c))
79	{
80	  ok = true; // at least a valid digit was read
81	  s += c;
82	  if (! i.get(c))
83	    break;
84	}
85      break;
86    case 8:
87      while (isdigit(c) && c != '8' && c != '9')
88	{
89	  ok = true; // at least a valid digit was read
90	  s += c;
91	  if (! i.get(c))
92	    break;
93	}
94      break;
95    case 16:
96      while (isxdigit(c))
97	{
98	  ok = true; // at least a valid digit was read
99	  s += c;
100	  if (! i.get(c))
101	    break;
102	}
103      break;
104    }
105}
106