code wiki / _hdl_build / nx_build_reg_sov.nx
nx_build_reg_sov.nx source
↩ module page · 121 lines · 6574 B
1// nx_build_reg_sov.nx -- SOVEREIGN build-registrar library on nx_seg_store (operator law: no flat files,
2// nishi ecosystem only -- [[feedback-no-tsv-sovereign-seg-store]]). Replaces the build_registry.log
3// fa_appendz flat log. Each organ is a key "br:<organ>" -> value "owner|parent|state"; the full id list is
4// the value of "br:ids" (space-delimited). Writes via ss_begin/ss_add/ss_commit (read-append the ids list +
5// write the record in one commit, latest-wins by segid = idempotent). Reads via ss_get_cap. Pure lib, no main.
6// Consumers: nx_build_reg_sov_gate (self-test) + the migrated govern/rooted/evidence/imports. license_tier: ORIGINAL
7import "nx_seg_store.nx"
8import "nx_syscalls.nx"
9
10const BR2_SCAN: i64 = 260 // max segments to scan
11const BR2_SLOT: i64 = 256
12const BR2_IDS: i64 = 262144 // ids list buffer
13
14func br2_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
15func br2_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } if b[i] != (0 as u8) { return 0 } return 1 }
16func br2_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64 = off; var i: i64 = 0; while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } return o }
17// key = "br:" + organ
18func br2_key(organ: *u8, out: *u8) -> i64 { out[0] = 98 as u8; out[1] = 114 as u8; out[2] = 58 as u8; var o: i64 = 3; var i: i64 = 0; while organ[i] != (0 as u8) { out[o] = organ[i]; o = o + 1; i = i + 1 } out[o] = 0 as u8; return 0 }
19// read a key's raw value into out (NUL-term, capped). returns len, or -1 if absent.
20func br2_get_raw(prefix: *u8, key: *u8, out: *u8, outcap: i64) -> i64 {
21 let pq: *i64 = sys_mmap(16) as *i64; let lq: *i64 = sys_mmap(16) as *i64
22 let r: i64 = ss_get_cap(prefix, key, pq, lq, BR2_SCAN)
23 if r != 1 { out[0] = 0 as u8; return 0 - 1 }
24 let ptr: *u8 = pq[0] as *u8; let len: i64 = lq[0]
25 var i: i64 = 0
26 while i < len { if i < outcap - 1 { out[i] = ptr[i] } i = i + 1 }
27 var w: i64 = len; if w > outcap - 1 { w = outcap - 1 }
28 out[w] = 0 as u8
29 return len
30}
31// the idx-th '|'-field of a NUL-term record into out
32func br2_field(rec: *u8, idx: i64, out: *u8) -> i64 {
33 var f: i64 = 0; var i: i64 = 0
34 while f < idx { if rec[i] == (0 as u8) { out[0] = 0 as u8; return 0 } if rec[i] == (124 as u8) { f = f + 1 } i = i + 1 }
35 var o: i64 = 0; var g: i64 = 1
36 while g == 1 { let c: i64 = rec[i] as i64; if c == 0 { g = 0 } else { if c == 124 { g = 0 } else { out[o] = rec[i]; o = o + 1; i = i + 1 } } }
37 out[o] = 0 as u8; return 1
38}
39// is `organ` a token in the space-delimited ids[0..n)?
40func br2_ids_has(ids: *u8, n: i64, organ: *u8) -> i64 {
41 var i: i64 = 0
42 while i < n {
43 let s: i64 = i
44 var g: i64 = 1
45 while g == 1 { if i >= n { g = 0 } else { if ids[i] == (32 as u8) { g = 0 } else { i = i + 1 } } }
46 // compare ids[s..i) to organ
47 var eq: i64 = 1; var a: i64 = s; var b: i64 = 0
48 while a < i { if organ[b] == (0 as u8) { eq = 0; a = i } else { if ids[a] != organ[b] { eq = 0; a = i } else { a = a + 1; b = b + 1 } } }
49 if eq == 1 { if organ[b] == (0 as u8) { return 1 } }
50 i = i + 1
51 }
52 return 0
53}
54
55// THE INTAKE: write br:<organ> = owner|parent|state and append organ to br:ids, one commit.
56func br2_submit_lin(prefix: *u8, organ: *u8, owner: *u8, parent: *u8, state: *u8) -> i64 {
57 let ids: *u8 = sys_mmap(BR2_IDS)
58 let il: i64 = br2_get_raw(prefix, "br:ids" as *u8, ids, BR2_IDS)
59 var n: i64 = il; if n < 0 { n = 0 }
60 if br2_ids_has(ids, n, organ) == 0 {
61 var i: i64 = 0; while organ[i] != (0 as u8) { ids[n] = organ[i]; n = n + 1; i = i + 1 }
62 ids[n] = 32 as u8; n = n + 1
63 }
64 let rec: *u8 = sys_mmap(512); var o: i64 = 0
65 o = br2_cat(rec, o, owner); rec[o] = 124 as u8; o = o + 1; o = br2_cat(rec, o, parent); rec[o] = 124 as u8; o = o + 1; o = br2_cat(rec, o, state)
66 let key: *u8 = sys_mmap(320); br2_key(organ, key)
67 let w: *i64 = ss_begin()
68 ss_add(w, 1, key, rec, o)
69 ss_add(w, 1, "br:ids" as *u8, ids, n)
70 ss_commit(prefix, w, sys_now_realtime_sec())
71 return 0
72}
73func br2_submit(prefix: *u8, organ: *u8, owner: *u8, state: *u8) -> i64 { return br2_submit_lin(prefix, organ, owner, "DESC-ORGANS" as *u8, state) }
74
75func br2_registered(prefix: *u8, organ: *u8) -> i64 {
76 let key: *u8 = sys_mmap(320); br2_key(organ, key)
77 let pq: *i64 = sys_mmap(16) as *i64; let lq: *i64 = sys_mmap(16) as *i64
78 if ss_get_cap(prefix, key, pq, lq, BR2_SCAN) == 1 { return 1 }
79 return 0
80}
81func br2_get_field(prefix: *u8, organ: *u8, idx: i64, out: *u8) -> i64 {
82 let key: *u8 = sys_mmap(320); br2_key(organ, key)
83 let rec: *u8 = sys_mmap(512)
84 if br2_get_raw(prefix, key, rec, 512) < 0 { out[0] = 0 as u8; return 0 }
85 br2_field(rec, idx, out); return 1
86}
87func br2_get_state(prefix: *u8, organ: *u8, out: *u8) -> i64 { return br2_get_field(prefix, organ, 2, out) }
88func br2_get_parent(prefix: *u8, organ: *u8, out: *u8) -> i64 { return br2_get_field(prefix, organ, 1, out) }
89// count distinct organs = space-delimited tokens in br:ids
90func br2_distinct(prefix: *u8) -> i64 {
91 let ids: *u8 = sys_mmap(BR2_IDS)
92 let n: i64 = br2_get_raw(prefix, "br:ids" as *u8, ids, BR2_IDS)
93 if n <= 0 { return 0 }
94 var cnt: i64 = 0; var i: i64 = 0
95 while i < n {
96 if ids[i] != (32 as u8) { cnt = cnt + 1; var g: i64 = 1; while g == 1 { if i >= n { g = 0 } else { if ids[i] == (32 as u8) { g = 0 } else { i = i + 1 } } } }
97 i = i + 1
98 }
99 return cnt
100}
101// enumerate organs -> names[] (ptrs), parents[] (ptrs). returns count. (states omitted for brevity; use br2_get_state)
102func br2_enum(prefix: *u8, names: *i64, parents: *i64, cap: i64) -> i64 {
103 let ids: *u8 = sys_mmap(BR2_IDS)
104 let n: i64 = br2_get_raw(prefix, "br:ids" as *u8, ids, BR2_IDS)
105 if n <= 0 { return 0 }
106 var cnt: i64 = 0; var i: i64 = 0
107 while i < n {
108 if ids[i] != (32 as u8) {
109 let s: i64 = i; var g: i64 = 1
110 while g == 1 { if i >= n { g = 0 } else { if ids[i] == (32 as u8) { g = 0 } else { i = i + 1 } } }
111 if cnt < cap {
112 let nb: *u8 = sys_mmap(BR2_SLOT); var w: i64 = 0; var a: i64 = s
113 while a < i { if w < BR2_SLOT - 1 { nb[w] = ids[a]; w = w + 1 } a = a + 1 } nb[w] = 0 as u8
114 let pb: *u8 = sys_mmap(BR2_SLOT); br2_get_parent(prefix, nb, pb)
115 names[cnt] = nb as i64; parents[cnt] = pb as i64; cnt = cnt + 1
116 }
117 }
118 i = i + 1
119 }
120 return cnt
121}