code wiki / _hdl_build / nx_estr.nx
nx_estr.nx source
↩ module page · 33 lines · 2114 B
1// nx_estr.nx -- the shared EMIT/CONVERT base class: the 4 primitives that ~1900 organs each reimplement
2// locally (measured 2026-07-21 via the atlas eco-scorecard's SonarQube line-dup gap: 1159 local puts,
3// 578 local putn/itoa, 589 local cat, across 6183 _hdl_build organs, with NO shared base to import).
4// Import this instead of hand-rolling a digit loop -- the OO consolidation target for the duplication GAP.
5// Built on sys_write only (no float, no hw writes -- Rule 26). license_tier: ORIGINAL
6import "nx_syscalls.nx"
7
8func es_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
9func es_puts(s: *u8) -> i64 { sys_write(1, s, es_len(s)); return 0 }
10func es_putn(v: i64) -> i64 {
11 let t: *u8 = sys_mmap(24); var m: i64 = v; var k: i64 = 0
12 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
13 if m == 0 { t[0] = 48 as u8; k = 1 }
14 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
15 let b: *u8 = sys_mmap(24); var i: i64 = 0
16 while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
17 sys_write(1, b, k); return 0
18}
19// write decimal of v into buf at offset o; return new offset (the reusable itoa -- the most-duplicated form)
20func es_catn(buf: *u8, o: i64, v: i64) -> i64 {
21 let t: *u8 = sys_mmap(24); var m: i64 = v; var p: i64 = o
22 if m < 0 { buf[p] = 45 as u8; p = p + 1; m = 0 - m }
23 var k: i64 = 0
24 if m == 0 { t[0] = 48 as u8; k = 1 }
25 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
26 var i: i64 = 0
27 while i < k { buf[p] = t[k - 1 - i]; p = p + 1; i = i + 1 }
28 return p
29}
30// append null-terminated s into buf at offset o; return new offset
31func es_cat(buf: *u8, o: i64, s: *u8) -> i64 { var p: i64 = o; var i: i64 = 0; while s[i] != (0 as u8) { buf[p] = s[i]; p = p + 1; i = i + 1 } return p }
32// parse leading non-negative decimal from s (stops at first non-digit)
33func es_atoi(s: *u8) -> i64 { var v: i64 = 0; var i: i64 = 0; var go: i64 = 1; while go == 1 { let c: i64 = s[i] as i64; if c < 48 { go = 0 } else { if c > 57 { go = 0 } else { v = v * 10 + (c - 48); i = i + 1 } } } return v }