File Annotation

Not logged in
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: }