fcoin/lib/bcoin/bn.js
Christopher Jeffrey 05a8aeeb48 add bn2.js.
2016-01-14 16:09:18 -08:00

99 lines
2.0 KiB
JavaScript

/**
* bn.js - signed big numbers for bcoin
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
* https://github.com/indutny/bcoin
*/
var bn = require('bn.js');
/**
* Signed Big Numbers
*/
function bn2(number, signed, base, endian) {
if (!(this instanceof bn2))
return new bn2(number, signed, base, endian);
if (typeof signed !== 'boolean') {
endian = base;
base = signed;
signed = null;
}
this.__signed = !!signed;
return bn.call(this, number, base, endian);
}
bn2.prototype.__proto__ = bn.prototype;
bn2.prototype._initArray = function _initArray(number, base, endian) {
var i = 0;
var ret;
if (!this.__signed)
return bn.prototype._initArray.apply(this, arguments);
if (endian === 'le')
i = number.length - 1;
// If we are signed, do (~num + 1) to get
// the positive counterpart and set bn's
// negative flag.
if (number[i] & 0x80) {
if (isNegZero(number, endian)) {
ret = this._initNumber(0, 10, endian);
} else {
ret = bn.prototype._initArray.apply(this, arguments);
this.inotn(64).iaddn(1).ineg();
}
} else {
ret = bn.prototype._initArray.apply(this, arguments);
}
return ret;
};
bn2.prototype.toArray = function toArray(endian, length) {
var self = this;
if (!this.__signed)
return bn.prototype.toArray.apply(self, arguments);
// Convert the number to the
// negative byte representation.
if (self.isNeg()) {
if (self.cmpn(0) === 0)
self = new bn(0);
else
self = self.neg().notn(64).addn(1);
}
return bn.prototype.toArray.apply(self, arguments);
};
bn2.signed = function signed(number, base, endian) {
return new bn2(number, true, base, endian);
};
function isNegZero(number, endian) {
var i = 0;
if (endian === 'le')
i = number.length - 1;
if (number[i] & 0x80) {
number = number.slice();
number[i] &= ~0x80;
return new bn(number, endian).cmpn(0) === 0;
}
return false;
}
/**
* Expose
*/
module.exports = bn2;