51 lines · 1.4 KB · Rust
RawDownload
use bstr::ByteSlice; use crate::{pattern, pattern::Mode}; #[inline]/// A sloppy parser that performs only the most basic checks, providing additional information/// using `pattern::Mode` flags.////// Returns `(pattern, mode, no_wildcard_len)`pub fn pattern(mut pat: &[u8]) -> Option<(&[u8], pattern::Mode, Option<usize>)> {    let mut mode = Mode::empty();    if pat.is_empty() {        return None;    };    if pat.first() == Some(&b'!') {        mode |= Mode::NEGATIVE;        pat = &pat[1..];    } else if pat.first() == Some(&b'\\') {        let second = pat.get(1);        if second == Some(&b'!') || second == Some(&b'#') {            pat = &pat[1..];        }    }    if pat.iter().all(|b| b.is_ascii_whitespace()) {        return None;    }    if pat.first() == Some(&b'/') {        mode |= Mode::ABSOLUTE;        pat = &pat[1..];    }    if pat.last() == Some(&b'/') {        mode |= Mode::MUST_BE_DIR;        pat = &pat[..pat.len() - 1];    }     if !pat.contains(&b'/') {        mode |= Mode::NO_SUB_DIR;    }    if pat.first() == Some(&b'*') && first_wildcard_pos(&pat[1..]).is_none() {        mode |= Mode::ENDS_WITH;    }     let pos_of_first_wildcard = first_wildcard_pos(pat);    Some((pat, mode, pos_of_first_wildcard))} fn first_wildcard_pos(pat: &[u8]) -> Option<usize> {    pat.find_byteset(GLOB_CHARACTERS)} pub(crate) const GLOB_CHARACTERS: &[u8] = br"*?[\";