diff options
author | Kevin Ryde <user42@zip.com.au> | 2001-10-09 03:22:59 +0200 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2001-10-09 03:22:59 +0200 |
commit | f6a97298f25fc8543dbed7e6a41351083412be93 (patch) | |
tree | d00217b2f3ddbd478c319aeb96848018afd13019 /cxx/ismpq.cc | |
parent | ddc1b47f3e826d602fd9ddf4f1500412b33593ee (diff) | |
download | gmp-f6a97298f25fc8543dbed7e6a41351083412be93.tar.gz |
2001-10-09 Gerardo Ballabio <ballabio@sissa.it>
* cxx/ismpf.cc, cxx/ismpq.cc, cxx/ismpz.cc: New files.
Diffstat (limited to 'cxx/ismpq.cc')
-rw-r--r-- | cxx/ismpq.cc | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/cxx/ismpq.cc b/cxx/ismpq.cc new file mode 100644 index 000000000..fae10c67f --- /dev/null +++ b/cxx/ismpq.cc @@ -0,0 +1,102 @@ +/* operator>> -- C++-style input of mpq_t. + +Copyright 2001 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" + +istream & +operator>> (istream &i, mpq_ptr q) +{ + 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 + while (isspace(c) && i.get(c)) + ; + + if (c == '-' || c == '+') // sign + { + if (c == '-') + s = "-"; + i.get(c); + } + + while (isspace(c) && i.get(c)) // skip whitespace + ; + + base = __gmp_istream_set_base(i, c, zero, showbase); // select the base + __gmp_istream_set_digits(s, i, c, ok, base); // read the numerator + + if (! ok && zero) // the only digit read was "0" + { + base = 10; + s += '0'; + ok = true; + } + + if (i.flags() & ios::skipws) + while (isspace(c) && i.get(c)) // skip whitespace + ; + + if (c == '/') // there's a denominator + { + bool zero2 = false; + int base2 = base; + + s += '/'; + ok = false; // denominator is mandatory + i.get(c); + + while (isspace(c) && i.get(c)) // skip whitespace + ; + + if (showbase) // check base of denominator + base2 = __gmp_istream_set_base(i, c, zero2, showbase); + + if (base2 == base || base2 == 10) // read the denominator + __gmp_istream_set_digits(s, i, c, ok, base); + + if (! ok && zero2) // the only digit read was "0" + { // denominator is 0, but that's your business + s += '0'; + ok = true; + } + } + + if (i.good()) // last character read was non-numeric + i.putback(c); + else if (i.eof() && ok) // stopped just before eof + i.clear(); + + if (ok) + mpq_set_str(q, s.c_str(), base); // extract the number + else + i.setstate(ios::failbit); // read failed + + return i; +} |