nx_ir_substitute_pairs_candidate_t216.nx source
↩ module page · 58 lines · 3654 B
1import "nx_import.nx"
2import "nx_fs_create_lib.nx"
3func isa_equal(a:*u8,b:*u8,n:i64)->i64{var i:i64=0;while i<n{if a[i]!=b[i]{return 0};i=i+1};return 1}
4func isa_decimal(s:*u8)->i64{var i:i64=0;var v:i64=0;if s[0]==(0 as u8){return -1};while s[i]!=(0 as u8){let d:i64=(s[i] as i64)-48;if d<0||d>9||v>(9223372036854775807-d)/10{return -1};v=v*10+d;i=i+1};return v}
5func isa_pair_arg(pair:i64)->i64{if pair==0{return 1};return 6+(pair-1)*2}
6func main(argc:i64,argv:*i64)->i64{
7 if argc<6||(argc-6)%2!=0{fsx_puts("usage: canonical-path candidate-path root-path output-path expansion-cap-bytes [canonical-path candidate-path ...]\n");return 2}
8 let canonical:*u8=argv[1] as *u8;let replacement:*u8=argv[2] as *u8;let root:*u8=argv[3] as *u8;let output:*u8=argv[4] as *u8;let cap:i64=isa_decimal(argv[5] as *u8)
9 if cap<1||cstr_len(root)>=IMPORT_PATH_LEN{return 2}
10 if file_exists(root)==0{return 3}
11 let pairs:i64=1+(argc-6)/2
12 let b:*u8=sys_mmap_try(cap);if (b as i64)==0{fsx_puts("REFUSED expansion-allocation\n");return 4}
13 let ctx:*ExpandCtx=expand_ctx_new(b,cap)
14 let cn:*u8=sys_mmap(IMPORT_PATH_LEN);let rn:*u8=sys_mmap(IMPORT_PATH_LEN);let other:*u8=sys_mmap(IMPORT_PATH_LEN)
15 var pair:i64=0
16 // Validate the whole mapping before expansion; duplicate or cross-mapped owners are ambiguous.
17 while pair<pairs{
18 let at:i64=isa_pair_arg(pair);let cp:*u8=argv[at] as *u8;let rp:*u8=argv[at+1] as *u8
19 if cstr_len(cp)>=IMPORT_PATH_LEN||cstr_len(rp)>=IMPORT_PATH_LEN{return 2}
20 if file_exists(cp)==0||file_exists(rp)==0{return 3}
21 canonicalise_path(cp,cn,ctx.scratch);canonicalise_path(rp,rn,ctx.scratch)
22 var prior:i64=0
23 while prior<pair{
24 let pa:i64=isa_pair_arg(prior)
25 canonicalise_path(argv[pa] as *u8,other,ctx.scratch)
26 if cstr_eq(cn,other)==1||cstr_eq(rn,other)==1{fsx_puts("REFUSED ambiguous-substitution\n");return 5}
27 canonicalise_path(argv[pa+1] as *u8,other,ctx.scratch)
28 if cstr_eq(cn,other)==1||cstr_eq(rn,other)==1{fsx_puts("REFUSED ambiguous-substitution\n");return 5}
29 prior=prior+1
30 }
31 pair=pair+1
32 }
33 // Seed every replaced canonical identity first so candidates cannot pull in another incumbent.
34 pair=0
35 while pair<pairs{
36 let at:i64=isa_pair_arg(pair)
37 canonicalise_path(argv[at] as *u8,cn,ctx.scratch);canonicalise_path(argv[at+1] as *u8,rn,ctx.scratch)
38 if cstr_eq(cn,rn)==0{
39 let np:*i64=ctx.n_paths;if import_add(ctx.paths,np[0],cn)==0{return 5}
40 ctx.path_alias[np[0]]=-1;np[0]=np[0]+1
41 }
42 pair=pair+1
43 }
44 pair=0
45 while pair<pairs{
46 let at:i64=isa_pair_arg(pair)
47 canonicalise_path(argv[at] as *u8,cn,ctx.scratch);canonicalise_path(argv[at+1] as *u8,rn,ctx.scratch)
48 if cstr_eq(cn,rn)==0{
49 let replaced:i64=expand_imports_inner(ctx,argv[at+1] as *u8,0,-1)
50 if replaced<0{fsx_puts("REFUSED replacement-expansion code=");fsx_putn(replaced);fsx_puts("\n");return 6}
51 }
52 pair=pair+1
53 }
54 let rc:i64=expand_imports(ctx,root);if rc<0{fsx_puts("REFUSED root-expansion code=");fsx_putn(rc);fsx_puts("\n");return 7}
55 let used:*i64=ctx.out_pos;let n:i64=used[0];if n<1||n>=cap{return 8}
56 let written:i64=fxc_create(output,b,n);if written==FXC_EXISTS{let ln:*i64=sys_mmap(8) as *i64;let prior:*u8=sys_read_file(output,ln);if (prior as i64)==0||ln[0]!=n{return 9};if isa_equal(prior,b,n)!=1{return 9}}else{if written!=n{return 10}}
57 fsx_puts("IR-SUBSTITUTE OK bytes=");fsx_putn(n);fsx_puts(" cap=");fsx_putn(cap);fsx_puts(" pairs=");fsx_putn(pairs);fsx_puts(" modules=");let count:*i64=ctx.n_paths;fsx_putn(count[0]);fsx_puts(" canonical=");fsx_puts(canonical);fsx_puts(" candidate=");fsx_puts(replacement);fsx_puts(" root=");fsx_puts(root);fsx_puts(" output=");fsx_puts(output);fsx_puts("\n");return 0
58}