From 9d50921289764d4320cf66d87c2205a8a3435686 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 28 Feb 2024 09:45:46 -0600 Subject: [PATCH] fix(token): Be consistent on `take_until("")` We aren't consistent on empty buffers between `simd` and not. Fixes #489 --- src/stream/mod.rs | 3 +++ src/token/tests.rs | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/stream/mod.rs b/src/stream/mod.rs index 03c74541..7aa25689 100644 --- a/src/stream/mod.rs +++ b/src/stream/mod.rs @@ -3479,6 +3479,7 @@ fn memchr3(token: (u8, u8, u8), slice: &[u8]) -> Option { #[inline(always)] fn memmem(slice: &[u8], literal: &[u8]) -> Option> { match literal.len() { + 0 => Some(0..0), 1 => memchr(literal[0], slice).map(|i| i..i + 1), _ => memmem_(slice, literal), } @@ -3487,6 +3488,7 @@ fn memmem(slice: &[u8], literal: &[u8]) -> Option Option> { match (literal.0.len(), literal.1.len()) { + (0, _) | (_, 0) => Some(0..0), (1, 1) => memchr2((literal.0[0], literal.1[0]), slice).map(|i| i..i + 1), _ => memmem2_(slice, literal), } @@ -3498,6 +3500,7 @@ fn memmem3( literal: (&[u8], &[u8], &[u8]), ) -> Option> { match (literal.0.len(), literal.1.len(), literal.2.len()) { + (0, _, _) | (_, 0, _) | (_, _, 0) => Some(0..0), (1, 1, 1) => memchr3((literal.0[0], literal.1[0], literal.2[0]), slice).map(|i| i..i + 1), _ => memmem3_(slice, literal), } diff --git a/src/token/tests.rs b/src/token/tests.rs index 6d1fbf9e..cd55c014 100644 --- a/src/token/tests.rs +++ b/src/token/tests.rs @@ -102,12 +102,6 @@ fn complete_take_until_empty() { fn take_until_empty(i: &str) -> IResult<&str, &str> { take_until(0, "").parse_peek(i) } - #[cfg(not(feature = "simd"))] - assert_eq!( - take_until_empty(""), - Err(ErrMode::Backtrack(error_position!(&"", ErrorKind::Slice))) - ); - #[cfg(feature = "simd")] assert_eq!(take_until_empty(""), Ok(("", ""))); assert_eq!(take_until_empty("end"), Ok(("end", ""))); }