From 144e080d03fb7bb2e2958dab90a10f36673f1491 Mon Sep 17 00:00:00 2001 From: Botahamec Date: Wed, 2 Aug 2023 22:07:26 -0400 Subject: Fix find_substring function --- src/scanner.rs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'src/scanner.rs') diff --git a/src/scanner.rs b/src/scanner.rs index 475098c..6c82041 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -198,11 +198,37 @@ impl Scanner { /// # Some(()) /// # } pub fn find_substring(&self, substring: impl AsRef) -> Option { - self.source - .get(self.position..)? - .iter() - .collect::() - .find(substring.as_ref()) + if substring.as_ref().is_empty() { + return Some(self.position); + } + + let chars: Vec = substring.as_ref().chars().collect(); + let mut i = self.position; + let mut chars_i = 0; + let mut start = None; + + while i < self.len() { + if self.source[i] == chars[chars_i] { + if chars_i == 0 { + start = Some(i); + } + + chars_i += 1; + + if let Some(start) = start { + if chars_i == chars.len() { + return Some(start); + } + } + } else { + chars_i = 0; + start = None; + } + + i += 1; + } + + start } /// If `source[position..]` starts with the given string, then this returns -- cgit v1.2.3