UNPKG

uleb128_33

Version:

Encoding and decoding large numbers (uleb128 and uleb128_33)

116 lines 4.14 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getUleb128_33Length = exports.getUleb128Length = exports.writeUleb128_33 = exports.writeUleb128 = exports.readUleb128_33 = exports.readUleb128 = void 0; /* eslint-disable camelcase */ const big_integer_1 = __importDefault(require("big-integer")); const write = (arr, integer) => { // eslint-disable-next-line no-constant-condition while (true) { let byte = integer.and(0x7f); // eslint-disable-next-line no-param-reassign integer = integer.shiftRight(7); if (integer.isZero()) { arr.push(byte.toJSNumber()); break; } byte = byte.or(0x80); arr.push(byte.toJSNumber()); } return arr; }; const read = (buffer, value, index, bitshift = 0) => { let i = index; let bitShift = bitshift; let byte; if (buffer.length === 0 || index >= buffer.length) return { value: 0, length: 0 }; do { byte = (0, big_integer_1.default)(buffer[i]); i += 1; bitShift += 7; // eslint-disable-next-line no-param-reassign value = value.or(byte.and(0x7f).shiftLeft(bitShift)); } while (byte.greaterOrEquals(0x80) && i < buffer.length); return { value: value.toJSNumber(), length: i - index + 1 }; }; const readUleb128 = (buffer, index = 0) => { if (buffer.length === 0) return { value: 0, length: 0 }; const value = (0, big_integer_1.default)(buffer[index]); if (value.greaterOrEquals(0x80)) { return read(buffer, value.and(0x7f), index + 1); } return { value: value.toJSNumber(), length: 1 }; }; exports.readUleb128 = readUleb128; const readUleb128_33 = (buffer, index = 0) => { if (buffer.length === 0) return { value: 0, length: 0, isMark: 0 }; const firstByte = (0, big_integer_1.default)(buffer[index]); const isMark = firstByte.and(0x1).toJSNumber(); const value = firstByte.shiftRight(1); if (value.greaterOrEquals(0x40)) { const result = read(buffer, value.and(0x3f), index + 1, -1); // extend type result.isMark = isMark; return result; } return { isMark, value: value.toJSNumber(), length: 1, }; }; exports.readUleb128_33 = readUleb128_33; const writeUleb128 = (integer) => { const result = []; return write(result, (0, big_integer_1.default)(integer)); }; exports.writeUleb128 = writeUleb128; const writeUleb128_33 = (integer, isMark) => { let integerB = (0, big_integer_1.default)(integer); const result = []; let byte = integerB.and(0x3f).shiftLeft(1).or(Number(isMark)); integerB = integerB.shiftRight(6); result.push(byte.or(integerB.isZero() ? 0 : 0x80).toJSNumber()); while (!integerB.isZero()) { byte = integerB.and(0x7f); integerB = integerB.shiftRight(7); result.push(byte.or(integerB.isZero() ? 0 : 0x80).toJSNumber()); } return result; }; exports.writeUleb128_33 = writeUleb128_33; const getUleb128Length = (integer) => { let result = 1; let integerB = (0, big_integer_1.default)(integer); integerB = integerB.shiftRight(7); while (!integerB.isZero()) { integerB = integerB.shiftRight(7); result += 1; } return result; }; exports.getUleb128Length = getUleb128Length; const getUleb128_33Length = (integer) => { let result = 1; let integerB = (0, big_integer_1.default)(integer); integerB = integerB.shiftRight(6); while (!integerB.isZero()) { integerB = integerB.shiftRight(7); result += 1; } return result; }; exports.getUleb128_33Length = getUleb128_33Length; exports.default = { getUleb128Length: exports.getUleb128Length, getUleb128_33Length: exports.getUleb128_33Length, readUleb128: exports.readUleb128, readUleb128_33: exports.readUleb128_33, writeUleb128: exports.writeUleb128, writeUleb128_33: exports.writeUleb128_33, }; //# sourceMappingURL=index.js.map