code wiki / (root) / nx_texr_boundary_gate_t285.nx

nx_texr_boundary_gate_t285.nx source

↩ module page · 78 lines · 3764 B

1// nx_texr_boundary_gate_t285.nx -- Validates TEXR boundary gate structures for correct header and data integrity checks. 2import "nx_syscalls.nx" 3import "nx_nxa_texbake_region_lib.nx" 4// Exercise the adopted validator through its canonical regional owner. 5const TV_TOC_WORDS:i64=8 6const TV_SETS:i64=2 7static tv_pass:i64 8static tv_total:i64 9func tv_check(ok:i64,name:*u8)->i64{ 10 tv_total=tv_total+1 11 if ok==1{tv_pass=tv_pass+1;nt_outs("PASS ")}else{nt_outs("FAIL ")} 12 nt_outs(name);nt_outs("\n");return ok 13} 14func tv_words()->i64{ 15 let bytes:i64=TV_SETS*NTR_NMAPS 16 return TV_TOC_WORDS+NTR_HDR_WORDS+NTR_JOINT_WORDS+TV_SETS*(NTR_SET_META+NTR_NMAPS*NTR_MAPREC)+(bytes+NTR_WORD-1)/NTR_WORD 17} 18func tv_seal(w:*i64)->i64{ 19 w[7]=nxa_check2(1,((w as i64)+TV_TOC_WORDS*NTR_WORD) as *i64,w[6]) 20 w[3]=nxa_check2(1,((w as i64)+4*NTR_WORD) as *i64,4) 21 return 0 22} 23func tv_reset(w:*i64)->i64{ 24 var i:i64=0;while i<tv_words(){w[i]=0;i=i+1} 25 w[0]=nxa_magic();w[1]=NXA_VER;w[2]=1;w[4]=nxa_tag4("TEXR");w[5]=TV_TOC_WORDS*NTR_WORD;w[6]=tv_words()-TV_TOC_WORDS 26 let o:i64=TV_TOC_WORDS;let stride:i64=NTR_SET_META+NTR_NMAPS*NTR_MAPREC 27 w[o+NTR_W_NSETS]=TV_SETS;w[o+NTR_W_RES]=2048;w[o+NTR_W_MODEL]=NTR_MODEL_SPECGLOSS 28 w[o+NTR_W_NMAPS]=NTR_NMAPS;w[o+NTR_W_MPX]=480;w[o+NTR_W_MREP]=24000;w[o+NTR_W_RANGE]=NTR_DISP_RANGE_UM 29 w[o+NTR_W_NJ]=1;w[o+NTR_W_SETW]=stride;w[o+NTR_W_JW]=NTR_JOINT_WORDS;w[o+NTR_W_VER]=NTR_VERSION 30 w[o+NTR_W_BLOBW]=(TV_SETS*NTR_NMAPS+NTR_WORD-1)/NTR_WORD 31 var s:i64=0 32 while s<TV_SETS{ 33 let at:i64=o+NTR_HDR_WORDS+NTR_JOINT_WORDS+s*stride 34 w[at+NTR_S_REGION]=s 35 var m:i64=0;while m<NTR_NMAPS{let p:i64=at+NTR_SET_META+m*NTR_MAPREC;w[p]=m;w[p+1]=s*NTR_NMAPS+m;w[p+2]=1;m=m+1} 36 s=s+1 37 } 38 return tv_seal(w) 39} 40func tv_mutate(w:*i64,index:i64,value:i64,expected:i64,name:*u8)->i64{ 41 tv_reset(w);w[index]=value;tv_seal(w) 42 return tv_check((ntr_texr_find(w as *u8,tv_words()*NTR_WORD)==expected) as i64,name) 43} 44func main(argc:i64,argv:*i64)->i64{ 45 let w:*i64=sys_mmap_try(tv_words()*NTR_WORD) as *i64 46 if (w as i64)<=0{return 1} 47 tv_reset(w) 48 tv_check((ntr_texr_find(w as *u8,tv_words()*NTR_WORD)==TV_TOC_WORDS) as i64,"valid bounded records; PNG decoding deliberately separate") 49 let o:i64=TV_TOC_WORDS 50 let at:i64=o+NTR_HDR_WORDS+NTR_JOINT_WORDS 51 let rec:i64=at+NTR_SET_META 52 tv_mutate(w,o+NTR_W_VER,NTR_VERSION+1,0-2,"future TEXR version refused") 53 tv_mutate(w,o+NTR_W_NJ,9223372036854775807,0-3,"oversized joint count before multiplication") 54 tv_mutate(w,o+NTR_W_NSETS,0-1,0-3,"negative set count") 55 tv_mutate(w,o+NTR_W_SETW,9223372036854775807,0-3,"invalid record stride") 56 tv_mutate(w,o+NTR_W_BLOBW,9223372036854775807,0-3,"invalid blob extent") 57 tv_mutate(w,rec+1,0-1,0-3,"negative map offset") 58 tv_mutate(w,rec+1,9223372036854775807,0-3,"oversized map offset") 59 tv_mutate(w,rec+2,9223372036854775807,0-3,"oversized map length") 60 tv_mutate(w,rec+2,0,0-3,"empty map") 61 tv_mutate(w,rec,NTR_NMAPS,0-3,"wrong map identity") 62 tv_mutate(w,at+NTR_SET_META+NTR_NMAPS*NTR_MAPREC+NTR_S_REGION,0,0-3,"duplicate region") 63 tv_mutate(w,o+NTR_W_RES,0,0-3,"zero resolution") 64 tv_reset(w);w[6]=NTR_HDR_WORDS-1;tv_seal(w) 65 tv_check((ntr_texr_find(w as *u8,tv_words()*NTR_WORD)==(0-3)) as i64,"short TEXR header") 66 tv_reset(w) 67 tv_check((ntr_texr_find(w as *u8,tv_words()*NTR_WORD-1)==(0-3)) as i64,"truncated container") 68 if argc>1{ 69 let size:*i64=sys_mmap_try(NTR_WORD) as *i64 70 if (size as i64)<=0{return 1} 71 let b:*u8=sys_read_file(argv[1] as *u8,size) 72 if (b as i64)<=0{return 1} 73 tv_check((ntr_texr_find(b,size[0])==(0-1)) as i64,"current resident reports absent TEXR") 74 } 75 nt_outs("TEXR-BOUNDARY ");nt_outn(tv_pass);nt_outs("/");nt_outn(tv_total);nt_outs("\n") 76 if sys_munmap_direct(w as *u8,tv_words()*NTR_WORD)!=0{return 1} 77 if tv_pass!=tv_total{return 1};return 0 78}