code wiki / (root) / nx_nxa_skin_variable_t37.nx

nx_nxa_skin_variable_t37.nx source

↩ module page · 20 lines · 927 B

1// Additive SKV1 full-influence section; legacy SKIN stays available with its declared top-four loss. 2import "nx_nxa.nx" 3const SKV_VERSION:i64=1 4const SKV_HEADER:i64=4 5const SKV_Q:i64=281474976710656 6const SKV_BAD:i64=0-80 7func skv_validate(p:*i64,words:i64,nv:i64,nj:i64)->i64{ 8 if words<SKV_HEADER||nv<=0||nj<=0{return SKV_BAD} 9 if p[0]!=SKV_VERSION||p[1]!=nv||p[2]<nv||p[3]!=SKV_Q{return SKV_BAD} 10 if nv>words-SKV_HEADER-1{return SKV_BAD} 11 let base:i64=SKV_HEADER+nv+1 12 if (words-base)%2!=0||p[2]!=(words-base)/2||p[4]!=0||p[4+nv]!=p[2]{return SKV_BAD} 13 var v:i64=0 14 while v<nv{let start:i64=p[4+v];let end:i64=p[5+v] 15 if start<0||end<=start||end>p[2]{return SKV_BAD} 16 var i:i64=start;while i<end{let j:i64=p[base+i*2];let weight:i64=p[base+i*2+1] 17 if j<0||j>=nj||weight<=0||weight>9223372036854775807/(end-start){return SKV_BAD} 18 var k:i64=start;while k<i{if p[base+k*2]==j{return SKV_BAD};k=k+1};i=i+1};v=v+1} 19 return 0 20}