code wiki / _hdl_build / _inflate_full_authored.nx

_inflate_full_authored.nx source

↩ module page · 48 lines · 6220 B

1// AUTHORED BY THE NISHI BUILDER (nx_module_author inflate-full template) -- DEFLATE stored+fixed+dynamic 2import "nx_syscalls.nx" 3func ibr(buf: *u8, len: i64, cur: *i64, n: i64) -> i64 { var v: i64=0; var g: i64=0; while g<n { let bp: i64=cur[0]>>3; if bp>=len { return 0 } let bit: i64=((buf[bp] as i64)>>(cur[0]&7))&1; v=v|(bit<<g); cur[0]=cur[0]+1; g=g+1 } return v } 4func ihb(ln: *i64, n: i64, ct: *i64, sy: *i64) -> i64 { var i: i64=0; while i<=15 { ct[i]=0; i=i+1 } i=0; while i<n { ct[ln[i]]=ct[ln[i]]+1; i=i+1 } let of: *i64=sys_mmap(8*17) as *i64; of[1]=0; var l: i64=1; while l<15 { of[l+1]=of[l]+ct[l]; l=l+1 } i=0; while i<n { if ln[i]!=0 { sy[of[ln[i]]]=i; of[ln[i]]=of[ln[i]]+1 } i=i+1 } return 0 } 5func ihd(buf: *u8, len: i64, cur: *i64, ct: *i64, sy: *i64) -> i64 { var code: i64=0; var first: i64=0; var idx: i64=0; var l: i64=1; while l<=15 { code=code|ibr(buf,len,cur,1); let c: i64=ct[l]; if code-first<c { return sy[idx+(code-first)] } idx=idx+c; first=first+c; first=first<<1; code=code<<1; l=l+1 } return 0-1 } 6func icodes(src: *u8, sl: i64, cur: *i64, out: *u8, op: i64, lc: *i64, ls: *i64, dc: *i64, ds: *i64, lens: *i64, lext: *i64, dists: *i64, dext: *i64) -> i64 { 7 var outpos: i64=op; var done: i64=0 8 while done==0 { let sym: i64=ihd(src,sl,cur,lc,ls); if sym<0 { done=1 } else { if sym<256 { out[outpos]=sym as u8; outpos=outpos+1 } else { if sym==256 { done=1 } else { let s: i64=sym-257; let length: i64=lens[s]+ibr(src,sl,cur,lext[s]); let dsy: i64=ihd(src,sl,cur,dc,ds); let dist: i64=dists[dsy]+ibr(src,sl,cur,dext[dsy]); var ci: i64=0; while ci<length { out[outpos]=out[outpos-dist]; outpos=outpos+1; ci=ci+1 } } } } } 9 return outpos 10} 11func inflate(src: *u8, srclen: i64, out: *u8) -> i64 { 12 let cur: *i64=sys_mmap(8) as *i64; cur[0]=0; var outpos: i64=0; var fin: i64=0 13 let lens: *i64=sys_mmap(8*29) as *i64; lens[0]=3;lens[1]=4;lens[2]=5;lens[3]=6;lens[4]=7;lens[5]=8;lens[6]=9;lens[7]=10;lens[8]=11;lens[9]=13;lens[10]=15;lens[11]=17;lens[12]=19;lens[13]=23;lens[14]=27;lens[15]=31;lens[16]=35;lens[17]=43;lens[18]=51;lens[19]=59;lens[20]=67;lens[21]=83;lens[22]=99;lens[23]=115;lens[24]=131;lens[25]=163;lens[26]=195;lens[27]=227;lens[28]=258 14 let lext: *i64=sys_mmap(8*29) as *i64; lext[0]=0;lext[1]=0;lext[2]=0;lext[3]=0;lext[4]=0;lext[5]=0;lext[6]=0;lext[7]=0;lext[8]=1;lext[9]=1;lext[10]=1;lext[11]=1;lext[12]=2;lext[13]=2;lext[14]=2;lext[15]=2;lext[16]=3;lext[17]=3;lext[18]=3;lext[19]=3;lext[20]=4;lext[21]=4;lext[22]=4;lext[23]=4;lext[24]=5;lext[25]=5;lext[26]=5;lext[27]=5;lext[28]=0 15 let dists: *i64=sys_mmap(8*30) as *i64; dists[0]=1;dists[1]=2;dists[2]=3;dists[3]=4;dists[4]=5;dists[5]=7;dists[6]=9;dists[7]=13;dists[8]=17;dists[9]=25;dists[10]=33;dists[11]=49;dists[12]=65;dists[13]=97;dists[14]=129;dists[15]=193;dists[16]=257;dists[17]=385;dists[18]=513;dists[19]=769;dists[20]=1025;dists[21]=1537;dists[22]=2049;dists[23]=3073;dists[24]=4097;dists[25]=6145;dists[26]=8193;dists[27]=12289;dists[28]=16385;dists[29]=24577 16 let dext: *i64=sys_mmap(8*30) as *i64; dext[0]=0;dext[1]=0;dext[2]=0;dext[3]=0;dext[4]=1;dext[5]=1;dext[6]=2;dext[7]=2;dext[8]=3;dext[9]=3;dext[10]=4;dext[11]=4;dext[12]=5;dext[13]=5;dext[14]=6;dext[15]=6;dext[16]=7;dext[17]=7;dext[18]=8;dext[19]=8;dext[20]=9;dext[21]=9;dext[22]=10;dext[23]=10;dext[24]=11;dext[25]=11;dext[26]=12;dext[27]=12;dext[28]=13;dext[29]=13 17 let fll: *i64=sys_mmap(8*288) as *i64; var q: i64=0; while q<144 { fll[q]=8; q=q+1 } while q<256 { fll[q]=9; q=q+1 } while q<280 { fll[q]=7; q=q+1 } while q<288 { fll[q]=8; q=q+1 } 18 let fdl: *i64=sys_mmap(8*30) as *i64; q=0; while q<30 { fdl[q]=5; q=q+1 } 19 let ord: *i64=sys_mmap(8*19) as *i64; ord[0]=16;ord[1]=17;ord[2]=18;ord[3]=0;ord[4]=8;ord[5]=7;ord[6]=9;ord[7]=6;ord[8]=10;ord[9]=5;ord[10]=11;ord[11]=4;ord[12]=12;ord[13]=3;ord[14]=13;ord[15]=2;ord[16]=14;ord[17]=1;ord[18]=15 20 let lc: *i64=sys_mmap(8*17) as *i64; let ls: *i64=sys_mmap(8*288) as *i64; let dc: *i64=sys_mmap(8*17) as *i64; let ds: *i64=sys_mmap(8*30) as *i64 21 while fin==0 { 22 let bfinal: i64=ibr(src,srclen,cur,1); let btype: i64=ibr(src,srclen,cur,2) 23 if bfinal==1 { fin=1 } 24 if btype==0 { cur[0]=((cur[0]+7)>>3)<<3; let bp: i64=cur[0]>>3; let bl: i64=(src[bp] as i64)|((src[bp+1] as i64)<<8); var p: i64=bp+4; var i: i64=0; while i<bl { out[outpos]=src[p]; outpos=outpos+1; p=p+1; i=i+1 } cur[0]=p<<3 } 25 if btype==1 { ihb(fll,288,lc,ls); ihb(fdl,30,dc,ds); outpos=icodes(src,srclen,cur,out,outpos,lc,ls,dc,ds,lens,lext,dists,dext) } 26 if btype==2 { 27 let hlit: i64=ibr(src,srclen,cur,5)+257; let hdist: i64=ibr(src,srclen,cur,5)+1; let hclen: i64=ibr(src,srclen,cur,4)+4 28 let cll: *i64=sys_mmap(8*19) as *i64; var j: i64=0; while j<19 { cll[j]=0; j=j+1 } 29 j=0; while j<hclen { cll[ord[j]]=ibr(src,srclen,cur,3); j=j+1 } 30 let clc: *i64=sys_mmap(8*17) as *i64; let cls: *i64=sys_mmap(8*19) as *i64; ihb(cll,19,clc,cls) 31 let al: *i64=sys_mmap(8*320) as *i64; var idx: i64=0 32 while idx<hlit+hdist { let s2: i64=ihd(src,srclen,cur,clc,cls); if s2<16 { al[idx]=s2; idx=idx+1 } else { if s2==16 { var rep: i64=3+ibr(src,srclen,cur,2); let prev: i64=al[idx-1]; while rep>0 { al[idx]=prev; idx=idx+1; rep=rep-1 } } else { if s2==17 { var rep2: i64=3+ibr(src,srclen,cur,3); while rep2>0 { al[idx]=0; idx=idx+1; rep2=rep2-1 } } else { var rep3: i64=11+ibr(src,srclen,cur,7); while rep3>0 { al[idx]=0; idx=idx+1; rep3=rep3-1 } } } } } 33 ihb(al,hlit,lc,ls); ihb(((al as i64)+hlit*8) as *i64,hdist,dc,ds) 34 outpos=icodes(src,srclen,cur,out,outpos,lc,ls,dc,ds,lens,lext,dists,dext) 35 } 36 } 37 return outpos 38} 39func main() -> i64 { 40 let lb: *i64=sys_mmap(8) as *i64; let gz: *u8=sys_read_file("/tmp/dyn.gz" as *u8, lb) 41 let ob: *i64=sys_mmap(8) as *i64; let orig: *u8=sys_read_file("/tmp/dyn.orig" as *u8, ob) 42 if (gz as i64)==0 { sys_exit(2) } if (orig as i64)==0 { sys_exit(2) } 43 let out: *u8=sys_mmap(65536) 44 let n: i64=inflate(((gz as i64)+10) as *u8, lb[0]-10, out) 45 var ok: i64=1; if n!=ob[0] { ok=0 } var i: i64=0; while i<ob[0] { if out[i]!=orig[i] { ok=0 } i=i+1 } 46 if ok==1 { sys_exit(0) } sys_exit(1) 47 return 1 48}