use crate::{libs::LIBRARY_NAME, ScriptManager};
fn char_is(func: impl Fn(char) -> bool, ch: u32) -> u32 {
let Some(ch) = char::from_u32(ch) else {
return 0;
};
func(ch) as u32
}
macro_rules! ctype {
(fn $fn_name: ident => $fn: expr;) => {
fn $fn_name(ch: u32) -> u32 {
char_is($fn, ch)
}
};
(fn $fn_name: ident => $fn: expr; $(fn $fn_name2: ident => $fn2: expr;)*) => {
fn $fn_name(ch: u32) -> u32 {
char_is($fn, ch)
}
ctype!($(fn $fn_name2 => $fn2;)*);
};
}
ctype!(
fn is_alphanumeric => |ch| ch.is_alphanumeric();
fn is_alphabetic => |ch| ch.is_alphabetic();
fn is_lowercase => |ch| ch.is_lowercase();
fn is_uppercase => |ch| ch.is_uppercase();
fn is_control => |ch| ch.is_control();
fn is_whitespace => |ch| ch.is_whitespace();
fn is_ascii_alphanumeric => |ch| ch.is_ascii_alphanumeric();
fn is_ascii_alphabetic => |ch| ch.is_ascii_alphabetic();
fn is_ascii_lowercase => |ch| ch.is_ascii_lowercase();
fn is_ascii_uppercase => |ch| ch.is_ascii_lowercase();
fn is_ascii_digit => |ch| ch.is_ascii_digit();
fn is_ascii_hexdigit => |ch| ch.is_ascii_hexdigit();
fn is_ascii_control => |ch| ch.is_ascii_control();
fn is_ascii_graphical => |ch| ch.is_ascii_graphic();
fn is_ascii_whitespace => |ch| ch.is_ascii_whitespace();
fn is_ascii_blank => |ch| ch == ' ' || ch == '\t';
fn is_ascii_printable => |ch| ch.is_alphanumeric() || ch.is_ascii_punctuation();
fn is_ascii_punctuation => |ch| ch.is_ascii_punctuation();
);
fn to_ascii_lower(ch: u32) -> u32 {
let Some(ch) = char::from_u32(ch) else {
return ch;
};
ch.to_ascii_lowercase() as u32
}
fn to_ascii_upper(ch: u32) -> u32 {
let Some(ch) = char::from_u32(ch) else {
return ch;
};
ch.to_ascii_uppercase() as u32
}
pub fn library(manager: &mut ScriptManager) -> Option<()> {
manager.add_library_function(LIBRARY_NAME, "iswalnum", is_alphanumeric)?;
manager.add_library_function(LIBRARY_NAME, "iswalpha", is_alphabetic)?;
manager.add_library_function(LIBRARY_NAME, "iswlower", is_lowercase)?;
manager.add_library_function(LIBRARY_NAME, "iswupper", is_uppercase)?;
manager.add_library_function(LIBRARY_NAME, "iswcntrl", is_control)?;
manager.add_library_function(LIBRARY_NAME, "iswspace", is_whitespace)?;
manager.add_library_function(LIBRARY_NAME, "isalnum", is_ascii_alphanumeric)?;
manager.add_library_function(LIBRARY_NAME, "isalpha", is_ascii_alphabetic)?;
manager.add_library_function(LIBRARY_NAME, "islower", is_ascii_lowercase)?;
manager.add_library_function(LIBRARY_NAME, "isupper", is_ascii_uppercase)?;
manager.add_library_function(LIBRARY_NAME, "isdigit", is_ascii_digit)?;
manager.add_library_function(LIBRARY_NAME, "isxdigit", is_ascii_hexdigit)?;
manager.add_library_function(LIBRARY_NAME, "iscntrl", is_ascii_control)?;
manager.add_library_function(LIBRARY_NAME, "isgraph", is_ascii_graphical)?;
manager.add_library_function(LIBRARY_NAME, "isspace", is_ascii_whitespace)?;
manager.add_library_function(LIBRARY_NAME, "isblank", is_ascii_blank)?;
manager.add_library_function(LIBRARY_NAME, "isprint", is_ascii_printable)?;
manager.add_library_function(LIBRARY_NAME, "ispunct", is_ascii_punctuation)?;
manager.add_library_function(LIBRARY_NAME, "tolower", to_ascii_lower)?;
manager.add_library_function(LIBRARY_NAME, "toupper", to_ascii_upper)?;
Some(())
}
|