Skip to content

Commit 53b0e83

Browse files
committed
SFT-UNKN: Add logging to nom-embedded-storage.
1 parent 098b726 commit 53b0e83

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

nom-embedded-storage/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ embedded-storage = { workspace = true }
1616
heapless = { workspace = true }
1717
memchr = { workspace = true }
1818
nom = { workspace = true }
19+
log = { workspace = true }

nom-embedded-storage/src/lib.rs

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ where
7777

7878
/// Find `needle` in haystack (self), returning the position of the found
7979
/// 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>> {
8181
let mut pos = 0;
8282

8383
while pos < self.len() {
@@ -89,23 +89,23 @@ where
8989

9090
let offset = match u32::try_from(self.offset + pos) {
9191
Ok(v) => v,
92-
Err(_) => return None,
92+
Err(_) => return Err(FindTokenError::OffsetOverflow),
9393
};
9494

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));
9797
}
9898

9999
// We found the needle in this chunk, so return the found
100100
// position inside of the chunk plus the current offset.
101101
if let Some(byte_position) = memchr::memchr(needle, &buffer[..]) {
102-
return Some(pos + byte_position);
102+
return Ok(pos + byte_position);
103103
}
104104

105105
pos += self.len().min(N);
106106
}
107107

108-
None
108+
Err(FindTokenError::NotFound)
109109
}
110110
}
111111

@@ -184,11 +184,13 @@ where
184184
.resize(len, 0)
185185
.expect("chunk size should be less than or equal to N");
186186

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:?}");
188189
return false;
189190
}
190191

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:?}");
192194
return false;
193195
}
194196

@@ -230,11 +232,14 @@ where
230232
};
231233

232234
match storage.read(offset, &mut buf) {
233-
Ok(_) => {
235+
Ok(()) => {
234236
self.pos += 1;
235237
Some(buf[0])
236238
}
237-
Err(_) => None,
239+
Err(e) => {
240+
log::error!("failed to iterate over bytes: {e:?}");
241+
return None;
242+
}
238243
}
239244
}
240245
}
@@ -440,7 +445,8 @@ where
440445
Err(_) => return CompareResult::Error,
441446
};
442447

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:?}");
444450
return CompareResult::Error;
445451
}
446452
pos += chunk.len();
@@ -475,7 +481,8 @@ where
475481
Err(_) => return CompareResult::Error,
476482
};
477483

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:?}");
479486
return CompareResult::Error;
480487
}
481488
pos += chunk.len();
@@ -527,13 +534,27 @@ where
527534
};
528535

529536
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+
}
531544
}
532545

533546
let mut offset = 0;
534547
let haystack = self.slice(..self.len() - substr_rest.len());
535548

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+
537558
offset += position;
538559
let next_offset = offset + 1;
539560
let maybe_substr_rest = self.slice(next_offset..).slice(..substr_rest.len());
@@ -554,10 +575,17 @@ where
554575
S: ReadNorFlash,
555576
{
556577
fn find_token(&self, token: u8) -> bool {
557-
self.memchr(token).is_some()
578+
self.memchr(token).is_ok()
558579
}
559580
}
560581

582+
#[derive(Debug)]
583+
pub enum FindTokenError<E> {
584+
NotFound,
585+
OffsetOverflow,
586+
Io(E),
587+
}
588+
561589
#[cfg(all(test, feature = "std"))]
562590
mod tests {
563591
use std::{cell::RefCell, ptr::NonNull};

0 commit comments

Comments
 (0)