Hex Artifact Content

Not logged in

Artifact 449e48789d18c169961f2a90f78fa9438ec47b41:


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;..}..