code wiki / _hdl_build / nx_galx_cid_index_gate.nx
nx_galx_cid_index_gate.nx source
↩ module page · 77 lines · 4606 B
1// nx_galx_cid_index_gate.nx -- SOVEREIGN gate for the O(1) cid->path store.
2// Builds a synthetic cid_paths.tsv (N unique cids -> paths), builds the index+blob, then verifies EVERY cid
3// resolves to its exact path (build + open-addressing + blob offsets all correct) and a non-existent cid is a
4// clean miss. Every number printed. GREEN iff all N resolve correctly AND the miss is rejected.
5// license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_g_puts_lib.nx"
8import "nx_galx_cid_index.nx"
9
10func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
11func g_streq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8) { if a[i]!=b[i] { return 0 } i=i+1 } if b[i]!=(0 as u8) { return 0 } return 1 }
12func g_itoa(v: i64, out: *u8) -> i64 { if v==0 { out[0]=48 as u8; return 1 } let t: *u8=sys_mmap(28); var m: i64=v; var k: i64=0; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{out[i]=t[k-1-i];i=i+1}; return k }
13
14func to_hex16(v: i64, out: *u8) -> i64 { let hx: *u8="0123456789abcdef" as *u8; var i: i64=0; while i<16 { let sh: i64=(15-i)*4; out[i]=hx[(v>>sh)&15]; i=i+1 } return 0 }
15// cid = "nxc1-" + 16 hex(id) + 48 '0' = 69 chars, NUL-terminated. Unique per id.
16func make_cid(idv: i64, out: *u8) -> i64 {
17 out[0]=110 as u8; out[1]=120 as u8; out[2]=99 as u8; out[3]=49 as u8; out[4]=45 as u8
18 to_hex16(idv, ((out as i64)+5) as *u8)
19 var i: i64=21; while i<69 { out[i]=48 as u8; i=i+1 } out[69]=0 as u8
20 return 0
21}
22// path = "/vol/img/<id>.png", NUL-terminated; returns len.
23func make_path(idv: i64, out: *u8) -> i64 {
24 var o: i64=0; let pre: *u8="/vol/img/" as *u8; var j: i64=0; while pre[j]!=(0 as u8){out[o]=pre[j];o=o+1;j=j+1}
25 o = o + g_itoa(idv, ((out as i64)+o) as *u8)
26 let suf: *u8=".png" as *u8; j=0; while suf[j]!=(0 as u8){out[o]=suf[j];o=o+1;j=j+1}
27 out[o]=0 as u8; return o
28}
29
30func main() -> i64 {
31 g_puts("=== GALX CID-INDEX GATE: sovereign O(1) cid->path store ===\n" as *u8)
32 let N: i64 = 2000
33 // build synthetic tsv
34 let tsv: *u8 = sys_mmap(N * 128)
35 var off: i64 = 0
36 let cid: *u8 = sys_mmap(96); let path: *u8 = sys_mmap(256)
37 var i: i64 = 0
38 while i < N {
39 make_cid(i, cid); var c: i64=0; while c<69 { tsv[off]=cid[c]; off=off+1; c=c+1 }
40 tsv[off]=9 as u8; off=off+1
41 let pl: i64 = make_path(i, path); var p: i64=0; while p<pl { tsv[off]=path[p]; off=off+1; p=p+1 }
42 tsv[off]=10 as u8; off=off+1
43 i = i + 1
44 }
45 let fa: i64 = sys_openat_wr("/tmp/cidx_test.tsv" as *u8, 0x1a4); sys_write(fa, tsv, off); sys_close(fa)
46 g_puts(" built synthetic tsv: entries="); g_num(N); g_puts(" bytes="); g_num(off); g_puts("\n" as *u8)
47
48 // build index
49 let nent: i64 = gs_cidindex_build("/tmp/cidx_test.tsv" as *u8, "/tmp/cidx.idx" as *u8, "/tmp/cidx.blob" as *u8)
50 g_puts(" gs_cidindex_build -> n_entries="); g_num(nent); g_puts("\n" as *u8)
51
52 // open
53 let szp: *i64 = sys_mmap(16) as *i64; let idx: *u8 = sys_read_file("/tmp/cidx.idx" as *u8, szp)
54 let szp2: *i64 = sys_mmap(16) as *i64; let blob: *u8 = sys_read_file("/tmp/cidx.blob" as *u8, szp2)
55 let nb: i64 = cidx_rd64(idx, 0)
56 g_puts(" opened idx: n_buckets="); g_num(nb); g_puts(" idx_bytes="); g_num(szp[0]); g_puts(" blob_bytes="); g_num(szp2[0]); g_puts("\n" as *u8)
57
58 // verify every cid resolves to its exact path
59 let out: *u8 = sys_mmap(256); let exp: *u8 = sys_mmap(256)
60 var ok: i64=0; var bad: i64=0; i=0
61 while i < N {
62 make_cid(i, cid); make_path(i, exp)
63 let f: i64 = gs_cidindex_lookup(idx, blob, nb, cid, out)
64 if f == 1 { if g_streq(out, exp) == 1 { ok = ok + 1 } else { bad = bad + 1 } } else { bad = bad + 1 }
65 i = i + 1
66 }
67 g_puts(" lookups: ok="); g_num(ok); g_puts("/"); g_num(N); g_puts(" wrong/missing="); g_num(bad); g_puts("\n" as *u8)
68
69 // verify a non-existent cid is a clean miss
70 make_cid(7777777, cid)
71 let mf: i64 = gs_cidindex_lookup(idx, blob, nb, cid, out)
72 g_puts(" miss test (absent cid): found="); g_num(mf); g_puts(" (expect 0)\n" as *u8)
73
74 g_puts("----\n" as *u8)
75 if ok == N { if bad == 0 { if mf == 0 { g_puts("GALXCIDX GREEN (all "); g_num(N); g_puts(" cids resolve O(1); absent cid rejected; sovereign idx+blob, no TSV scan)\n" as *u8); sys_exit(0); return 0 } } }
76 g_puts("GALXCIDX RED\n" as *u8); sys_exit(1); return 1
77}