Annotation of OpenXM_contrib/gmp/cxx/ismpf.cc, Revision 1.1
1.1 ! ohara 1: /* operator>> -- C++-style input of mpf_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 "config.h"
! 23:
! 24: #include <cctype>
! 25: #include <iostream>
! 26: #include <string>
! 27:
! 28: #if HAVE_LOCALE_H
! 29: #include <locale.h> /* for localeconv */
! 30: #endif
! 31:
! 32: #include "gmp.h"
! 33: #include "gmp-impl.h"
! 34:
! 35: using namespace std;
! 36:
! 37:
! 38: /* Perhaps the decimal point should be taken from the C++ <locale> stuff,
! 39: but that doesn't exist in g++ 2.95.x. In any case, using plain C
! 40: localeconv will ensure we parse exactly what mpf_set_str will expect, and
! 41: what the current operator<< implementation produces. */
! 42:
! 43: istream &
! 44: operator>> (istream &i, mpf_ptr f)
! 45: {
! 46: int base;
! 47: char c = 0;
! 48: string s;
! 49: bool ok = false;
! 50:
! 51: i.get(c); // start reading
! 52:
! 53: if (i.flags() & ios::skipws) // skip initial whitespace
! 54: while (isspace(c) && i.get(c))
! 55: ;
! 56:
! 57: if (c == '-' || c == '+') // sign
! 58: {
! 59: if (c == '-')
! 60: s = "-";
! 61: i.get(c);
! 62:
! 63: while (isspace(c) && i.get(c)) // skip whitespace
! 64: ;
! 65: }
! 66:
! 67: base = 10; // octal/hex floats currently unsupported
! 68: __gmp_istream_set_digits(s, i, c, ok, base); // read the number
! 69:
! 70: #if HAVE_LOCALECONV
! 71: const char *point = localeconv()->decimal_point;
! 72: if (c == *point) // radix point
! 73: {
! 74: for (;;)
! 75: {
! 76: s += c;
! 77: i.get(c);
! 78: point++;
! 79: if (*point == '\0')
! 80: break;
! 81: if (c != *point)
! 82: goto fail;
! 83: }
! 84: __gmp_istream_set_digits(s, i, c, ok, base); // read the mantissa
! 85: }
! 86: #else
! 87: if (c == '.') // radix point
! 88: {
! 89: s += '.';
! 90: i.get(c);
! 91: __gmp_istream_set_digits(s, i, c, ok, base); // read the mantissa
! 92: }
! 93: #endif
! 94:
! 95: if (ok && (c == 'e' || c == 'E' || c == '@')) // exponent
! 96: {
! 97: s += c;
! 98: i.get(c);
! 99: ok = false; // exponent is mandatory
! 100:
! 101: if (c == '-' || c == '+') // sign
! 102: {
! 103: s += c;
! 104: i.get(c);
! 105:
! 106: while (isspace(c) && i.get(c)) // skip whitespace
! 107: ;
! 108: }
! 109:
! 110: __gmp_istream_set_digits(s, i, c, ok, base); // read the exponent
! 111: }
! 112:
! 113: if (i.good()) // last character read was non-numeric
! 114: i.putback(c);
! 115: else if (i.eof() && ok) // stopped just before eof
! 116: i.clear();
! 117:
! 118: if (ok)
! 119: mpf_set_str(f, s.c_str(), base); // extract the number
! 120: else
! 121: {
! 122: fail:
! 123: i.setstate(ios::failbit); // read failed
! 124: }
! 125:
! 126: return i;
! 127: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>