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}