Annotation of OpenXM_contrib/gmp/cxx/ismpq.cc, Revision 1.1.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>