diff options
author | Kevin Ryde <user42@zip.com.au> | 2003-10-24 23:44:32 +0200 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2003-10-24 23:44:32 +0200 |
commit | 0088f0b8db19b2895b418feb02e716c52747caea (patch) | |
tree | 58e6a4bc7cea62a397f27ef4cf53720ad3aeafab /cxx | |
parent | 97a0eff393bffe78710d981ecfcbc67a69045768 (diff) | |
download | gmp-0088f0b8db19b2895b418feb02e716c52747caea.tar.gz |
* cxx/ismpznw.cc: New file, integer input without whitespace ...
* cxx/ismpz.cc: ... from here.
Diffstat (limited to 'cxx')
-rw-r--r-- | cxx/ismpz.cc | 28 | ||||
-rw-r--r-- | cxx/ismpznw.cc | 64 |
2 files changed, 65 insertions, 27 deletions
diff --git a/cxx/ismpz.cc b/cxx/ismpz.cc index 0cc3e7980..7b2d89156 100644 --- a/cxx/ismpz.cc +++ b/cxx/ismpz.cc @@ -34,11 +34,7 @@ using namespace std; istream & operator>> (istream &i, mpz_ptr z) { - int base; char c = 0; - string s; - bool ok = false, zero, showbase; - i.get(c); // start reading if (i.flags() & ios::skipws) // skip initial whitespace @@ -54,27 +50,5 @@ operator>> (istream &i, mpz_ptr z) ; } - if (c == '-' || c == '+') // sign - { - if (c == '-') // mpz_set_str doesn't accept '+' - s = "-"; - i.get(c); - } - - base = __gmp_istream_set_base(i, c, zero, showbase); // select the base - __gmp_istream_set_digits(s, i, c, ok, base); // read the number - - if (i.good()) // last character read was non-numeric - i.putback(c); - else if (i.eof() && (ok || zero)) // stopped just before eof - i.clear(); - - if (ok) - ASSERT_NOCARRY (mpz_set_str (z, s.c_str(), base)); // extract the number - else if (zero) - mpz_set_ui(z, 0); - else - i.setstate(ios::failbit); // read failed - - return i; + return __gmpz_operator_in_nowhite (i, z, c); } diff --git a/cxx/ismpznw.cc b/cxx/ismpznw.cc new file mode 100644 index 000000000..fed99d72c --- /dev/null +++ b/cxx/ismpznw.cc @@ -0,0 +1,64 @@ +/* __gmpz_operator_in_nowhite -- C++-style input of mpz_t, no whitespace skip. + +Copyright 2001, 2003 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +MA 02111-1307, USA. */ + +#include <cctype> +#include <iostream> +#include <string> +#include "gmp.h" +#include "gmp-impl.h" + +using namespace std; + + +// For g++ libstdc++ parsing see num_get<chartype,initer>::_M_extract_int in +// include/bits/locale_facets.tcc. + +istream & +__gmpz_operator_in_nowhite (istream &i, mpz_ptr z, char c) +{ + int base; + string s; + bool ok = false, zero, showbase; + + if (c == '-' || c == '+') // sign + { + if (c == '-') // mpz_set_str doesn't accept '+' + s = "-"; + i.get(c); + } + + base = __gmp_istream_set_base(i, c, zero, showbase); // select the base + __gmp_istream_set_digits(s, i, c, ok, base); // read the number + + if (i.good()) // last character read was non-numeric + i.putback(c); + else if (i.eof() && (ok || zero)) // stopped just before eof + i.clear(); + + if (ok) + ASSERT_NOCARRY (mpz_set_str (z, s.c_str(), base)); // extract the number + else if (zero) + mpz_set_ui(z, 0); + else + i.setstate(ios::failbit); // read failed + + return i; +} |