8
8
#error "TEXTDECODER must be either 1 or 2"
9
9
#endif
10
10
11
+ #if TEXTENCODER != 1 && TEXTENCODER != 2
12
+ #error "TEXTENCODER must be either 1 or 2"
13
+ #endif
14
+
11
15
addToLibrary ( {
12
16
// TextDecoder constructor defaults to UTF-8
13
17
#if TEXTDECODER == 2
@@ -16,6 +20,13 @@ addToLibrary({
16
20
$UTF8Decoder : "typeof TextDecoder != 'undefined' ? new TextDecoder() : undefined" ,
17
21
#endif
18
22
23
+ // TextEncoder constructor defaults to UTF-8
24
+ #if TEXTENCODER == 2
25
+ $UTF8Encoder : "new TextEncoder()" ,
26
+ #else
27
+ $UTF8Encoder : "typeof TextEncoder != 'undefined' ? new TextEncoder() : undefined" ,
28
+ #endif
29
+
19
30
$findStringEnd : ( heapOrArray , idx , maxBytesToRead , ignoreNul ) => {
20
31
var maxIdx = idx + maxBytesToRead ;
21
32
if ( ignoreNul ) return maxIdx ;
@@ -147,9 +158,12 @@ addToLibrary({
147
158
* terminator.
148
159
* @return {number } The number of bytes written, EXCLUDING the null terminator.
149
160
*/
161
+ $stringToUTF8Array__deps : [
162
+ '$UTF8Encoder' ,
150
163
#if ASSERTIONS
151
- $stringToUTF8Array__deps : [ '$warnOnce' ] ,
164
+ '$warnOnce' ,
152
165
#endif
166
+ ] ,
153
167
$stringToUTF8Array : ( str , heap , outIdx , maxBytesToWrite ) => {
154
168
#if CAN_ADDRESS_2GB
155
169
outIdx >>>= 0 ;
@@ -162,6 +176,28 @@ addToLibrary({
162
176
if ( ! ( maxBytesToWrite > 0 ) )
163
177
return 0 ;
164
178
179
+ #if TEXTENCODER == 2
180
+ // Always use TextEncoder when TEXTENCODER == 2
181
+ var encoded = UTF8Encoder . encode ( str ) ;
182
+ var bytesToWrite = Math . min ( encoded . length , maxBytesToWrite - 1 ) ; // -1 for null terminator
183
+ for ( var i = 0 ; i < bytesToWrite ; ++ i ) {
184
+ heap [ outIdx + i ] = encoded [ i ] ;
185
+ }
186
+ heap [ outIdx + bytesToWrite ] = 0 ;
187
+ return bytesToWrite ;
188
+ #else
189
+ // When using conditional TextEncoder, use it for longer strings if available
190
+ if ( UTF8Encoder ) {
191
+ var encoded = UTF8Encoder . encode ( str ) ;
192
+ var bytesToWrite = Math . min ( encoded . length , maxBytesToWrite - 1 ) ; // -1 for null terminator
193
+ for ( var i = 0 ; i < bytesToWrite ; ++ i ) {
194
+ heap [ outIdx + i ] = encoded [ i ] ;
195
+ }
196
+ heap [ outIdx + bytesToWrite ] = 0 ;
197
+ return bytesToWrite ;
198
+ }
199
+
200
+ // Fallback: manual UTF-8 encoding
165
201
var startIdx = outIdx ;
166
202
var endIdx = outIdx + maxBytesToWrite - 1 ; // -1 for string null terminator.
167
203
for ( var i = 0 ; i < str . length ; ++ i ) {
@@ -198,6 +234,7 @@ addToLibrary({
198
234
// Null-terminate the pointer to the buffer.
199
235
heap [ outIdx ] = 0 ;
200
236
return outIdx - startIdx ;
237
+ #endif // TEXTENCODER == 2
201
238
} ,
202
239
203
240
/**
@@ -224,7 +261,18 @@ addToLibrary({
224
261
* @param {string } str - JavaScript string to operator on
225
262
* @return {number } Length, in bytes, of the UTF8 encoded string.
226
263
*/
264
+ $lengthBytesUTF8__deps : [ '$UTF8Encoder' ] ,
227
265
$lengthBytesUTF8 : ( str ) => {
266
+ #if TEXTENCODER == 2
267
+ // Always use TextEncoder when TEXTENCODER == 2
268
+ return UTF8Encoder . encode ( str ) . length ;
269
+ #else
270
+ // When using conditional TextEncoder, use it for longer strings if available
271
+ if ( UTF8Encoder ) {
272
+ return UTF8Encoder . encode ( str ) . length ;
273
+ }
274
+
275
+ // Fallback: manual calculation
228
276
var len = 0 ;
229
277
for ( var i = 0 ; i < str . length ; ++ i ) {
230
278
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
@@ -243,6 +291,7 @@ addToLibrary({
243
291
}
244
292
}
245
293
return len ;
294
+ #endif // TEXTENCODER == 2
246
295
} ,
247
296
248
297
$intArrayFromString__docs : '/** @type {function(string, boolean=, number=)} */' ,
0 commit comments