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}