nx_box_lib.nx source
↩ module page · 104 lines · 3939 B
1// nx_box_lib.nx -- Nishi Box (F503): matter-scoped LEGAL DMS on the immutable CID plane.
2// Adds the LEGAL layer ON TOP of the existing /office doc suite (nx_docx/xlsx/pptx storage):
3// matter-scoping, privilege/work-product tags, PRIVILEGE LOG generation (e-discovery), and
4// BATES numbering. Versioned by construction (CID plane). DRY: reuses nx_matter_lib helpers
5// (mt_field/mt_streq/mt_catcopy + reg_*/canon_encode). LIB (no main). license_tier: ORIGINAL
6
7import "nx_matter_lib.nx"
8const K_MAGIC_100000: i64 = 100000
9const K_MAGIC_2048: i64 = 2048
10const K_MAGIC_1048576: i64 = 1048576
11
12// Bates: "<PREFIX>-000001" (zero-padded 6 digits, per-matter sequential).
13func box_bates(prefix: *u8, seq: i64, out: *u8) -> i64 {
14 var o: i64 = mt_catcopy(out, 0, prefix)
15 out[o] = 45 as u8
16 o = o + 1
17 var d: i64 = K_MAGIC_100000
18 while d >= 1 {
19 out[o] = (48 + ((seq / d) % 10)) as u8
20 o = o + 1
21 d = d / 10
22 }
23 out[o] = 0 as u8
24 return o
25}
26
27// put a document scoped to a matter, with privilege tag + Bates. Key = "<matter>:<docid>".
28func box_doc_put(prefix: *u8, matter: *u8, docid: *u8, title: *u8, cid: *u8, priv: *u8, bates: *u8) -> i64 {
29 let did: *u8 = sys_mmap(128)
30 var o: i64 = mt_catcopy(did, 0, matter)
31 did[o] = 58 as u8
32 o = o + 1
33 o = mt_catcopy(did, o, docid)
34 did[o] = 0 as u8
35 let k: *i64 = sys_mmap(8 * 5) as *i64
36 let v: *i64 = sys_mmap(8 * 5) as *i64
37 k[0] = ("matter" as *u8) as i64
38 v[0] = matter as i64
39 k[1] = ("title" as *u8) as i64
40 v[1] = title as i64
41 k[2] = ("cid" as *u8) as i64
42 v[2] = cid as i64
43 k[3] = ("privilege" as *u8) as i64
44 v[3] = priv as i64
45 k[4] = ("bates" as *u8) as i64
46 v[4] = bates as i64
47 let rec: *u8 = sys_mmap(K_MAGIC_2048)
48 let rl: i64 = canon_encode(k, v, 5, rec)
49 return reg_put(prefix, "doc:" as *u8, "doc:__idx__" as *u8, did, rec, rl)
50}
51
52// scan a matter's documents: returns total; priv_out[0]=privileged count; batesbuf gets the
53// PRIVILEGE LOG (newline-sep Bates numbers of privileged docs = the e-discovery deliverable).
54func box_matter_scan(prefix: *u8, matter: *u8, priv_out: *i64, batesbuf: *u8) -> i64 {
55 let idx: *u8 = sys_mmap(K_MAGIC_1048576)
56 let ilen: i64 = reg_index(prefix, "doc:__idx__" as *u8, idx, K_MAGIC_1048576)
57 let mp: *u8 = sys_mmap(128)
58 var mpl: i64 = mt_catcopy(mp, 0, matter)
59 mp[mpl] = 58 as u8
60 mpl = mpl + 1
61 mp[mpl] = 0 as u8
62 let idb: *u8 = sys_mmap(256)
63 let po: *i64 = sys_mmap(16) as *i64
64 let lo: *i64 = sys_mmap(16) as *i64
65 let pf: *u8 = sys_mmap(128)
66 var total: i64 = 0
67 var npriv: i64 = 0
68 var bo: i64 = 0
69 var ls: i64 = 0
70 var i: i64 = 0
71 while i <= ilen {
72 var eol: i64 = 0
73 if i == ilen { eol = 1 }
74 if i < ilen { if idx[i] == 10 as u8 { eol = 1 } }
75 if eol == 1 {
76 if i > ls {
77 var c: i64 = 0
78 while ls + c < i { idb[c] = idx[ls + c]; c = c + 1 }
79 idb[c] = 0 as u8
80 var mtch: i64 = 1
81 var x: i64 = 0
82 while mp[x] != (0 as u8) { if idb[x] != mp[x] { mtch = 0 } x = x + 1 }
83 if mtch == 1 {
84 if reg_get(prefix, "doc:" as *u8, idb, po, lo) == 1 {
85 total = total + 1
86 mt_field(po[0] as *u8, lo[0], "privilege" as *u8, 9, pf)
87 if mt_streq(pf, "yes" as *u8) == 1 {
88 npriv = npriv + 1
89 mt_field(po[0] as *u8, lo[0], "bates" as *u8, 5, pf)
90 bo = mt_catcopy(batesbuf, bo, pf)
91 batesbuf[bo] = 10 as u8
92 bo = bo + 1
93 }
94 }
95 }
96 }
97 ls = i + 1
98 }
99 i = i + 1
100 }
101 batesbuf[bo] = 0 as u8
102 priv_out[0] = npriv
103 return total
104}