code wiki / (root) / nx_contentdiff_export.nx

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}