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(()) }