Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
large-numbers.js99 linesDownload Raw Back to commonjs
1"use strict";
2// Tar can encode large and negative numbers using a leading byte of
3// 0xff for negative, and 0x80 for positive.
4Object.defineProperty(exports, "__esModule", { value: true });
5exports.parse = exports.encode = void 0;
6const encode = (num, buf) => {
7    if (!Number.isSafeInteger(num)) {
8        // The number is so large that javascript cannot represent it with integer
9        // precision.
10        throw Error('cannot encode number outside of javascript safe integer range');
11    }
12    else if (num < 0) {
13        encodeNegative(num, buf);
14    }
15    else {
16        encodePositive(num, buf);
17    }
18    return buf;
19};
20exports.encode = encode;
21const encodePositive = (num, buf) => {
22    buf[0] = 0x80;
23    for (var i = buf.length; i > 1; i--) {
24        buf[i - 1] = num & 0xff;
25        num = Math.floor(num / 0x100);
26    }
27};
28const encodeNegative = (num, buf) => {
29    buf[0] = 0xff;
30    var flipped = false;
31    num = num * -1;
32    for (var i = buf.length; i > 1; i--) {
33        var byte = num & 0xff;
34        num = Math.floor(num / 0x100);
35        if (flipped) {
36            buf[i - 1] = onesComp(byte);
37        }
38        else if (byte === 0) {
39            buf[i - 1] = 0;
40        }
41        else {
42            flipped = true;
43            buf[i - 1] = twosComp(byte);
44        }
45    }
46};
47const parse = (buf) => {
48    const pre = buf[0];
49    const value = pre === 0x80 ? pos(buf.subarray(1, buf.length))
50        : pre === 0xff ? twos(buf)
51            : null;
52    if (value === null) {
53        throw Error('invalid base256 encoding');
54    }
55    if (!Number.isSafeInteger(value)) {
56        // The number is so large that javascript cannot represent it with integer
57        // precision.
58        throw Error('parsed number outside of javascript safe integer range');
59    }
60    return value;
61};
62exports.parse = parse;
63const twos = (buf) => {
64    var len = buf.length;
65    var sum = 0;
66    var flipped = false;
67    for (var i = len - 1; i > -1; i--) {
68        var byte = Number(buf[i]);
69        var f;
70        if (flipped) {
71            f = onesComp(byte);
72        }
73        else if (byte === 0) {
74            f = byte;
75        }
76        else {
77            flipped = true;
78            f = twosComp(byte);
79        }
80        if (f !== 0) {
81            sum -= f * Math.pow(256, len - i - 1);
82        }
83    }
84    return sum;
85};
86const pos = (buf) => {
87    var len = buf.length;
88    var sum = 0;
89    for (var i = len - 1; i > -1; i--) {
90        var byte = Number(buf[i]);
91        if (byte !== 0) {
92            sum += byte * Math.pow(256, len - i - 1);
93        }
94    }
95    return sum;
96};
97const onesComp = (byte) => (0xff ^ byte) & 0xff;
98const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff;
99//# sourceMappingURL=large-numbers.js.map