code wiki / _hdl_build / nx_map_delegate.nx
nx_map_delegate.nx source
↩ module page · 92 lines · 4029 B
1// nx_map_delegate.nx -- FULL-SCALE delegation conductor: apply the SAME rule-15 delegation (add a lib import
2// + remove a byte-identical helper block) to EVERY consumer in a list, in ONE run. SAFE BY CONSTRUCTION:
3// only edits a file where the block occurs EXACTLY ONCE and the anchor occurs EXACTLY ONCE; else SKIP
4// untouched (a non-matching organ never gets a half-edit / double-definition). Verify the batch by re-running
5// nx_funcmine (the dup group collapses) + compiling a consumer. license_tier: ORIGINAL No hw writes (Rule 26).
6import "nx_seat_drive_lib.nx"
7import "nx_deploy_lib.nx"
8import "nx_ge_str_lib.nx"
9import "nx_syscalls.nx"
10
11const MD_CAP: i64 = 1048576
12const MD_LIST: i64 = 131072
13const MD_PATH: i64 = 1024
14
15func md_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
16
17func md_one(path: *u8, block: *u8, bn: i64, anchor: *u8, an: i64, imp: *u8, in2: i64, work: *u8, tmp: *u8) -> i64 {
18 let n: i64 = dp_read(path, work, MD_CAP)
19 if n <= 0 { return 0 }
20 if ge_count(work, n, block, bn) != 1 { return 0 }
21 if ge_count(work, n, anchor, an) != 1 { return 0 }
22 let ap: i64 = ge_find(work, n, anchor, an, 0)
23 let insat: i64 = ap + an
24 var t: i64 = 0
25 var i: i64 = 0
26 while i < insat { tmp[t] = work[i]; t = t + 1; i = i + 1 }
27 tmp[t] = 10 as u8; t = t + 1
28 var m: i64 = 0
29 while m < in2 { tmp[t] = imp[m]; t = t + 1; m = m + 1 }
30 var z: i64 = insat
31 while z < n { tmp[t] = work[z]; t = t + 1; z = z + 1 }
32 let bp: i64 = ge_find(tmp, t, block, bn, 0)
33 if bp < 0 { return 0 }
34 var w: i64 = 0
35 var a: i64 = 0
36 while a < bp { work[w] = tmp[a]; w = w + 1; a = a + 1 }
37 var b: i64 = bp + bn
38 while b < t { work[w] = tmp[b]; w = w + 1; b = b + 1 }
39 if dp_writefile(path, work, w) < 0 { return 0 - 1 }
40 return 1
41}
42
43func main(argc: i64, argv: *i64) -> i64 {
44 if argc < 5 { sd_w("usage: nx_map_delegate <listfile> <blockfile> <anchor> <impline>\n" as *u8); sys_exit(2); return 2 }
45 let listp: *u8 = argv[1] as *u8
46 let blockp: *u8 = argv[2] as *u8
47 let anchor: *u8 = argv[3] as *u8
48 let imp: *u8 = argv[4] as *u8
49 if argc >= 6 { let ofd: i64 = sys_openat_wr(argv[5] as *u8, 0x1a4); if ofd >= 0 { sys_dup3(ofd, 1, 0) } }
50 let an: i64 = md_slen(anchor)
51 let in2: i64 = md_slen(imp)
52 let list: *u8 = sys_mmap(MD_LIST)
53 let ln: i64 = dp_read(listp, list, MD_LIST)
54 if ln <= 0 { sd_w("NX-MAP-DELEGATE list-absent. FIX: <listfile> = one consumer path per line.\n" as *u8); sys_exit(2); return 2 }
55 let block: *u8 = sys_mmap(MD_CAP)
56 let bn: i64 = dp_read(blockp, block, MD_CAP)
57 if bn <= 0 { sd_w("NX-MAP-DELEGATE block-absent. FIX: <blockfile> = the exact helper block to remove.\n" as *u8); sys_exit(2); return 2 }
58 let work: *u8 = sys_mmap(MD_CAP)
59 let tmp: *u8 = sys_mmap(MD_CAP)
60 let path: *u8 = sys_mmap(MD_PATH)
61 var edited: i64 = 0
62 var skipped: i64 = 0
63 var errs: i64 = 0
64 var i: i64 = 0
65 while i < ln {
66 var le: i64 = i
67 var f: i64 = 1
68 while f == 1 { if le >= ln { f = 0 } else { if list[le] == (10 as u8) { f = 0 } else { le = le + 1 } } }
69 if le > i {
70 var aa: i64 = 0
71 var p: i64 = i
72 while p < le { path[aa] = list[p]; aa = aa + 1; p = p + 1 }
73 path[aa] = 0 as u8
74 let r: i64 = md_one(path, block, bn, anchor, an, imp, in2, work, tmp)
75 if r == 1 { edited = edited + 1; sd_w("EDITED " as *u8); sd_w(path); sd_w("\n" as *u8) } else { if r == 0 { skipped = skipped + 1; sd_w("SKIP " as *u8); sd_w(path); sd_w("\n" as *u8) } else { errs = errs + 1; sd_w("IO-ERR " as *u8); sd_w(path); sd_w("\n" as *u8) } }
76 }
77 i = le
78 if i < ln { i = i + 1 }
79 }
80 sd_w("NX-MAP-DELEGATE edited=" as *u8)
81 let nb: *u8 = sys_mmap(24)
82 sd_num(nb, 0, edited)
83 sd_w(nb)
84 sd_w(" skipped=" as *u8)
85 sd_num(nb, 0, skipped)
86 sd_w(nb)
87 sd_w(" errs=" as *u8)
88 sd_num(nb, 0, errs)
89 sd_w(nb)
90 sd_w("\n" as *u8)
91 return 0
92}