#
source:
trunk/third/gmp/cxx/ismpq.cc
@
18191

Revision 18191, 2.6 KB checked in by ghudson, 22 years ago (diff) |
---|

Line | |
---|---|

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 | } |

**Note:**See TracBrowser for help on using the repository browser.