From 9cf38d1dc5a28421fa7d43ddc6815e73314f6c2d Mon Sep 17 00:00:00 2001 From: Alex Roper Date: Thu, 14 May 2020 01:56:55 -0700 Subject: [PATCH] Add a fastpath for newlines that don't start with a star. --- src/parsers.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/parsers.rs b/src/parsers.rs index 5af8b9f..ffcd438 100644 --- a/src/parsers.rs +++ b/src/parsers.rs @@ -674,7 +674,8 @@ pub fn parse_headline(input: &str) -> Option<(&str, (&str, usize))> { // Collect lines until EOF or a headline. let mut last = 0; for i in memchr_iter(b'\n', text.as_bytes()) { - if parse_headline_level_le(&text[last..], level).is_ok() { + // Check the first byte after the newline to skip parsing unnecessarily. + if text.as_bytes()[last] == b'*' && parse_headline_level_le(&text[last..], level).is_ok() { break; } @@ -697,11 +698,26 @@ mod tests { #[test] fn test_parse_headline() { + assert_eq!(parse_headline(""), None); + assert_eq!(parse_headline("\n"), None); + assert_eq!(parse_headline("Hello"), None); + assert_eq!(parse_headline("Hello\n"), None); + assert_eq!(parse_headline("Hello\r"), None); + assert_eq!(parse_headline("Hello\n\r"), None); + assert_eq!(parse_headline("Hello\r\n"), None); + assert_eq!(parse_headline("Hello\n*"), None); + assert_eq!(parse_headline("Hello\n\n*"), None); + assert_eq!(parse_headline("Hello\r\n*"), None); + assert_eq!(parse_headline("Hello\n\r\n*"), None); + assert_eq!(parse_headline("Hello\r\n\n*"), None); assert_eq!(parse_headline("*"), Some(("", ("*", 1)))); + assert_eq!(parse_headline("*\n"), Some(("", ("*\n", 1)))); + assert_eq!(parse_headline("*\n\r"), Some(("", ("*\n\r", 1)))); assert_eq!(parse_headline("* "), Some(("", ("* ", 1)))); assert_eq!(parse_headline("* \r"), Some(("", ("* \r", 1)))); assert_eq!(parse_headline("*\t"), None); assert_eq!(parse_headline("*\t\n"), None); + assert_eq!(parse_headline("*\r\n"), None); assert_eq!(parse_headline("* \n"), Some(("", ("* \n", 1)))); assert_eq!(parse_headline("* \n\r*"), Some(("", ("* \n\r*", 1)))); assert_eq!(parse_headline("* \n\r**"), Some(("", ("* \n\r**", 1))));