1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code by Matt McCutchen, see the LICENSE file.
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include <ostream>
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include "BigIntegerUtils.hh"
10*3ac0a46fSAndroid Build Coastguard Worker #include "BigUnsignedInABase.hh"
11*3ac0a46fSAndroid Build Coastguard Worker
bigUnsignedToString(const BigUnsigned & x)12*3ac0a46fSAndroid Build Coastguard Worker std::string bigUnsignedToString(const BigUnsigned &x) {
13*3ac0a46fSAndroid Build Coastguard Worker return std::string(BigUnsignedInABase(x, 10));
14*3ac0a46fSAndroid Build Coastguard Worker }
15*3ac0a46fSAndroid Build Coastguard Worker
bigIntegerToString(const BigInteger & x)16*3ac0a46fSAndroid Build Coastguard Worker std::string bigIntegerToString(const BigInteger &x) {
17*3ac0a46fSAndroid Build Coastguard Worker return (x.getSign() == BigInteger::negative)
18*3ac0a46fSAndroid Build Coastguard Worker ? (std::string("-") + bigUnsignedToString(x.getMagnitude()))
19*3ac0a46fSAndroid Build Coastguard Worker : (bigUnsignedToString(x.getMagnitude()));
20*3ac0a46fSAndroid Build Coastguard Worker }
21*3ac0a46fSAndroid Build Coastguard Worker
stringToBigUnsigned(const std::string & s)22*3ac0a46fSAndroid Build Coastguard Worker BigUnsigned stringToBigUnsigned(const std::string &s) {
23*3ac0a46fSAndroid Build Coastguard Worker return BigUnsigned(BigUnsignedInABase(s, 10));
24*3ac0a46fSAndroid Build Coastguard Worker }
25*3ac0a46fSAndroid Build Coastguard Worker
stringToBigInteger(const std::string & s)26*3ac0a46fSAndroid Build Coastguard Worker BigInteger stringToBigInteger(const std::string &s) {
27*3ac0a46fSAndroid Build Coastguard Worker // Recognize a sign followed by a BigUnsigned.
28*3ac0a46fSAndroid Build Coastguard Worker return (s[0] == '-') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1)), BigInteger::negative)
29*3ac0a46fSAndroid Build Coastguard Worker : (s[0] == '+') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1)))
30*3ac0a46fSAndroid Build Coastguard Worker : BigInteger(stringToBigUnsigned(s));
31*3ac0a46fSAndroid Build Coastguard Worker }
32*3ac0a46fSAndroid Build Coastguard Worker
operator <<(std::ostream & os,const BigUnsigned & x)33*3ac0a46fSAndroid Build Coastguard Worker std::ostream &operator <<(std::ostream &os, const BigUnsigned &x) {
34*3ac0a46fSAndroid Build Coastguard Worker BigUnsignedInABase::Base base;
35*3ac0a46fSAndroid Build Coastguard Worker long osFlags = os.flags();
36*3ac0a46fSAndroid Build Coastguard Worker if (osFlags & os.dec)
37*3ac0a46fSAndroid Build Coastguard Worker base = 10;
38*3ac0a46fSAndroid Build Coastguard Worker else if (osFlags & os.hex) {
39*3ac0a46fSAndroid Build Coastguard Worker base = 16;
40*3ac0a46fSAndroid Build Coastguard Worker if (osFlags & os.showbase)
41*3ac0a46fSAndroid Build Coastguard Worker os << "0x";
42*3ac0a46fSAndroid Build Coastguard Worker } else if (osFlags & os.oct) {
43*3ac0a46fSAndroid Build Coastguard Worker base = 8;
44*3ac0a46fSAndroid Build Coastguard Worker if (osFlags & os.showbase)
45*3ac0a46fSAndroid Build Coastguard Worker os << '0';
46*3ac0a46fSAndroid Build Coastguard Worker } else
47*3ac0a46fSAndroid Build Coastguard Worker abort();
48*3ac0a46fSAndroid Build Coastguard Worker
49*3ac0a46fSAndroid Build Coastguard Worker std::string s = std::string(BigUnsignedInABase(x, base));
50*3ac0a46fSAndroid Build Coastguard Worker os << s;
51*3ac0a46fSAndroid Build Coastguard Worker return os;
52*3ac0a46fSAndroid Build Coastguard Worker }
53*3ac0a46fSAndroid Build Coastguard Worker
operator <<(std::ostream & os,const BigInteger & x)54*3ac0a46fSAndroid Build Coastguard Worker std::ostream &operator <<(std::ostream &os, const BigInteger &x) {
55*3ac0a46fSAndroid Build Coastguard Worker if (x.getSign() == BigInteger::negative)
56*3ac0a46fSAndroid Build Coastguard Worker os << '-';
57*3ac0a46fSAndroid Build Coastguard Worker os << x.getMagnitude();
58*3ac0a46fSAndroid Build Coastguard Worker return os;
59*3ac0a46fSAndroid Build Coastguard Worker }
60