code wiki / _hdl_build / _inflate_fixed_authored.nx

_inflate_fixed_authored.nx source

↩ module page · 32 lines · 4487 B

1// AUTHORED BY THE NISHI BUILDER (nx_module_author inflate-fixed template) -- DEFLATE stored+fixed, bits-up 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 inflate(src: *u8, srclen: i64, out: *u8) -> i64 { 7 let cur: *i64=sys_mmap(8) as *i64; cur[0]=0; var outpos: i64=0; var fin: i64=0 8 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 9 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 10 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 11 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 12 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 } 13 let fdl: *i64=sys_mmap(8*30) as *i64; q=0; while q<30 { fdl[q]=5; q=q+1 } 14 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 15 while fin==0 { 16 let bfinal: i64=ibr(src,srclen,cur,1); let btype: i64=ibr(src,srclen,cur,2) 17 if bfinal==1 { fin=1 } 18 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 } 19 if btype==1 { ihb(fll,288,lc,ls); ihb(fdl,30,dc,ds); var done: i64=0; while done==0 { let sym: i64=ihd(src,srclen,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,srclen,cur,lext[s]); let dsy: i64=ihd(src,srclen,cur,dc,ds); let dist: i64=dists[dsy]+ibr(src,srclen,cur,dext[dsy]); var ci: i64=0; while ci<length { out[outpos]=out[outpos-dist]; outpos=outpos+1; ci=ci+1 } } } } } } 20 if btype==2 { fin=1 } 21 } 22 return outpos 23} 24func main() -> i64 { 25 let lb: *i64=sys_mmap(8) as *i64; let gz: *u8=sys_read_file("/tmp/fixed.gz" as *u8, lb) 26 if (gz as i64)==0 { sys_exit(2) } 27 let out: *u8=sys_mmap(4096) 28 let n: i64=inflate(((gz as i64)+10) as *u8, lb[0]-10, out) 29 var ok: i64=1; if n!=10 { ok=0 } var i: i64=0; while i<n { if out[i]!=97 as u8 { ok=0 } i=i+1 } 30 if ok==1 { sys_exit(0) } sys_exit(1) 31 return 1 32}