code wiki / (root) / nx_ir_substitute_qualification_t206.nx

nx_ir_substitute_qualification_t206.nx source

↩ module page · 59 lines · 3748 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 // Pairs are dependency-first: this adapter preserves caller order, not a dependency solver. 34 // Seed every replaced canonical identity first so candidates cannot pull in another incumbent. 35 pair=0 36 while pair<pairs{ 37 let at:i64=isa_pair_arg(pair) 38 canonicalise_path(argv[at] as *u8,cn,ctx.scratch);canonicalise_path(argv[at+1] as *u8,rn,ctx.scratch) 39 if cstr_eq(cn,rn)==0{ 40 let np:*i64=ctx.n_paths;if import_add(ctx.paths,np[0],cn)==0{return 5} 41 ctx.path_alias[np[0]]=-1;np[0]=np[0]+1 42 } 43 pair=pair+1 44 } 45 pair=0 46 while pair<pairs{ 47 let at:i64=isa_pair_arg(pair) 48 canonicalise_path(argv[at] as *u8,cn,ctx.scratch);canonicalise_path(argv[at+1] as *u8,rn,ctx.scratch) 49 if cstr_eq(cn,rn)==0{ 50 let replaced:i64=expand_imports_inner(ctx,argv[at+1] as *u8,0,-1) 51 if replaced<0{fsx_puts("REFUSED replacement-expansion code=");fsx_putn(replaced);fsx_puts("\n");return 6} 52 } 53 pair=pair+1 54 } 55 let rc:i64=expand_imports(ctx,root);if rc<0{fsx_puts("REFUSED root-expansion code=");fsx_putn(rc);fsx_puts("\n");return 7} 56 let used:*i64=ctx.out_pos;let n:i64=used[0];if n<1||n>=cap{return 8} 57 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}} 58 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 59}