77
77
78
78
/// Find `needle` in haystack (self), returning the position of the found
79
79
/// byte or None if not found.
80
- pub fn memchr ( & self , needle : u8 ) -> Option < usize > {
80
+ pub fn memchr ( & self , needle : u8 ) -> Result < usize , FindTokenError < S :: Error > > {
81
81
let mut pos = 0 ;
82
82
83
83
while pos < self . len ( ) {
@@ -89,23 +89,23 @@ where
89
89
90
90
let offset = match u32:: try_from ( self . offset + pos) {
91
91
Ok ( v) => v,
92
- Err ( _) => return None ,
92
+ Err ( _) => return Err ( FindTokenError :: OffsetOverflow ) ,
93
93
} ;
94
94
95
- if let Err ( _ ) = self . storage . borrow_mut ( ) . read ( offset, & mut buffer) {
96
- return None ;
95
+ if let Err ( e ) = self . storage . borrow_mut ( ) . read ( offset, & mut buffer) {
96
+ return Err ( FindTokenError :: Io ( e ) ) ;
97
97
}
98
98
99
99
// We found the needle in this chunk, so return the found
100
100
// position inside of the chunk plus the current offset.
101
101
if let Some ( byte_position) = memchr:: memchr ( needle, & buffer[ ..] ) {
102
- return Some ( pos + byte_position) ;
102
+ return Ok ( pos + byte_position) ;
103
103
}
104
104
105
105
pos += self . len ( ) . min ( N ) ;
106
106
}
107
107
108
- None
108
+ Err ( FindTokenError :: NotFound )
109
109
}
110
110
}
111
111
@@ -184,11 +184,13 @@ where
184
184
. resize ( len, 0 )
185
185
. expect ( "chunk size should be less than or equal to N" ) ;
186
186
187
- if let Err ( _) = self . storage . borrow_mut ( ) . read ( offset0, & mut buffer0) {
187
+ if let Err ( e) = self . storage . borrow_mut ( ) . read ( offset0, & mut buffer0) {
188
+ log:: error!( "failed to compare bytes (self): {e:?}" ) ;
188
189
return false ;
189
190
}
190
191
191
- if let Err ( _) = self . storage . borrow_mut ( ) . read ( offset1, & mut buffer1) {
192
+ if let Err ( e) = self . storage . borrow_mut ( ) . read ( offset1, & mut buffer1) {
193
+ log:: error!( "failed to compare bytes (other): {e:?}" ) ;
192
194
return false ;
193
195
}
194
196
@@ -230,11 +232,14 @@ where
230
232
} ;
231
233
232
234
match storage. read ( offset, & mut buf) {
233
- Ok ( _ ) => {
235
+ Ok ( ( ) ) => {
234
236
self . pos += 1 ;
235
237
Some ( buf[ 0 ] )
236
238
}
237
- Err ( _) => None ,
239
+ Err ( e) => {
240
+ log:: error!( "failed to iterate over bytes: {e:?}" ) ;
241
+ return None ;
242
+ }
238
243
}
239
244
}
240
245
}
@@ -440,7 +445,8 @@ where
440
445
Err ( _) => return CompareResult :: Error ,
441
446
} ;
442
447
443
- if let Err ( _) = self . storage . borrow_mut ( ) . read ( offset, & mut buffer) {
448
+ if let Err ( e) = self . storage . borrow_mut ( ) . read ( offset, & mut buffer) {
449
+ log:: error!( "failed compare bytes: {e:?}" ) ;
444
450
return CompareResult :: Error ;
445
451
}
446
452
pos += chunk. len ( ) ;
@@ -475,7 +481,8 @@ where
475
481
Err ( _) => return CompareResult :: Error ,
476
482
} ;
477
483
478
- if let Err ( _) = self . storage . borrow_mut ( ) . read ( offset, & mut buffer) {
484
+ if let Err ( e) = self . storage . borrow_mut ( ) . read ( offset, & mut buffer) {
485
+ log:: error!( "failed compare bytes (no case): {e:?}" ) ;
479
486
return CompareResult :: Error ;
480
487
}
481
488
pos += chunk. len ( ) ;
@@ -527,13 +534,27 @@ where
527
534
} ;
528
535
529
536
if substr_rest. is_empty ( ) {
530
- return self . memchr ( substr_first) ;
537
+ match self . memchr ( substr_first) {
538
+ Ok ( v) => return Some ( v) ,
539
+ Err ( e) => {
540
+ log:: error!( "failed to find token: {e:?}" ) ;
541
+ return None ;
542
+ }
543
+ }
531
544
}
532
545
533
546
let mut offset = 0 ;
534
547
let haystack = self . slice ( ..self . len ( ) - substr_rest. len ( ) ) ;
535
548
536
- while let Some ( position) = haystack. slice ( offset..) . memchr ( substr_first) {
549
+ loop {
550
+ let position = match haystack. slice ( offset..) . memchr ( substr_first) {
551
+ Ok ( v) => v,
552
+ Err ( e) => {
553
+ log:: error!( "failed to find substring: {e:?}" ) ;
554
+ break ;
555
+ }
556
+ } ;
557
+
537
558
offset += position;
538
559
let next_offset = offset + 1 ;
539
560
let maybe_substr_rest = self . slice ( next_offset..) . slice ( ..substr_rest. len ( ) ) ;
@@ -554,10 +575,17 @@ where
554
575
S : ReadNorFlash ,
555
576
{
556
577
fn find_token ( & self , token : u8 ) -> bool {
557
- self . memchr ( token) . is_some ( )
578
+ self . memchr ( token) . is_ok ( )
558
579
}
559
580
}
560
581
582
+ #[ derive( Debug ) ]
583
+ pub enum FindTokenError < E > {
584
+ NotFound ,
585
+ OffsetOverflow ,
586
+ Io ( E ) ,
587
+ }
588
+
561
589
#[ cfg( all( test, feature = "std" ) ) ]
562
590
mod tests {
563
591
use std:: { cell:: RefCell , ptr:: NonNull } ;
0 commit comments