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.
108 lines
2.7 KiB
108 lines
2.7 KiB
// bufferish.js |
|
|
|
var Buffer = exports.global = require("./buffer-global"); |
|
var hasBuffer = exports.hasBuffer = Buffer && !!Buffer.isBuffer; |
|
var hasArrayBuffer = exports.hasArrayBuffer = ("undefined" !== typeof ArrayBuffer); |
|
|
|
var isArray = exports.isArray = require("isarray"); |
|
exports.isArrayBuffer = hasArrayBuffer ? isArrayBuffer : _false; |
|
var isBuffer = exports.isBuffer = hasBuffer ? Buffer.isBuffer : _false; |
|
var isView = exports.isView = hasArrayBuffer ? (ArrayBuffer.isView || _is("ArrayBuffer", "buffer")) : _false; |
|
|
|
exports.alloc = alloc; |
|
exports.concat = concat; |
|
exports.from = from; |
|
|
|
var BufferArray = exports.Array = require("./bufferish-array"); |
|
var BufferBuffer = exports.Buffer = require("./bufferish-buffer"); |
|
var BufferUint8Array = exports.Uint8Array = require("./bufferish-uint8array"); |
|
var BufferProto = exports.prototype = require("./bufferish-proto"); |
|
|
|
/** |
|
* @param value {Array|ArrayBuffer|Buffer|String} |
|
* @returns {Buffer|Uint8Array|Array} |
|
*/ |
|
|
|
function from(value) { |
|
if (typeof value === "string") { |
|
return fromString.call(this, value); |
|
} else { |
|
return auto(this).from(value); |
|
} |
|
} |
|
|
|
/** |
|
* @param size {Number} |
|
* @returns {Buffer|Uint8Array|Array} |
|
*/ |
|
|
|
function alloc(size) { |
|
return auto(this).alloc(size); |
|
} |
|
|
|
/** |
|
* @param list {Array} array of (Buffer|Uint8Array|Array)s |
|
* @param [length] |
|
* @returns {Buffer|Uint8Array|Array} |
|
*/ |
|
|
|
function concat(list, length) { |
|
if (!length) { |
|
length = 0; |
|
Array.prototype.forEach.call(list, dryrun); |
|
} |
|
var ref = (this !== exports) && this || list[0]; |
|
var result = alloc.call(ref, length); |
|
var offset = 0; |
|
Array.prototype.forEach.call(list, append); |
|
return result; |
|
|
|
function dryrun(buffer) { |
|
length += buffer.length; |
|
} |
|
|
|
function append(buffer) { |
|
offset += BufferProto.copy.call(buffer, result, offset); |
|
} |
|
} |
|
|
|
var _isArrayBuffer = _is("ArrayBuffer"); |
|
|
|
function isArrayBuffer(value) { |
|
return (value instanceof ArrayBuffer) || _isArrayBuffer(value); |
|
} |
|
|
|
/** |
|
* @private |
|
*/ |
|
|
|
function fromString(value) { |
|
var expected = value.length * 3; |
|
var that = alloc.call(this, expected); |
|
var actual = BufferProto.write.call(that, value); |
|
if (expected !== actual) { |
|
that = BufferProto.slice.call(that, 0, actual); |
|
} |
|
return that; |
|
} |
|
|
|
function auto(that) { |
|
return isBuffer(that) ? BufferBuffer |
|
: isView(that) ? BufferUint8Array |
|
: isArray(that) ? BufferArray |
|
: hasBuffer ? BufferBuffer |
|
: hasArrayBuffer ? BufferUint8Array |
|
: BufferArray; |
|
} |
|
|
|
function _false() { |
|
return false; |
|
} |
|
|
|
function _is(name, key) { |
|
/* jshint eqnull:true */ |
|
name = "[object " + name + "]"; |
|
return function(value) { |
|
return (value != null) && {}.toString.call(key ? value[key] : value) === name; |
|
}; |
|
} |