for mut packet in data.split_mut(|&c| c == SLIP_END) {
if packet.len() > mtu.sat() {
- throw!(anyhow!("mtu exceeded ({} > {})", packet.len(), mtu));
+ throw!(anyhow!("MTU exceeded ({} > {})", packet.len(), mtu));
}
- while let Some((i, _)) = packet.iter().enumerate().find(
- |(_,&c)| c == if TO_MIME { SLIP_ESC } else { SLIP_MIME_ESC }
+ while let Some((i, was_mime)) = packet.iter().enumerate().find_map(
+ |(i,&c)| match c {
+ SLIP_MIME_ESC => Some((i,true)),
+ SLIP_ESC => Some((i,false)),
+ _ => None,
+ }
) {
- packet[i] = if TO_MIME { SLIP_MIME_ESC } else { SLIP_ESC };
- match packet.get(i+1) {
- Some(&SLIP_ESC_END) |
- Some(&SLIP_ESC_ESC) => Ok(()),
- _ => Err(anyhow!("SLIP escape not followed by ESC_END or ESC_ESC")),
- }?;
- packet = &mut packet[i+2 ..];
+ packet[i] = if was_mime { SLIP_ESC } else { SLIP_MIME_ESC };
+ if was_mime != TO_MIME {
+ match packet.get(i+1) {
+ Some(&SLIP_ESC_END) |
+ Some(&SLIP_ESC_ESC) => Ok(()),
+ _ => Err(anyhow!("SLIP escape not followed by ESC_END or ESC_ESC")),
+ }?;
+ packet = &mut packet[i+2 ..];
+ } else {
+ packet = &mut packet[i+1 ..];
+ }
}
}
fn from(frames: Frames) -> FramesData { frames.frames }
}
+#[derive(Copy,Clone,Eq,PartialEq,Ord,PartialOrd,Hash)]
pub struct DumpHex<'b>(pub &'b [u8]);
impl Debug for DumpHex<'_> {
#[throws(fmt::Error)]
fn chk(i: &[u8], exp: Result<&[u8], &str>) {
let mut p = i.to_owned();
match (exp, check_checkmtu_mimeswap::<true>(10, p.as_mut())) {
- (Ok(exp), Ok(())) => assert_eq!( exp, &p ),
+ (Ok(exp), Ok(())) => assert_eq!( DumpHex(exp), DumpHex(&p) ),
(Err(exp), Err(got)) => assert!( got.to_string().contains(exp) ),
x => panic!("? {:?}", x),
}
Ok(&[ SLIP_END, b'-', SLIP_ESC_END, SLIP_ESC, b'X' ]) );
chk( &[ SLIP_END, SLIP_ESC, b'y' ], Err("SLIP escape") );
+
+ chk( &[ SLIP_END, b'-', b'y' ],
+ Ok(&[ SLIP_END, SLIP_ESC, b'y' ]) );
+
+ chk( &[b'x'; 20], Err("MTU"));
}