@@ -263,13 +263,15 @@ pub(crate) mod printf {
263
263
}
264
264
265
265
impl Num {
266
- fn from_str ( s : & str , arg : Option < & str > ) -> Self {
266
+ fn from_str ( s : & str , arg : Option < & str > ) -> Option < Self > {
267
267
if let Some ( arg) = arg {
268
- Num :: Arg ( arg. parse ( ) . unwrap_or_else ( |_| panic ! ( "invalid format arg `{arg:?}`" ) ) )
268
+ Some ( Num :: Arg (
269
+ arg. parse ( ) . unwrap_or_else ( |_| panic ! ( "invalid format arg `{arg:?}`" ) ) ,
270
+ ) )
269
271
} else if s == "*" {
270
- Num :: Next
272
+ Some ( Num :: Next )
271
273
} else {
272
- Num :: Num ( s. parse ( ) . unwrap_or_else ( |_| panic ! ( "invalid format num `{s:?}`" ) ) )
274
+ s. parse ( ) . ok ( ) . map ( |num| Num :: Num ( num) )
273
275
}
274
276
}
275
277
@@ -421,7 +423,10 @@ pub(crate) mod printf {
421
423
state = Prec ;
422
424
parameter = None ;
423
425
flags = "" ;
424
- width = Some ( Num :: from_str ( at. slice_between ( end) . unwrap ( ) , None ) ) ;
426
+ width = Num :: from_str ( at. slice_between ( end) . unwrap ( ) , None ) ;
427
+ if width. is_none ( ) {
428
+ return fallback ( ) ;
429
+ }
425
430
move_to ! ( end) ;
426
431
}
427
432
// It's invalid, is what it is.
@@ -452,7 +457,10 @@ pub(crate) mod printf {
452
457
'1' ..='9' => {
453
458
let end = at_next_cp_while ( next, char:: is_ascii_digit) ;
454
459
state = Prec ;
455
- width = Some ( Num :: from_str ( at. slice_between ( end) . unwrap ( ) , None ) ) ;
460
+ width = Num :: from_str ( at. slice_between ( end) . unwrap ( ) , None ) ;
461
+ if width. is_none ( ) {
462
+ return fallback ( ) ;
463
+ }
456
464
move_to ! ( end) ;
457
465
}
458
466
_ => {
@@ -468,7 +476,7 @@ pub(crate) mod printf {
468
476
match end. next_cp ( ) {
469
477
Some ( ( '$' , end2) ) => {
470
478
state = Prec ;
471
- width = Some ( Num :: from_str ( "" , Some ( at. slice_between ( end) . unwrap ( ) ) ) ) ;
479
+ width = Some ( Num :: from_str ( "" , Some ( at. slice_between ( end) . unwrap ( ) ) ) . unwrap ( ) ) ;
472
480
move_to ! ( end2) ;
473
481
}
474
482
_ => {
@@ -500,7 +508,7 @@ pub(crate) mod printf {
500
508
match end. next_cp ( ) {
501
509
Some ( ( '$' , end2) ) => {
502
510
state = Length ;
503
- precision = Some ( Num :: from_str ( "*" , next. slice_between ( end) ) ) ;
511
+ precision = Some ( Num :: from_str ( "*" , next. slice_between ( end) ) . unwrap ( ) ) ;
504
512
move_to ! ( end2) ;
505
513
}
506
514
_ => {
@@ -513,7 +521,7 @@ pub(crate) mod printf {
513
521
'0' ..='9' => {
514
522
let end = at_next_cp_while ( next, char:: is_ascii_digit) ;
515
523
state = Length ;
516
- precision = Some ( Num :: from_str ( at. slice_between ( end) . unwrap ( ) , None ) ) ;
524
+ precision = Some ( Num :: from_str ( at. slice_between ( end) . unwrap ( ) , None ) . unwrap ( ) ) ;
517
525
move_to ! ( end) ;
518
526
}
519
527
_ => return fallback ( ) ,
0 commit comments