diff options
Diffstat (limited to 'lib/buffer.js')
-rw-r--r-- | lib/buffer.js | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/lib/buffer.js b/lib/buffer.js index dfd79e6290..de0ab040dd 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -202,40 +202,46 @@ Buffer.prototype.parent = undefined; // toString(encoding, start=0, end=buffer.length) Buffer.prototype.toString = function(encoding, start, end) { - encoding = !!encoding ? (encoding + '').toLowerCase() : 'utf8'; + var loweredCase = false; - start = ~~start; - end = util.isUndefined(end) ? this.length : ~~end; + start = start >>> 0; + end = util.isUndefined(end) ? this.length : end >>> 0; + if (!encoding) encoding = 'utf8'; if (start < 0) start = 0; if (end > this.length) end = this.length; if (end <= start) return ''; - switch (encoding) { - case 'hex': - return this.hexSlice(start, end); + while (true) { + switch (encoding) { + case 'hex': + return this.hexSlice(start, end); - case 'utf8': - case 'utf-8': - return this.utf8Slice(start, end); + case 'utf8': + case 'utf-8': + return this.utf8Slice(start, end); - case 'ascii': - return this.asciiSlice(start, end); + case 'ascii': + return this.asciiSlice(start, end); - case 'binary': - return this.binarySlice(start, end); + case 'binary': + return this.binarySlice(start, end); - case 'base64': - return this.base64Slice(start, end); + case 'base64': + return this.base64Slice(start, end); - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return this.ucs2Slice(start, end); + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return this.ucs2Slice(start, end); - default: - throw new TypeError('Unknown encoding: ' + encoding); + default: + if (loweredCase) + throw new TypeError('Unknown encoding: ' + encoding); + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } } }; |