@@ -166,6 +166,12 @@ pub use {
166
166
crate :: primitives:: { Bech32 , Bech32m , NoChecksum } ,
167
167
} ;
168
168
169
+ // Write to fmt buffer, small during testing to exercise full code path.
170
+ #[ cfg( not( test) ) ]
171
+ const BUF_LENGTH : usize = 1024 ;
172
+ #[ cfg( test) ]
173
+ const BUF_LENGTH : usize = 10 ;
174
+
169
175
/// Decodes a bech32 encoded string.
170
176
///
171
177
/// If this function succeeds the input string was found to be well formed (hrp, separator, bech32
@@ -319,11 +325,25 @@ pub fn encode_lower_to_fmt<Ck: Checksum, W: fmt::Write>(
319
325
hrp : & Hrp ,
320
326
data : & [ u8 ] ,
321
327
) -> Result < ( ) , fmt:: Error > {
328
+ let mut buf = [ 0u8 ; BUF_LENGTH ] ;
329
+ let mut pos = 0 ;
330
+
322
331
let iter = data. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
323
332
let chars = iter. with_checksum :: < Ck > ( hrp) . chars ( ) ;
333
+
324
334
for c in chars {
325
- fmt. write_char ( c) ?;
335
+ buf[ pos] = c as u8 ;
336
+ pos += 1 ;
337
+ if pos == BUF_LENGTH {
338
+ let s = core:: str:: from_utf8 ( & buf) . expect ( "we only write ASCII" ) ;
339
+ fmt. write_str ( s) ?;
340
+ pos = 0 ;
341
+ }
326
342
}
343
+
344
+ let s = core:: str:: from_utf8 ( & buf[ ..pos] ) . expect ( "we only write ASCII" ) ;
345
+ fmt. write_str ( s) ?;
346
+
327
347
Ok ( ( ) )
328
348
}
329
349
@@ -346,11 +366,25 @@ pub fn encode_upper_to_fmt<Ck: Checksum, W: fmt::Write>(
346
366
hrp : & Hrp ,
347
367
data : & [ u8 ] ,
348
368
) -> Result < ( ) , fmt:: Error > {
369
+ let mut buf = [ 0u8 ; BUF_LENGTH ] ;
370
+ let mut pos = 0 ;
371
+
349
372
let iter = data. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
350
373
let chars = iter. with_checksum :: < Ck > ( hrp) . chars ( ) ;
374
+
351
375
for c in chars {
352
- fmt. write_char ( c. to_ascii_uppercase ( ) ) ?;
376
+ buf[ pos] = c. to_ascii_uppercase ( ) as u8 ;
377
+ pos += 1 ;
378
+ if pos == BUF_LENGTH {
379
+ let s = core:: str:: from_utf8 ( & buf) . expect ( "we only write ASCII" ) ;
380
+ fmt. write_str ( s) ?;
381
+ pos = 0 ;
382
+ }
353
383
}
384
+
385
+ let s = core:: str:: from_utf8 ( & buf[ ..pos] ) . expect ( "we only write ASCII" ) ;
386
+ fmt. write_str ( s) ?;
387
+
354
388
Ok ( ( ) )
355
389
}
356
390
@@ -397,11 +431,23 @@ pub fn encode_lower_to_writer<Ck: Checksum, W: std::io::Write>(
397
431
hrp : & Hrp ,
398
432
data : & [ u8 ] ,
399
433
) -> Result < ( ) , std:: io:: Error > {
434
+ let mut buf = [ 0u8 ; BUF_LENGTH ] ;
435
+ let mut pos = 0 ;
436
+
400
437
let iter = data. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
401
438
let chars = iter. with_checksum :: < Ck > ( hrp) . chars ( ) ;
439
+
402
440
for c in chars {
403
- w. write_all ( & [ c as u8 ] ) ?;
441
+ buf[ pos] = c as u8 ;
442
+ pos += 1 ;
443
+ if pos == BUF_LENGTH {
444
+ w. write_all ( & buf) ?;
445
+ pos = 0 ;
446
+ }
404
447
}
448
+
449
+ w. write_all ( & buf[ ..pos] ) ?;
450
+
405
451
Ok ( ( ) )
406
452
}
407
453
@@ -425,11 +471,23 @@ pub fn encode_upper_to_writer<Ck: Checksum, W: std::io::Write>(
425
471
hrp : & Hrp ,
426
472
data : & [ u8 ] ,
427
473
) -> Result < ( ) , std:: io:: Error > {
474
+ let mut buf = [ 0u8 ; BUF_LENGTH ] ;
475
+ let mut pos = 0 ;
476
+
428
477
let iter = data. iter ( ) . copied ( ) . bytes_to_fes ( ) ;
429
478
let chars = iter. with_checksum :: < Ck > ( hrp) . chars ( ) ;
479
+
430
480
for c in chars {
431
- w. write_all ( & [ c. to_ascii_uppercase ( ) as u8 ] ) ?;
481
+ buf[ pos] = c. to_ascii_uppercase ( ) as u8 ;
482
+ pos += 1 ;
483
+ if pos == BUF_LENGTH {
484
+ w. write_all ( & buf) ?;
485
+ pos = 0 ;
486
+ }
432
487
}
488
+
489
+ w. write_all ( & buf[ ..pos] ) ?;
490
+
433
491
Ok ( ( ) )
434
492
}
435
493
0 commit comments