| // Copyright 2014 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code by Matt McCutchen, see the LICENSE file. |
| |
| #include "BigIntegerUtils.hh" |
| #include "BigUnsignedInABase.hh" |
| |
| std::string bigUnsignedToString(const BigUnsigned &x) { |
| return std::string(BigUnsignedInABase(x, 10)); |
| } |
| |
| std::string bigIntegerToString(const BigInteger &x) { |
| return (x.getSign() == BigInteger::negative) |
| ? (std::string("-") + bigUnsignedToString(x.getMagnitude())) |
| : (bigUnsignedToString(x.getMagnitude())); |
| } |
| |
| BigUnsigned stringToBigUnsigned(const std::string &s) { |
| return BigUnsigned(BigUnsignedInABase(s, 10)); |
| } |
| |
| BigInteger stringToBigInteger(const std::string &s) { |
| // Recognize a sign followed by a BigUnsigned. |
| return (s[0] == '-') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1)), BigInteger::negative) |
| : (s[0] == '+') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1))) |
| : BigInteger(stringToBigUnsigned(s)); |
| } |
| |
| std::ostream &operator <<(std::ostream &os, const BigUnsigned &x) { |
| BigUnsignedInABase::Base base; |
| long osFlags = os.flags(); |
| if (osFlags & os.dec) |
| base = 10; |
| else if (osFlags & os.hex) { |
| base = 16; |
| if (osFlags & os.showbase) |
| os << "0x"; |
| } else if (osFlags & os.oct) { |
| base = 8; |
| if (osFlags & os.showbase) |
| os << '0'; |
| } else |
| abort(); |
| |
| std::string s = std::string(BigUnsignedInABase(x, base)); |
| os << s; |
| return os; |
| } |
| |
| std::ostream &operator <<(std::ostream &os, const BigInteger &x) { |
| if (x.getSign() == BigInteger::negative) |
| os << '-'; |
| os << x.getMagnitude(); |
| return os; |
| } |