code wiki / _hdl_build / nx_sitemap_extract_gate.nx
nx_sitemap_extract_gate.nx source
↩ module page · 57 lines · 3972 B
1import "nx_gate_gn.nx"
2// nx_sitemap_extract_gate.nx -- deterministic gate for sitemap parsing: robots Sitemap: extraction, <loc>
3// extraction (urlset + sitemapindex), and sub-sitemap classification. Inline fixtures + a real-data
4// cross-check on the saved NYT robots.txt (knowledge/fetched/rb_nyt).
5import "nx_syscalls.nx"
6import "nx_sitemap_extract.nx"
7
8func gw(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
9func sl(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} return k }
10func 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 }
11func chk(name: *u8, ok: i64, p: *i64, t: *i64) -> i64 { t[0]=t[0]+1; if ok==1 { p[0]=p[0]+1; gw(" ok " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("\n" as *u8); return 0 }
12func gread(path: *u8, buf: *u8, cap: i64) -> i64 { let fd: i64=sys_openat_rd(path); if fd<0 { return 0-1 } var tot: i64=0; var go: i64=1; while go==1 { let n: i64=sys_read(fd,(buf as i64+tot) as *u8,cap-tot); if n<=0 { go=0 } else { tot=tot+n; if tot>=cap { go=0 } } } sys_close(fd); return tot }
13
14func main() -> i64 {
15 gw("=== NX-SITEMAP-EXTRACT gate ===\n" as *u8)
16 let p: *i64=sys_mmap(16) as *i64; p[0]=0
17 let t: *i64=sys_mmap(16) as *i64; t[0]=0
18 let out: *u8 = sys_mmap(64*2048)
19
20 // --- robots Sitemap: extraction (inline fixture) ---
21 let rob: *u8 = "User-agent: *\nDisallow: /admin\nSitemap: https://site.com/sitemap.xml\nSitemap: https://site.com/news.xml.gz\n" as *u8
22 let rc: i64 = sm_robots_sitemaps(rob, sl(rob), out, 2048, 64)
23 chk("robots -> 2 Sitemap URLs" as *u8, rc == 2, p, t)
24 chk("robots url0 = sitemap.xml" as *u8, streq((out as i64 + 0*2048) as *u8, "https://site.com/sitemap.xml" as *u8), p, t)
25 chk("robots url1 = news.xml.gz" as *u8, streq((out as i64 + 1*2048) as *u8, "https://site.com/news.xml.gz" as *u8), p, t)
26
27 // --- <loc> extraction: urlset (page locs) ---
28 let urlset: *u8 = "<?xml version=\"1.0\"?><urlset><url><loc>https://site.com/article-1</loc><lastmod>2026</lastmod></url><url><loc>https://site.com/article-2</loc></url></urlset>" as *u8
29 let uc: i64 = sm_extract_locs(urlset, sl(urlset), out, 2048, 64)
30 chk("urlset -> 2 locs" as *u8, uc == 2, p, t)
31 chk("urlset loc0" as *u8, streq((out as i64 + 0*2048) as *u8, "https://site.com/article-1" as *u8), p, t)
32 chk("urlset loc1" as *u8, streq((out as i64 + 1*2048) as *u8, "https://site.com/article-2" as *u8), p, t)
33
34 // --- <loc> extraction: sitemapindex (sub-sitemap locs, one gzipped) ---
35 let idx: *u8 = "<sitemapindex><sitemap><loc>https://site.com/sm/news.xml.gz</loc></sitemap><sitemap><loc>https://site.com/sm/pages.xml</loc></sitemap></sitemapindex>" as *u8
36 let ic: i64 = sm_extract_locs(idx, sl(idx), out, 2048, 64)
37 chk("index -> 2 locs" as *u8, ic == 2, p, t)
38 let l0: *u8 = (out as i64 + 0*2048) as *u8
39 let l1: *u8 = (out as i64 + 1*2048) as *u8
40 chk("index loc0 = .xml.gz -> is-subsitemap" as *u8, sm_is_subsitemap(l0, sl(l0)) == 1, p, t)
41 chk("index loc1 = .xml -> is-subsitemap" as *u8, sm_is_subsitemap(l1, sl(l1)) == 1, p, t)
42 chk("a page url -> NOT subsitemap" as *u8, sm_is_subsitemap("https://site.com/article-1" as *u8, 26) == 0, p, t)
43
44 // --- REAL DATA cross-check: NYT robots.txt (saved) declares .xml.gz sitemaps ---
45 let cap: i64 = 65536
46 let buf: *u8 = sys_mmap(cap)
47 let rn: i64 = gread("knowledge/fetched/rb_nyt" as *u8, buf, cap)
48 if rn > 0 {
49 let nc: i64 = sm_robots_sitemaps(buf, rn, out, 2048, 64)
50 gw(" [real] NYT robots.txt -> " as *u8); gn(nc); gw(" sitemap URLs; first=" as *u8); gw((out as i64) as *u8); gw("\n" as *u8)
51 chk("real NYT robots -> >=1 sitemap" as *u8, nc >= 1, p, t)
52 }
53
54 gw("=== NX-SITEMAP-EXTRACT " as *u8); gn(p[0]); gw("/" as *u8); gn(t[0])
55 if p[0] == t[0] { gw(" GREEN\n" as *u8); return 0 }
56 gw(" RED\n" as *u8); return 1
57}