1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
use crate::ast::NodeData;
use crate::parse::Code;
use memchr::memchr;

pub fn parse_bang(code: &mut Code) -> NodeData {
    debug_assert!(code.as_slice().starts_with(b"<!"));
    code.shift(2);
    let (len, matched) = match memchr(b'>', code.as_slice()) {
        Some(m) => (m, 1),
        None => (code.rem(), 0),
    };
    let data = code.copy_and_shift(len);
    // It might be EOF.
    code.shift(matched);
    NodeData::Bang {
        code: data,
        ended: matched > 0,
    }
}