Fix bug with literal_i() going beyond EOI

This commit is contained in:
2025-06-07 12:41:19 -07:00
parent ea0c5ff7ad
commit 26a38742f8
+9 -1
View File
@@ -108,7 +108,8 @@ pub mod backend {
} }
fn literal_i(&mut self, s: &str) -> bool { fn literal_i(&mut self, s: &str) -> bool {
if self.input[self.offset..(self.offset + s.len())].eq_ignore_ascii_case(s) { let range = self.offset..(self.offset + s.len());
if range.end <= self.input.len() && self.input[range].eq_ignore_ascii_case(s) {
self.offset += s.len(); self.offset += s.len();
true true
} else { } else {
@@ -216,6 +217,7 @@ mod tests {
quoted = dq ("\\" ANY / !dq ANY)* dq; quoted = dq ("\\" ANY / !dq ANY)* dq;
case_sensitivity = "Strict " ('a'..'z')+ ", loose "i ('a'..'z'i)+; case_sensitivity = "Strict " ('a'..'z')+ ", loose "i ('a'..'z'i)+;
long_icase_str = "foo bar baz"i;
@icase @icase
hex_config = "let " var_name " = 0x" ('a'..'f' / '0'..'9')+; hex_config = "let " var_name " = 0x" ('a'..'f' / '0'..'9')+;
@@ -322,6 +324,12 @@ mod tests {
assert!(!parse(hex_config, "let BAR = 0xcafe")); assert!(!parse(hex_config, "let BAR = 0xcafe"));
} }
#[test]
fn test_icase_eoi() {
assert!(parse(long_icase_str, "FOO BAR BAZ"));
assert!(!parse(long_icase_str, "FOO BAR BA"));
}
#[test] #[test]
fn test_captures() { fn test_captures() {
let mut p = ParseState::new("alice@example.com"); let mut p = ParseState::new("alice@example.com");