use std::io::{self, BufRead};
pub(crate) fn read_until2<R: BufRead + ?Sized>(
r: &mut R,
delim1: u8,
delim2: u8,
buf: &mut Vec<u8>,
) -> io::Result<usize> {
let mut read = 0;
loop {
let (done, used) = {
let available = match r.fill_buf() {
Ok(n) => n,
Err(ref e) if e.kind() == io::ErrorKind::Interrupted => continue,
Err(e) => return Err(e),
};
if let Some(i) = memchr::memchr2(delim1, delim2, available) {
buf.extend_from_slice(&available[..=i]);
(true, i + 1)
} else {
buf.extend_from_slice(available);
(false, available.len())
}
};
r.consume(used);
read += used;
if done || used == 0 {
return Ok(read);
}
}
}