code wiki / (root) / nx_paper_beat_all.nx

nx_paper_beat_all.nx source

↩ module page · 133 lines · 5251 B

1// nx_paper_beat_all.nx -- THE CLOCK-RUNNABLE FACE of the native paper library (2026-08-14). 2// nx_clockjob rows carry NO ARGV, so the beat needed an arg-free entry: this reads the SAME data 3// file the library page is compiled from (knowledge/cvf_listings.conf) and forks the promoted 4// nx_paper_beat once per listing with that listing's own cursor, so every proceeding drains in 5// parallel-by-rows and a new conference is still a conf edit, never a code edit. 6// Creates its own output dirs (the run that taught this needed a manual mkdir). 7// nx_paper_beat_all -- default slice PBA_LIMIT per listing per run 8// exit 0 ok | 3 refuse (named). license_tier: ORIGINAL. No hw writes (Rule 26). 9import "nx_syscalls.nx" 10 11const PBA_CONF: *u8 = "knowledge/cvf_listings.conf" 12const PBA_BEAT: *u8 = "/volume1/homes/elderwesto/nishihost/nx_paper_beat.elf" 13const PBA_LIMIT: *u8 = "60" 14const PBA_CAP: i64 = 65536 15 16func pa_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 17func pa_puts(s: *u8) -> i64 { sys_write(1, s, pa_len(s)); return 0 } 18func pa_num(v: i64) -> i64 { 19 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 20 var m: i64 = v 21 let t: *u8 = sys_mmap(32) 22 var k: i64 = 0 23 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 24 let o: *u8 = sys_mmap(32) 25 var i: i64 = 0 26 while i < k { o[i] = t[k - 1 - i]; i = i + 1 } 27 sys_write(1, o, k) 28 return 0 29} 30func pa_app(d: *u8, off: i64, s: *u8) -> i64 { 31 var i: i64 = 0 32 var o: i64 = off 33 while s[i] != (0 as u8) { d[o] = s[i]; o = o + 1; i = i + 1 } 34 return o 35} 36func pa_appn(d: *u8, off: i64, src: *u8, a: i64, b: i64) -> i64 { 37 var o: i64 = off 38 var i: i64 = a 39 while i < b { d[o] = src[i]; o = o + 1; i = i + 1 } 40 return o 41} 42func pa_appnum(d: *u8, off: i64, v: i64) -> i64 { 43 var o: i64 = off 44 if v == 0 { d[o] = 48 as u8; return o + 1 } 45 var m: i64 = v 46 let t: *u8 = sys_mmap(32) 47 var k: i64 = 0 48 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 49 while k > 0 { k = k - 1; d[o] = t[k]; o = o + 1 } 50 return o 51} 52func pa_find(src: *u8, a: i64, b: i64, pat: *u8) -> i64 { 53 let pl: i64 = pa_len(pat) 54 if pl == 0 { return 0 - 1 } 55 var i: i64 = a 56 while i + pl <= b { 57 var j: i64 = 0 58 var hit: i64 = 1 59 while j < pl { if src[i + j] != pat[j] { hit = 0; j = pl } else { j = j + 1 } } 60 if hit == 1 { return i } 61 i = i + 1 62 } 63 return 0 - 1 64} 65func pa_run(a1: *u8, a2: *u8, a3: *u8, a4: *u8) -> i64 { 66 let pid: i64 = sys_fork() 67 if pid == 0 { 68 let av: *i64 = sys_mmap(64) as *i64 69 let p0: *u8 = PBA_BEAT 70 av[0] = p0 as i64 71 av[1] = a1 as i64 72 av[2] = a2 as i64 73 av[3] = a3 as i64 74 av[4] = a4 as i64 75 av[5] = 0 76 let ep: *i64 = sys_mmap(16) as *i64 77 let e0: *u8 = "PATH=/usr/bin:/bin" as *u8 78 ep[0] = e0 as i64 79 ep[1] = 0 80 sys_execve(PBA_BEAT, av, ep) 81 sys_exit(127) 82 } 83 let st: *i64 = sys_mmap(16) as *i64 84 sys_wait4(pid, st, 0) 85 return wait_exit_code(st[0]) 86} 87 88func main() -> i64 { 89 sys_mkdir("knowledge/papers" as *u8, 0x1ed) 90 sys_mkdir("sites/nishifamily/papers" as *u8, 0x1ed) 91 let lp: *i64 = sys_mmap(16) as *i64 92 let mf: *u8 = sys_read_file(PBA_CONF, lp) 93 if (mf as i64) == 0 { pa_puts("PAPER-BEAT-ALL REFUSE: cannot read listings conf\n" as *u8); sys_exit(3); return 3 } 94 let n: i64 = lp[0] 95 let path: *u8 = sys_mmap(512) 96 let cur: *u8 = sys_mmap(512) 97 let pfx: *u8 = sys_mmap(64) 98 var rows: i64 = 0 99 var okrows: i64 = 0 100 var i: i64 = 0 101 while i < n { 102 var le: i64 = i 103 var sc: i64 = 1 104 while sc == 1 { if le >= n { sc = 0 } else { if mf[le] == (10 as u8) { sc = 0 } else { le = le + 1 } } } 105 if le > i { if mf[i] != (35 as u8) { 106 let tb: i64 = pa_find(mf, i, le, "\t" as *u8) 107 if tb > i { 108 let po: i64 = pa_appn(path, 0, mf, tb + 1, le) 109 path[po] = 0 as u8 110 var co: i64 = pa_app(cur, 0, "knowledge/papers/cur" as *u8) 111 co = pa_appnum(cur, co, rows) 112 co = pa_app(cur, co, ".txt" as *u8) 113 cur[co] = 0 as u8 114 pa_puts(" listing " as *u8); pa_num(rows); pa_puts(" -> " as *u8); pa_puts(path); pa_puts("\n" as *u8) 115 // per-listing name prefix: indices are per-listing, so a shared prefix makes 116 // listing B overwrite listing A at the same index (measured: ~120 lost) 117 var xo: i64 = pa_app(pfx, 0, "c" as *u8) 118 xo = pa_appnum(pfx, xo, rows) 119 xo = pa_app(pfx, xo, "p" as *u8) 120 pfx[xo] = 0 as u8 121 let rc: i64 = pa_run(path, PBA_LIMIT, cur, pfx) 122 if rc == 0 { okrows = okrows + 1 } 123 rows = rows + 1 124 } 125 } } 126 i = le + 1 127 } 128 if rows == 0 { pa_puts("PAPER-BEAT-ALL REFUSE: no listing rows\n" as *u8); sys_exit(3); return 3 } 129 pa_puts("PAPER-BEAT-ALL-OK listings=" as *u8); pa_num(rows) 130 pa_puts(" ok=" as *u8); pa_num(okrows) 131 pa_puts(" slice_per_listing=" as *u8); pa_puts(PBA_LIMIT); pa_puts("\n" as *u8) 132 return 0 133}