nx_contentdiff_export.nx source
↩ module page · 63 lines · 3761 B
1// Complete, pinned missing-string inventory. String absence is evidence, not a capability verdict.
2import "nx_game_page_artifact_lib.nx"
3import "_hdl_build/nx_contentdiff_lib.nx"
4func cdx_digits(v: i64) -> i64 { var n: i64=1; var x: i64=v; while x>=10 { n=n+1; x=x/10 }; return n }
5func cdx_num(out: *u8,p: i64,v: i64) -> i64 { let n: i64=cdx_digits(v); var i: i64=n; var x: i64=v; while i>0 { i=i-1; out[p+i]=(48+x%10) as u8; x=x/10 }; return p+n }
6func cdx_text(out: *u8,p: i64,s: *u8) -> i64 { var i: i64=0; while s[i]!=0 as u8 { out[p+i]=s[i]; i=i+1 }; return p+i }
7func cdx_class(a: *u8,i: i64,n: i64) -> *u8 {
8 if cdl_is_srcpath(a,i,n)==1 { return "source-path" as *u8 }
9 if cdl_is_sectname(a,i,n)==1 { return "section" as *u8 }
10 if cdl_is_ident(a,i,n)==1 { return "identifier" as *u8 }
11 return "content" as *u8
12}
13func main(argc: i64,argv: *i64) -> i64 {
14 if argc!=7 { fsx_puts("usage: nx_contentdiff_export live candidate output live-sha256 candidate-sha256 min-run-length\n" as *u8); return 2 }
15 let minarg: *u8=argv[6] as *u8
16 var minimum: i64=0; var mi: i64=0
17 while minarg[mi]!=0 as u8 { let d: i64=minarg[mi] as i64-48; if d<0 || d>9 || minimum>FSX_READ_CAP/10 { return 2 }; minimum=minimum*10+d; mi=mi+1 }
18 if minimum<1 || minimum>FSX_READ_CAP { return 2 }
19 if fsx_denied(argv[1] as *u8)==1 || fsx_denied(argv[2] as *u8)==1 || fsx_write_denied(argv[3] as *u8)==1 { return FSX_RC_DENIED }
20 let a: *u8=sys_mmap(FSX_READ_CAP); let b: *u8=sys_mmap(FSX_READ_CAP)
21 let an: i64=vw_read(argv[1] as *u8,a,FSX_READ_CAP); let bn: i64=vw_read(argv[2] as *u8,b,FSX_READ_CAP)
22 if an<=0 || bn<=0 || an>=FSX_READ_CAP || bn>=FSX_READ_CAP { return 3 }
23 let ah: *u8=sys_mmap(65); let bh: *u8=sys_mmap(65); gpa_sha(a,an,ah); gpa_sha(b,bn,bh)
24 if fsx_seq(ah,argv[4] as *u8)==0 || fsx_seq(bh,argv[5] as *u8)==0 { return GPA_RC_CONFLICT }
25 let rows: *i64=sys_mmap((an/minimum+1)*16) as *i64
26 var count: i64=0; var scanned: i64=0; var bytes: i64=0; var i: i64=0
27 while i<an {
28 let n: i64=cdl_runlen(a,an,i)
29 if n>=minimum {
30 scanned=scanned+1
31 if cdl_contains(b,bn,a,i,n)==0 {
32 rows[count*2]=i; rows[count*2+1]=n; count=count+1
33 bytes=bytes+cdx_digits(i)+cdx_digits(n)+vw_slen(cdx_class(a,i,n))+n+4
34 }
35 }
36 if n>0 { i=i+n } else { i=i+1 }
37 }
38 let header: *u8="offset\tlength\tclass\ttext\n" as *u8
39 let prefix: *u8="# live-sha256\t" as *u8
40 let middle: *u8="\n# candidate-sha256\t" as *u8
41 let meta: *u8="\n# min-run-length\t" as *u8
42 let cap: i64=bytes+vw_slen(header)+vw_slen(prefix)+64+vw_slen(middle)+64+vw_slen(meta)+cdx_digits(minimum)+1
43 let out: *u8=sys_mmap(cap)
44 var p: i64=cdx_text(out,0,prefix);p=cdx_text(out,p,ah);p=cdx_text(out,p,middle);p=cdx_text(out,p,bh);p=cdx_text(out,p,meta);p=cdx_num(out,p,minimum);out[p]=10 as u8;p=p+1;p=cdx_text(out,p,header)
45 var r: i64=0
46 while r<count {
47 let start: i64=rows[r*2];let n: i64=rows[r*2+1]
48 p=cdx_num(out,p,start);out[p]=9 as u8;p=p+1;p=cdx_num(out,p,n);out[p]=9 as u8;p=p+1
49 p=cdx_text(out,p,cdx_class(a,start,n));out[p]=9 as u8;p=p+1
50 i=0;while i<n { out[p]=a[start+i];p=p+1;i=i+1 };out[p]=10 as u8;p=p+1;r=r+1
51 }
52 if p!=cap { return 4 }
53 let rc: i64=fxc_create(argv[3] as *u8,out,p)
54 if rc==FXC_EXISTS {
55 let prior: *u8=sys_mmap(cap+1);let oldn: i64=vw_read(argv[3] as *u8,prior,cap+1)
56 if gpa_same(out,p,prior,oldn)!=1 { return GPA_RC_CONFLICT }
57 } else { if rc!=p { return 5 } }
58 let check: *u8=sys_mmap(cap+1);let cn: i64=vw_read(argv[3] as *u8,check,cap+1)
59 if gpa_same(out,p,check,cn)!=1 { return 5 }
60 let hash: *u8=sys_mmap(65);gpa_sha(out,p,hash)
61 fsx_puts("CONTENT-INVENTORY complete=1 runs=" as *u8);fsx_putn(scanned);fsx_puts(" missing=" as *u8);fsx_putn(count);fsx_puts(" bytes=" as *u8);fsx_putn(p);fsx_puts(" sha256=" as *u8);fsx_puts(hash);fsx_puts("\n" as *u8)
62 return 0
63}