pub(crate) const PLAIN_PARSE: u8 = 1 << 0;
pub(crate) const PLAIN_ENC_RQF: u8 = 1 << 1;
pub(crate) const PLAIN_ENC_NSS: u8 = 1 << 2;
pub(crate) const HEX: u8 = 1 << 3;
pub(crate) const NID: u8 = 1 << 4;
const fn build_byte_class() -> [u8; 256] {
let mut t = [0u8; 256];
let mut i = 0;
while i < 256 {
let b = i as u8;
let mut m = 0u8;
let is_alpha = b.is_ascii_alphabetic();
let is_digit = b.is_ascii_digit();
let is_alnum = is_alpha || is_digit;
let is_hex = is_digit || matches!(b, b'A'..=b'F' | b'a'..=b'f');
let parse_plain = is_alnum
|| matches!(
b,
b'-' | b'.' | b'_' | b'~' | b'!' | b'$' | b'&' | b'\'' | b'(' | b')' | b'*' | b'+' | b',' | b';' | b'=' | b':' | b'@'
);
if parse_plain {
m |= PLAIN_PARSE;
}
let enc_rqf = is_alnum
|| matches!(
b,
b'-' | b'.' | b'_' | b'!' | b'$' | b'&' | b'\'' | b'(' | b')' | b'*' | b'+' | b',' | b';' | b'=' | b':' | b'@'
);
if enc_rqf {
m |= PLAIN_ENC_RQF;
}
if enc_rqf && b != b'&' {
m |= PLAIN_ENC_NSS;
}
if is_hex {
m |= HEX;
}
if is_alnum || b == b'-' {
m |= NID;
}
t[i] = m;
i += 1;
}
t
}
pub(crate) static BYTE_CLASS: [u8; 256] = build_byte_class();
const fn build_hex_val() -> [u8; 256] {
let mut t = [0xFFu8; 256];
let mut i = 0;
while i < 256 {
let b = i as u8;
let v = match b {
b'0'..=b'9' => b - b'0',
b'A'..=b'F' => b - b'A' + 10,
b'a'..=b'f' => b - b'a' + 10,
_ => 0xFF,
};
t[i] = v;
i += 1;
}
t
}
#[cfg(feature = "alloc")]
pub(crate) static HEX_VAL: [u8; 256] = build_hex_val();