Skip to content

Commit 0c89157

Browse files
committedJun 17, 2024
fix(core): add missing UTF8ToString function, close #693
1 parent a49f2e0 commit 0c89157

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
 

‎packages/core/src/oniguruma/onig.ts

+45
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,50 @@ export default async function main(init: Instantiator): Promise<IOnigBinding> {
4848
return false
4949
}
5050

51+
const UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined
52+
function UTF8ArrayToString(heapOrArray: Uint8Array, idx: number, maxBytesToRead = 1024) {
53+
const endIdx = idx + maxBytesToRead
54+
let endPtr = idx
55+
while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr
56+
if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
57+
return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr))
58+
}
59+
let str = ''
60+
while (idx < endPtr) {
61+
let u0 = heapOrArray[idx++]
62+
if (!(u0 & 128)) {
63+
str += String.fromCharCode(u0)
64+
continue
65+
}
66+
const u1 = heapOrArray[idx++] & 63
67+
if ((u0 & 224) === 192) {
68+
str += String.fromCharCode(((u0 & 31) << 6) | u1)
69+
continue
70+
}
71+
const u2 = heapOrArray[idx++] & 63
72+
if ((u0 & 240) === 224) {
73+
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2
74+
}
75+
else {
76+
u0 = ((u0 & 7) << 18)
77+
| (u1 << 12)
78+
| (u2 << 6)
79+
| (heapOrArray[idx++] & 63)
80+
}
81+
if (u0 < 65536) {
82+
str += String.fromCharCode(u0)
83+
}
84+
else {
85+
const ch = u0 - 65536
86+
str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023))
87+
}
88+
}
89+
return str
90+
}
91+
function UTF8ToString(ptr: number, maxBytesToRead?: number) {
92+
return ptr ? UTF8ArrayToString(binding.HEAPU8, ptr, maxBytesToRead) : ''
93+
}
94+
5195
const asmLibraryArg = {
5296
emscripten_get_now: _emscripten_get_now,
5397
emscripten_memcpy_big: _emscripten_memcpy_big,
@@ -64,6 +108,7 @@ export default async function main(init: Instantiator): Promise<IOnigBinding> {
64108
wasmMemory = exports.memory
65109
updateGlobalBufferAndViews(wasmMemory.buffer)
66110
Object.assign(binding, exports)
111+
binding.UTF8ToString = UTF8ToString
67112
}
68113

69114
await createWasm()

0 commit comments

Comments
 (0)