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}