fn read_while()

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;
        }
    }