nx_compare_results.nx source
↩ module page · 81 lines · 4796 B
1// nx_compare_results.nx -- CLI over nx_compare_results_lib (ecosystem EC64, 2026-09-17): a board's results in ONE place.
2// nx_compare_results emit <dom> <results-file> <out.html> -> render any results file to any page (fixtures, previews)
3// nx_compare_results publish <dom> -> buildroot/knowledge/compare/<dom>.results rendered to
4// sites/nishifamily/compare/<dom>/results/index.html
5// Every image on the page sits behind the estate's click-to-open primitive; the page is refused when the audit finds a
6// media tag outside one. Receipt: one COMPARE-RESULTS line, verdict last.
7// exit: 0 emitted | 2 usage | 3 results file unreadable | 4 no live rows | 5 write refused | 6 page overflow | 7 bare media
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_syscalls.nx"
10import "nx_compare_results_lib.nx"
11
12const CRC_EXIT_USAGE: i64 = 2
13const CRC_ARGC_EMIT: i64 = 5
14const CRC_ARGC_PUBLISH: i64 = 3
15const CRC_MODE755: i64 = 493
16const CRC_STDOUT: i64 = 1
17const CRC_DATA_PREFIX: *u8 = "buildroot/knowledge/compare/"
18const CRC_DATA_SUFFIX: *u8 = ".results"
19const CRC_SITE_PREFIX: *u8 = "sites/nishifamily/compare/"
20const CRC_SITE_DIR: *u8 = "/results"
21const CRC_SITE_PAGE: *u8 = "/results/index.html"
22
23func crc_puts(s: *u8) -> i64 { sys_write(CRC_STDOUT, s, rvl_slen(s)); return 0 }
24func crc_putn(v: i64) -> i64 {
25 let b: *u8 = sys_mmap(CRES_PATHB)
26 var o: i64 = 0
27 if v < 0 { o = rvl_cat(b, 0, CRES_PATHB, "-" as *u8); o = cres_catn(b, o, CRES_PATHB, 0 - v) } else { o = cres_catn(b, 0, CRES_PATHB, v) }
28 return crc_puts(b)
29}
30func crc_kv(k: *u8, v: i64) -> i64 { crc_puts(k); return crc_putn(v) }
31func crc_usage() -> i64 { crc_puts("usage: nx_compare_results emit <dom> <results-file> <out.html> | publish <dom>\n" as *u8); return CRC_EXIT_USAGE }
32func crc_streq(a: *u8, b: *u8) -> i64 { return rvl_span_is(a, 0, rvl_slen(a), b) }
33func crc_verdict(code: i64) -> *u8 {
34 if code == CRES_E_READ { return "REFUSED-RESULTS-FILE-UNREADABLE" as *u8 }
35 if code == CRES_E_NOROWS { return "REFUSED-NO-LIVE-ROWS" as *u8 }
36 if code == CRES_E_WRITE { return "REFUSED-WRITE" as *u8 }
37 if code == CRES_E_OVERFLOW { return "REFUSED-PAGE-OVERFLOW" as *u8 }
38 if code == CRES_E_BARE { return "REFUSED-BARE-MEDIA" as *u8 }
39 return "EMITTED" as *u8
40}
41func crc_run(dom: *u8, results_path: *u8, out_path: *u8) -> i64 {
42 let rep: *i64 = sys_mmap(CRES_R_N * CRES_I64) as *i64
43 var i: i64 = 0
44 while i < CRES_R_N { rep[i] = 0; i = i + 1 }
45 let code: i64 = cres_emit_file(dom, results_path, out_path, rep)
46 crc_puts("COMPARE-RESULTS dom=" as *u8); crc_puts(dom)
47 crc_puts(" results=" as *u8); crc_puts(results_path)
48 crc_puts(" page=" as *u8); crc_puts(out_path)
49 crc_kv(" lines=" as *u8, rep[CRES_R_LINES]); crc_kv(" rows=" as *u8, rep[CRES_R_ROWS]); crc_kv(" live=" as *u8, rep[CRES_R_LIVE])
50 crc_kv(" superseded=" as *u8, rep[CRES_R_SUPERSEDED]); crc_kv(" malformed=" as *u8, rep[CRES_R_MALFORMED]); crc_kv(" first_bad_line=" as *u8, rep[CRES_R_FIRST_BAD_LINE])
51 crc_kv(" kinds=" as *u8, rep[CRES_R_KINDS]); crc_kv(" inline=" as *u8, rep[CRES_R_OPEN]); crc_kv(" click=" as *u8, rep[CRES_R_CLICK])
52 crc_kv(" gated=" as *u8, rep[CRES_R_GATED]); crc_kv(" unknown_class=" as *u8, rep[CRES_R_UNKNOWN]); crc_kv(" adult=" as *u8, rep[CRES_R_ADULT])
53 crc_kv(" bare_media=" as *u8, rep[CRES_R_BARE]); crc_kv(" html_bytes=" as *u8, rep[CRES_R_HTML_BYTES])
54 crc_puts(" verdict=" as *u8); crc_puts(crc_verdict(code)); crc_puts("\n" as *u8)
55 if code >= 0 { return 0 }
56 return 0 - code
57}
58func main(argc: i64, argv: **u8) -> i64 {
59 if argc < CRC_ARGC_PUBLISH { return crc_usage() }
60 if crc_streq(argv[1], "emit" as *u8) == 1 {
61 if argc < CRC_ARGC_EMIT { return crc_usage() }
62 return crc_run(argv[2], argv[3], argv[4])
63 }
64 if crc_streq(argv[1], "publish" as *u8) == 1 {
65 let data: *u8 = sys_mmap(CRES_PATHB)
66 var o: i64 = rvl_cat(data, 0, CRES_PATHB, CRC_DATA_PREFIX)
67 o = rvl_cat(data, o, CRES_PATHB, argv[2]); o = rvl_cat(data, o, CRES_PATHB, CRC_DATA_SUFFIX)
68 let dir: *u8 = sys_mmap(CRES_PATHB)
69 var d: i64 = rvl_cat(dir, 0, CRES_PATHB, CRC_SITE_PREFIX)
70 d = rvl_cat(dir, d, CRES_PATHB, argv[2]); d = rvl_cat(dir, d, CRES_PATHB, CRC_SITE_DIR)
71 let page: *u8 = sys_mmap(CRES_PATHB)
72 var g: i64 = rvl_cat(page, 0, CRES_PATHB, CRC_SITE_PREFIX)
73 g = rvl_cat(page, g, CRES_PATHB, argv[2]); g = rvl_cat(page, g, CRES_PATHB, CRC_SITE_PAGE)
74 if o < 0 { return crc_usage() }
75 if d < 0 { return crc_usage() }
76 if g < 0 { return crc_usage() }
77 sys_mkdir(dir, CRC_MODE755)
78 return crc_run(argv[2], data, page)
79 }
80 return crc_usage()
81}