code wiki / _hdl_build / nx_vizsla_doc.nx
nx_vizsla_doc.nx source
↩ module page · 554 lines · 19499 B
1// nx_vizsla_doc.nx -- NISHI VIZSLA DOCUMENT MANAGEMENT: never-lose documents on the additive plane.
2// Operator 2026-07-08: "mcp level apis along with document management". Documents (venue contracts,
3// invite letters, mail-merge output, plans) live as CID records on the SAME tamper-evident seg_store
4// plane as everything else: ADDITIVE-ONLY (law 13 -- a new upload of the same docid = a NEW VERSION,
5// old bytes never destroyed), content-addressed (identical re-put dedups = idempotent law 10),
6// byte-exact round-trip (binary-safe: values are length-prefixed, not NUL-terminated).
7// Docs link to the coordination entities via rel (venue:lakeday / plan:summer / event:launch / -).
8//
9// Commands:
10// put <prefix> <docid> <file> <doctype> <rel> <date YYYY-MM-DD> [segid]
11// get <prefix> <docid> <out> latest version bytes -> out (byte-exact)
12// history <prefix> <docid> every version: date + bytes + doctype + rel
13// list <prefix> <rel|-> latest version per docid (rel-filtered or all)
14// Loud-fail: missing file, bad date, unknown docid, oversize (> DOC_MAX -- honest cap, chunking
15// = a later rung), empty store on list.
16// DOC_MAX = 524288 bytes (contracts/letters/exports; large media belongs to the gallery plane).
17// spec: knowledge/research/2026-06-22-vizsla-sclass-roadmap.md license_tier: ORIGINAL
18import "nx_syscalls.nx"
19import "nx_canon_cid.nx"
20import "nx_seg_store.nx"
21const K_MAGIC_1970: i64 = 1970
22const K_MAGIC_146097: i64 = 146097
23const K_MAGIC_719468: i64 = 719468
24const K_MAGIC_524288: i64 = 524288
25const K_MAGIC_4096: i64 = 4096
26const K_MAGIC_1024: i64 = 1024
27const K_MAGIC_65536: i64 = 65536
28
29func vd_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
30func vd_p(s: *u8) -> i64 { sys_write(1, s, vd_slen(s)); return 0 }
31
32func vd_eq(a: *u8, b: *u8) -> i64 {
33 var i: i64 = 0
34 var go: i64 = 1
35 while go == 1 {
36 if a[i] != b[i] { return 0 }
37 if a[i] == (0 as u8) { return 1 }
38 i = i + 1
39 }
40 return 0
41}
42
43func vd_dup(s: *u8) -> *u8 {
44 let n: i64 = vd_slen(s)
45 let d: *u8 = sys_mmap(n + 2)
46 var i: i64 = 0
47 while i <= n { d[i] = s[i]; i = i + 1 }
48 return d
49}
50
51func vd_atoi(s: *u8) -> i64 {
52 var v: i64 = 0
53 var i: i64 = 0
54 while s[i] != (0 as u8) {
55 let d: i64 = (s[i] as i64) - 48
56 if d >= 0 { if d <= 9 { v = v * 10 + d } }
57 i = i + 1
58 }
59 return v
60}
61
62func vd_cat(dst: *u8, off: i64, s: *u8) -> i64 {
63 var i: i64 = 0
64 while s[i] != (0 as u8) { dst[off + i] = s[i]; i = i + 1 }
65 return off + i
66}
67
68func vd_catn(dst: *u8, off: i64, v: i64) -> i64 {
69 var o: i64 = off
70 var m: i64 = v
71 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m }
72 let t: *u8 = sys_mmap(28)
73 var k: i64 = 0
74 if m == 0 { t[0] = 48 as u8; k = 1 }
75 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
76 var i: i64 = 0
77 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
78 return o + k
79}
80
81func vd_kmemeq(b: *u8, off: i64, n: i64, s: *u8) -> i64 {
82 if vd_slen(s) != n { return 0 }
83 var i: i64 = 0
84 while i < n {
85 if b[off + i] != s[i] { return 0 }
86 i = i + 1
87 }
88 return 1
89}
90
91// field lookup returning OFFSET+LEN (binary-safe -- no NUL-terminated copy of the value)
92func vd_field_span(rec: *u8, rl: i64, want: *u8, offp: *i64, lenp: *i64) -> i64 {
93 if rl < 8 { return 0 }
94 let nf: i64 = ss_r32(rec, 4)
95 var off: i64 = 8
96 var fi: i64 = 0
97 while fi < nf {
98 if off + 8 > rl { return 0 }
99 let kl: i64 = ss_r32(rec, off)
100 let koff: i64 = off + 4
101 let vl: i64 = ss_r32(rec, koff + kl)
102 let voff: i64 = koff + kl + 4
103 if vd_kmemeq(rec, koff, kl, want) == 1 {
104 offp[0] = voff
105 lenp[0] = vl
106 return 1
107 }
108 off = voff + vl
109 fi = fi + 1
110 }
111 return 0
112}
113
114func vd_field(rec: *u8, rl: i64, want: *u8, out: *u8, cap: i64) -> i64 {
115 let op: *i64 = sys_mmap(16) as *i64
116 let lp: *i64 = sys_mmap(16) as *i64
117 if vd_field_span(rec, rl, want, op, lp) == 0 { return 0 }
118 var t: i64 = 0
119 while t < lp[0] {
120 if t < cap - 1 { out[t] = rec[op[0] + t] }
121 t = t + 1
122 }
123 if t > cap - 1 { t = cap - 1 }
124 out[t] = 0 as u8
125 return 1
126}
127
128func vd_iskind(b: *u8, koff: i64, kl: i64, pfx: *u8) -> i64 {
129 if kl <= 4 { return 0 }
130 return vd_kmemeq(b, koff, 4, pfx)
131}
132
133func vd_datedays(s: *u8) -> i64 {
134 let nums: *i64 = sys_mmap(8 * 4) as *i64
135 var nn: i64 = 0
136 var cur: i64 = 0
137 var indig: i64 = 0
138 var i: i64 = 0
139 var go: i64 = 1
140 while go == 1 {
141 let c: i64 = s[i] as i64
142 var isd: i64 = 0
143 if c >= 48 { if c <= 57 { isd = 1 } }
144 if isd == 1 { cur = cur * 10 + (c - 48); indig = 1 }
145 if isd == 0 {
146 if indig == 1 {
147 if nn < 4 { nums[nn] = cur; nn = nn + 1 }
148 cur = 0
149 indig = 0
150 }
151 }
152 if c == 0 { go = 0 }
153 i = i + 1
154 }
155 if nn != 3 { return 0 - 1 }
156 var y: i64 = nums[0]
157 let m: i64 = nums[1]
158 let d: i64 = nums[2]
159 if y < K_MAGIC_1970 { return 0 - 1 }
160 if m < 1 { return 0 - 1 }
161 if m > 12 { return 0 - 1 }
162 if d < 1 { return 0 - 1 }
163 if d > 31 { return 0 - 1 }
164 if m <= 2 { y = y - 1 }
165 let era: i64 = y / 400
166 let yoe: i64 = y - era * 400
167 var mp: i64 = m - 3
168 if m <= 2 { mp = m + 9 }
169 let doy: i64 = (153 * mp + 2) / 5 + d - 1
170 let doe: i64 = yoe * 365 + yoe / 4 - yoe / 100 + doy
171 return era * K_MAGIC_146097 + doe - K_MAGIC_719468
172}
173
174func vd_find(list: *i64, n: i64, s: *u8) -> i64 {
175 var i: i64 = 0
176 while i < n {
177 if vd_eq(list[i] as *u8, s) == 1 { return i }
178 i = i + 1
179 }
180 return 0 - 1
181}
182
183// u32 stores use ss_w32 (BIG-endian, the exact wire shape ss_r32 reads)
184
185// ---------------- PUT ----------------
186func vd_cmd_put(argc: i64, argv: *i64) -> i64 {
187 if argc < 8 { vd_p("VIZSLA-DOC put needs <prefix> <docid> <file> <doctype> <rel> <date> -- fail loud\n" as *u8); return 1 }
188 let prefix: *u8 = argv[2] as *u8
189 let docid: *u8 = argv[3] as *u8
190 let file: *u8 = argv[4] as *u8
191 let dtype: *u8 = argv[5] as *u8
192 let rel: *u8 = argv[6] as *u8
193 let date: *u8 = argv[7] as *u8
194 if vd_datedays(date) < 0 { vd_p("VIZSLA-DOC put bad date -- fail loud\n" as *u8); return 1 }
195 var segid: i64 = 0
196 if argc > 8 { segid = vd_atoi(argv[8] as *u8) }
197 if segid == 0 { segid = sys_now_us() }
198
199 let szp: *i64 = sys_mmap(16) as *i64
200 let content: *u8 = ss_readall(file, szp)
201 let csz: i64 = szp[0]
202 if csz <= 0 { vd_p("VIZSLA-DOC file MISSING/EMPTY -- fail loud\n" as *u8); return 1 }
203 if csz > K_MAGIC_524288 { vd_p("VIZSLA-DOC file exceeds DOC_MAX 524288 (chunking = later rung) -- fail loud\n" as *u8); return 1 }
204
205 // canon record: docid/doctype/rel/date are cstrings; content is raw bytes (length-prefixed)
206 let keys: *i64 = sys_mmap(8 * 8) as *i64
207 let vals: *i64 = sys_mmap(8 * 8) as *i64
208 let lens: *i64 = sys_mmap(8 * 8) as *i64
209 keys[0] = "kind" as *u8 as i64
210 keys[1] = "docid" as *u8 as i64
211 keys[2] = "doctype" as *u8 as i64
212 keys[3] = "rel" as *u8 as i64
213 keys[4] = "date" as *u8 as i64
214 keys[5] = "content" as *u8 as i64
215 vals[0] = "doc" as *u8 as i64
216 vals[1] = docid as i64
217 vals[2] = dtype as i64
218 vals[3] = rel as i64
219 vals[4] = date as i64
220 vals[5] = content as i64
221 lens[0] = 3
222 lens[1] = vd_slen(docid)
223 lens[2] = vd_slen(dtype)
224 lens[3] = vd_slen(rel)
225 lens[4] = vd_slen(date)
226 lens[5] = csz
227
228 // hand-encode the record (canon_encode is cstring-based; content is binary so we frame
229 // the SAME wire shape ourselves: u32 nf, then per field u32 klen,key,u32 vlen,val)
230 let enc: *u8 = sys_mmap(csz + K_MAGIC_4096)
231 var o: i64 = 0
232 ss_w32(enc, 0, 0)
233 ss_w32(enc, 4, 6)
234 o = 8
235 var f: i64 = 0
236 while f < 6 {
237 let k: *u8 = keys[f] as *u8
238 let kl: i64 = vd_slen(k)
239 ss_w32(enc, o, kl)
240 o = o + 4
241 var i: i64 = 0
242 while i < kl { enc[o + i] = k[i]; i = i + 1 }
243 o = o + kl
244 ss_w32(enc, o, lens[f])
245 o = o + 4
246 let v: *u8 = vals[f] as *u8
247 i = 0
248 while i < lens[f] { enc[o + i] = v[i]; i = i + 1 }
249 o = o + lens[f]
250 f = f + 1
251 }
252 let el: i64 = o
253
254 let cid: *u8 = sys_mmap(96)
255 cid_of(enc, el, cid)
256 let kbuf: *u8 = sys_mmap(160)
257 var ko: i64 = 0
258 ko = vd_cat(kbuf, ko, "doc:" as *u8)
259 ko = vd_cat(kbuf, ko, cid)
260 kbuf[ko] = 0 as u8
261
262 var fresh: i64 = 1
263 let pp: *i64 = sys_mmap(16) as *i64
264 let ll: *i64 = sys_mmap(16) as *i64
265 if ss_get_idx(prefix, kbuf, pp, ll) == 1 { fresh = 0 }
266 var committed: i64 = 0
267 if fresh == 1 {
268 let w: *i64 = ss_begin()
269 if ss_add(w, 1, kbuf, enc, el) != 0 { vd_p("VIZSLA-DOC writer full -- fail loud\n" as *u8); return 1 }
270 if ss_commit(prefix, w, segid) != 0 { vd_p("VIZSLA-DOC commit FAILED -- fail loud\n" as *u8); return 1 }
271 committed = 1
272 }
273
274 let rep: *u8 = sys_mmap(K_MAGIC_1024)
275 var ro: i64 = 0
276 ro = vd_cat(rep, ro, "VIZSLA-DOC-PUT docid=" as *u8)
277 ro = vd_cat(rep, ro, docid)
278 ro = vd_cat(rep, ro, " doctype=" as *u8)
279 ro = vd_cat(rep, ro, dtype)
280 ro = vd_cat(rep, ro, " rel=" as *u8)
281 ro = vd_cat(rep, ro, rel)
282 ro = vd_cat(rep, ro, " date=" as *u8)
283 ro = vd_cat(rep, ro, date)
284 ro = vd_cat(rep, ro, " bytes=" as *u8)
285 ro = vd_catn(rep, ro, csz)
286 ro = vd_cat(rep, ro, " new=" as *u8)
287 ro = vd_catn(rep, ro, committed)
288 ro = vd_cat(rep, ro, " segment=" as *u8)
289 if committed == 1 {
290 ro = vd_cat(rep, ro, "seg-" as *u8)
291 ro = vd_catn(rep, ro, segid)
292 } else {
293 ro = vd_cat(rep, ro, "none" as *u8)
294 }
295 ro = vd_cat(rep, ro, "\n" as *u8)
296 sys_write(1, rep, ro)
297 return 0
298}
299
300// walk all doc: records for prefix; per match call is inlined by the three consumers below.
301// st slots: 0=n 1=docid[] 2=doctype[] 3=rel[] 4=date[] 5=days[] 6=bytes[] 7=segbuf-ptr[] 8=coff[] 9=clen[]
302func vd_gather(prefix: *u8, st: *i64) -> i64 {
303 let segs: *i64 = sys_mmap(8 * 260) as *i64
304 let ns: i64 = ss_manifest(prefix, segs)
305 let fid: *u8 = sys_mmap(256)
306 let fty: *u8 = sys_mmap(256)
307 let fre: *u8 = sys_mmap(256)
308 let fdt: *u8 = sys_mmap(128)
309 let op: *i64 = sys_mmap(16) as *i64
310 let lp: *i64 = sys_mmap(16) as *i64
311 var s: i64 = 0
312 while s < ns {
313 let path: *u8 = sys_mmap(512)
314 var po: i64 = 0
315 po = vd_cat(path, po, prefix)
316 po = vd_cat(path, po, segs[s] as *u8)
317 po = vd_cat(path, po, ".docs" as *u8)
318 path[po] = 0 as u8
319 let szp: *i64 = sys_mmap(16) as *i64
320 let b: *u8 = ss_readall(path, szp)
321 let sz: i64 = szp[0]
322 var j: i64 = 0
323 while j + 9 <= sz {
324 let kind: i64 = b[j]
325 let kl: i64 = ss_r32(b, j + 1)
326 let koff: i64 = j + 5
327 let vl: i64 = ss_r32(b, koff + kl)
328 let voff: i64 = koff + kl + 4
329 var take: i64 = 0
330 if kind == 1 { take = vd_iskind(b, koff, kl, "doc:" as *u8) }
331 if take == 1 {
332 let rec: *u8 = (b as i64 + voff) as *u8
333 let n: i64 = st[0]
334 if n < 256 {
335 vd_field(rec, vl, "docid" as *u8, fid, 256)
336 vd_field(rec, vl, "doctype" as *u8, fty, 256)
337 vd_field(rec, vl, "rel" as *u8, fre, 256)
338 vd_field(rec, vl, "date" as *u8, fdt, 128)
339 let ids: *i64 = st[1] as *i64
340 let tys: *i64 = st[2] as *i64
341 let res: *i64 = st[3] as *i64
342 let dts: *i64 = st[4] as *i64
343 let dys: *i64 = st[5] as *i64
344 let bys: *i64 = st[6] as *i64
345 let bp: *i64 = st[7] as *i64
346 let cof: *i64 = st[8] as *i64
347 let cln: *i64 = st[9] as *i64
348 let d1: *u8 = vd_dup(fid)
349 let d2: *u8 = vd_dup(fty)
350 let d3: *u8 = vd_dup(fre)
351 let d4: *u8 = vd_dup(fdt)
352 ids[n] = d1 as i64
353 tys[n] = d2 as i64
354 res[n] = d3 as i64
355 dts[n] = d4 as i64
356 dys[n] = vd_datedays(fdt)
357 var cl: i64 = 0
358 if vd_field_span(rec, vl, "content" as *u8, op, lp) == 1 {
359 cl = lp[0]
360 bp[n] = rec as i64
361 cof[n] = op[0]
362 } else {
363 bp[n] = 0
364 cof[n] = 0
365 }
366 bys[n] = cl
367 cln[n] = cl
368 st[0] = n + 1
369 }
370 }
371 j = voff + vl
372 }
373 s = s + 1
374 }
375 return 0
376}
377
378func vd_alloc_state() -> *i64 {
379 let st: *i64 = sys_mmap(8 * 12) as *i64
380 st[0] = 0
381 st[1] = sys_mmap(8 * 256)
382 st[2] = sys_mmap(8 * 256)
383 st[3] = sys_mmap(8 * 256)
384 st[4] = sys_mmap(8 * 256)
385 st[5] = sys_mmap(8 * 256)
386 st[6] = sys_mmap(8 * 256)
387 st[7] = sys_mmap(8 * 256)
388 st[8] = sys_mmap(8 * 256)
389 st[9] = sys_mmap(8 * 256)
390 return st
391}
392
393// index of the LATEST version of docid (max date; ties -> later store order); -1 if absent
394func vd_latest(st: *i64, docid: *u8) -> i64 {
395 let ids: *i64 = st[1] as *i64
396 let dys: *i64 = st[5] as *i64
397 var best: i64 = 0 - 1
398 var i: i64 = 0
399 while i < st[0] {
400 if vd_eq(ids[i] as *u8, docid) == 1 {
401 if best < 0 { best = i } else {
402 if dys[i] >= dys[best] { best = i }
403 }
404 }
405 i = i + 1
406 }
407 return best
408}
409
410// ---------------- GET ----------------
411func vd_cmd_get(argc: i64, argv: *i64) -> i64 {
412 if argc < 5 { vd_p("VIZSLA-DOC get needs <prefix> <docid> <out> -- fail loud\n" as *u8); return 1 }
413 let prefix: *u8 = argv[2] as *u8
414 let docid: *u8 = argv[3] as *u8
415 let outp: *u8 = argv[4] as *u8
416 let st: *i64 = vd_alloc_state()
417 vd_gather(prefix, st)
418 let hit: i64 = vd_latest(st, docid)
419 if hit < 0 { vd_p("VIZSLA-DOC get UNKNOWN docid -- fail loud\n" as *u8); return 1 }
420 let bp: *i64 = st[7] as *i64
421 let cof: *i64 = st[8] as *i64
422 let cln: *i64 = st[9] as *i64
423 let rec: *u8 = bp[hit] as *u8
424 let fd: i64 = sys_openat_wr(outp, 0x1a4)
425 if fd < 0 { vd_p("VIZSLA-DOC cannot write out -- fail loud\n" as *u8); return 1 }
426 sys_write(fd, (rec as i64 + cof[hit]) as *u8, cln[hit])
427 sys_close(fd)
428 let dts: *i64 = st[4] as *i64
429 let tys: *i64 = st[2] as *i64
430 let rep: *u8 = sys_mmap(K_MAGIC_1024)
431 var ro: i64 = 0
432 ro = vd_cat(rep, ro, "VIZSLA-DOC-GET docid=" as *u8)
433 ro = vd_cat(rep, ro, docid)
434 ro = vd_cat(rep, ro, " doctype=" as *u8)
435 ro = vd_cat(rep, ro, tys[hit] as *u8)
436 ro = vd_cat(rep, ro, " date=" as *u8)
437 ro = vd_cat(rep, ro, dts[hit] as *u8)
438 ro = vd_cat(rep, ro, " bytes=" as *u8)
439 ro = vd_catn(rep, ro, cln[hit])
440 ro = vd_cat(rep, ro, " -> " as *u8)
441 ro = vd_cat(rep, ro, outp)
442 ro = vd_cat(rep, ro, "\n" as *u8)
443 sys_write(1, rep, ro)
444 return 0
445}
446
447// ---------------- HISTORY ----------------
448func vd_cmd_history(argc: i64, argv: *i64) -> i64 {
449 if argc < 4 { vd_p("VIZSLA-DOC history needs <prefix> <docid> -- fail loud\n" as *u8); return 1 }
450 let prefix: *u8 = argv[2] as *u8
451 let docid: *u8 = argv[3] as *u8
452 let st: *i64 = vd_alloc_state()
453 vd_gather(prefix, st)
454 let ids: *i64 = st[1] as *i64
455 let tys: *i64 = st[2] as *i64
456 let res: *i64 = st[3] as *i64
457 let dts: *i64 = st[4] as *i64
458 let bys: *i64 = st[6] as *i64
459 let rep: *u8 = sys_mmap(K_MAGIC_65536)
460 var o: i64 = 0
461 var cnt: i64 = 0
462 var i: i64 = 0
463 while i < st[0] {
464 if vd_eq(ids[i] as *u8, docid) == 1 {
465 o = vd_cat(rep, o, "VIZSLA-DOC-VERSION docid=" as *u8)
466 o = vd_cat(rep, o, docid)
467 o = vd_cat(rep, o, " date=" as *u8)
468 o = vd_cat(rep, o, dts[i] as *u8)
469 o = vd_cat(rep, o, " doctype=" as *u8)
470 o = vd_cat(rep, o, tys[i] as *u8)
471 o = vd_cat(rep, o, " rel=" as *u8)
472 o = vd_cat(rep, o, res[i] as *u8)
473 o = vd_cat(rep, o, " bytes=" as *u8)
474 o = vd_catn(rep, o, bys[i])
475 o = vd_cat(rep, o, "\n" as *u8)
476 cnt = cnt + 1
477 }
478 i = i + 1
479 }
480 if cnt == 0 { vd_p("VIZSLA-DOC history UNKNOWN docid -- fail loud\n" as *u8); return 1 }
481 o = vd_cat(rep, o, "VIZSLA-DOC-HISTORY docid=" as *u8)
482 o = vd_cat(rep, o, docid)
483 o = vd_cat(rep, o, " versions=" as *u8)
484 o = vd_catn(rep, o, cnt)
485 o = vd_cat(rep, o, "\n" as *u8)
486 sys_write(1, rep, o)
487 return 0
488}
489
490// ---------------- LIST ----------------
491func vd_cmd_list(argc: i64, argv: *i64) -> i64 {
492 if argc < 4 { vd_p("VIZSLA-DOC list needs <prefix> <rel|-> -- fail loud\n" as *u8); return 1 }
493 let prefix: *u8 = argv[2] as *u8
494 let relf: *u8 = argv[3] as *u8
495 let st: *i64 = vd_alloc_state()
496 vd_gather(prefix, st)
497 if st[0] == 0 { vd_p("VIZSLA-DOC list EMPTY store -- fail loud\n" as *u8); return 1 }
498 let ids: *i64 = st[1] as *i64
499 let tys: *i64 = st[2] as *i64
500 let res: *i64 = st[3] as *i64
501 let dts: *i64 = st[4] as *i64
502 let bys: *i64 = st[6] as *i64
503 let seenids: *i64 = sys_mmap(8 * 256) as *i64
504 var nseen: i64 = 0
505 let rep: *u8 = sys_mmap(K_MAGIC_65536)
506 var o: i64 = 0
507 var cnt: i64 = 0
508 var i: i64 = 0
509 while i < st[0] {
510 let id: *u8 = ids[i] as *u8
511 if vd_find(seenids, nseen, id) < 0 {
512 seenids[nseen] = id as i64
513 nseen = nseen + 1
514 let hit: i64 = vd_latest(st, id)
515 var show: i64 = 1
516 if vd_eq(relf, "-" as *u8) == 0 {
517 if vd_eq(res[hit] as *u8, relf) == 0 { show = 0 }
518 }
519 if show == 1 {
520 o = vd_cat(rep, o, "VIZSLA-DOC-ITEM docid=" as *u8)
521 o = vd_cat(rep, o, id)
522 o = vd_cat(rep, o, " doctype=" as *u8)
523 o = vd_cat(rep, o, tys[hit] as *u8)
524 o = vd_cat(rep, o, " rel=" as *u8)
525 o = vd_cat(rep, o, res[hit] as *u8)
526 o = vd_cat(rep, o, " date=" as *u8)
527 o = vd_cat(rep, o, dts[hit] as *u8)
528 o = vd_cat(rep, o, " bytes=" as *u8)
529 o = vd_catn(rep, o, bys[hit])
530 o = vd_cat(rep, o, "\n" as *u8)
531 cnt = cnt + 1
532 }
533 }
534 i = i + 1
535 }
536 o = vd_cat(rep, o, "VIZSLA-DOC-LIST rel=" as *u8)
537 o = vd_cat(rep, o, relf)
538 o = vd_cat(rep, o, " docs=" as *u8)
539 o = vd_catn(rep, o, cnt)
540 o = vd_cat(rep, o, "\n" as *u8)
541 sys_write(1, rep, o)
542 return 0
543}
544
545func main(argc: i64, argv: *i64) -> i64 {
546 if argc < 2 { vd_p("VIZSLA-DOC usage: put|get|history|list -- fail loud\n" as *u8); return 1 }
547 let cmd: *u8 = argv[1] as *u8
548 if vd_eq(cmd, "put" as *u8) == 1 { return vd_cmd_put(argc, argv) }
549 if vd_eq(cmd, "get" as *u8) == 1 { return vd_cmd_get(argc, argv) }
550 if vd_eq(cmd, "history" as *u8) == 1 { return vd_cmd_history(argc, argv) }
551 if vd_eq(cmd, "list" as *u8) == 1 { return vd_cmd_list(argc, argv) }
552 vd_p("VIZSLA-DOC unknown command (put|get|history|list) -- fail loud\n" as *u8)
553 return 1
554}