dieumercimvemba's picture
download
raw
3.93 kB
"use strict";
/**
* A minimal UTF8 implementation for number arrays.
* @memberof util
* @namespace
*/
var utf8 = exports,
replacementCharCode = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
/**
* Calculates the UTF8 byte length of a string.
* @param {string} string String
* @returns {number} Byte length
*/
utf8.length = function utf8_length(string) {
var len = 0,
c = 0;
for (var i = 0; i < string.length; ++i) {
c = string.charCodeAt(i);
if (c < 128)
len += 1;
else if (c < 2048)
len += 2;
else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {
++i;
len += 4;
} else
len += 3;
}
return len;
};
/**
* Reads UTF8 bytes as a string.
* @param {Uint8Array} buffer Source buffer
* @param {number} start Source start
* @param {number} end Source end
* @returns {string} String read
*/
utf8.read = function utf8_read(buffer, start, end) {
if (end - start < 1)
return "";
// Batch code units and flush via String.fromCharCode.apply in 8192-unit
// chunks to avoid the per-character ConsString buildup of `str += ...`.
var parts = null,
chunk = [],
i = 0, // chunk write index
t, t2, c2, c3;
while (start < end) {
t = buffer[start++];
if (t <= 0x7F) {
chunk[i++] = t;
} else if (t >= 0xC0 && t < 0xE0) {
c2 = (t & 0x1F) << 6 | buffer[start++] & 0x3F;
chunk[i++] = c2 >= 0x80 ? c2 : replacementCharCode;
} else if (t >= 0xE0 && t < 0xF0) {
c3 = (t & 0xF) << 12 | (buffer[start++] & 0x3F) << 6 | buffer[start++] & 0x3F;
chunk[i++] = c3 >= 0x800 ? c3 : replacementCharCode;
} else if (t >= 0xF0) {
t2 = (t & 7) << 18 | (buffer[start++] & 0x3F) << 12 | (buffer[start++] & 0x3F) << 6 | buffer[start++] & 0x3F;
if (t2 < 0x10000 || t2 > 0x10FFFF)
chunk[i++] = replacementCharCode;
else {
t2 -= 0x10000;
chunk[i++] = 0xD800 + (t2 >> 10);
chunk[i++] = 0xDC00 + (t2 & 0x3FF);
}
}
if (i > 8191) {
(parts || (parts = [])).push(String.fromCharCode.apply(String, chunk.slice(0, i)));
i = 0;
}
}
if (parts) {
if (i)
parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));
return parts.join("");
}
return String.fromCharCode.apply(String, chunk.slice(0, i));
};
/**
* Writes a string as UTF8 bytes.
* @param {string} string Source string
* @param {Uint8Array} buffer Destination buffer
* @param {number} offset Destination offset
* @returns {number} Bytes written
*/
utf8.write = function utf8_write(string, buffer, offset) {
var start = offset,
c1, // character 1
c2; // character 2
for (var i = 0; i < string.length; ++i) {
c1 = string.charCodeAt(i);
if (c1 < 128) {
buffer[offset++] = c1;
} else if (c1 < 2048) {
buffer[offset++] = c1 >> 6 | 192;
buffer[offset++] = c1 & 63 | 128;
} else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {
c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);
++i;
buffer[offset++] = c1 >> 18 | 240;
buffer[offset++] = c1 >> 12 & 63 | 128;
buffer[offset++] = c1 >> 6 & 63 | 128;
buffer[offset++] = c1 & 63 | 128;
} else {
buffer[offset++] = c1 >> 12 | 224;
buffer[offset++] = c1 >> 6 & 63 | 128;
buffer[offset++] = c1 & 63 | 128;
}
}
return offset - start;
};

Xet Storage Details

Size:
3.93 kB
·
Xet hash:
74747a4ed3bbac23a51162fc15be5a4168c86dbfba1c2e7f774a330d54c4b738

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.