summaryrefslogtreecommitdiff
path: root/scripts/src/libs/ctype.rs
blob: 123693619a910d75c947b709670768f7fd25b534 (plain)
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(())
}