code wiki / _hdl_build / _race6_claude.nx
_race6_claude.nx source
↩ module page · 95 lines · 3253 B
1// _race6_claude.nx -- the CLAUDE lane for autonomy race 6 (handwritten single-pass PNG chunk
2// census; the yardstick). Lane contract: read /tmp/race_input.bin, print NCHK= IHDR= IDAT=
3// IEND= W= as key=int lines. PNG: 8-byte magic, then chunks [len u32 BE][type 4cc][body][CRC 4B].
4// NCHK = well-formed chunk count, -1 refused (bad magic / truncation / overlong); finds = body
5// offset RELATIVE to the chunk area (byte 8), -2 refused/absent; W= = u32 BE at abs byte 16
6// (IHDR width) whenever the magic is intact, -2 otherwise. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8
9func r6_dec(label: *u8, v: i64) -> i64 {
10 var n: i64 = 0
11 while label[n] != (0 as u8) { n = n + 1 }
12 sys_write(1, label, n)
13 var av: i64 = v
14 if av < 0 { sys_write(1, "-" as *u8, 1); av = 0 - av }
15 if av == 0 { sys_write(1, "0" as *u8, 1) }
16 if av > 0 {
17 let buf: *u8 = sys_mmap(32)
18 var pos: i64 = 0
19 var x: i64 = av
20 while x > 0 { buf[pos] = (48 + (x % 10)) as u8; x = x / 10; pos = pos + 1 }
21 let outb: *u8 = sys_mmap(32)
22 var oi: i64 = 0
23 while oi < pos { outb[oi] = buf[pos - 1 - oi]; oi = oi + 1 }
24 sys_write(1, outb, pos)
25 }
26 sys_write(1, "\n" as *u8, 1)
27 return 0
28}
29
30func r6_be4(b: *u8, off: i64) -> i64 {
31 var v: i64 = (b[off] as i64) << 24
32 v = v + ((b[off + 1] as i64) << 16)
33 v = v + ((b[off + 2] as i64) << 8)
34 v = v + (b[off + 3] as i64)
35 return v
36}
37
38// chunk count from byte 8; -1 refused (truncated entry, body+CRC must fit)
39func r6_count(b: *u8, n: i64) -> i64 {
40 var off: i64 = 8
41 var c: i64 = 0
42 while off < n {
43 if off + 8 > n { return 0 - 1 }
44 let len: i64 = r6_be4(b, off)
45 if off + 8 + len + 4 > n { return 0 - 1 }
46 off = off + 8 + len + 4
47 c = c + 1
48 }
49 return c
50}
51
52// body offset of first chunk typed t, RELATIVE to the chunk area; -2 absent
53func r6_find(b: *u8, n: i64, t: i64) -> i64 {
54 var off: i64 = 8
55 while off < n {
56 if off + 8 > n { return 0 - 2 }
57 let len: i64 = r6_be4(b, off)
58 if off + 8 + len + 4 > n { return 0 - 2 }
59 if r6_be4(b, off + 4) == t { return off + 8 - 8 }
60 off = off + 8 + len + 4
61 }
62 return 0 - 2
63}
64
65func main() -> i64 {
66 let lenp: *i64 = sys_mmap(16) as *i64
67 let b: *u8 = sys_read_file("/tmp/race_input.bin\x00" as *u8, lenp)
68 let n: i64 = lenp[0]
69 var hdr_ok: i64 = 0
70 if n >= 8 {
71 if r6_be4(b, 0) == 0x89504e47 { if r6_be4(b, 4) == 0x0d0a1a0a { hdr_ok = 1 } }
72 }
73 if hdr_ok == 0 {
74 r6_dec("NCHK=\x00" as *u8, 0 - 1)
75 r6_dec("IHDR=\x00" as *u8, 0 - 2)
76 r6_dec("IDAT=\x00" as *u8, 0 - 2)
77 r6_dec("IEND=\x00" as *u8, 0 - 2)
78 r6_dec("W=\x00" as *u8, 0 - 2)
79 return 0
80 }
81 let c: i64 = r6_count(b, n)
82 r6_dec("NCHK=\x00" as *u8, c)
83 if c < 0 {
84 r6_dec("IHDR=\x00" as *u8, 0 - 2)
85 r6_dec("IDAT=\x00" as *u8, 0 - 2)
86 r6_dec("IEND=\x00" as *u8, 0 - 2)
87 }
88 if c >= 0 {
89 r6_dec("IHDR=\x00" as *u8, r6_find(b, n, 0x49484452))
90 r6_dec("IDAT=\x00" as *u8, r6_find(b, n, 0x49444154))
91 r6_dec("IEND=\x00" as *u8, r6_find(b, n, 0x49454e44))
92 }
93 r6_dec("W=\x00" as *u8, r6_be4(b, 16))
94 return 0
95}