5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "stdafx.h" 5128eecc9f 2011-02-23 kinaba: #include "LzhDecoder2.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::Unstore() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: #define UNS_BUFSIZE (32768) 5128eecc9f 2011-02-23 kinaba: int how_much; 5128eecc9f 2011-02-23 kinaba: char buf[UNS_BUFSIZE]; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( cmpsize==-1 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: while( (how_much=fread(buf,1,UNS_BUFSIZE,in))!=0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( how_much==-1 ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: fwrite(buf,1,how_much,out); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: return; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: while( cmpsize>0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: how_much = cmpsize>UNS_BUFSIZE?UNS_BUFSIZE:cmpsize; 5128eecc9f 2011-02-23 kinaba: if( 0>=(how_much=fread( buf,1,how_much,in )) ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: fwrite( buf,1,how_much,out ); 5128eecc9f 2011-02-23 kinaba: cmpsize -= how_much; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::Decode( lzh_method mhd,FILE* infile,DWORD insize, 5128eecc9f 2011-02-23 kinaba: FILE* outfile,DWORD outsize ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: in = infile; 5128eecc9f 2011-02-23 kinaba: cmpsize = insize; 5128eecc9f 2011-02-23 kinaba: out = outfile; 5128eecc9f 2011-02-23 kinaba: orisize = outsize; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: DWORD dicsiz,dicbit; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // メソッドによっていろいろ切り替え 5128eecc9f 2011-02-23 kinaba: switch( mhd ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: case LH0:Unstore(); return; 5128eecc9f 2011-02-23 kinaba: default: return; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: case LH4: np=14,pbit=4,dicbit=12,dicsiz=(1<<dicbit);break; 5128eecc9f 2011-02-23 kinaba: case LH5: np=14,pbit=4,dicbit=13,dicsiz=(1<<dicbit);break; 5128eecc9f 2011-02-23 kinaba: case LH6: np=16,pbit=5,dicbit=15,dicsiz=(1<<dicbit);break; 5128eecc9f 2011-02-23 kinaba: case LH7: np=17,pbit=5,dicbit=16,dicsiz=(1<<dicbit);break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: BYTE* text = new BYTE[dicsiz]; 5128eecc9f 2011-02-23 kinaba: memset( text,' ',dicsiz ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: init_getbits(); 5128eecc9f 2011-02-23 kinaba: blocksize = 0; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // デコード 5128eecc9f 2011-02-23 kinaba: DWORD count=0; 5128eecc9f 2011-02-23 kinaba: loc=0; 5128eecc9f 2011-02-23 kinaba: int offset=(0x0100-3); 5128eecc9f 2011-02-23 kinaba: while( count<orisize ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int c = Decode_C(mhd); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( c<=255 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: text[loc++] = c; 5128eecc9f 2011-02-23 kinaba: if( loc==dicsiz ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: fwrite(text,1,dicsiz,out); 5128eecc9f 2011-02-23 kinaba: loc = 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: count++; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int j = c - offset; 5128eecc9f 2011-02-23 kinaba: count += j; 5128eecc9f 2011-02-23 kinaba: int i = Decode_P(mhd); 5128eecc9f 2011-02-23 kinaba: if( (i=loc-i-1)<0 ) 5128eecc9f 2011-02-23 kinaba: i += dicsiz; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: for( int k=0; k<j; k++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: text[loc++] = text[i]; 5128eecc9f 2011-02-23 kinaba: if( loc>=dicsiz ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: fwrite( text,1,dicsiz,out ); 5128eecc9f 2011-02-23 kinaba: loc = 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if( ++i>=(int)dicsiz ) 5128eecc9f 2011-02-23 kinaba: i = 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( loc!=0 ) 5128eecc9f 2011-02-23 kinaba: fwrite( text,1,loc,out ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: delete [] text; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /**************** LH4-7,ARJ,ZOO ************************/ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::make_table(WORD nchar,BYTE* bitlen, 5128eecc9f 2011-02-23 kinaba: WORD tablebits,WORD* table) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD count[17],weight[17],start[17],total,*p; 5128eecc9f 2011-02-23 kinaba: unsigned int i; 5128eecc9f 2011-02-23 kinaba: int j,k,l,m,n,avail; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: avail = nchar; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: for( i=1; i<=16; i++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: count[i] = 0; 5128eecc9f 2011-02-23 kinaba: weight[i] = 1 << (16 - i); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: for( i=0; i<nchar; i++ ) 5128eecc9f 2011-02-23 kinaba: count[bitlen[i]]++; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: total = 0; 5128eecc9f 2011-02-23 kinaba: for( i=1; i<=16; i++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: start[i] = total; 5128eecc9f 2011-02-23 kinaba: total += weight[i] * count[i]; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if( (total & 0xffff) != 0 ) 5128eecc9f 2011-02-23 kinaba: return;//error("Bad table (5)\n"); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: m = 16 - tablebits; 5128eecc9f 2011-02-23 kinaba: for( i=1; i<=tablebits; i++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: start[i] >>= m; 5128eecc9f 2011-02-23 kinaba: weight[i] >>= m; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: j = start[tablebits + 1] >> m; 5128eecc9f 2011-02-23 kinaba: k = 1 << tablebits; 5128eecc9f 2011-02-23 kinaba: if( j!=0 ) 5128eecc9f 2011-02-23 kinaba: for( i=j; i<(unsigned)k; i++ ) 5128eecc9f 2011-02-23 kinaba: table[i] = 0; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: for( j=0; j<nchar; j++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: k = bitlen[j]; 5128eecc9f 2011-02-23 kinaba: if( k==0 ) 5128eecc9f 2011-02-23 kinaba: continue; 5128eecc9f 2011-02-23 kinaba: l = start[k] + weight[k]; 5128eecc9f 2011-02-23 kinaba: if( k<=tablebits ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: for( i=start[k]; i<(unsigned)l; i++ ) 5128eecc9f 2011-02-23 kinaba: table[i] = j; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: p = &table[(i = start[k]) >> m]; 5128eecc9f 2011-02-23 kinaba: i <<= tablebits; 5128eecc9f 2011-02-23 kinaba: n = k - tablebits; 5128eecc9f 2011-02-23 kinaba: while (--n >= 0) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (*p == 0) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: right[avail] = left[avail] = 0; 5128eecc9f 2011-02-23 kinaba: *p = avail++; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if (i & 0x8000) 5128eecc9f 2011-02-23 kinaba: p = &right[*p]; 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: p = &left[*p]; 5128eecc9f 2011-02-23 kinaba: i <<= 1; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: *p = j; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: start[k] = l; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::read_pt_len(short nn,short nbit,short i_special) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: short i, c, n=getbits((BYTE)nbit); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( n==0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: c = getbits((BYTE)nbit); 5128eecc9f 2011-02-23 kinaba: for( i=0; i<nn; i++ ) pt_len[i] = 0; 5128eecc9f 2011-02-23 kinaba: for( i=0; i<256; i++ ) pt_table[i] = c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: short i = 0; 5128eecc9f 2011-02-23 kinaba: while( i<n ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: c = bitbuf >> (16-3); 5128eecc9f 2011-02-23 kinaba: if( c==7 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD mask = 1<<(16-4); 5128eecc9f 2011-02-23 kinaba: while( mask&bitbuf ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: mask >>= 1; 5128eecc9f 2011-02-23 kinaba: c++; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: fillbuf( (c<7) ? 3 : c-3 ); 5128eecc9f 2011-02-23 kinaba: pt_len[i++] = (BYTE)c; 5128eecc9f 2011-02-23 kinaba: if( i==i_special ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: c = getbits(2); 5128eecc9f 2011-02-23 kinaba: while( --c>=0 ) 5128eecc9f 2011-02-23 kinaba: pt_len[i++] = 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: while( i<nn ) 5128eecc9f 2011-02-23 kinaba: pt_len[i++] = 0; 5128eecc9f 2011-02-23 kinaba: make_table(nn,pt_len,8,pt_table); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::read_c_len() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: short i, c, n=getbits(CBIT); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( n==0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: c = getbits(CBIT); 5128eecc9f 2011-02-23 kinaba: for( i=0; i<NC; i++ ) c_len[i] = 0; 5128eecc9f 2011-02-23 kinaba: for( i=0; i<4096; i++ ) c_table[i] = c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: short i = 0; 5128eecc9f 2011-02-23 kinaba: while( i<n ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: c = pt_table[ bitbuf>>(16-8) ]; 5128eecc9f 2011-02-23 kinaba: if( c>=NT ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD mask = 1<<(16-9); 5128eecc9f 2011-02-23 kinaba: do 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( bitbuf&mask )c = right[c]; 5128eecc9f 2011-02-23 kinaba: else c = left[c]; 5128eecc9f 2011-02-23 kinaba: mask >>= 1; 5128eecc9f 2011-02-23 kinaba: }while( c>=NT ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: fillbuf(pt_len[c]); 5128eecc9f 2011-02-23 kinaba: if( c<=2 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( c==0 ) c = 1; 5128eecc9f 2011-02-23 kinaba: else if( c==1 ) c = getbits(4) + 3; 5128eecc9f 2011-02-23 kinaba: else c = getbits(CBIT) + 20; 5128eecc9f 2011-02-23 kinaba: while( --c>=0 ) 5128eecc9f 2011-02-23 kinaba: c_len[i++] = 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: c_len[i++] = c-2; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: while( i<NC ) 5128eecc9f 2011-02-23 kinaba: c_len[i++]=0; 5128eecc9f 2011-02-23 kinaba: make_table(NC,c_len,12,c_table); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: WORD CLzhDecoder2::decode_c_st1() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD j,mask; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( blocksize==0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: blocksize = getbits(16); 5128eecc9f 2011-02-23 kinaba: read_pt_len(NT,TBIT,3); 5128eecc9f 2011-02-23 kinaba: read_c_len(); 5128eecc9f 2011-02-23 kinaba: read_pt_len(np,pbit,-1); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: blocksize--; 5128eecc9f 2011-02-23 kinaba: j = c_table[ bitbuf>>4 ]; 5128eecc9f 2011-02-23 kinaba: if( j<NC ) 5128eecc9f 2011-02-23 kinaba: fillbuf(c_len[j]); 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: fillbuf(12); 5128eecc9f 2011-02-23 kinaba: mask = 1 << (16-1); 5128eecc9f 2011-02-23 kinaba: do 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( bitbuf&mask ) j = right[j]; 5128eecc9f 2011-02-23 kinaba: else j = left[j]; 5128eecc9f 2011-02-23 kinaba: mask >>= 1; 5128eecc9f 2011-02-23 kinaba: }while( j>=NC ); 5128eecc9f 2011-02-23 kinaba: fillbuf( c_len[j]-12 ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: return j; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: WORD CLzhDecoder2::decode_p_st1() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD j, mask; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: j = pt_table[ bitbuf>>(16-8) ]; 5128eecc9f 2011-02-23 kinaba: if( j<np ) 5128eecc9f 2011-02-23 kinaba: fillbuf(pt_len[j]); 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: fillbuf(8); 5128eecc9f 2011-02-23 kinaba: mask = 1 << (16-1); 5128eecc9f 2011-02-23 kinaba: do 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( bitbuf&mask ) j = right[j]; 5128eecc9f 2011-02-23 kinaba: else j = left[j]; 5128eecc9f 2011-02-23 kinaba: mask >>= 1; 5128eecc9f 2011-02-23 kinaba: }while( j>=np ); 5128eecc9f 2011-02-23 kinaba: fillbuf(pt_len[j] - 8); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if( j!=0 ) 5128eecc9f 2011-02-23 kinaba: j = (1<<(j-1)) + getbits(j-1); 5128eecc9f 2011-02-23 kinaba: return j; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /******************** bit単位のread&write ************************/ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::init_getbits() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: bitbuf = 0; 5128eecc9f 2011-02-23 kinaba: subbitbuf = 0; 5128eecc9f 2011-02-23 kinaba: bitcount = 0; 5128eecc9f 2011-02-23 kinaba: fillbuf(16); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void CLzhDecoder2::fillbuf(BYTE n) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: while( n>bitcount ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: n -= bitcount; 5128eecc9f 2011-02-23 kinaba: bitbuf = (bitbuf<<bitcount) + (subbitbuf>>(8-bitcount)); 5128eecc9f 2011-02-23 kinaba: if( cmpsize!=0 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: cmpsize--; 5128eecc9f 2011-02-23 kinaba: subbitbuf = (BYTE)getc(in); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: subbitbuf = 0; 5128eecc9f 2011-02-23 kinaba: bitcount = 8; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: bitcount -= n; 5128eecc9f 2011-02-23 kinaba: bitbuf = (bitbuf<<n) + (subbitbuf>>(8-n)); 5128eecc9f 2011-02-23 kinaba: subbitbuf <<= n; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: WORD CLzhDecoder2::getbits(BYTE n) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD x = bitbuf>>(16-n); 5128eecc9f 2011-02-23 kinaba: fillbuf(n); 5128eecc9f 2011-02-23 kinaba: return x; 5128eecc9f 2011-02-23 kinaba: }