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}