rawinflate.js (7342B) - raw
1 /* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp> 2 * Version: 1.0.0.1 3 * LastModified: Dec 25 1999 4 */ 5 6 (function(){var WSIZE=32768,STORED_BLOCK=0,STATIC_TREES=1,DYN_TREES=2,lbits=9,dbits=6,slide,wp,fixed_tl=null,fixed_td,fixed_bl,fixed_bd,bit_buf,bit_len,method,eof,copy_leng,copy_dist,tl,td,bl,bd,inflate_data,inflate_pos,MASK_BITS=[0x0000,0x0001,0x0003,0x0007,0x000f,0x001f,0x003f,0x007f,0x00ff,0x01ff,0x03ff,0x07ff,0x0fff,0x1fff,0x3fff,0x7fff,0xffff],cplens=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],cplext=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,99,99],cpdist=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],cpdext=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],border=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];function HuftList(){this.next=null;this.list=null}function HuftNode(){this.e=0;this.b=0;this.n=0;this.t=null;}function HuftBuild(b,n,s,d,e,mm){this.BMAX=16;this.N_MAX=288;this.status=0;this.root=null;this.m=0;var a;var c=[];var el;var f;var g;var h;var i;var j;var k;var lx=[];var p;var pidx;var q;var r=new HuftNode();var u=[];var v=[];var w;var x=[];var xp;var y;var z;var o;var tail;tail=this.root=null;for(i=0;i<this.BMAX+1;i+=1){c[i]=0}for(i=0;i<this.BMAX+1;i+=1){lx[i]=0}for(i=0;i<this.BMAX;i+=1){u[i]=null}for(i=0;i<this.N_MAX;i+=1){v[i]=0}for(i=0;i<this.BMAX+1;i+=1){x[i]=0}el=n>256?b[256]:this.BMAX;p=b;pidx=0;i=n;do{c[p[pidx]]+=1;pidx+=1}while(--i>0);if(c[0]===n){this.root=null;this.m=0;this.status=0;return}for(j=1;j<=this.BMAX;j+=1){if(c[j]!==0){break}}k=j;if(mm<j){mm=j}for(i=this.BMAX;i!==0;i-=1){if(c[i]!==0){break}}g=i;if(mm>i){mm=i}for(y=1<<j;j<i;j+=1,y<<=1){if((y-=c[j])<0){this.status=2;this.m=mm;return}}if((y-=c[i])<0){this.status=2;this.m=mm;return}c[i]+=y;x[1]=j=0;p=c;pidx=1;xp=2;while(--i>0){x[xp++]=(j+=p[pidx++])}p=b;pidx=0;i=0;do{if((j=p[pidx++])!==0){v[x[j]++]=i}}while(++i<n);n=x[g];x[0]=i=0;p=v;pidx=0;h=-1;w=lx[0]=0;q=null;z=0;for(null;k<=g;k+=1){a=c[k];while(a-- >0){while(k>w+lx[1+h]){w+=lx[1+h];h+=1;z=(z=g-w)>mm?mm:z;if((f=1<<(j=k-w))>a+1){f-=a+1;xp=k;while(++j<z){if((f<<=1)<=c[xp+=1]){break;}f-=c[xp];}}if(w+j>el&&w<el){j=el-w;}z=1<<j;lx[1+h]=j;q=[];for(o=0;o<z;o+=1){q[o]=new HuftNode()}if(!tail){tail=this.root=new HuftList()}else{tail=tail.next=new HuftList()}tail.next=null;tail.list=q;u[h]=q;if(h>0){x[h]=i;r.b=lx[h];r.e=16+j;r.t=q;j=(i&((1<<w)-1))>>(w-lx[h]);u[h-1][j].e=r.e;u[h-1][j].b=r.b;u[h-1][j].n=r.n;u[h-1][j].t=r.t}}r.b=k-w;if(pidx>=n){r.e=99;}else if(p[pidx]<s){r.e=(p[pidx]<256?16:15);r.n=p[pidx++];}else{r.e=e[p[pidx]-s];r.n=d[p[pidx++]-s]}f=1<<(k-w);for(j=i>>w;j<z;j+=f){q[j].e=r.e;q[j].b=r.b;q[j].n=r.n;q[j].t=r.t}for(j=1<<(k-1);(i&j)!==0;j>>=1){i^=j}i^=j;while((i&((1<<w)-1))!==x[h]){w-=lx[h];h-=1}}}this.m=lx[1];this.status=((y!==0&&g!==1)?1:0)}function GET_BYTE(){if(inflate_data.length===inflate_pos){return -1}return inflate_data[inflate_pos++]&0xff}function NEEDBITS(n){while(bit_len<n){bit_buf|=GET_BYTE()<<bit_len;bit_len+=8}}function GETBITS(n){return bit_buf&MASK_BITS[n]}function DUMPBITS(n){bit_buf>>=n;bit_len-=n}function inflate_codes(buff,off,size){var e;var t;var n;if(size===0){return 0}n=0;for(;;){NEEDBITS(bl);t=tl.list[GETBITS(bl)];e=t.e;while(e>16){if(e===99){return -1}DUMPBITS(t.b);e-=16;NEEDBITS(e);t=t.t[GETBITS(e)];e=t.e}DUMPBITS(t.b);if(e===16){wp&=WSIZE-1;buff[off+n++]=slide[wp++]=t.n;if(n===size){return size}continue}if(e===15){break}NEEDBITS(e);copy_leng=t.n+GETBITS(e);DUMPBITS(e);NEEDBITS(bd);t=td.list[GETBITS(bd)];e=t.e;while(e>16){if(e===99){return -1}DUMPBITS(t.b);e-=16;NEEDBITS(e);t=t.t[GETBITS(e)];e=t.e}DUMPBITS(t.b);NEEDBITS(e);copy_dist=wp-t.n-GETBITS(e);DUMPBITS(e);while(copy_leng>0&&n<size){copy_leng-=1;copy_dist&=WSIZE-1;wp&=WSIZE-1;buff[off+n++]=slide[wp++]=slide[copy_dist++]}if(n===size){return size}}method=-1;return n}function inflate_stored(buff,off,size){var n;n=bit_len&7;DUMPBITS(n);NEEDBITS(16);n=GETBITS(16);DUMPBITS(16);NEEDBITS(16);if(n!==((~bit_buf)&0xffff)){return -1;}DUMPBITS(16);copy_leng=n;n=0;while(copy_leng>0&&n<size){copy_leng-=1;wp&=WSIZE-1;NEEDBITS(8);buff[off+n++]=slide[wp++]=GETBITS(8);DUMPBITS(8)}if(copy_leng===0){method=-1;}return n}function inflate_fixed(buff,off,size){if(!fixed_tl){var i;var l=[];var h;for(i=0;i<144;i+=1){l[i]=8}for(null;i<256;i+=1){l[i]=9}for(null;i<280;i+=1){l[i]=7}for(null;i<288;i+=1){l[i]=8}fixed_bl=7;h=new HuftBuild(l,288,257,cplens,cplext,fixed_bl);if(h.status!==0){console.error("HufBuild error: "+h.status);return -1}fixed_tl=h.root;fixed_bl=h.m;for(i=0;i<30;i+=1){l[i]=5}fixed_bd=5;h=new HuftBuild(l,30,0,cpdist,cpdext,fixed_bd);if(h.status>1){fixed_tl=null;console.error("HufBuild error: "+h.status);return -1}fixed_td=h.root;fixed_bd=h.m}tl=fixed_tl;td=fixed_td;bl=fixed_bl;bd=fixed_bd;return inflate_codes(buff,off,size)}function inflate_dynamic(buff,off,size){var i;var j;var l;var n;var t;var nb;var nl;var nd;var ll=[];var h;for(i=0;i<286+30;i+=1){ll[i]=0}NEEDBITS(5);nl=257+GETBITS(5);DUMPBITS(5);NEEDBITS(5);nd=1+GETBITS(5);DUMPBITS(5);NEEDBITS(4);nb=4+GETBITS(4);DUMPBITS(4);if(nl>286||nd>30){return -1;}for(j=0;j<nb;j+=1){NEEDBITS(3);ll[border[j]]=GETBITS(3);DUMPBITS(3)}for(null;j<19;j+=1){ll[border[j]]=0}bl=7;h=new HuftBuild(ll,19,19,null,null,bl);if(h.status!==0){return -1;}tl=h.root;bl=h.m;n=nl+nd;i=l=0;while(i<n){NEEDBITS(bl);t=tl.list[GETBITS(bl)];j=t.b;DUMPBITS(j);j=t.n;if(j<16){ll[i++]=l=j;}else if(j===16){NEEDBITS(2);j=3+GETBITS(2);DUMPBITS(2);if(i+j>n){return -1}while(j-- >0){ll[i++]=l}}else if(j===17){NEEDBITS(3);j=3+GETBITS(3);DUMPBITS(3);if(i+j>n){return -1}while(j-- >0){ll[i++]=0}l=0}else{NEEDBITS(7);j=11+GETBITS(7);DUMPBITS(7);if(i+j>n){return -1}while(j-- >0){ll[i++]=0}l=0}}bl=lbits;h=new HuftBuild(ll,nl,257,cplens,cplext,bl);if(bl===0){h.status=1}if(h.status!==0){if(h.status!==1){return -1;}}tl=h.root;bl=h.m;for(i=0;i<nd;i+=1){ll[i]=ll[i+nl]}bd=dbits;h=new HuftBuild(ll,nd,0,cpdist,cpdext,bd);td=h.root;bd=h.m;if(bd===0&&nl>257){return -1}if(h.status!==0){return -1}return inflate_codes(buff,off,size)}function inflate_start(){if(!slide){slide=[];}wp=0;bit_buf=0;bit_len=0;method=-1;eof=false;copy_leng=copy_dist=0;tl=null}function inflate_internal(buff,off,size){var n,i;n=0;while(n<size){if(eof&&method===-1){return n}if(copy_leng>0){if(method!==STORED_BLOCK){while(copy_leng>0&&n<size){copy_leng-=1;copy_dist&=WSIZE-1;wp&=WSIZE-1;buff[off+n++]=slide[wp++]=slide[copy_dist++]}}else{while(copy_leng>0&&n<size){copy_leng-=1;wp&=WSIZE-1;NEEDBITS(8);buff[off+n++]=slide[wp++]=GETBITS(8);DUMPBITS(8)}if(copy_leng===0){method=-1;}}if(n===size){return n}}if(method===-1){if(eof){break}NEEDBITS(1);if(GETBITS(1)!==0){eof=true}DUMPBITS(1);NEEDBITS(2);method=GETBITS(2);DUMPBITS(2);tl=null;copy_leng=0}switch(method){case STORED_BLOCK:i=inflate_stored(buff,off+n,size-n);break;case STATIC_TREES:if(tl){i=inflate_codes(buff,off+n,size-n)}else{i=inflate_fixed(buff,off+n,size-n)}break;case DYN_TREES:if(tl){i=inflate_codes(buff,off+n,size-n)}else{i=inflate_dynamic(buff,off+n,size-n)}break;default:i=-1;break}if(i===-1){if(eof){return 0}return -1}n+=i}return n}function inflate(arr){var buff=[],i;inflate_start();inflate_data=arr;inflate_pos=0;do{i=inflate_internal(buff,buff.length,1024)}while(i>0);inflate_data=null;return buff}window.inflate=inflate}());