nx_gltf_inverse_contract_t374.nx source
↩ module page · 50 lines · 1706 B
1// nx_gltf_inverse_contract_t374.nx
2// First native contract fixture for the reusable GLB inverse path.
3// It proves bounded GLB container admission and structured refusal codes.
4// Geometry conversion remains deliberately unimplemented until the NXMSH2 writer owner is adopted.
5import "nx_syscalls.nx"
6
7const GLB_OK:i64=0
8const GLB_E_OPEN:i64=-1001
9const GLB_E_EMPTY:i64=-1002
10const GLB_E_MAGIC:i64=-1003
11const GLB_E_VERSION:i64=-1004
12const GLB_E_HEADER:i64=-1005
13const GLB_E_JSON:i64=-1006
14const GLB_E_BIN:i64=-1007
15const GLB_E_LIMIT:i64=-1008
16const GLB_CONFIG_MAX_BYTES:i64=67108864
17
18func rd32(p:*u8,o:i64)->i64{
19 return (p[o] as i64)|((p[o+1] as i64)<<8)|((p[o+2] as i64)<<16)|((p[o+3] as i64)<<24)
20}
21func glb_admit(p:*u8,n:i64)->i64{
22 if (p as i64)<=0{return GLB_E_OPEN}
23 if n<20{return GLB_E_EMPTY}
24 if n>GLB_CONFIG_MAX_BYTES{return GLB_E_LIMIT}
25 if rd32(p,0)!=0x46546c67{return GLB_E_MAGIC}
26 if rd32(p,4)!=2{return GLB_E_VERSION}
27 let declared:i64=rd32(p,8)
28 if declared<28||declared>n{return GLB_E_HEADER}
29 let jsonLen:i64=rd32(p,12)
30 if rd32(p,16)!=0x4e4f534a{return GLB_E_JSON}
31 if jsonLen<2||jsonLen>declared-20{return GLB_E_JSON}
32 let binHead:i64=20+jsonLen
33 if binHead+8>declared{return GLB_E_BIN}
34 let binLen:i64=rd32(p,binHead)
35 if rd32(p,binHead+4)!=0x004e4942{return GLB_E_BIN}
36 if binLen<1||binLen>declared-(binHead+8){return GLB_E_BIN}
37 if binHead+8+binLen>n{return GLB_E_BIN}
38 return GLB_OK
39}
40func main()->i64{
41 let path:*u8="buildroot/knowledge/gates/faceanat-alpha-t374.glb" as *u8
42 let nbox:*i64=sys_mmap(8) as *i64
43 nbox[0]=0
44 let p:*u8=sys_read_file(path,nbox)
45 let n:i64=nbox[0]
46 let rc:i64=glb_admit(p,n)
47 if (p as i64)>0{sys_munmap(p,n)}
48 sys_munmap(nbox as *u8,8)
49 return rc
50}