const C_TCHAR: u8 = 1;
const C_QDTEXT: u8 = 2;
const C_ESCAPABLE: u8 = 4;
const C_OWS: u8 = 8;
const C_ATTR: u8 = 16;
fn is_tchar(b: u8) -> bool {
matches!(b,
b'!'
| b'#'
| b'$'
| b'%'
| b'&'
| b'\''
| b'*'
| b'+'
| b'-'
| b'.'
| b'^'
| b'_'
| b'`'
| b'|'
| b'~'
| b'0'..=b'9'
| b'a'..=b'z'
| b'A'..=b'Z')
}
fn is_qdtext(b: u8) -> bool {
matches!(b, b'\t' | b' ' | 0x21 | 0x23..=0x5B | 0x5D..=0x7E)
}
fn is_escapable(b: u8) -> bool {
matches!(b, b'\t' | b' ' | 0x21..=0x7E | 0x80..=0xFF)
}
fn is_attr(b: u8) -> bool {
matches!(b,
b'a'..=b'z'
| b'A'..=b'Z'
| b'0'..=b'9'
| b'!'
| b'#'
| b'$'
| b'&'
| b'+'
| b'-'
| b'.'
| b'^'
| b'_'
| b'`'
| b'|'
| b'~')
}
fn is_ows(b: u8) -> bool {
matches!(b, b' ' | b'\t')
}
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let mut table = [0u8; 128];
for (i, e) in table.iter_mut().enumerate() {
let b = i as u8;
let mut classes = 0;
if is_tchar(b) {
classes |= C_TCHAR;
}
if is_qdtext(b) {
classes |= C_QDTEXT;
}
if is_escapable(b) {
classes |= C_ESCAPABLE;
}
if is_ows(b) {
classes |= C_OWS;
}
if is_attr(b) {
classes |= C_ATTR;
}
*e = classes;
}
let mut out_path = std::path::PathBuf::new();
let out_dir = std::env::var("OUT_DIR").unwrap();
out_path.push(out_dir);
out_path.push("char_class_table.bin");
std::fs::write(&out_path, table).unwrap();
}