You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
4.4 KiB

// read-format.js
var ieee754 = require("ieee754");
var Int64Buffer = require("int64-buffer");
var Uint64BE = Int64Buffer.Uint64BE;
var Int64BE = Int64Buffer.Int64BE;
exports.getReadFormat = getReadFormat;
exports.readUint8 = uint8;
var Bufferish = require("./bufferish");
var BufferProto = require("./bufferish-proto");
var HAS_MAP = ("undefined" !== typeof Map);
var NO_ASSERT = true;
function getReadFormat(options) {
var binarraybuffer = Bufferish.hasArrayBuffer && options && options.binarraybuffer;
var int64 = options && options.int64;
var usemap = HAS_MAP && options && options.usemap;
var readFormat = {
map: (usemap ? map_to_map : map_to_obj),
array: array,
str: str,
bin: (binarraybuffer ? bin_arraybuffer : bin_buffer),
ext: ext,
uint8: uint8,
uint16: uint16,
uint32: uint32,
uint64: read(8, int64 ? readUInt64BE_int64 : readUInt64BE),
int8: int8,
int16: int16,
int32: int32,
int64: read(8, int64 ? readInt64BE_int64 : readInt64BE),
float32: read(4, readFloatBE),
float64: read(8, readDoubleBE)
};
return readFormat;
}
function map_to_obj(decoder, len) {
var value = {};
var i;
var k = new Array(len);
var v = new Array(len);
var decode = decoder.codec.decode;
for (i = 0; i < len; i++) {
k[i] = decode(decoder);
v[i] = decode(decoder);
}
for (i = 0; i < len; i++) {
value[k[i]] = v[i];
}
return value;
}
function map_to_map(decoder, len) {
var value = new Map();
var i;
var k = new Array(len);
var v = new Array(len);
var decode = decoder.codec.decode;
for (i = 0; i < len; i++) {
k[i] = decode(decoder);
v[i] = decode(decoder);
}
for (i = 0; i < len; i++) {
value.set(k[i], v[i]);
}
return value;
}
function array(decoder, len) {
var value = new Array(len);
var decode = decoder.codec.decode;
for (var i = 0; i < len; i++) {
value[i] = decode(decoder);
}
return value;
}
function str(decoder, len) {
var start = decoder.reserve(len);
var end = start + len;
return BufferProto.toString.call(decoder.buffer, "utf-8", start, end);
}
function bin_buffer(decoder, len) {
var start = decoder.reserve(len);
var end = start + len;
var buf = BufferProto.slice.call(decoder.buffer, start, end);
return Bufferish.from(buf);
}
function bin_arraybuffer(decoder, len) {
var start = decoder.reserve(len);
var end = start + len;
var buf = BufferProto.slice.call(decoder.buffer, start, end);
return Bufferish.Uint8Array.from(buf).buffer;
}
function ext(decoder, len) {
var start = decoder.reserve(len+1);
var type = decoder.buffer[start++];
var end = start + len;
var unpack = decoder.codec.getExtUnpacker(type);
if (!unpack) throw new Error("Invalid ext type: " + (type ? ("0x" + type.toString(16)) : type));
var buf = BufferProto.slice.call(decoder.buffer, start, end);
return unpack(buf);
}
function uint8(decoder) {
var start = decoder.reserve(1);
return decoder.buffer[start];
}
function int8(decoder) {
var start = decoder.reserve(1);
var value = decoder.buffer[start];
return (value & 0x80) ? value - 0x100 : value;
}
function uint16(decoder) {
var start = decoder.reserve(2);
var buffer = decoder.buffer;
return (buffer[start++] << 8) | buffer[start];
}
function int16(decoder) {
var start = decoder.reserve(2);
var buffer = decoder.buffer;
var value = (buffer[start++] << 8) | buffer[start];
return (value & 0x8000) ? value - 0x10000 : value;
}
function uint32(decoder) {
var start = decoder.reserve(4);
var buffer = decoder.buffer;
return (buffer[start++] * 16777216) + (buffer[start++] << 16) + (buffer[start++] << 8) + buffer[start];
}
function int32(decoder) {
var start = decoder.reserve(4);
var buffer = decoder.buffer;
return (buffer[start++] << 24) | (buffer[start++] << 16) | (buffer[start++] << 8) | buffer[start];
}
function read(len, method) {
return function(decoder) {
var start = decoder.reserve(len);
return method.call(decoder.buffer, start, NO_ASSERT);
};
}
function readUInt64BE(start) {
return new Uint64BE(this, start).toNumber();
}
function readInt64BE(start) {
return new Int64BE(this, start).toNumber();
}
function readUInt64BE_int64(start) {
return new Uint64BE(this, start);
}
function readInt64BE_int64(start) {
return new Int64BE(this, start);
}
function readFloatBE(start) {
return ieee754.read(this, start, false, 23, 4);
}
function readDoubleBE(start) {
return ieee754.read(this, start, false, 52, 8);
}