in reverie-syscalls/src/memory/mod.rs [180:203]
fn read_while<F>(&self, mut addr: Addr<u8>, buf: &mut [u8], mut pred: F) -> Result<usize, Errno>
where
F: FnMut(&[u8]) -> Option<usize>,
{
let mut count = 0;
loop {
let read = self.read(addr, buf)?;
if read == 0 {
// We hit an "EOF" (an EFAULT) and the predicate never matched.
// The predicate should *eventually* return true, so this is
// always an error.
return Err(Errno::EFAULT);
}
addr = unsafe { addr.add(read) };
if let Some(used) = pred(&buf[..read]) {
return Ok(count + used);
}
count += read;
}
}