123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263(*---------------------------------------------------------------------------
Copyright (c) 2025 The more programmers. All rights reserved.
SPDX-License-Identifier: ISC
---------------------------------------------------------------------------*)includeCharmoduleAscii=struct(* Characters *)letmin='\x00'letmax='\x7F'(* Predicates *)letis_valid=function'\x00'..'\x7F'->true|_->falseletis_upper=function'A'..'Z'->true|_->falseletis_lower=function'a'..'z'->true|_->falseletis_letter=function'A'..'Z'|'a'..'z'->true|_->falseletis_alphanum=function|'0'..'9'|'A'..'Z'|'a'..'z'->true|_->falseletis_white=function' '|'\t'..'\r'->true|_->falseletis_blank=function' '|'\t'->true|_->falseletis_graphic=function'!'..'~'->true|_->falseletis_print=function' '..'~'->true|_->falseletis_control=function'\x00'..'\x1F'|'\x7F'->true|_->false(* Decimal digits *)letis_digit=function'0'..'9'->true|_->falseletdigit_to_int=function|'0'..'9'asc->codec-0x30|c->invalid_arg(escapedc^": not a decimal digit")letdigit_of_intn=unsafe_chr(0x30+abs(nmod10))(* Hexadecimal digits *)letis_hex_digit=function|'0'..'9'|'A'..'F'|'a'..'f'->true|_->falselethex_digit_to_int=function|'0'..'9'asc->codec-0x30|'A'..'F'asc->10+codec-0x41|'a'..'f'asc->10+codec-0x61|c->invalid_arg(escapedc^": not a hexadecimal digit")letlower_hex_digit_of_intn=letd=abs(nmod16)inunsafe_chr(ifd<10then0x30+delse0x57+d)letupper_hex_digit_of_intn=letd=abs(nmod16)inunsafe_chr(ifd<10then0x30+delse0x37+d)(* Casing transforms *)letlowercase=lowercase_asciiletuppercase=uppercase_asciiend