181 lines
4.4 KiB
JavaScript
181 lines
4.4 KiB
JavaScript
// 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);
|
|
} |