code wiki / (root) / nx_ascii.nx

nx_ascii.nx source

↩ module page · 127 lines · 4359 B

1// nx_ascii.nx -- ASCII character classification. 2// 3// Replaces the inline `c >= 0x30 && c <= 0x39`-style checks scattered 4// across the lexer, the printer, the formatter, the path module, 5// the strconv module, etc. Centralises the table so all callers 6// agree (and so we can swap to UTF-8-aware versions later without 7// hunting them down). 8// 9// Functions return 1 / 0 (NishiLang doesn't have a bool type). 10// All inputs are i64 in 0..255 -- caller pre-validates byte range 11// (typically by reading from a *u8). 12 13// nx_safety_envelope: 14// intended_use: AUTO_APPLIED -- primitive-specific tuning queued 15// sil_target: SIL1 16// evidence: [bulk_applied_2026-05-16, see-file-comment-for-detail] 17// verdict: NOT_YET_EVALUATED 18 19import "syscalls.nx" 20 21func nx_ascii_is_digit(c: i64) -> i64 { 22 if c < 0x30 { return 0 } 23 if c > 0x39 { return 0 } 24 return 1 25} 26 27func nx_ascii_is_lower(c: i64) -> i64 { 28 if c < 0x61 { return 0 } 29 if c > 0x7A { return 0 } 30 return 1 31} 32 33func nx_ascii_is_upper(c: i64) -> i64 { 34 if c < 0x41 { return 0 } 35 if c > 0x5A { return 0 } 36 return 1 37} 38 39func nx_ascii_is_alpha(c: i64) -> i64 { 40 if nx_ascii_is_lower(c) == 1 { return 1 } 41 return nx_ascii_is_upper(c) 42} 43 44func nx_ascii_is_alnum(c: i64) -> i64 { 45 if nx_ascii_is_alpha(c) == 1 { return 1 } 46 return nx_ascii_is_digit(c) 47} 48 49// Identifier-start: [A-Za-z_] 50func nx_ascii_is_id_start(c: i64) -> i64 { 51 if nx_ascii_is_alpha(c) == 1 { return 1 } 52 if c == 0x5F { return 1 } // '_' 53 return 0 54} 55 56// Identifier-continue: [A-Za-z0-9_] 57func nx_ascii_is_id_cont(c: i64) -> i64 { 58 if nx_ascii_is_alnum(c) == 1 { return 1 } 59 if c == 0x5F { return 1 } 60 return 0 61} 62 63func nx_ascii_is_space(c: i64) -> i64 { 64 if c == 0x20 { return 1 } // ' ' 65 if c == 0x09 { return 1 } // '\t' 66 if c == 0x0A { return 1 } // '\n' 67 if c == 0x0D { return 1 } // '\r' 68 if c == 0x0B { return 1 } // '\v' 69 if c == 0x0C { return 1 } // '\f' 70 return 0 71} 72 73func nx_ascii_is_print(c: i64) -> i64 { 74 if c < 0x20 { return 0 } 75 if c > 0x7E { return 0 } 76 return 1 77} 78 79func nx_ascii_is_hex(c: i64) -> i64 { 80 if nx_ascii_is_digit(c) == 1 { return 1 } 81 if c >= 0x61 { if c <= 0x66 { return 1 } } 82 if c >= 0x41 { if c <= 0x46 { return 1 } } 83 return 0 84} 85 86// Lowercase one ASCII char (no-op if not upper). 87func nx_ascii_to_lower(c: i64) -> i64 { 88 if nx_ascii_is_upper(c) == 1 { return c + 32 } 89 return c 90} 91 92func nx_ascii_to_upper(c: i64) -> i64 { 93 if nx_ascii_is_lower(c) == 1 { return c - 32 } 94 return c 95} 96 97// ---- self-test --------------------------------------------------- 98 99func main() -> i64 { 100 if nx_ascii_is_digit(0x30) != 1 { return __syscall(93, 1, 0, 0, 0, 0, 0) } 101 if nx_ascii_is_digit(0x39) != 1 { return __syscall(93, 2, 0, 0, 0, 0, 0) } 102 if nx_ascii_is_digit(0x40) != 0 { return __syscall(93, 3, 0, 0, 0, 0, 0) } 103 104 if nx_ascii_is_alpha(0x41) != 1 { return __syscall(93, 4, 0, 0, 0, 0, 0) } 105 if nx_ascii_is_alpha(0x7A) != 1 { return __syscall(93, 5, 0, 0, 0, 0, 0) } 106 if nx_ascii_is_alpha(0x5B) != 0 { return __syscall(93, 6, 0, 0, 0, 0, 0) } // '[' 107 108 if nx_ascii_is_id_start(0x5F) != 1 { return __syscall(93, 7, 0, 0, 0, 0, 0) } 109 if nx_ascii_is_id_start(0x30) != 0 { return __syscall(93, 8, 0, 0, 0, 0, 0) } // digit not start 110 if nx_ascii_is_id_cont(0x30) != 1 { return __syscall(93, 9, 0, 0, 0, 0, 0) } // digit ok continue 111 112 if nx_ascii_is_space(0x20) != 1 { return __syscall(93, 10, 0, 0, 0, 0, 0) } 113 if nx_ascii_is_space(0x09) != 1 { return __syscall(93, 11, 0, 0, 0, 0, 0) } 114 if nx_ascii_is_space(0x41) != 0 { return __syscall(93, 12, 0, 0, 0, 0, 0) } 115 116 if nx_ascii_is_hex(0x39) != 1 { return __syscall(93, 13, 0, 0, 0, 0, 0) } 117 if nx_ascii_is_hex(0x46) != 1 { return __syscall(93, 14, 0, 0, 0, 0, 0) } 118 if nx_ascii_is_hex(0x66) != 1 { return __syscall(93, 15, 0, 0, 0, 0, 0) } 119 if nx_ascii_is_hex(0x47) != 0 { return __syscall(93, 16, 0, 0, 0, 0, 0) } 120 121 if nx_ascii_to_lower(0x41) != 0x61 { return __syscall(93, 17, 0, 0, 0, 0, 0) } 122 if nx_ascii_to_lower(0x61) != 0x61 { return __syscall(93, 18, 0, 0, 0, 0, 0) } 123 if nx_ascii_to_upper(0x7A) != 0x5A { return __syscall(93, 19, 0, 0, 0, 0, 0) } 124 if nx_ascii_to_upper(0x5A) != 0x5A { return __syscall(93, 20, 0, 0, 0, 0, 0) } 125 126 return 0 127}