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}