UNPKG

3.13 kBJavaScriptView Raw
1// util.js
2
3var MAXBUFLEN = 8192;
4
5exports.writeString = writeString;
6exports.readString = readString;
7exports.byteLength = byteLength;
8exports.copy = copy;
9exports.writeUint64BE = writeUint64BE;
10exports.writeInt64BE = writeInt64BE;
11
12// new Buffer(string, "utf-8") is SLOWER then below
13
14function writeString(string, start) {
15 var buffer = this;
16 var index = start || 0;
17 var length = string.length;
18 // JavaScript's string uses UTF-16 surrogate pairs for characters other than BMP.
19 // This encodes string as CESU-8 which never reaches 4 octets per character.
20 for (var i = 0; i < length; i++) {
21 var chr = string.charCodeAt(i);
22 if (chr < 0x80) {
23 buffer[index++] = chr;
24 } else if (chr < 0x800) {
25 buffer[index++] = 0xC0 | (chr >> 6);
26 buffer[index++] = 0x80 | (chr & 0x3F);
27 } else {
28 buffer[index++] = 0xE0 | (chr >> 12);
29 buffer[index++] = 0x80 | ((chr >> 6) & 0x3F);
30 buffer[index++] = 0x80 | (chr & 0x3F);
31 }
32 }
33 return index - start;
34}
35
36// Buffer.ptototype.toString is 2x FASTER then below
37// https://github.com/feross/buffer may throw "Maximum call stack size exceeded." at String.fromCharCode.apply.
38
39function readString(start, end) {
40 var buffer = this;
41 var index = start - 0 || 0;
42 if (!end) end = buffer.length;
43 var size = end - start;
44 if (size > MAXBUFLEN) size = MAXBUFLEN;
45 var out = [];
46 for (; index < end;) {
47 var array = new Array(size);
48 for (var pos = 0; pos < size && index < end;) {
49 var chr = buffer[index++];
50 chr = (chr < 0x80) ? chr :
51 (chr < 0xE0) ? (((chr & 0x3F) << 6) | (buffer[index++] & 0x3F)) :
52 (((chr & 0x3F) << 12) | ((buffer[index++] & 0x3F) << 6) | ((buffer[index++] & 0x3F)));
53 array[pos++] = chr;
54 }
55 if (pos < size) array = array.slice(0, pos);
56 out.push(String.fromCharCode.apply("", array));
57 }
58 return (out.length > 1) ? out.join("") : out.length ? out.shift() : "";
59}
60
61// Buffer.byteLength is FASTER than below
62
63function byteLength(string) {
64 var length = 0 | 0;
65 Array.prototype.forEach.call(string, function(chr) {
66 var code = chr.charCodeAt(0);
67 length += (code < 0x80) ? 1 : (code < 0x800) ? 2 : 3;
68 });
69 return length;
70}
71
72// https://github.com/feross/buffer lacks descending copying feature
73
74function copy(target, targetStart, start, end) {
75 var i;
76 if (!start) start = 0;
77 if (!end && end !== 0) end = this.length;
78 if (!targetStart) targetStart = 0;
79 var len = end - start;
80
81 if (target === this && start < targetStart && targetStart < end) {
82 // descending
83 for (i = len - 1; i >= 0; i--) {
84 target[i + targetStart] = this[i + start];
85 }
86 } else {
87 // ascending
88 for (i = 0; i < len; i++) {
89 target[i + targetStart] = this[i + start];
90 }
91 }
92
93 return len;
94}
95
96function writeUint64BE(value, offset) {
97 for (var i = 7; i >= 0; i--) {
98 this[offset + i] = value & 0xFF;
99 value /= 256;
100 }
101}
102
103function writeInt64BE(value, offset) {
104 if (value > 0) return writeUint64BE.call(this, value, offset);
105 value++;
106 for (var i = 7; i >= 0; i--) {
107 this[offset + i] = ((-value) & 0xFF) ^ 0xFF;
108 value /= 256;
109 }
110}