From e95d055131b03fd5cb7172feae0b52d3bd0ecf29 Mon Sep 17 00:00:00 2001 From: wcampbell Date: Sat, 7 Sep 2024 12:19:39 -0400 Subject: [PATCH] Fix bug with id_pat and read_bytes_const * Reset last_bit_read_amt before reading for enum id * Always add to last_bits_read_amt --- deku-derive/src/macros/deku_read.rs | 1 + src/reader.rs | 52 +++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/deku-derive/src/macros/deku_read.rs b/deku-derive/src/macros/deku_read.rs index 0b087a88..6364be63 100644 --- a/deku-derive/src/macros/deku_read.rs +++ b/deku-derive/src/macros/deku_read.rs @@ -363,6 +363,7 @@ fn emit_enum(input: &DekuData) -> Result { }; let variant_read = quote! { + __deku_reader.last_bits_read_amt = 0; #variant_id_read #(#pre_match_tokens)* diff --git a/src/reader.rs b/src/reader.rs index d60b5b16..82528230 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -35,7 +35,7 @@ pub struct Reader<'a, R: Read + Seek> { inner: &'a mut R, /// bits stored from previous reads that didn't read to the end of a byte size leftover: Option, - /// Amount of bits read during the last call to [read_bits](Reader::read_bits) and [read_bytes](Reader::read_bytes) + /// Amount of bits read after last read, reseted before reading enum ids pub last_bits_read_amt: usize, /// Amount of bits read during the use of [read_bits](Reader::read_bits) and [read_bytes](Reader::read_bytes) pub bits_read: usize, @@ -289,7 +289,7 @@ impl<'a, R: Read + Seek> Reader<'a, R> { } let bits_read = ret.len(); - self.last_bits_read_amt = bits_read; + self.last_bits_read_amt += bits_read; self.bits_read += bits_read; #[cfg(feature = "logging")] @@ -518,4 +518,52 @@ mod tests { let _ = reader.read_bytes(1, &mut buf); assert_eq!([0xaa], buf); } + + #[test] + fn test_seek_last_read_bytes() { + // bytes + let input = hex!("aa"); + let mut cursor = Cursor::new(input); + let mut reader = Reader::new(&mut cursor); + let mut buf = [0; 1]; + let _ = reader.read_bytes(1, &mut buf); + assert_eq!([0xaa], buf); + reader.seek_last_read().unwrap(); + let _ = reader.read_bytes(1, &mut buf); + assert_eq!([0xaa], buf); + + // 2 bytes (and const) + let input = hex!("aabb"); + let mut cursor = Cursor::new(input); + let mut reader = Reader::new(&mut cursor); + let mut buf = [0; 2]; + let _ = reader.read_bytes_const::<2>(&mut buf); + assert_eq!([0xaa, 0xbb], buf); + reader.seek_last_read().unwrap(); + let _ = reader.read_bytes_const::<2>(&mut buf); + assert_eq!([0xaa, 0xbb], buf); + } + + #[cfg(feature = "bits")] + #[test] + fn test_seek_last_read_bits() { + let input = hex!("ab"); + let mut cursor = Cursor::new(input); + let mut reader = Reader::new(&mut cursor); + let bits = reader.read_bits(4).unwrap(); + assert_eq!(bits, Some(bitvec![u8, Msb0; 1, 0, 1, 0])); + reader.seek_last_read().unwrap(); + let bits = reader.read_bits(4).unwrap(); + assert_eq!(bits, Some(bitvec![u8, Msb0; 1, 0, 1, 0])); + + // more than byte + let input = hex!("abd0"); + let mut cursor = Cursor::new(input); + let mut reader = Reader::new(&mut cursor); + let bits = reader.read_bits(9).unwrap(); + assert_eq!(bits, Some(bitvec![u8, Msb0; 1, 0, 1, 0, 1, 0, 1, 1, 1])); + reader.seek_last_read().unwrap(); + let bits = reader.read_bits(9).unwrap(); + assert_eq!(bits, Some(bitvec![u8, Msb0; 1, 0, 1, 0, 1, 0, 1, 1, 1])); + } }