fix: fix some edge case errors

This commit is contained in:
PoiScript 2019-02-12 22:07:18 +08:00
parent 4d56633c43
commit c5a6d82aa8
4 changed files with 17 additions and 7 deletions

View file

@ -6,7 +6,7 @@ use memchr::memchr2;
pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> {
debug_assert!(src.starts_with("#+"));
if src[2..8].to_uppercase() != "BEGIN_" {
if src.len() <= 8 || src[2..8].to_uppercase() != "BEGIN_" {
return None;
}

View file

@ -6,7 +6,7 @@ use memchr::memchr2;
pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> {
debug_assert!(src.starts_with("#+"));
if !src[2..9].eq_ignore_ascii_case("BEGIN: ") {
if src.len() <= 9 || !src[2..9].eq_ignore_ascii_case("BEGIN: ") {
return None;
}

View file

@ -96,8 +96,8 @@ pub fn parse<'a>(src: &'a str) -> (Option<Element<'a>>, usize, Option<(Element<'
macro_rules! brk {
($ele:expr, $off:expr) => {
break if line_beg == 0 || pos == start {
(Some($ele), start + $off, None)
break if line_beg == start || pos == start {
(Some($ele), pos + $off, None)
} else {
(
Some(Element::Paragraph {
@ -272,8 +272,7 @@ pub fn parse<'a>(src: &'a str) -> (Option<Element<'a>>, usize, Option<(Element<'
mod tests {
#[test]
fn parse() {
use super::parse;
use super::Element::*;
use super::{Element::*, *};
assert_eq!(parse("\n\n\n"), (None, 3, None));
@ -388,6 +387,17 @@ mod tests {
))
)
);
assert_eq!(
parse("\n #+ATTR_HTML: :width 200px"),
(
Some(Keyword {
key: keyword::Key::Attr { backend: "HTML" },
value: ":width 200px"
}),
"\n #+ATTR_HTML: :width 200px".len(),
None
)
);
// TODO: more tests
}
}

View file

@ -144,7 +144,7 @@ pub fn parse<'a>(src: &'a str) -> (Object<'a>, usize, Option<(Object<'a>, usize)
if let Some(off) = bs
.find(&bytes[pos + 1..])
.map(|i| i + pos + 1)
.filter(|&i| i < src.len() - 2)
.filter(|&i| i < src.len() - 3)
{
pos = off;
} else {