code wiki / _hdl_build / nx_seat_drive_lib.nx

nx_seat_drive_lib.nx source

↩ module page · 109 lines · 3541 B

1// nx_seat_drive_lib.nx -- shared helpers for the S2 seat stack (nx_seat_drive + nx_seat_hub). 2// KEY=VALUE lane/hub config parsing + string building. Bodies are the gate-proven originals 3// from nx_seat_drive (6/6 GREEN) extracted verbatim -- behavior identical by construction. 4// license_tier: ORIGINAL No hw writes (Rule 26). 5import "nx_syscalls.nx" 6 7const SD_VAL_CAP: i64 = 1024 8 9func sd_w(s: *u8) -> i64 { 10 var n: i64 = 0 11 while s[n] != (0 as u8) { n = n + 1 } 12 sys_write(1, s, n) 13 return 0 14} 15 16// append NUL-terminated s into dst at off; returns new off (dst stays NUL-terminated) 17func sd_cat(dst: *u8, off: i64, s: *u8) -> i64 { 18 var o: i64 = off 19 var i: i64 = 0 20 while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } 21 dst[o] = 0 as u8 22 return o 23} 24 25// append decimal v into dst at off; returns new off 26func sd_num(dst: *u8, off: i64, v: i64) -> i64 { 27 var m: i64 = v 28 var o: i64 = off 29 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m } 30 let t: *u8 = sys_mmap(24) 31 var k: i64 = 0 32 if m == 0 { t[0] = 48 as u8; k = 1 } 33 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 34 var i: i64 = 0 35 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 } 36 dst[o + k] = 0 as u8 37 return o + k 38} 39 40// find "key=..." at a line start in buf[0..n); return mmap'd NUL-terminated value copy or 0. 41// key INCLUDES the '=' (call with "ws=" etc). Empty value counts as absent. 42func sd_val(buf: *u8, n: i64, key: *u8) -> *u8 { 43 var ls: i64 = 0 44 while ls < n { 45 var ki: i64 = 0 46 var ok: i64 = 1 47 var scanning: i64 = 1 48 while scanning == 1 { 49 let kc: i64 = key[ki] as i64 50 if kc == 0 { scanning = 0 } else { 51 var bc: i64 = 0 52 if ls + ki < n { bc = buf[ls + ki] as i64 } 53 if bc == kc { ki = ki + 1 } else { ok = 0; scanning = 0 } 54 } 55 } 56 if ok == 1 { 57 let out: *u8 = sys_mmap(SD_VAL_CAP) 58 var vo: i64 = 0 59 var vp: i64 = ls + ki 60 var cp: i64 = 1 61 while cp == 1 { 62 if vp >= n { cp = 0 } else { 63 let c: i64 = buf[vp] as i64 64 if c == 10 { cp = 0 } else { 65 if c == 13 { cp = 0 } else { 66 out[vo] = c as u8 67 vo = vo + 1 68 vp = vp + 1 69 if vo >= SD_VAL_CAP - 8 { cp = 0 } 70 } 71 } 72 } 73 } 74 out[vo] = 0 as u8 75 if vo > 0 { return out } 76 } 77 var adv: i64 = 1 78 while adv == 1 { 79 if ls >= n { adv = 0 } else { 80 let c2: i64 = buf[ls] as i64 81 ls = ls + 1 82 if c2 == 10 { adv = 0 } 83 } 84 } 85 } 86 return 0 as *u8 87} 88 89// occurrences of NUL-terminated needle in buf[0..n) 90func sd_count(buf: *u8, n: i64, needle: *u8) -> i64 { 91 var cnt: i64 = 0 92 var p: i64 = 0 93 while p < n { 94 var ki: i64 = 0 95 var hit: i64 = 1 96 var scanning: i64 = 1 97 while scanning == 1 { 98 let kc: i64 = needle[ki] as i64 99 if kc == 0 { scanning = 0 } else { 100 var bc: i64 = 0 101 if p + ki < n { bc = buf[p + ki] as i64 } 102 if bc == kc { ki = ki + 1 } else { hit = 0; scanning = 0 } 103 } 104 } 105 if hit == 1 { cnt = cnt + 1 } 106 p = p + 1 107 } 108 return cnt 109}