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}