@@ -48,6 +48,50 @@ export default async function main(init: Instantiator): Promise<IOnigBinding> {
48
48
return false
49
49
}
50
50
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
+
51
95
const asmLibraryArg = {
52
96
emscripten_get_now : _emscripten_get_now ,
53
97
emscripten_memcpy_big : _emscripten_memcpy_big ,
@@ -64,6 +108,7 @@ export default async function main(init: Instantiator): Promise<IOnigBinding> {
64
108
wasmMemory = exports . memory
65
109
updateGlobalBufferAndViews ( wasmMemory . buffer )
66
110
Object . assign ( binding , exports )
111
+ binding . UTF8ToString = UTF8ToString
67
112
}
68
113
69
114
await createWasm ( )
0 commit comments