mime: M,
mtu: u32,
data: &[u8],
- out: &mut OUT,
addr_chk: AC,
+ mut out: OUT,
mut error_handler: EH
-) where OUT: Extend<Box<[u8]>>,
- AC: Fn(&[u8]) -> Result<(), PacketError> + Copy,
+) where AC: Fn(&[u8]) -> Result<(), PacketError> + Copy,
+ OUT: FnMut(Box<[u8]>) -> Result<(), PacketError>,
EH: FnMut(PacketError),
{
// eprintln!("before: {:?}", DumpHex(data));
let mut ok = false;
let mut err = false;
for packet in data.split(|&c| c == SLIP_END) {
- match check1(mime, mtu, packet, addr_chk) {
- Err(PacketError::Empty) => { }
+ match (||{
+ let packet = check1(mime, mtu, packet, addr_chk);
+ if matches!(packet, Err(PacketError::Empty)) { return Ok::<_,PE>(()) }
+ out(packet?)?;
+ ok = true;
+ Ok::<_,PE>(())
+ })() {
+ Ok(()) => { },
Err(e) => { err=true; error_handler(e); },
- Ok(packet) => { ok=true; out.extend(iter::once(packet)); },
}
}
// eprintln!(" after: {:?}", DumpHex(data));
if packet.len() == 0 {
throw!(PacketError::Empty)
}
- if packet.len() > mtu.sat() {
- throw!(PacketError::MTU { len: packet.len(), mtu });
- }
let mut packet: Box<[u8]> = packet.to_owned().into();
let mut walk: &mut [u8] = &mut packet;
let mut header = [0u8; HEADER_FOR_ADDR];
let mut wheader = &mut header[..];
+ let mut escapes = 0;
while let Some((i, was_mime)) = walk.iter().enumerate().find_map(
|(i,&c)| match c {
};
let _ = wheader.write(&[c]);
walk = &mut walk[i+2 ..];
+ escapes += 1;
} else {
let _ = wheader.write(&[SLIP_MIME_ESC]);
walk = &mut walk[i+1 ..];
let wheader_len = wheader.len();
let header = &header[0.. header.len() - wheader_len];
+ let decoded_len = packet.len() - escapes;
+ if decoded_len > mtu.sat() {
+ throw!(PacketError::MTU { len: decoded_len, mtu });
+ }
+
addr_chk(&header)?;
packet
#[throws(fmt::Error)]
fn fmt(&self, f: &mut fmt::Formatter) {
for v in self.0 { write!(f, "{:02x}", v)?; }
+ match str::from_utf8(self.0) {
+ Ok(s) => write!(f, "={:?}", s)?,
+ Err(x) => write!(f, "={:?}..",
+ str::from_utf8(&self.0[0..x.valid_up_to()]).unwrap()
+ )?,
+ }
}
}