xref: /aosp_15_r20/external/pdfium/third_party/bigint/BigIntegerUtils.cc (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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