nx_nxa_write_append_t37.nx source
↩ module page · 17 lines · 1285 B
1// Additive section append for the existing NXA writer; caller validates section semantics.
2import "nx_nxa_write_lib.nx"
3func nxw_append_section(b:*u8,n:i64,tag:i64,p:*i64,words:i64,out:*u8,capacity:i64)->i64{
4 if n<32||n%8!=0||words<0||capacity<n+32||words>(capacity-n-32)/8{return NXW_ERR_EXTENT}
5 if nxw_ranges_overlap(b as i64,n,out as i64,capacity)==1||nxw_ranges_overlap(p as i64,words*8,out as i64,capacity)==1{return NXW_ERR_OVERLAP}
6 let h:*i64=b as *i64;
7 if h[0]!=nxa_magic()||h[1]!=NXA_VER||h[2]<=0||h[2]>(n-32)/32{return NXW_ERR_CONTAINER}
8 let ns:i64=h[2];var i:i64=0
9 while i<ns{let e:i64=4+i*4;if nxa_section_entry(b,n,h[e])!=e||h[e]==tag{return NXW_ERR_CONTAINER};var j:i64=0;while j<i{let q:i64=4+j*4;if nxw_ranges_overlap(h[e+1],h[e+2]*8,h[q+1],h[q+2]*8)==1{return NXW_ERR_CONTAINER};j=j+1};i=i+1}
10 let begin:i64=32+ns*32;i=begin;while i<n{out[i+32]=b[i];i=i+1}
11 let dst:*i64=out as *i64;dst[0]=nxa_magic();dst[1]=NXA_VER;dst[2]=ns+1
12 i=0;while i<ns{let e:i64=4+i*4;dst[e]=h[e];dst[e+1]=h[e+1]+32;dst[e+2]=h[e+2];dst[e+3]=h[e+3];i=i+1}
13 let at:i64=(n+32)/8;i=0;while i<words{dst[at+i]=p[i];i=i+1}
14 let e:i64=4+ns*4;dst[e]=tag;dst[e+1]=n+32;dst[e+2]=words;dst[e+3]=nxa_check2(1,p,words)
15 dst[3]=nxa_check2(1,((out as i64)+32) as *i64,(ns+1)*4)
16 return n+32+words*8
17}