pluie-bin/lib/bin.js

97 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2016-12-18 22:50:34 +00:00
module.exports = function (ns) {
2016-12-18 23:39:08 +00:00
require('./encoder')(ns);
2016-12-18 13:44:45 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 22:50:34 +00:00
String.prototype.removeEndNullBytes = function() {
return this.replace(/\0+$/g, '');
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
String.prototype.removeStartNullBytes = function() {
return this.replace(/^\0+/g, '');
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 23:39:08 +00:00
ns.enc = new ns.TextEncoder("utf-8");
ns.dec = new ns.TextDecoder("utf-8", {fatal: true});
2016-12-18 22:50:34 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ns.intFromBytes = function(bytes)
2016-12-18 13:44:45 +00:00
{
var value = null;
if (bytes!=null && bytes.length > 0) {
// Big Endian
for (var i = value = 0, lim = bytes.length; i < lim; i++) {
value = value * 256 + bytes[i];
}
}
return value;
2016-12-18 22:50:34 +00:00
};
2016-12-18 13:44:45 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 22:50:34 +00:00
ns.bytesFromInt = function(value, size)
2016-12-18 13:44:45 +00:00
{
var bytes = new Uint8Array(size);
while (value) {
bytes.set([value & 255], --size);
value >>= 8;
}
return bytes;
2016-12-18 22:50:34 +00:00
};
2016-12-18 13:44:45 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 22:50:34 +00:00
ns.pack = function(size, type, value)
2016-12-18 13:44:45 +00:00
{
var packed = null
if (type == 'n' || type == 'N') {
// js int max on 32 signed bits
if (value >= 0 && value <= 2147483647) {
packed = this.bytesFromInt(value, type == 'n' ? 2 : 4);
}
}
else if (type == 'a') {
packed = new Uint8Array(size);
packed.set(this.enc.encode(value), 0);
}
return packed;
2016-12-18 22:50:34 +00:00
};
2016-12-18 13:44:45 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 22:50:34 +00:00
ns.unpack = function(size, type, bytes)
2016-12-18 13:44:45 +00:00
{
var unpacked = null
if (type == 'n' || type == 'N') {
var selByte = bytes.slice(0, size*(type == 'n' ? 2 : 4));
unpacked = this.intFromBytes(selByte);
}
else if (type == 'a') {
unpacked = this.dec.decode(bytes.slice(0, size)).removeEndNullBytes();
}
return unpacked;
2016-12-18 22:50:34 +00:00
};
2016-12-18 13:44:45 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 22:50:34 +00:00
ns.mergeBuffers = function(bufferArray)
2016-12-18 13:44:45 +00:00
{
var maxLength = 0;
for(var i=0, lim=bufferArray.length; i < lim; i++) {
if (bufferArray[i] != null) {
maxLength += bufferArray[i].byteLength;
}
}
var tmp = new Uint8Array(maxLength);
for(var i=0, pos = 0, lim=bufferArray.length; i < lim; i++) {
if (bufferArray[i] != null) {
tmp.set(new Uint8Array(bufferArray[i]), pos);
pos += bufferArray[i].byteLength;
}
}
return tmp;
2016-12-18 22:50:34 +00:00
};
2016-12-18 13:44:45 +00:00
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016-12-18 22:50:34 +00:00
ns.getBuffer = function(array, size)
2016-12-18 13:44:45 +00:00
{
var buffer = new Uint8Array(!size ? array.length : size);
buffer.set(new Uint8Array(array), 0);
return buffer;
2016-12-18 22:50:34 +00:00
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
require('./file')(ns);
return ns;
2016-12-18 13:44:45 +00:00
}