Files
DocumentServer-v-9.2.0/core/Common/js/string_utf8.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

145 lines
3.8 KiB
JavaScript

(function(){
if (undefined !== String.prototype.fromUtf8 &&
undefined !== String.prototype.toUtf8)
return;
var STRING_UTF8_BUFFER_LENGTH = 1024;
var STRING_UTF8_BUFFER = new ArrayBuffer(STRING_UTF8_BUFFER_LENGTH);
/**
* Read string from utf8
* @param {Uint8Array} buffer
* @param {number} [start=0]
* @param {number} [len]
* @returns {string}
*/
String.prototype.fromUtf8 = function(buffer, start, len) {
if (undefined === start)
start = 0;
if (undefined === len)
len = buffer.length - start;
var result = "";
var index = start;
var end = start + len;
while (index < end)
{
var u0 = buffer[index++];
if (!(u0 & 128))
{
result += String.fromCharCode(u0);
continue;
}
var u1 = buffer[index++] & 63;
if ((u0 & 224) == 192)
{
result += String.fromCharCode((u0 & 31) << 6 | u1);
continue;
}
var u2 = buffer[index++] & 63;
if ((u0 & 240) == 224)
u0 = (u0 & 15) << 12 | u1 << 6 | u2;
else
u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | buffer[index++] & 63;
if (u0 < 65536)
result += String.fromCharCode(u0);
else
{
var ch = u0 - 65536;
result += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
}
}
return result;
};
/**
* Convert string to utf8 array
* @returns {Uint8Array}
*/
String.prototype.toUtf8 = function(isNoEndNull, isUseBuffer) {
var inputLen = this.length;
var testLen = 6 * inputLen + 1;
var tmpStrings = (isUseBuffer && testLen < STRING_UTF8_BUFFER_LENGTH) ? STRING_UTF8_BUFFER : new ArrayBuffer(testLen);
var code = 0;
var index = 0;
var outputIndex = 0;
var outputDataTmp = new Uint8Array(tmpStrings);
var outputData = outputDataTmp;
while (index < inputLen)
{
code = this.charCodeAt(index++);
if (code >= 0xD800 && code <= 0xDFFF && index < inputLen)
code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & this.charCodeAt(index++)));
if (code < 0x80)
outputData[outputIndex++] = code;
else if (code < 0x0800)
{
outputData[outputIndex++] = 0xC0 | (code >> 6);
outputData[outputIndex++] = 0x80 | (code & 0x3F);
}
else if (code < 0x10000)
{
outputData[outputIndex++] = 0xE0 | (code >> 12);
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
outputData[outputIndex++] = 0x80 | (code & 0x3F);
}
else if (code < 0x1FFFFF)
{
outputData[outputIndex++] = 0xF0 | (code >> 18);
outputData[outputIndex++] = 0x80 | ((code >> 12) & 0x3F);
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
outputData[outputIndex++] = 0x80 | (code & 0x3F);
}
else if (code < 0x3FFFFFF)
{
outputData[outputIndex++] = 0xF8 | (code >> 24);
outputData[outputIndex++] = 0x80 | ((code >> 18) & 0x3F);
outputData[outputIndex++] = 0x80 | ((code >> 12) & 0x3F);
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
outputData[outputIndex++] = 0x80 | (code & 0x3F);
}
else if (code < 0x7FFFFFFF)
{
outputData[outputIndex++] = 0xFC | (code >> 30);
outputData[outputIndex++] = 0x80 | ((code >> 24) & 0x3F);
outputData[outputIndex++] = 0x80 | ((code >> 18) & 0x3F);
outputData[outputIndex++] = 0x80 | ((code >> 12) & 0x3F);
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
outputData[outputIndex++] = 0x80 | (code & 0x3F);
}
}
if (isNoEndNull !== true)
outputData[outputIndex++] = 0;
return new Uint8Array(tmpStrings, 0, outputIndex);
};
function StringPointer(pointer, len)
{
this.ptr = pointer;
this.length = len;
}
StringPointer.prototype.free = function()
{
if (0 !== this.ptr)
Module["_free"](this.ptr);
};
String.prototype.toUtf8Pointer = function(isNoEndNull) {
var tmp = this.toUtf8(isNoEndNull, true);
var pointer = Module["_malloc"](tmp.length);
if (0 == pointer)
return null;
Module["HEAP8"].set(tmp, pointer);
return new StringPointer(pointer, tmp.length);
};
})();