0000: 0d 0a 23 69 6e 63 6c 75 64 65 20 22 73 74 64 61 ..#include "stda
0010: 66 78 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 20 fx.h"..#include
0020: 22 4c 7a 68 44 65 63 6f 64 65 72 32 2e 68 22 0d "LzhDecoder2.h".
0030: 0a 0d 0a 76 6f 69 64 20 43 4c 7a 68 44 65 63 6f ...void CLzhDeco
0040: 64 65 72 32 3a 3a 55 6e 73 74 6f 72 65 28 29 0d der2::Unstore().
0050: 0a 7b 0d 0a 23 64 65 66 69 6e 65 20 55 4e 53 5f .{..#define UNS_
0060: 42 55 46 53 49 5a 45 20 28 33 32 37 36 38 29 0d BUFSIZE (32768).
0070: 0a 09 69 6e 74 20 68 6f 77 5f 6d 75 63 68 3b 0d ..int how_much;.
0080: 0a 09 63 68 61 72 20 62 75 66 5b 55 4e 53 5f 42 ..char buf[UNS_B
0090: 55 46 53 49 5a 45 5d 3b 0d 0a 0d 0a 09 69 66 28 UFSIZE];.....if(
00a0: 20 63 6d 70 73 69 7a 65 3d 3d 2d 31 20 29 0d 0a cmpsize==-1 )..
00b0: 09 7b 0d 0a 09 09 77 68 69 6c 65 28 20 28 68 6f .{....while( (ho
00c0: 77 5f 6d 75 63 68 3d 66 72 65 61 64 28 62 75 66 w_much=fread(buf
00d0: 2c 31 2c 55 4e 53 5f 42 55 46 53 49 5a 45 2c 69 ,1,UNS_BUFSIZE,i
00e0: 6e 29 29 21 3d 30 20 29 0d 0a 09 09 7b 0d 0a 09 n))!=0 )....{...
00f0: 09 09 69 66 28 20 68 6f 77 5f 6d 75 63 68 3d 3d ..if( how_much==
0100: 2d 31 20 29 0d 0a 09 09 09 09 62 72 65 61 6b 3b -1 )......break;
0110: 0d 0a 09 09 09 66 77 72 69 74 65 28 62 75 66 2c .....fwrite(buf,
0120: 31 2c 68 6f 77 5f 6d 75 63 68 2c 6f 75 74 29 3b 1,how_much,out);
0130: 0d 0a 09 09 7d 0d 0a 09 09 72 65 74 75 72 6e 3b ....}....return;
0140: 0d 0a 09 7d 0d 0a 0d 0a 09 77 68 69 6c 65 28 20 ...}.....while(
0150: 63 6d 70 73 69 7a 65 3e 30 20 29 0d 0a 09 7b 0d cmpsize>0 )...{.
0160: 0a 09 09 68 6f 77 5f 6d 75 63 68 20 3d 20 63 6d ...how_much = cm
0170: 70 73 69 7a 65 3e 55 4e 53 5f 42 55 46 53 49 5a psize>UNS_BUFSIZ
0180: 45 3f 55 4e 53 5f 42 55 46 53 49 5a 45 3a 63 6d E?UNS_BUFSIZE:cm
0190: 70 73 69 7a 65 3b 0d 0a 09 09 69 66 28 20 30 3e psize;....if( 0>
01a0: 3d 28 68 6f 77 5f 6d 75 63 68 3d 66 72 65 61 64 =(how_much=fread
01b0: 28 20 62 75 66 2c 31 2c 68 6f 77 5f 6d 75 63 68 ( buf,1,how_much
01c0: 2c 69 6e 20 29 29 20 29 0d 0a 09 09 09 62 72 65 ,in )) ).....bre
01d0: 61 6b 3b 0d 0a 09 09 66 77 72 69 74 65 28 20 62 ak;....fwrite( b
01e0: 75 66 2c 31 2c 68 6f 77 5f 6d 75 63 68 2c 6f 75 uf,1,how_much,ou
01f0: 74 20 29 3b 0d 0a 09 09 63 6d 70 73 69 7a 65 20 t );....cmpsize
0200: 2d 3d 20 68 6f 77 5f 6d 75 63 68 3b 0d 0a 09 7d -= how_much;...}
0210: 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 20 43 4c 7a 68 ..}....void CLzh
0220: 44 65 63 6f 64 65 72 32 3a 3a 44 65 63 6f 64 65 Decoder2::Decode
0230: 28 20 6c 7a 68 5f 6d 65 74 68 6f 64 20 6d 68 64 ( lzh_method mhd
0240: 2c 46 49 4c 45 2a 20 69 6e 66 69 6c 65 2c 44 57 ,FILE* infile,DW
0250: 4f 52 44 20 69 6e 73 69 7a 65 2c 0d 0a 09 09 09 ORD insize,.....
0260: 09 09 09 09 09 09 09 46 49 4c 45 2a 20 6f 75 74 .......FILE* out
0270: 66 69 6c 65 2c 44 57 4f 52 44 20 6f 75 74 73 69 file,DWORD outsi
0280: 7a 65 20 29 0d 0a 7b 0d 0a 09 69 6e 20 20 20 20 ze )..{...in
0290: 20 20 3d 20 69 6e 66 69 6c 65 3b 0d 0a 09 63 6d = infile;...cm
02a0: 70 73 69 7a 65 20 3d 20 69 6e 73 69 7a 65 3b 0d psize = insize;.
02b0: 0a 09 6f 75 74 20 20 20 20 20 3d 20 6f 75 74 66 ..out = outf
02c0: 69 6c 65 3b 0d 0a 09 6f 72 69 73 69 7a 65 20 3d ile;...orisize =
02d0: 20 6f 75 74 73 69 7a 65 3b 0d 0a 0d 0a 09 44 57 outsize;.....DW
02e0: 4f 52 44 20 64 69 63 73 69 7a 2c 64 69 63 62 69 ORD dicsiz,dicbi
02f0: 74 3b 0d 0a 0d 0a 09 2f 2f 20 83 81 83 5c 83 62 t;.....// ...\.b
0300: 83 68 82 c9 82 e6 82 c1 82 c4 82 a2 82 eb 82 a2 .h..............
0310: 82 eb 90 d8 82 e8 91 d6 82 a6 0d 0a 09 73 77 69 .............swi
0320: 74 63 68 28 20 6d 68 64 20 29 0d 0a 09 7b 0d 0a tch( mhd )...{..
0330: 09 63 61 73 65 20 4c 48 30 3a 55 6e 73 74 6f 72 .case LH0:Unstor
0340: 65 28 29 3b 09 72 65 74 75 72 6e 3b 0d 0a 09 64 e();.return;...d
0350: 65 66 61 75 6c 74 3a 09 09 09 72 65 74 75 72 6e efault:...return
0360: 3b 0d 0a 0d 0a 09 63 61 73 65 20 4c 48 34 3a 09 ;.....case LH4:.
0370: 6e 70 3d 31 34 2c 70 62 69 74 3d 34 2c 64 69 63 np=14,pbit=4,dic
0380: 62 69 74 3d 31 32 2c 64 69 63 73 69 7a 3d 28 31 bit=12,dicsiz=(1
0390: 3c 3c 64 69 63 62 69 74 29 3b 62 72 65 61 6b 3b <<dicbit);break;
03a0: 0d 0a 09 63 61 73 65 20 4c 48 35 3a 09 6e 70 3d ...case LH5:.np=
03b0: 31 34 2c 70 62 69 74 3d 34 2c 64 69 63 62 69 74 14,pbit=4,dicbit
03c0: 3d 31 33 2c 64 69 63 73 69 7a 3d 28 31 3c 3c 64 =13,dicsiz=(1<<d
03d0: 69 63 62 69 74 29 3b 62 72 65 61 6b 3b 0d 0a 09 icbit);break;...
03e0: 63 61 73 65 20 4c 48 36 3a 09 6e 70 3d 31 36 2c case LH6:.np=16,
03f0: 70 62 69 74 3d 35 2c 64 69 63 62 69 74 3d 31 35 pbit=5,dicbit=15
0400: 2c 64 69 63 73 69 7a 3d 28 31 3c 3c 64 69 63 62 ,dicsiz=(1<<dicb
0410: 69 74 29 3b 62 72 65 61 6b 3b 0d 0a 09 63 61 73 it);break;...cas
0420: 65 20 4c 48 37 3a 09 6e 70 3d 31 37 2c 70 62 69 e LH7:.np=17,pbi
0430: 74 3d 35 2c 64 69 63 62 69 74 3d 31 36 2c 64 69 t=5,dicbit=16,di
0440: 63 73 69 7a 3d 28 31 3c 3c 64 69 63 62 69 74 29 csiz=(1<<dicbit)
0450: 3b 62 72 65 61 6b 3b 0d 0a 09 7d 0d 0a 0d 0a 09 ;break;...}.....
0460: 42 59 54 45 2a 20 74 65 78 74 20 3d 20 6e 65 77 BYTE* text = new
0470: 20 42 59 54 45 5b 64 69 63 73 69 7a 5d 3b 0d 0a BYTE[dicsiz];..
0480: 09 6d 65 6d 73 65 74 28 20 74 65 78 74 2c 27 20 .memset( text,'
0490: 27 2c 64 69 63 73 69 7a 20 29 3b 0d 0a 0d 0a 09 ',dicsiz );.....
04a0: 69 6e 69 74 5f 67 65 74 62 69 74 73 28 29 3b 0d init_getbits();.
04b0: 0a 09 62 6c 6f 63 6b 73 69 7a 65 20 3d 20 30 3b ..blocksize = 0;
04c0: 0d 0a 0d 0a 09 2f 2f 20 83 66 83 52 81 5b 83 68 .....// .f.R.[.h
04d0: 0d 0a 09 44 57 4f 52 44 20 63 6f 75 6e 74 3d 30 ...DWORD count=0
04e0: 3b 0d 0a 09 6c 6f 63 3d 30 3b 0d 0a 09 69 6e 74 ;...loc=0;...int
04f0: 20 6f 66 66 73 65 74 3d 28 30 78 30 31 30 30 2d offset=(0x0100-
0500: 33 29 3b 0d 0a 09 77 68 69 6c 65 28 20 63 6f 75 3);...while( cou
0510: 6e 74 3c 6f 72 69 73 69 7a 65 20 29 0d 0a 09 7b nt<orisize )...{
0520: 0d 0a 09 09 69 6e 74 20 63 20 3d 20 44 65 63 6f ....int c = Deco
0530: 64 65 5f 43 28 6d 68 64 29 3b 0d 0a 0d 0a 09 09 de_C(mhd);......
0540: 69 66 28 20 63 3c 3d 32 35 35 20 29 0d 0a 09 09 if( c<=255 )....
0550: 7b 0d 0a 09 09 09 74 65 78 74 5b 6c 6f 63 2b 2b {.....text[loc++
0560: 5d 20 3d 20 63 3b 0d 0a 09 09 09 69 66 28 20 6c ] = c;.....if( l
0570: 6f 63 3d 3d 64 69 63 73 69 7a 20 29 0d 0a 09 09 oc==dicsiz )....
0580: 09 7b 0d 0a 09 09 09 09 66 77 72 69 74 65 28 74 .{......fwrite(t
0590: 65 78 74 2c 31 2c 64 69 63 73 69 7a 2c 6f 75 74 ext,1,dicsiz,out
05a0: 29 3b 0d 0a 09 09 09 09 6c 6f 63 20 3d 20 30 3b );......loc = 0;
05b0: 0d 0a 09 09 09 7d 0d 0a 09 09 09 63 6f 75 6e 74 .....}.....count
05c0: 2b 2b 3b 0d 0a 09 09 7d 0d 0a 09 09 65 6c 73 65 ++;....}....else
05d0: 0d 0a 09 09 7b 0d 0a 09 09 09 69 6e 74 20 6a 20 ....{.....int j
05e0: 3d 20 63 20 2d 20 6f 66 66 73 65 74 3b 0d 0a 09 = c - offset;...
05f0: 09 09 63 6f 75 6e 74 20 2b 3d 20 6a 3b 0d 0a 09 ..count += j;...
0600: 09 09 69 6e 74 20 69 20 3d 20 44 65 63 6f 64 65 ..int i = Decode
0610: 5f 50 28 6d 68 64 29 3b 0d 0a 09 09 09 69 66 28 _P(mhd);.....if(
0620: 20 28 69 3d 6c 6f 63 2d 69 2d 31 29 3c 30 20 29 (i=loc-i-1)<0 )
0630: 0d 0a 09 09 09 09 69 20 2b 3d 20 64 69 63 73 69 ......i += dicsi
0640: 7a 3b 0d 0a 0d 0a 09 09 09 66 6f 72 28 20 69 6e z;.......for( in
0650: 74 20 6b 3d 30 3b 20 6b 3c 6a 3b 20 6b 2b 2b 20 t k=0; k<j; k++
0660: 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 74 65 78 ).....{......tex
0670: 74 5b 6c 6f 63 2b 2b 5d 20 3d 20 74 65 78 74 5b t[loc++] = text[
0680: 69 5d 3b 0d 0a 09 09 09 09 69 66 28 20 6c 6f 63 i];......if( loc
0690: 3e 3d 64 69 63 73 69 7a 20 29 0d 0a 09 09 09 09 >=dicsiz )......
06a0: 7b 0d 0a 09 09 09 09 09 66 77 72 69 74 65 28 20 {.......fwrite(
06b0: 74 65 78 74 2c 31 2c 64 69 63 73 69 7a 2c 6f 75 text,1,dicsiz,ou
06c0: 74 20 29 3b 0d 0a 09 09 09 09 09 6c 6f 63 20 3d t );.......loc =
06d0: 20 30 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 09 0;......}......
06e0: 69 66 28 20 2b 2b 69 3e 3d 28 69 6e 74 29 64 69 if( ++i>=(int)di
06f0: 63 73 69 7a 20 29 0d 0a 09 09 09 09 09 69 20 3d csiz ).......i =
0700: 20 30 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d 0d 0a 0;.....}....}..
0710: 09 7d 0d 0a 0d 0a 09 69 66 28 20 6c 6f 63 21 3d .}.....if( loc!=
0720: 30 20 29 0d 0a 09 09 66 77 72 69 74 65 28 20 74 0 )....fwrite( t
0730: 65 78 74 2c 31 2c 6c 6f 63 2c 6f 75 74 20 29 3b ext,1,loc,out );
0740: 0d 0a 0d 0a 09 64 65 6c 65 74 65 20 5b 5d 20 74 .....delete [] t
0750: 65 78 74 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 2a 2a 2a ext;..}..../****
0760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4c 48 34 ************ LH4
0770: 2d 37 2c 41 52 4a 2c 5a 4f 4f 20 2a 2a 2a 2a 2a -7,ARJ,ZOO *****
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0790: 2a 2a 2a 2f 0d 0a 0d 0a 76 6f 69 64 20 43 4c 7a ***/....void CLz
07a0: 68 44 65 63 6f 64 65 72 32 3a 3a 6d 61 6b 65 5f hDecoder2::make_
07b0: 74 61 62 6c 65 28 57 4f 52 44 20 6e 63 68 61 72 table(WORD nchar
07c0: 2c 42 59 54 45 2a 20 62 69 74 6c 65 6e 2c 0d 0a ,BYTE* bitlen,..
07d0: 09 09 09 09 09 09 09 09 57 4f 52 44 20 74 61 62 ........WORD tab
07e0: 6c 65 62 69 74 73 2c 57 4f 52 44 2a 20 74 61 62 lebits,WORD* tab
07f0: 6c 65 29 0d 0a 7b 0d 0a 09 57 4f 52 44 20 63 6f le)..{...WORD co
0800: 75 6e 74 5b 31 37 5d 2c 77 65 69 67 68 74 5b 31 unt[17],weight[1
0810: 37 5d 2c 73 74 61 72 74 5b 31 37 5d 2c 74 6f 74 7],start[17],tot
0820: 61 6c 2c 2a 70 3b 0d 0a 09 75 6e 73 69 67 6e 65 al,*p;...unsigne
0830: 64 20 69 6e 74 20 69 3b 0d 0a 09 69 6e 74 20 6a d int i;...int j
0840: 2c 6b 2c 6c 2c 6d 2c 6e 2c 61 76 61 69 6c 3b 0d ,k,l,m,n,avail;.
0850: 0a 0d 0a 09 61 76 61 69 6c 20 3d 20 6e 63 68 61 ....avail = ncha
0860: 72 3b 0d 0a 0d 0a 09 66 6f 72 28 20 69 3d 31 3b r;.....for( i=1;
0870: 20 69 3c 3d 31 36 3b 20 69 2b 2b 20 29 0d 0a 09 i<=16; i++ )...
0880: 7b 0d 0a 09 09 63 6f 75 6e 74 5b 69 5d 20 3d 20 {....count[i] =
0890: 30 3b 0d 0a 09 09 77 65 69 67 68 74 5b 69 5d 20 0;....weight[i]
08a0: 3d 20 31 20 3c 3c 20 28 31 36 20 2d 20 69 29 3b = 1 << (16 - i);
08b0: 0d 0a 09 7d 0d 0a 0d 0a 09 66 6f 72 28 20 69 3d ...}.....for( i=
08c0: 30 3b 20 69 3c 6e 63 68 61 72 3b 20 69 2b 2b 20 0; i<nchar; i++
08d0: 29 0d 0a 09 09 63 6f 75 6e 74 5b 62 69 74 6c 65 )....count[bitle
08e0: 6e 5b 69 5d 5d 2b 2b 3b 0d 0a 0d 0a 09 74 6f 74 n[i]]++;.....tot
08f0: 61 6c 20 3d 20 30 3b 0d 0a 09 66 6f 72 28 20 69 al = 0;...for( i
0900: 3d 31 3b 20 69 3c 3d 31 36 3b 20 69 2b 2b 20 29 =1; i<=16; i++ )
0910: 0d 0a 09 7b 0d 0a 09 09 73 74 61 72 74 5b 69 5d ...{....start[i]
0920: 20 3d 20 74 6f 74 61 6c 3b 0d 0a 09 09 74 6f 74 = total;....tot
0930: 61 6c 20 2b 3d 20 77 65 69 67 68 74 5b 69 5d 20 al += weight[i]
0940: 2a 20 63 6f 75 6e 74 5b 69 5d 3b 0d 0a 09 7d 0d * count[i];...}.
0950: 0a 09 69 66 28 20 28 74 6f 74 61 6c 20 26 20 30 ..if( (total & 0
0960: 78 66 66 66 66 29 20 21 3d 20 30 20 29 0d 0a 09 xffff) != 0 )...
0970: 09 72 65 74 75 72 6e 3b 2f 2f 65 72 72 6f 72 28 .return;//error(
0980: 22 42 61 64 20 74 61 62 6c 65 20 28 35 29 5c 6e "Bad table (5)\n
0990: 22 29 3b 0d 0a 0d 0a 09 6d 20 3d 20 31 36 20 2d ");.....m = 16 -
09a0: 20 74 61 62 6c 65 62 69 74 73 3b 0d 0a 09 66 6f tablebits;...fo
09b0: 72 28 20 69 3d 31 3b 20 69 3c 3d 74 61 62 6c 65 r( i=1; i<=table
09c0: 62 69 74 73 3b 20 69 2b 2b 20 29 0d 0a 09 7b 0d bits; i++ )...{.
09d0: 0a 09 09 73 74 61 72 74 5b 69 5d 20 3e 3e 3d 20 ...start[i] >>=
09e0: 6d 3b 0d 0a 09 09 77 65 69 67 68 74 5b 69 5d 20 m;....weight[i]
09f0: 3e 3e 3d 20 6d 3b 0d 0a 09 7d 0d 0a 0d 0a 09 6a >>= m;...}.....j
0a00: 20 3d 20 73 74 61 72 74 5b 74 61 62 6c 65 62 69 = start[tablebi
0a10: 74 73 20 2b 20 31 5d 20 3e 3e 20 6d 3b 0d 0a 09 ts + 1] >> m;...
0a20: 6b 20 3d 20 31 20 3c 3c 20 74 61 62 6c 65 62 69 k = 1 << tablebi
0a30: 74 73 3b 0d 0a 09 69 66 28 20 6a 21 3d 30 20 29 ts;...if( j!=0 )
0a40: 0d 0a 09 09 66 6f 72 28 20 69 3d 6a 3b 20 69 3c ....for( i=j; i<
0a50: 28 75 6e 73 69 67 6e 65 64 29 6b 3b 20 69 2b 2b (unsigned)k; i++
0a60: 20 29 0d 0a 09 09 09 74 61 62 6c 65 5b 69 5d 20 ).....table[i]
0a70: 3d 20 30 3b 0d 0a 0d 0a 09 66 6f 72 28 20 6a 3d = 0;.....for( j=
0a80: 30 3b 20 6a 3c 6e 63 68 61 72 3b 20 6a 2b 2b 20 0; j<nchar; j++
0a90: 29 0d 0a 09 7b 0d 0a 09 09 6b 20 3d 20 62 69 74 )...{....k = bit
0aa0: 6c 65 6e 5b 6a 5d 3b 0d 0a 09 09 69 66 28 20 6b len[j];....if( k
0ab0: 3d 3d 30 20 29 0d 0a 09 09 09 63 6f 6e 74 69 6e ==0 ).....contin
0ac0: 75 65 3b 0d 0a 09 09 6c 20 3d 20 73 74 61 72 74 ue;....l = start
0ad0: 5b 6b 5d 20 2b 20 77 65 69 67 68 74 5b 6b 5d 3b [k] + weight[k];
0ae0: 0d 0a 09 09 69 66 28 20 6b 3c 3d 74 61 62 6c 65 ....if( k<=table
0af0: 62 69 74 73 20 29 0d 0a 09 09 7b 0d 0a 09 09 09 bits )....{.....
0b00: 66 6f 72 28 20 69 3d 73 74 61 72 74 5b 6b 5d 3b for( i=start[k];
0b10: 20 69 3c 28 75 6e 73 69 67 6e 65 64 29 6c 3b 20 i<(unsigned)l;
0b20: 69 2b 2b 20 29 0d 0a 09 09 09 09 74 61 62 6c 65 i++ )......table
0b30: 5b 69 5d 20 3d 20 6a 3b 0d 0a 09 09 7d 0d 0a 09 [i] = j;....}...
0b40: 09 65 6c 73 65 0d 0a 09 09 7b 0d 0a 09 09 09 70 .else....{.....p
0b50: 20 3d 20 26 74 61 62 6c 65 5b 28 69 20 3d 20 73 = &table[(i = s
0b60: 74 61 72 74 5b 6b 5d 29 20 3e 3e 20 6d 5d 3b 0d tart[k]) >> m];.
0b70: 0a 09 09 09 69 20 3c 3c 3d 20 74 61 62 6c 65 62 ....i <<= tableb
0b80: 69 74 73 3b 0d 0a 09 09 09 6e 20 3d 20 6b 20 2d its;.....n = k -
0b90: 20 74 61 62 6c 65 62 69 74 73 3b 0d 0a 09 09 09 tablebits;.....
0ba0: 77 68 69 6c 65 20 28 2d 2d 6e 20 3e 3d 20 30 29 while (--n >= 0)
0bb0: 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 69 66 20 28 .....{......if (
0bc0: 2a 70 20 3d 3d 20 30 29 0d 0a 09 09 09 09 7b 0d *p == 0)......{.
0bd0: 0a 09 09 09 09 09 72 69 67 68 74 5b 61 76 61 69 ......right[avai
0be0: 6c 5d 20 3d 20 6c 65 66 74 5b 61 76 61 69 6c 5d l] = left[avail]
0bf0: 20 3d 20 30 3b 0d 0a 09 09 09 09 09 2a 70 20 3d = 0;.......*p =
0c00: 20 61 76 61 69 6c 2b 2b 3b 0d 0a 09 09 09 09 7d avail++;......}
0c10: 0d 0a 09 09 09 09 69 66 20 28 69 20 26 20 30 78 ......if (i & 0x
0c20: 38 30 30 30 29 0d 0a 09 09 09 09 09 70 20 3d 20 8000).......p =
0c30: 26 72 69 67 68 74 5b 2a 70 5d 3b 0d 0a 09 09 09 &right[*p];.....
0c40: 09 65 6c 73 65 0d 0a 09 09 09 09 09 70 20 3d 20 .else.......p =
0c50: 26 6c 65 66 74 5b 2a 70 5d 3b 0d 0a 09 09 09 09 &left[*p];......
0c60: 69 20 3c 3c 3d 20 31 3b 0d 0a 09 09 09 7d 0d 0a i <<= 1;.....}..
0c70: 09 09 09 2a 70 20 3d 20 6a 3b 0d 0a 09 09 7d 0d ...*p = j;....}.
0c80: 0a 09 09 73 74 61 72 74 5b 6b 5d 20 3d 20 6c 3b ...start[k] = l;
0c90: 0d 0a 09 7d 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 20 ...}..}....void
0ca0: 43 4c 7a 68 44 65 63 6f 64 65 72 32 3a 3a 72 65 CLzhDecoder2::re
0cb0: 61 64 5f 70 74 5f 6c 65 6e 28 73 68 6f 72 74 20 ad_pt_len(short
0cc0: 6e 6e 2c 73 68 6f 72 74 20 6e 62 69 74 2c 73 68 nn,short nbit,sh
0cd0: 6f 72 74 20 69 5f 73 70 65 63 69 61 6c 29 0d 0a ort i_special)..
0ce0: 7b 0d 0a 09 73 68 6f 72 74 20 69 2c 20 63 2c 20 {...short i, c,
0cf0: 6e 3d 67 65 74 62 69 74 73 28 28 42 59 54 45 29 n=getbits((BYTE)
0d00: 6e 62 69 74 29 3b 0d 0a 0d 0a 09 69 66 28 20 6e nbit);.....if( n
0d10: 3d 3d 30 20 29 0d 0a 09 7b 0d 0a 09 09 63 20 3d ==0 )...{....c =
0d20: 20 67 65 74 62 69 74 73 28 28 42 59 54 45 29 6e getbits((BYTE)n
0d30: 62 69 74 29 3b 0d 0a 09 09 66 6f 72 28 20 69 3d bit);....for( i=
0d40: 30 3b 20 69 3c 6e 6e 3b 20 69 2b 2b 20 29 09 70 0; i<nn; i++ ).p
0d50: 74 5f 6c 65 6e 5b 69 5d 20 3d 20 30 3b 0d 0a 09 t_len[i] = 0;...
0d60: 09 66 6f 72 28 20 69 3d 30 3b 20 69 3c 32 35 36 .for( i=0; i<256
0d70: 3b 20 69 2b 2b 20 29 09 70 74 5f 74 61 62 6c 65 ; i++ ).pt_table
0d80: 5b 69 5d 20 3d 20 63 3b 0d 0a 09 7d 0d 0a 09 65 [i] = c;...}...e
0d90: 6c 73 65 0d 0a 09 7b 0d 0a 09 09 73 68 6f 72 74 lse...{....short
0da0: 20 69 20 3d 20 30 3b 0d 0a 09 09 77 68 69 6c 65 i = 0;....while
0db0: 28 20 69 3c 6e 20 29 0d 0a 09 09 7b 0d 0a 09 09 ( i<n )....{....
0dc0: 09 63 20 3d 20 62 69 74 62 75 66 20 3e 3e 20 28 .c = bitbuf >> (
0dd0: 31 36 2d 33 29 3b 0d 0a 09 09 09 69 66 28 20 63 16-3);.....if( c
0de0: 3d 3d 37 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 ==7 ).....{.....
0df0: 09 57 4f 52 44 20 6d 61 73 6b 20 3d 20 31 3c 3c .WORD mask = 1<<
0e00: 28 31 36 2d 34 29 3b 0d 0a 09 09 09 09 77 68 69 (16-4);......whi
0e10: 6c 65 28 20 6d 61 73 6b 26 62 69 74 62 75 66 20 le( mask&bitbuf
0e20: 29 0d 0a 09 09 09 09 7b 0d 0a 09 09 09 09 09 6d )......{.......m
0e30: 61 73 6b 20 3e 3e 3d 20 31 3b 0d 0a 09 09 09 09 ask >>= 1;......
0e40: 09 63 2b 2b 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 .c++;......}....
0e50: 09 7d 0d 0a 09 09 09 66 69 6c 6c 62 75 66 28 20 .}.....fillbuf(
0e60: 28 63 3c 37 29 20 3f 20 33 20 3a 20 63 2d 33 20 (c<7) ? 3 : c-3
0e70: 29 3b 0d 0a 09 09 09 70 74 5f 6c 65 6e 5b 69 2b );.....pt_len[i+
0e80: 2b 5d 20 3d 20 28 42 59 54 45 29 63 3b 0d 0a 09 +] = (BYTE)c;...
0e90: 09 09 69 66 28 20 69 3d 3d 69 5f 73 70 65 63 69 ..if( i==i_speci
0ea0: 61 6c 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 al ).....{......
0eb0: 63 20 3d 20 67 65 74 62 69 74 73 28 32 29 3b 0d c = getbits(2);.
0ec0: 0a 09 09 09 09 77 68 69 6c 65 28 20 2d 2d 63 3e .....while( --c>
0ed0: 3d 30 20 29 0d 0a 09 09 09 09 09 70 74 5f 6c 65 =0 ).......pt_le
0ee0: 6e 5b 69 2b 2b 5d 20 3d 20 30 3b 0d 0a 09 09 09 n[i++] = 0;.....
0ef0: 7d 0d 0a 09 09 7d 0d 0a 09 09 77 68 69 6c 65 28 }....}....while(
0f00: 20 69 3c 6e 6e 20 29 0d 0a 09 09 09 70 74 5f 6c i<nn ).....pt_l
0f10: 65 6e 5b 69 2b 2b 5d 20 3d 20 30 3b 0d 0a 09 09 en[i++] = 0;....
0f20: 6d 61 6b 65 5f 74 61 62 6c 65 28 6e 6e 2c 70 74 make_table(nn,pt
0f30: 5f 6c 65 6e 2c 38 2c 70 74 5f 74 61 62 6c 65 29 _len,8,pt_table)
0f40: 3b 0d 0a 09 7d 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 ;...}..}....void
0f50: 20 43 4c 7a 68 44 65 63 6f 64 65 72 32 3a 3a 72 CLzhDecoder2::r
0f60: 65 61 64 5f 63 5f 6c 65 6e 28 29 0d 0a 7b 0d 0a ead_c_len()..{..
0f70: 09 73 68 6f 72 74 20 69 2c 20 63 2c 20 6e 3d 67 .short i, c, n=g
0f80: 65 74 62 69 74 73 28 43 42 49 54 29 3b 0d 0a 0d etbits(CBIT);...
0f90: 0a 09 69 66 28 20 6e 3d 3d 30 20 29 0d 0a 09 7b ..if( n==0 )...{
0fa0: 0d 0a 09 09 63 20 3d 20 67 65 74 62 69 74 73 28 ....c = getbits(
0fb0: 43 42 49 54 29 3b 0d 0a 09 09 66 6f 72 28 20 69 CBIT);....for( i
0fc0: 3d 30 3b 20 69 3c 4e 43 3b 20 69 2b 2b 20 29 09 =0; i<NC; i++ ).
0fd0: 63 5f 6c 65 6e 5b 69 5d 20 3d 20 30 3b 0d 0a 09 c_len[i] = 0;...
0fe0: 09 66 6f 72 28 20 69 3d 30 3b 20 69 3c 34 30 39 .for( i=0; i<409
0ff0: 36 3b 20 69 2b 2b 20 29 09 63 5f 74 61 62 6c 65 6; i++ ).c_table
1000: 5b 69 5d 20 3d 20 63 3b 0d 0a 09 7d 0d 0a 09 65 [i] = c;...}...e
1010: 6c 73 65 0d 0a 09 7b 0d 0a 09 09 73 68 6f 72 74 lse...{....short
1020: 20 69 20 3d 20 30 3b 0d 0a 09 09 77 68 69 6c 65 i = 0;....while
1030: 28 20 69 3c 6e 20 29 0d 0a 09 09 7b 0d 0a 09 09 ( i<n )....{....
1040: 09 63 20 3d 20 70 74 5f 74 61 62 6c 65 5b 20 62 .c = pt_table[ b
1050: 69 74 62 75 66 3e 3e 28 31 36 2d 38 29 20 5d 3b itbuf>>(16-8) ];
1060: 0d 0a 09 09 09 69 66 28 20 63 3e 3d 4e 54 20 29 .....if( c>=NT )
1070: 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 57 4f 52 44 .....{......WORD
1080: 20 6d 61 73 6b 20 3d 20 31 3c 3c 28 31 36 2d 39 mask = 1<<(16-9
1090: 29 3b 0d 0a 09 09 09 09 64 6f 0d 0a 09 09 09 09 );......do......
10a0: 7b 0d 0a 09 09 09 09 09 69 66 28 20 62 69 74 62 {.......if( bitb
10b0: 75 66 26 6d 61 73 6b 20 29 63 20 3d 20 72 69 67 uf&mask )c = rig
10c0: 68 74 5b 63 5d 3b 0d 0a 09 09 09 09 09 65 6c 73 ht[c];.......els
10d0: 65 09 09 09 20 63 20 3d 20 6c 65 66 74 5b 63 5d e... c = left[c]
10e0: 3b 0d 0a 09 09 09 09 09 6d 61 73 6b 20 3e 3e 3d ;.......mask >>=
10f0: 20 31 3b 0d 0a 09 09 09 09 7d 77 68 69 6c 65 28 1;......}while(
1100: 20 63 3e 3d 4e 54 20 29 3b 0d 0a 09 09 09 7d 0d c>=NT );.....}.
1110: 0a 09 09 09 66 69 6c 6c 62 75 66 28 70 74 5f 6c ....fillbuf(pt_l
1120: 65 6e 5b 63 5d 29 3b 0d 0a 09 09 09 69 66 28 20 en[c]);.....if(
1130: 63 3c 3d 32 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 c<=2 ).....{....
1140: 09 09 69 66 28 20 63 3d 3d 30 20 29 09 09 63 20 ..if( c==0 )..c
1150: 3d 20 31 3b 0d 0a 09 09 09 09 65 6c 73 65 20 69 = 1;......else i
1160: 66 28 20 63 3d 3d 31 20 29 09 63 20 3d 20 67 65 f( c==1 ).c = ge
1170: 74 62 69 74 73 28 34 29 20 2b 20 33 3b 0d 0a 09 tbits(4) + 3;...
1180: 09 09 09 65 6c 73 65 09 09 09 63 20 3d 20 67 65 ...else...c = ge
1190: 74 62 69 74 73 28 43 42 49 54 29 20 2b 20 32 30 tbits(CBIT) + 20
11a0: 3b 0d 0a 09 09 09 09 77 68 69 6c 65 28 20 2d 2d ;......while( --
11b0: 63 3e 3d 30 20 29 0d 0a 09 09 09 09 09 63 5f 6c c>=0 ).......c_l
11c0: 65 6e 5b 69 2b 2b 5d 20 3d 20 30 3b 0d 0a 09 09 en[i++] = 0;....
11d0: 09 7d 0d 0a 09 09 09 65 6c 73 65 0d 0a 09 09 09 .}.....else.....
11e0: 09 63 5f 6c 65 6e 5b 69 2b 2b 5d 20 3d 20 63 2d .c_len[i++] = c-
11f0: 32 3b 0d 0a 09 09 7d 0d 0a 09 09 77 68 69 6c 65 2;....}....while
1200: 28 20 69 3c 4e 43 20 29 0d 0a 09 09 09 63 5f 6c ( i<NC ).....c_l
1210: 65 6e 5b 69 2b 2b 5d 3d 30 3b 0d 0a 09 09 6d 61 en[i++]=0;....ma
1220: 6b 65 5f 74 61 62 6c 65 28 4e 43 2c 63 5f 6c 65 ke_table(NC,c_le
1230: 6e 2c 31 32 2c 63 5f 74 61 62 6c 65 29 3b 0d 0a n,12,c_table);..
1240: 09 7d 0d 0a 7d 0d 0a 0d 0a 57 4f 52 44 20 43 4c .}..}....WORD CL
1250: 7a 68 44 65 63 6f 64 65 72 32 3a 3a 64 65 63 6f zhDecoder2::deco
1260: 64 65 5f 63 5f 73 74 31 28 29 0d 0a 7b 0d 0a 09 de_c_st1()..{...
1270: 57 4f 52 44 20 6a 2c 6d 61 73 6b 3b 0d 0a 0d 0a WORD j,mask;....
1280: 09 69 66 28 20 62 6c 6f 63 6b 73 69 7a 65 3d 3d .if( blocksize==
1290: 30 20 29 0d 0a 09 7b 0d 0a 09 09 62 6c 6f 63 6b 0 )...{....block
12a0: 73 69 7a 65 20 3d 20 67 65 74 62 69 74 73 28 31 size = getbits(1
12b0: 36 29 3b 0d 0a 09 09 72 65 61 64 5f 70 74 5f 6c 6);....read_pt_l
12c0: 65 6e 28 4e 54 2c 54 42 49 54 2c 33 29 3b 0d 0a en(NT,TBIT,3);..
12d0: 09 09 72 65 61 64 5f 63 5f 6c 65 6e 28 29 3b 0d ..read_c_len();.
12e0: 0a 09 09 72 65 61 64 5f 70 74 5f 6c 65 6e 28 6e ...read_pt_len(n
12f0: 70 2c 70 62 69 74 2c 2d 31 29 3b 0d 0a 09 7d 0d p,pbit,-1);...}.
1300: 0a 09 62 6c 6f 63 6b 73 69 7a 65 2d 2d 3b 0d 0a ..blocksize--;..
1310: 09 6a 20 3d 20 63 5f 74 61 62 6c 65 5b 20 62 69 .j = c_table[ bi
1320: 74 62 75 66 3e 3e 34 20 5d 3b 0d 0a 09 69 66 28 tbuf>>4 ];...if(
1330: 20 6a 3c 4e 43 20 29 0d 0a 09 09 66 69 6c 6c 62 j<NC )....fillb
1340: 75 66 28 63 5f 6c 65 6e 5b 6a 5d 29 3b 0d 0a 09 uf(c_len[j]);...
1350: 65 6c 73 65 0d 0a 09 7b 0d 0a 09 09 66 69 6c 6c else...{....fill
1360: 62 75 66 28 31 32 29 3b 0d 0a 09 09 6d 61 73 6b buf(12);....mask
1370: 20 3d 20 31 20 3c 3c 20 28 31 36 2d 31 29 3b 0d = 1 << (16-1);.
1380: 0a 09 09 64 6f 0d 0a 09 09 7b 0d 0a 09 09 09 69 ...do....{.....i
1390: 66 28 20 62 69 74 62 75 66 26 6d 61 73 6b 20 29 f( bitbuf&mask )
13a0: 09 6a 20 3d 20 72 69 67 68 74 5b 6a 5d 3b 0d 0a .j = right[j];..
13b0: 09 09 09 65 6c 73 65 09 09 09 09 6a 20 3d 20 6c ...else....j = l
13c0: 65 66 74 5b 6a 5d 3b 0d 0a 09 09 09 6d 61 73 6b eft[j];.....mask
13d0: 20 3e 3e 3d 20 31 3b 0d 0a 09 09 7d 77 68 69 6c >>= 1;....}whil
13e0: 65 28 20 6a 3e 3d 4e 43 20 29 3b 0d 0a 09 09 66 e( j>=NC );....f
13f0: 69 6c 6c 62 75 66 28 20 63 5f 6c 65 6e 5b 6a 5d illbuf( c_len[j]
1400: 2d 31 32 20 29 3b 0d 0a 09 7d 0d 0a 09 72 65 74 -12 );...}...ret
1410: 75 72 6e 20 6a 3b 0d 0a 7d 0d 0a 0d 0a 57 4f 52 urn j;..}....WOR
1420: 44 20 43 4c 7a 68 44 65 63 6f 64 65 72 32 3a 3a D CLzhDecoder2::
1430: 64 65 63 6f 64 65 5f 70 5f 73 74 31 28 29 0d 0a decode_p_st1()..
1440: 7b 0d 0a 09 57 4f 52 44 20 6a 2c 20 6d 61 73 6b {...WORD j, mask
1450: 3b 0d 0a 0d 0a 09 6a 20 3d 20 70 74 5f 74 61 62 ;.....j = pt_tab
1460: 6c 65 5b 20 62 69 74 62 75 66 3e 3e 28 31 36 2d le[ bitbuf>>(16-
1470: 38 29 20 5d 3b 0d 0a 09 69 66 28 20 6a 3c 6e 70 8) ];...if( j<np
1480: 20 29 0d 0a 09 09 66 69 6c 6c 62 75 66 28 70 74 )....fillbuf(pt
1490: 5f 6c 65 6e 5b 6a 5d 29 3b 0d 0a 09 65 6c 73 65 _len[j]);...else
14a0: 0d 0a 09 7b 0d 0a 09 09 66 69 6c 6c 62 75 66 28 ...{....fillbuf(
14b0: 38 29 3b 0d 0a 09 09 6d 61 73 6b 20 3d 20 31 20 8);....mask = 1
14c0: 3c 3c 20 28 31 36 2d 31 29 3b 0d 0a 09 09 64 6f << (16-1);....do
14d0: 0d 0a 09 09 7b 0d 0a 09 09 09 69 66 28 20 62 69 ....{.....if( bi
14e0: 74 62 75 66 26 6d 61 73 6b 20 29 09 6a 20 3d 20 tbuf&mask ).j =
14f0: 72 69 67 68 74 5b 6a 5d 3b 0d 0a 09 09 09 65 6c right[j];.....el
1500: 73 65 09 09 09 09 6a 20 3d 20 6c 65 66 74 5b 6a se....j = left[j
1510: 5d 3b 0d 0a 09 09 09 6d 61 73 6b 20 3e 3e 3d 20 ];.....mask >>=
1520: 31 3b 0d 0a 09 09 7d 77 68 69 6c 65 28 20 6a 3e 1;....}while( j>
1530: 3d 6e 70 20 29 3b 0d 0a 09 09 66 69 6c 6c 62 75 =np );....fillbu
1540: 66 28 70 74 5f 6c 65 6e 5b 6a 5d 20 2d 20 38 29 f(pt_len[j] - 8)
1550: 3b 0d 0a 09 7d 0d 0a 09 69 66 28 20 6a 21 3d 30 ;...}...if( j!=0
1560: 20 29 0d 0a 09 09 6a 20 3d 20 28 31 3c 3c 28 6a )....j = (1<<(j
1570: 2d 31 29 29 20 2b 20 67 65 74 62 69 74 73 28 6a -1)) + getbits(j
1580: 2d 31 29 3b 0d 0a 09 72 65 74 75 72 6e 20 6a 3b -1);...return j;
1590: 0d 0a 7d 0d 0a 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a ..}....../******
15a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 62 ************** b
15b0: 69 74 92 50 88 ca 82 cc 72 65 61 64 26 77 72 69 it.P....read&wri
15c0: 74 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a te *************
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a ***********/....
15e0: 76 6f 69 64 20 43 4c 7a 68 44 65 63 6f 64 65 72 void CLzhDecoder
15f0: 32 3a 3a 69 6e 69 74 5f 67 65 74 62 69 74 73 28 2::init_getbits(
1600: 29 0d 0a 7b 0d 0a 09 62 69 74 62 75 66 20 3d 20 )..{...bitbuf =
1610: 30 3b 0d 0a 09 73 75 62 62 69 74 62 75 66 20 3d 0;...subbitbuf =
1620: 20 30 3b 0d 0a 09 62 69 74 63 6f 75 6e 74 20 3d 0;...bitcount =
1630: 20 30 3b 0d 0a 09 66 69 6c 6c 62 75 66 28 31 36 0;...fillbuf(16
1640: 29 3b 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 20 43 4c );..}....void CL
1650: 7a 68 44 65 63 6f 64 65 72 32 3a 3a 66 69 6c 6c zhDecoder2::fill
1660: 62 75 66 28 42 59 54 45 20 6e 29 0d 0a 7b 0d 0a buf(BYTE n)..{..
1670: 09 77 68 69 6c 65 28 20 6e 3e 62 69 74 63 6f 75 .while( n>bitcou
1680: 6e 74 20 29 0d 0a 09 7b 0d 0a 09 09 6e 20 2d 3d nt )...{....n -=
1690: 20 62 69 74 63 6f 75 6e 74 3b 0d 0a 09 09 62 69 bitcount;....bi
16a0: 74 62 75 66 20 3d 20 28 62 69 74 62 75 66 3c 3c tbuf = (bitbuf<<
16b0: 62 69 74 63 6f 75 6e 74 29 20 2b 20 28 73 75 62 bitcount) + (sub
16c0: 62 69 74 62 75 66 3e 3e 28 38 2d 62 69 74 63 6f bitbuf>>(8-bitco
16d0: 75 6e 74 29 29 3b 0d 0a 09 09 69 66 28 20 63 6d unt));....if( cm
16e0: 70 73 69 7a 65 21 3d 30 20 29 0d 0a 09 09 7b 0d psize!=0 )....{.
16f0: 0a 09 09 09 63 6d 70 73 69 7a 65 2d 2d 3b 0d 0a ....cmpsize--;..
1700: 09 09 09 73 75 62 62 69 74 62 75 66 20 3d 20 28 ...subbitbuf = (
1710: 42 59 54 45 29 67 65 74 63 28 69 6e 29 3b 0d 0a BYTE)getc(in);..
1720: 09 09 7d 0d 0a 09 09 65 6c 73 65 0d 0a 09 09 09 ..}....else.....
1730: 73 75 62 62 69 74 62 75 66 20 3d 20 30 3b 0d 0a subbitbuf = 0;..
1740: 09 09 62 69 74 63 6f 75 6e 74 20 3d 20 38 3b 0d ..bitcount = 8;.
1750: 0a 09 7d 0d 0a 09 62 69 74 63 6f 75 6e 74 20 2d ..}...bitcount -
1760: 3d 20 6e 3b 0d 0a 09 62 69 74 62 75 66 20 3d 20 = n;...bitbuf =
1770: 28 62 69 74 62 75 66 3c 3c 6e 29 20 2b 20 28 73 (bitbuf<<n) + (s
1780: 75 62 62 69 74 62 75 66 3e 3e 28 38 2d 6e 29 29 ubbitbuf>>(8-n))
1790: 3b 0d 0a 09 73 75 62 62 69 74 62 75 66 20 3c 3c ;...subbitbuf <<
17a0: 3d 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 57 4f 52 44 20 = n;..}....WORD
17b0: 43 4c 7a 68 44 65 63 6f 64 65 72 32 3a 3a 67 65 CLzhDecoder2::ge
17c0: 74 62 69 74 73 28 42 59 54 45 20 6e 29 0d 0a 7b tbits(BYTE n)..{
17d0: 0d 0a 09 57 4f 52 44 20 78 20 3d 20 62 69 74 62 ...WORD x = bitb
17e0: 75 66 3e 3e 28 31 36 2d 6e 29 3b 0d 0a 09 66 69 uf>>(16-n);...fi
17f0: 6c 6c 62 75 66 28 6e 29 3b 0d 0a 09 72 65 74 75 llbuf(n);...retu
1800: 72 6e 20 78 3b 0d 0a 7d 0d 0a rn x;..}..