#![no_std]
#[macro_export]
macro_rules! pattern {
[$($item:tt) *] => {
&[$(
$crate::__pattern_inner!($item),
)*]
};
}
#[macro_export]
macro_rules! __pattern_inner {
(?) => {
None
};
($x:expr) => {
Some($x)
};
}
pub fn scan<P: AsRef<[Option<u8>]>, B: AsRef<[u8]>>(pattern: P, bytes: B) -> Option<usize> {
let bytes = bytes.as_ref();
let pattern = pattern.as_ref();
for (i, window) in bytes.windows(pattern.len()).enumerate() {
let mut matches = true;
for j in 0..pattern.len() {
if pattern[j] != None && pattern[j] != Some(window[j]) {
matches = false;
break
}
}
if matches {
return Some(i);
}
}
None
}