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}