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
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); |
|
} |