1/* __gmpz_operator_in_nowhite -- C++-style input of mpz_t, no whitespace skip. 2 3Copyright 2001, 2003 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 29// For g++ libstdc++ parsing see num_get<chartype,initer>::_M_extract_int in 30// include/bits/locale_facets.tcc. 31 32istream & 33__gmpz_operator_in_nowhite (istream &i, mpz_ptr z, char c) 34{ 35 int base; 36 string s; 37 bool ok = false, zero, showbase; 38 39 if (c == '-' || c == '+') // sign 40 { 41 if (c == '-') // mpz_set_str doesn't accept '+' 42 s = "-"; 43 i.get(c); 44 } 45 46 base = __gmp_istream_set_base(i, c, zero, showbase); // select the base 47 __gmp_istream_set_digits(s, i, c, ok, base); // read the number 48 49 if (i.good()) // last character read was non-numeric 50 i.putback(c); 51 else if (i.eof() && (ok || zero)) // stopped just before eof 52 i.clear(); 53 54 if (ok) 55 ASSERT_NOCARRY (mpz_set_str (z, s.c_str(), base)); // extract the number 56 else if (zero) 57 mpz_set_ui(z, 0); 58 else 59 i.setstate(ios::failbit); // read failed 60 61 return i; 62} 63