code wiki / _hdl_build / _race5_claude.nx
_race5_claude.nx source
↩ module page · 104 lines · 3551 B
1// _race5_claude.nx -- the CLAUDE lane for autonomy race 5 (handwritten single-pass RIFF/WAV
2// chunk census; the yardstick the team lane races against). Lane contract: read
3// /tmp/race_input.bin, print NCHK= FMT= DATA= LIST= RSZ= as key=int lines.
4// Census semantics (the assignment): NCHK = well-formed chunk count, -1 = REFUSED (truncated /
5// bad magic / overlong length); finds = body offset RELATIVE to the chunk area (byte 12),
6// -2 when refused or absent; RSZ = declared u32le size at byte 4 whenever the 12-byte header
7// is intact, -2 otherwise. Odd chunk bodies are padded to even (RIFF law). license_tier: ORIGINAL
8import "nx_syscalls.nx"
9
10func r5_dec(label: *u8, v: i64) -> i64 {
11 var n: i64 = 0
12 while label[n] != (0 as u8) { n = n + 1 }
13 sys_write(1, label, n)
14 var av: i64 = v
15 if av < 0 { sys_write(1, "-" as *u8, 1); av = 0 - av }
16 if av == 0 { sys_write(1, "0" as *u8, 1) }
17 if av > 0 {
18 let buf: *u8 = sys_mmap(32)
19 var pos: i64 = 0
20 var x: i64 = av
21 while x > 0 { buf[pos] = (48 + (x % 10)) as u8; x = x / 10; pos = pos + 1 }
22 let outb: *u8 = sys_mmap(32)
23 var oi: i64 = 0
24 while oi < pos { outb[oi] = buf[pos - 1 - oi]; oi = oi + 1 }
25 sys_write(1, outb, pos)
26 }
27 sys_write(1, "\n" as *u8, 1)
28 return 0
29}
30
31func r5_le4(b: *u8, off: i64) -> i64 {
32 var v: i64 = b[off] as i64
33 v = v + ((b[off + 1] as i64) << 8)
34 v = v + ((b[off + 2] as i64) << 16)
35 v = v + ((b[off + 3] as i64) << 24)
36 return v
37}
38
39func r5_4cc(b: *u8, off: i64) -> i64 {
40 var v: i64 = (b[off] as i64) << 24
41 v = v + ((b[off + 1] as i64) << 16)
42 v = v + ((b[off + 2] as i64) << 8)
43 v = v + (b[off + 3] as i64)
44 return v
45}
46
47// chunk count from byte 12; -1 = refused (truncated entry or overlong length)
48func r5_count(b: *u8, n: i64) -> i64 {
49 var off: i64 = 12
50 var c: i64 = 0
51 while off < n {
52 if off + 8 > n { return 0 - 1 }
53 let len: i64 = r5_le4(b, off + 4)
54 if off + 8 + len > n { return 0 - 1 }
55 off = off + 8 + len + (len & 1)
56 c = c + 1
57 }
58 return c
59}
60
61// body offset of first chunk tagged t, RELATIVE to the chunk area; -2 absent
62func r5_find(b: *u8, n: i64, t: i64) -> i64 {
63 var off: i64 = 12
64 while off < n {
65 if off + 8 > n { return 0 - 2 }
66 let len: i64 = r5_le4(b, off + 4)
67 if off + 8 + len > n { return 0 - 2 }
68 if r5_4cc(b, off) == t { return off + 8 - 12 }
69 off = off + 8 + len + (len & 1)
70 }
71 return 0 - 2
72}
73
74func main() -> i64 {
75 let lenp: *i64 = sys_mmap(16) as *i64
76 let b: *u8 = sys_read_file("/tmp/race_input.bin\x00" as *u8, lenp)
77 let n: i64 = lenp[0]
78 var hdr_ok: i64 = 0
79 if n >= 12 {
80 if r5_4cc(b, 0) == 0x52494646 { if r5_4cc(b, 8) == 0x57415645 { hdr_ok = 1 } }
81 }
82 if hdr_ok == 0 {
83 r5_dec("NCHK=\x00" as *u8, 0 - 1)
84 r5_dec("FMT=\x00" as *u8, 0 - 2)
85 r5_dec("DATA=\x00" as *u8, 0 - 2)
86 r5_dec("LIST=\x00" as *u8, 0 - 2)
87 r5_dec("RSZ=\x00" as *u8, 0 - 2)
88 return 0
89 }
90 let c: i64 = r5_count(b, n)
91 r5_dec("NCHK=\x00" as *u8, c)
92 if c < 0 {
93 r5_dec("FMT=\x00" as *u8, 0 - 2)
94 r5_dec("DATA=\x00" as *u8, 0 - 2)
95 r5_dec("LIST=\x00" as *u8, 0 - 2)
96 }
97 if c >= 0 {
98 r5_dec("FMT=\x00" as *u8, r5_find(b, n, 0x666d7420))
99 r5_dec("DATA=\x00" as *u8, r5_find(b, n, 0x64617461))
100 r5_dec("LIST=\x00" as *u8, r5_find(b, n, 0x4c495354))
101 }
102 r5_dec("RSZ=\x00" as *u8, r5_le4(b, 4))
103 return 0
104}