Skip to content

Commit 27b3570

Browse files
authored
fix: fixed hang on sub-string delimiter search (#744) (#786)
1 parent e985aad commit 27b3570

File tree

3 files changed

+75
-4
lines changed

3 files changed

+75
-4
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ members = [".", "crate/encstr", "crate/heapopt"]
44
[workspace.package]
55
repository = "https://github.com/pamburus/hl"
66
authors = ["Pavel Ivanov <[email protected]>"]
7-
version = "0.30.4-alpha.1"
7+
version = "0.30.4-alpha.2"
88
edition = "2021"
99
license = "MIT"
1010

src/scanning.rs

+73-2
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ impl<D: AsRef<[u8]>> Search for SubStrSearcher<D> {
336336
let mut pos = 0;
337337
loop {
338338
if let Some(i) = buf[pos..].iter().position(|x| *x == b) {
339-
pos = i;
339+
pos += i;
340340
} else {
341341
return None;
342342
}
@@ -896,7 +896,7 @@ mod tests {
896896
}
897897

898898
#[test]
899-
fn test_split_iter() {
899+
fn test_split_iter_byte() {
900900
let searcher = b'/'.into_searcher();
901901
let buf = b"test/token/";
902902
let mut iter = searcher.split(buf);
@@ -906,6 +906,77 @@ mod tests {
906906
assert_eq!(iter.next(), None);
907907
}
908908

909+
#[test]
910+
fn test_split_iter_substr() {
911+
let input = b"test/token/";
912+
913+
let searcher = SubStrSearcher::new(b"t/");
914+
let mut iter = searcher.split(input);
915+
assert_eq!(iter.next(), Some(&b"tes"[..]));
916+
assert_eq!(iter.next(), Some(&b"token/"[..]));
917+
assert_eq!(iter.next(), None);
918+
919+
let searcher = SubStrSearcher::new(b"/t");
920+
let mut iter = searcher.split(input);
921+
assert_eq!(iter.next(), Some(&b"test"[..]));
922+
assert_eq!(iter.next(), Some(&b"oken/"[..]));
923+
assert_eq!(iter.next(), None);
924+
}
925+
926+
#[test]
927+
fn test_substr_search_l() {
928+
let input = b"test/token/";
929+
930+
let searcher = SubStrSearcher::new(b"t/");
931+
assert_eq!(searcher.search_l(input, false), Some(3..5));
932+
assert_eq!(searcher.search_l(input, true), Some(3..5));
933+
934+
let searcher = SubStrSearcher::new(b"/t");
935+
assert_eq!(searcher.search_l(input, false), Some(4..6));
936+
assert_eq!(searcher.search_l(input, true), Some(4..6));
937+
938+
let searcher = SubStrSearcher::new(b"n/");
939+
assert_eq!(searcher.search_l(input, false), Some(9..11));
940+
assert_eq!(searcher.search_l(input, true), Some(9..11));
941+
942+
let searcher = SubStrSearcher::new(b"te");
943+
assert_eq!(searcher.search_l(input, false), Some(0..2));
944+
assert_eq!(searcher.search_l(input, true), Some(0..2));
945+
946+
let searcher = SubStrSearcher::new(b"xt");
947+
assert_eq!(searcher.search_l(input, false), None);
948+
assert_eq!(searcher.search_l(input, true), None);
949+
950+
let searcher = SubStrSearcher::new(b"/x");
951+
assert_eq!(searcher.search_l(input, false), None);
952+
assert_eq!(searcher.search_l(input, true), None);
953+
}
954+
955+
#[test]
956+
fn test_substr_search_r() {
957+
let input = b"test/token/";
958+
959+
let searcher = SubStrSearcher::new(b"t/");
960+
assert_eq!(searcher.search_r(input, false), Some(3..5));
961+
assert_eq!(searcher.search_r(input, true), Some(3..5));
962+
963+
let searcher = SubStrSearcher::new(b"/t");
964+
assert_eq!(searcher.search_r(input, false), Some(4..6));
965+
assert_eq!(searcher.search_r(input, true), Some(4..6));
966+
967+
let searcher = SubStrSearcher::new(b"n/");
968+
assert_eq!(searcher.search_r(input, false), Some(9..11));
969+
assert_eq!(searcher.search_r(input, true), Some(9..11));
970+
971+
let searcher = SubStrSearcher::new(b"te");
972+
assert_eq!(searcher.search_r(input, false), Some(0..2));
973+
assert_eq!(searcher.search_r(input, true), Some(0..2));
974+
975+
let searcher = SubStrSearcher::new(b"xt");
976+
assert_eq!(searcher.search_r(input, false), None);
977+
assert_eq!(searcher.search_r(input, true), None);
978+
}
979+
909980
#[test]
910981
fn test_small_token() {
911982
let sf = Arc::new(SegmentBufFactory::new(20));

0 commit comments

Comments
 (0)