aboutsummaryrefslogtreecommitdiff
path: root/src/parseTools.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-02-14 21:36:59 -0500
committerAlon Zakai <alonzakai@gmail.com>2012-02-14 21:36:59 -0500
commitb16a890dc7e1435497a1b97b1a0fb7b0987faaef (patch)
tree93069e3ff4853e547a81b6a913eae1f6c84265f2 /src/parseTools.js
parent96a29d6e19bcd9617de7881d673f31a63e0728d6 (diff)
parse negative iBig numbers
Diffstat (limited to 'src/parseTools.js')
-rw-r--r--src/parseTools.js22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/parseTools.js b/src/parseTools.js
index 071ed090..b401c1a5 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -602,6 +602,22 @@ function parseArbitraryInt(str, bits) {
}
}
+ function mul2(v) { // v *= 2
+ for (var i = v.length-1; i >= 0; i--) {
+ var d = v[i]*2;
+ r = d >= 10;
+ v[i] = d%10;
+ var j = i-1;
+ if (r) {
+ if (j < 0) {
+ v.unshift(1);
+ break;
+ }
+ v[j] += 0.5; // will be multiplied
+ }
+ }
+ }
+
function subtract(v, w) { // v -= w. we assume v >= w
while (v.length > w.length) w.splice(0, 0, 0);
for (var i = 0; i < v.length; i++) {
@@ -631,9 +647,11 @@ function parseArbitraryInt(str, bits) {
if (str[0] == '-') {
// twos-complement is needed
- assert(bits == 64, "we only support 64-bit two's complement so far");
str = str.substr(1);
- v = str2vec('18446744073709551616'); // 2^64
+ v = str2vec('1');
+ for (var i = 0; i < bits; i++) {
+ mul2(v);
+ }
subtract(v, str2vec(str));
} else {
v = str2vec(str);