code wiki / (root) / nx_niffacts.nx

nx_niffacts.nx source

↩ module page · 135 lines · 5901 B

1// nx_niffacts.nx -- CLI: NIF container structural facts. nx_niffacts probe|blocks|geom <f.nif> 2// The Bethesda mesh-container dialect beside nx_kkfacts / nx_bspfacts / nx_mhtarget 3// (/compare/koikatsu KK12 legs 1+2). Structure + block-type census + self-verified per-TriShape 4// vertex/triangle counts; full vertex-data extraction is the contract's declared final half. 5// Donor FORM is measured, never shipped. 6// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_nif_lib.nx" 9 10const NFC_CAP: i64 = 134217728 // 128MB refuse-beyond bound; a partial read reports state 2 and abstains 11const NFC_MAX_SHAPES: i64 = 4096 // per-file TriShape bound; overflow visible via shapes vs shown 12const NFC_SHOW: i64 = 8 // per-shape rows printed; the totals carry the population 13 14func nc_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 15func nc_w(s: *u8) -> i64 { sys_write(1, s, nc_slen(s)); return 0 } 16func nc_e(s: *u8) -> i64 { sys_write(2, s, nc_slen(s)); return 0 } 17func nc_span(buf: *u8, off: i64, len: i64) -> i64 { 18 if off < 0 { return 0 } 19 if len <= 0 { return 0 } 20 sys_write(1, ((buf as i64) + off) as *u8, len) 21 return 0 22} 23func nc_num(v: i64) -> i64 { 24 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 25 var m: i64 = v 26 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 27 let t: *u8 = sys_mmap(32) 28 var k: i64 = 0 29 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 30 let o: *u8 = sys_mmap(32) 31 var i: i64 = 0 32 while i < k { o[i] = t[k - 1 - i]; i = i + 1 } 33 sys_write(1, o, k) 34 return 0 35} 36func nc_eq(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 } 37 38func main(argc: i64, argv: *i64) -> i64 { 39 if argc < 3 { nc_e("usage: nx_niffacts probe|blocks|geom <f.nif>\n" as *u8); sys_exit(2); return 2 } 40 let buf: *u8 = sys_mmap(NFC_CAP) 41 let fd: i64 = sys_openat_rd(argv[2] as *u8) 42 if fd < 0 { nc_e("ERROR: cannot open file\n" as *u8); sys_exit(1); return 1 } 43 let size: i64 = sys_lseek(fd, 0, 2) 44 sys_lseek(fd, 0, 0) 45 var want: i64 = size 46 if want > NFC_CAP { want = NFC_CAP } 47 var got: i64 = 0 48 var stop: i64 = 0 49 while stop == 0 { 50 if got >= want { stop = 1 } else { 51 let k: i64 = sys_read(fd, ((buf as i64) + got) as *u8, want - got) 52 if k <= 0 { stop = 1 } else { got = got + k } 53 } 54 } 55 sys_close(fd) 56 let facts: *i64 = sys_mmap(NF_N_SLOTS * 8) as *i64 57 nif_probe(buf, got, size, facts) 58 nc_w("NIFFACT is_nif=" as *u8); nc_num(facts[0]) 59 if facts[0] >= 1 { 60 nc_w(" version=" as *u8); nc_num(facts[1]) 61 nc_w(" bsver=" as *u8); nc_num(facts[2]) 62 nc_w(" blocks=" as *u8); nc_num(facts[3]) 63 nc_w(" blocktypes=" as *u8); nc_num(facts[4]) 64 nc_w(" trishapes=" as *u8); nc_num(facts[5]) 65 nc_w(" blockbytes=" as *u8); nc_num(facts[6]) 66 nc_w(" strings=" as *u8); nc_num(facts[7]) 67 nc_w(" headerbytes=" as *u8); nc_num(facts[8]) 68 nc_w(" endian=" as *u8); nc_num(facts[9]) 69 } 70 nc_w("\n" as *u8) 71 if facts[0] == 0 { sys_exit(4); return 4 } 72 if facts[0] == 2 { sys_exit(5); return 5 } 73 if nc_eq(argv[1] as *u8, "blocks" as *u8) == 1 { 74 let toffs: *i64 = sys_mmap(NF_MAX_TYPES * 8) as *i64 75 let tlens: *i64 = sys_mmap(NF_MAX_TYPES * 8) as *i64 76 let tcounts: *i64 = sys_mmap(NF_MAX_TYPES * 8) as *i64 77 let meta: *i64 = sys_mmap(16) as *i64 78 let st: i64 = nif_types(buf, got, size, toffs, tlens, tcounts, NF_MAX_TYPES, meta) 79 nc_w("NIFBLOCKS state=" as *u8); nc_num(st) 80 nc_w(" types=" as *u8); nc_num(meta[0]) 81 nc_w(" census:" as *u8) 82 var t: i64 = 0 83 while t < meta[0] { 84 nc_w(" " as *u8); nc_span(buf, toffs[t], tlens[t]) 85 nc_w("=" as *u8); nc_num(tcounts[t]) 86 t = t + 1 87 } 88 nc_w("\n" as *u8) 89 } 90 if nc_eq(argv[1] as *u8, "geom" as *u8) == 1 { 91 let vouts: *i64 = sys_mmap(NFC_MAX_SHAPES * 8) as *i64 92 let touts: *i64 = sys_mmap(NFC_MAX_SHAPES * 8) as *i64 93 let vflags: *i64 = sys_mmap(NFC_MAX_SHAPES * 8) as *i64 94 let gmeta: *i64 = sys_mmap(32) as *i64 95 let shapes: i64 = nif_geom(buf, got, size, vouts, touts, vflags, NFC_MAX_SHAPES, gmeta) 96 nc_w("NIFGEOM shapes=" as *u8); nc_num(shapes) 97 nc_w(" verified=" as *u8); nc_num(gmeta[0]) 98 nc_w(" verts=" as *u8); nc_num(gmeta[1]) 99 nc_w(" tris=" as *u8); nc_num(gmeta[2]) 100 nc_w(" detail:" as *u8) 101 var show: i64 = shapes 102 if show > NFC_SHOW { show = NFC_SHOW } 103 var s: i64 = 0 104 while s < show { 105 nc_w(" " as *u8); nc_num(vouts[s]) 106 nc_w(":" as *u8); nc_num(touts[s]) 107 nc_w(":" as *u8); nc_num(vflags[s]) 108 s = s + 1 109 } 110 nc_w("\n" as *u8) 111 } 112 if nc_eq(argv[1] as *u8, "verts" as *u8) == 1 { 113 let pxs: *i64 = sys_mmap(NFC_MAX_SHAPES * 8) as *i64 114 let pys: *i64 = sys_mmap(NFC_MAX_SHAPES * 8) as *i64 115 let pzs: *i64 = sys_mmap(NFC_MAX_SHAPES * 8) as *i64 116 let vmeta: *i64 = sys_mmap(32) as *i64 117 let nv: i64 = nif_verts(buf, got, size, 0, pxs, pys, pzs, NFC_MAX_SHAPES, vmeta) 118 nc_w("NIFVERTS shape=0 verts=" as *u8); nc_num(nv) 119 nc_w(" inside=" as *u8); nc_num(vmeta[1]) 120 nc_w(" radius_permil=" as *u8); nc_num(vmeta[2]) 121 nc_w(" permil:" as *u8) 122 var show2: i64 = nv 123 if show2 > 4 { show2 = 4 } 124 var w: i64 = 0 125 while w < show2 { 126 nc_w(" " as *u8); nc_num(pxs[w]) 127 nc_w("," as *u8); nc_num(pys[w]) 128 nc_w("," as *u8); nc_num(pzs[w]) 129 w = w + 1 130 } 131 nc_w("\n" as *u8) 132 } 133 sys_exit(0) 134 return 0 135}