summaryrefslogtreecommitdiff
path: root/lib/buffer.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/buffer.js')
-rw-r--r--lib/buffer.js50
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;
+ }
}
};