Annotation of OpenXM_contrib/gmp/cxx/ismpq.cc, Revision 1.1
1.1 ! ohara 1: /* operator>> -- C++-style input of mpq_t.
! 2:
! 3: Copyright 2001, 2002 Free Software Foundation, Inc.
! 4:
! 5: This file is part of the GNU MP Library.
! 6:
! 7: The GNU MP Library is free software; you can redistribute it and/or modify
! 8: it under the terms of the GNU Lesser General Public License as published by
! 9: the Free Software Foundation; either version 2.1 of the License, or (at your
! 10: option) any later version.
! 11:
! 12: The GNU MP Library is distributed in the hope that it will be useful, but
! 13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 15: License for more details.
! 16:
! 17: You should have received a copy of the GNU Lesser General Public License
! 18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 20: MA 02111-1307, USA. */
! 21:
! 22: #include <cctype>
! 23: #include <iostream>
! 24: #include <string>
! 25: #include "gmp.h"
! 26: #include "gmp-impl.h"
! 27:
! 28: using namespace std;
! 29:
! 30:
! 31: istream &
! 32: operator>> (istream &i, mpq_ptr q)
! 33: {
! 34: int base;
! 35: char c = 0;
! 36: string s;
! 37: bool ok = false, zero, showbase;
! 38:
! 39: i.get(c); // start reading
! 40:
! 41: if (i.flags() & ios::skipws) // skip initial whitespace
! 42: while (isspace(c) && i.get(c))
! 43: ;
! 44:
! 45: if (c == '-' || c == '+') // sign
! 46: {
! 47: if (c == '-')
! 48: s = "-";
! 49: i.get(c);
! 50:
! 51: while (isspace(c) && i.get(c)) // skip whitespace
! 52: ;
! 53: }
! 54:
! 55: base = __gmp_istream_set_base(i, c, zero, showbase); // select the base
! 56: __gmp_istream_set_digits(s, i, c, ok, base); // read the numerator
! 57:
! 58: if (! ok && zero) // the only digit read was "0"
! 59: {
! 60: base = 10;
! 61: s += '0';
! 62: ok = true;
! 63: }
! 64:
! 65: if (i.flags() & ios::skipws)
! 66: while (isspace(c) && i.get(c)) // skip whitespace
! 67: ;
! 68:
! 69: if (c == '/') // there's a denominator
! 70: {
! 71: bool zero2 = false;
! 72: int base2 = base;
! 73:
! 74: s += '/';
! 75: ok = false; // denominator is mandatory
! 76: i.get(c);
! 77:
! 78: while (isspace(c) && i.get(c)) // skip whitespace
! 79: ;
! 80:
! 81: if (showbase) // check base of denominator
! 82: base2 = __gmp_istream_set_base(i, c, zero2, showbase);
! 83:
! 84: if (base2 == base || base2 == 10) // read the denominator
! 85: __gmp_istream_set_digits(s, i, c, ok, base);
! 86:
! 87: if (! ok && zero2) // the only digit read was "0"
! 88: { // denominator is 0, but that's your business
! 89: s += '0';
! 90: ok = true;
! 91: }
! 92: }
! 93:
! 94: if (i.good()) // last character read was non-numeric
! 95: i.putback(c);
! 96: else if (i.eof() && ok) // stopped just before eof
! 97: i.clear();
! 98:
! 99: if (ok)
! 100: mpq_set_str(q, s.c_str(), base); // extract the number
! 101: else
! 102: i.setstate(ios::failbit); // read failed
! 103:
! 104: return i;
! 105: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>