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 }