1cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
2cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-------------------------------------------------------------*/
3cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- Compression machinery (not incl block sorting)        ---*/
4cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---                                            compress.c ---*/
5cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-------------------------------------------------------------*/
6cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
7cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* ------------------------------------------------------------------
8cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   This file is part of bzip2/libbzip2, a program and library for
9cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   lossless, block-sorting data compression.
10cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
11172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   bzip2/libbzip2 version 1.0.6 of 6 September 2010
12172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
13cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
14cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Please read the WARNING, DISCLAIMER and PATENTS sections in the
15cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   README file.
16cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
17cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   This program is released under the terms of the license contained
18cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   in the file LICENSE.
19cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ------------------------------------------------------------------ */
20cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
21cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
22cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* CHANGES
23cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    0.9.0    -- original version.
24cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    0.9.0a/b -- no changes in this file.
25cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    0.9.0c   -- changed setting of nGroups in sendMTFValues()
26cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                so as to do a bit better on small files
27cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project*/
28cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
29cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include "bzlib_private.h"
30cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
31cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
32cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
33cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- Bit stream I/O                              ---*/
34cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
35cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
36cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
37cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid BZ2_bsInitWrite ( EState* s )
38cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
39cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->bsLive = 0;
40cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->bsBuff = 0;
41cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
42cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
43cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
44cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
45cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
46cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid bsFinishWrite ( EState* s )
47cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
48cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (s->bsLive > 0) {
49cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
50cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->numZ++;
51cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->bsBuff <<= 8;
52cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->bsLive -= 8;
53cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
54cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
55cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
56cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
57cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
58cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define bsNEEDW(nz)                           \
59cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{                                             \
60cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (s->bsLive >= 8) {                   \
61cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->zbits[s->numZ]                       \
62cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         = (UChar)(s->bsBuff >> 24);          \
63cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->numZ++;                              \
64cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->bsBuff <<= 8;                        \
65cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->bsLive -= 8;                         \
66cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }                                          \
67cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
68cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
69cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
70cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
71cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
72cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project__inline__
73cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid bsW ( EState* s, Int32 n, UInt32 v )
74cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
75cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsNEEDW ( n );
76cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->bsBuff |= (v << (32 - s->bsLive - n));
77cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->bsLive += n;
78cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
79cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
80cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
81cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
82cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
83cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid bsPutUInt32 ( EState* s, UInt32 u )
84cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
85cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW ( s, 8, (u >> 24) & 0xffL );
86cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW ( s, 8, (u >> 16) & 0xffL );
87cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW ( s, 8, (u >>  8) & 0xffL );
88cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW ( s, 8,  u        & 0xffL );
89cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
90cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
91cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
92cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
93cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
94cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid bsPutUChar ( EState* s, UChar c )
95cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
96cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW( s, 8, (UInt32)c );
97cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
98cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
99cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
100cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
101cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- The back end proper                         ---*/
102cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
103cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
104cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
105cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
106cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid makeMaps_e ( EState* s )
107cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
108cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 i;
109cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->nInUse = 0;
110cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < 256; i++)
111cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (s->inUse[i]) {
112cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         s->unseqToSeq[i] = s->nInUse;
113cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         s->nInUse++;
114cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
115cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
116cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
117cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
118cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
119cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
120cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid generateMTFValues ( EState* s )
121cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
122cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar   yy[256];
123cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   i, j;
124cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   zPend;
125cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   wr;
126cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   EOB;
127cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
128cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*
129cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      After sorting (eg, here),
130cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
131cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         and
132cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ]
133cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         holds the original block data.
134cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
135cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      The first thing to do is generate the MTF values,
136cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      and put them in
137cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
138cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Because there are strictly fewer or equal MTF values
139cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      than block values, ptr values in this area are overwritten
140cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      with MTF values only when they are no longer needed.
141cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
142cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      The final compressed bitstream is generated into the
143cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      area starting at
144cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         (UChar*) (&((UChar*)s->arr2)[s->nblock])
145cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
146cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      These storage aliases are set up in bzCompressInit(),
147cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      except for the last one, which is arranged in
148cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      compressBlock().
149cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   */
150cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt32* ptr   = s->ptr;
151cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar* block  = s->block;
152cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt16* mtfv  = s->mtfv;
153cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
154cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   makeMaps_e ( s );
155cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   EOB = s->nInUse+1;
156cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
157cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
158cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
159cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   wr = 0;
160cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   zPend = 0;
161cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
162cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
163cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < s->nblock; i++) {
164cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      UChar ll_i;
165cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      AssertD ( wr <= i, "generateMTFValues(1)" );
166cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      j = ptr[i]-1; if (j < 0) j += s->nblock;
167cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      ll_i = s->unseqToSeq[block[j]];
168cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
169cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
170cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (yy[0] == ll_i) {
171cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         zPend++;
172cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
173cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
174cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (zPend > 0) {
175cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            zPend--;
176cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            while (True) {
177cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               if (zPend & 1) {
178cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  mtfv[wr] = BZ_RUNB; wr++;
179cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  s->mtfFreq[BZ_RUNB]++;
180cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               } else {
181cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  mtfv[wr] = BZ_RUNA; wr++;
182cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  s->mtfFreq[BZ_RUNA]++;
183cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               }
184cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               if (zPend < 2) break;
185cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               zPend = (zPend - 2) / 2;
186cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            };
187cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            zPend = 0;
188cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
189cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         {
190cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            register UChar  rtmp;
191cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            register UChar* ryy_j;
192cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            register UChar  rll_i;
193cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            rtmp  = yy[1];
194cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            yy[1] = yy[0];
195cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            ryy_j = &(yy[1]);
196cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            rll_i = ll_i;
197cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            while ( rll_i != rtmp ) {
198cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               register UChar rtmp2;
199cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               ryy_j++;
200cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               rtmp2  = rtmp;
201cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               rtmp   = *ryy_j;
202cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               *ryy_j = rtmp2;
203cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            };
204cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            yy[0] = rtmp;
205cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            j = ryy_j - &(yy[0]);
206cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
207cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
208cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
209cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
210cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
211cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
212cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (zPend > 0) {
213cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      zPend--;
214cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (True) {
215cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (zPend & 1) {
216cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            mtfv[wr] = BZ_RUNB; wr++;
217cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            s->mtfFreq[BZ_RUNB]++;
218cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         } else {
219cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            mtfv[wr] = BZ_RUNA; wr++;
220cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            s->mtfFreq[BZ_RUNA]++;
221cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
222cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (zPend < 2) break;
223cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         zPend = (zPend - 2) / 2;
224cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      };
225cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      zPend = 0;
226cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
227cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
228cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
229cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
230cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->nMTF = wr;
231cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
232cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
233cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
234cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
235cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_LESSER_ICOST  0
236cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_GREATER_ICOST 15
237cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
238cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
239cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid sendMTFValues ( EState* s )
240cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
241cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
242cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
243cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 nGroups, nBytes;
244cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
245cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--
246cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
247cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   is a global since the decoder also needs it.
248cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
249cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
250cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
251cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   are also globals only used in this proc.
252cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Made global to keep stack frame size small.
253cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   --*/
254cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
255cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
256cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt16 cost[BZ_N_GROUPS];
257cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  fave[BZ_N_GROUPS];
258cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
259cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt16* mtfv = s->mtfv;
260cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
261cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->verbosity >= 3)
262cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
263cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                "%d+2 syms in use\n",
264cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                s->nblock, s->nMTF, s->nInUse );
265cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
266cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   alphaSize = s->nInUse+2;
267cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (t = 0; t < BZ_N_GROUPS; t++)
268cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (v = 0; v < alphaSize; v++)
269cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         s->len[t][v] = BZ_GREATER_ICOST;
270cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
271cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Decide how many coding tables to use ---*/
272cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   AssertH ( s->nMTF > 0, 3001 );
273cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->nMTF < 200)  nGroups = 2; else
274cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->nMTF < 600)  nGroups = 3; else
275cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->nMTF < 1200) nGroups = 4; else
276cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->nMTF < 2400) nGroups = 5; else
277cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                       nGroups = 6;
278cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
279cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Generate an initial set of coding tables ---*/
280cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   {
281cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Int32 nPart, remF, tFreq, aFreq;
282cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
283cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      nPart = nGroups;
284cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      remF  = s->nMTF;
285cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      gs = 0;
286cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (nPart > 0) {
287cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         tFreq = remF / nPart;
288cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ge = gs-1;
289cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         aFreq = 0;
290cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         while (aFreq < tFreq && ge < alphaSize-1) {
291cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            ge++;
292cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            aFreq += s->mtfFreq[ge];
293cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
294cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
295cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (ge > gs
296cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             && nPart != nGroups && nPart != 1
297cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             && ((nGroups-nPart) % 2 == 1)) {
298cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            aFreq -= s->mtfFreq[ge];
299cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            ge--;
300cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
301cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
302cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (s->verbosity >= 3)
303cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            VPrintf5( "      initial group %d, [%d .. %d], "
304cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "has %d syms (%4.1f%%)\n",
305cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      nPart, gs, ge, aFreq,
306cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
307cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
308cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (v = 0; v < alphaSize; v++)
309cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (v >= gs && v <= ge)
310cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
311cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               s->len[nPart-1][v] = BZ_GREATER_ICOST;
312cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
313cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         nPart--;
314cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         gs = ge+1;
315cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         remF -= aFreq;
316cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
317cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
318cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
319cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*---
320cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Iterate up to BZ_N_ITERS times to improve the tables.
321cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ---*/
322cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (iter = 0; iter < BZ_N_ITERS; iter++) {
323cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
324cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (t = 0; t < nGroups; t++) fave[t] = 0;
325cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
326cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (t = 0; t < nGroups; t++)
327cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (v = 0; v < alphaSize; v++)
328cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            s->rfreq[t][v] = 0;
329cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
330cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /*---
331cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        Set up an auxiliary length table which is used to fast-track
332cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	the common case (nGroups == 6).
333cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      ---*/
334cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (nGroups == 6) {
335cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (v = 0; v < alphaSize; v++) {
336cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
337cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
338cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
339cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 }
340cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
341cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
342cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      nSelectors = 0;
343cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      totc = 0;
344cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      gs = 0;
345cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (True) {
346cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
347cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         /*--- Set group start & end marks. --*/
348cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (gs >= s->nMTF) break;
349cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ge = gs + BZ_G_SIZE - 1;
350cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (ge >= s->nMTF) ge = s->nMTF-1;
351cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
352cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         /*--
353cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            Calculate the cost of this group as coded
354cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            by each of the coding tables.
355cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         --*/
356cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (t = 0; t < nGroups; t++) cost[t] = 0;
357cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
358cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (nGroups == 6 && 50 == ge-gs+1) {
359cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            /*--- fast track the common case ---*/
360cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            register UInt32 cost01, cost23, cost45;
361cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            register UInt16 icv;
362cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            cost01 = cost23 = cost45 = 0;
363cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
364cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#           define BZ_ITER(nn)                \
365cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               icv = mtfv[gs+(nn)];           \
366cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               cost01 += s->len_pack[icv][0]; \
367cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               cost23 += s->len_pack[icv][1]; \
368cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               cost45 += s->len_pack[icv][2]; \
369cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
370cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
371cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
372cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
373cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
374cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
375cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
376cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
377cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
378cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
379cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
380cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
381cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#           undef BZ_ITER
382cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
383cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
384cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
385cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
386cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
387cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         } else {
388cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	    /*--- slow version which correctly handles all situations ---*/
389cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            for (i = gs; i <= ge; i++) {
390cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               UInt16 icv = mtfv[i];
391cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
392cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            }
393cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
394cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
395cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         /*--
396cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            Find the coding table which is best for this group,
397cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            and record its identity in the selector table.
398cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         --*/
399cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         bc = 999999999; bt = -1;
400cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (t = 0; t < nGroups; t++)
401cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (cost[t] < bc) { bc = cost[t]; bt = t; };
402cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         totc += bc;
403cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fave[bt]++;
404cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         s->selector[nSelectors] = bt;
405cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         nSelectors++;
406cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
407cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         /*--
408cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            Increment the symbol frequencies for the selected table.
409cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project          --*/
410cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (nGroups == 6 && 50 == ge-gs+1) {
411cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            /*--- fast track the common case ---*/
412cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
413cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
414cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
415cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
416cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
417cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
418cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
419cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
420cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
421cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
422cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
423cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
424cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
425cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
426cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#           undef BZ_ITUR
427cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
428cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         } else {
429cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	    /*--- slow version which correctly handles all situations ---*/
430cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            for (i = gs; i <= ge; i++)
431cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               s->rfreq[bt][ mtfv[i] ]++;
432cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
433cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
434cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         gs = ge+1;
435cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
436cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (s->verbosity >= 3) {
437cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         VPrintf2 ( "      pass %d: size is %d, grp uses are ",
438cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   iter+1, totc/8 );
439cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (t = 0; t < nGroups; t++)
440cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            VPrintf1 ( "%d ", fave[t] );
441cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         VPrintf0 ( "\n" );
442cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
443cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
444cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /*--
445cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        Recompute the tables based on the accumulated frequencies.
446cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      --*/
447cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See
448cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         comment in huffman.c for details. */
449cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (t = 0; t < nGroups; t++)
450cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),
451cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                                 alphaSize, 17 /*20*/ );
452cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
453cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
454cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
455cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   AssertH( nGroups < 8, 3002 );
456cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   AssertH( nSelectors < 32768 &&
457cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            nSelectors <= (2 + (900000 / BZ_G_SIZE)),
458cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            3003 );
459cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
460cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
461cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Compute MTF values for the selectors. ---*/
462cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   {
463cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
464cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < nGroups; i++) pos[i] = i;
465cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < nSelectors; i++) {
466cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ll_i = s->selector[i];
467cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         j = 0;
468cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         tmp = pos[j];
469cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         while ( ll_i != tmp ) {
470cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            j++;
471cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            tmp2 = tmp;
472cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            tmp = pos[j];
473cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            pos[j] = tmp2;
474cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
475cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         pos[0] = tmp;
476cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         s->selectorMtf[i] = j;
477cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
478cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   };
479cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
480cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Assign actual codes for the tables. --*/
481cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (t = 0; t < nGroups; t++) {
482cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      minLen = 32;
483cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      maxLen = 0;
484cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < alphaSize; i++) {
485cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
486cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (s->len[t][i] < minLen) minLen = s->len[t][i];
487cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
488cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
489cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      AssertH ( !(minLen < 1),  3005 );
490cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]),
491cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                          minLen, maxLen, alphaSize );
492cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
493cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
494cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Transmit the mapping table. ---*/
495cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   {
496cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Bool inUse16[16];
497cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < 16; i++) {
498cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project          inUse16[i] = False;
499cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project          for (j = 0; j < 16; j++)
500cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             if (s->inUse[i * 16 + j]) inUse16[i] = True;
501cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
502cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
503cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      nBytes = s->numZ;
504cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < 16; i++)
505cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
506cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
507cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < 16; i++)
508cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (inUse16[i])
509cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            for (j = 0; j < 16; j++) {
510cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
511cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            }
512cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
513cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (s->verbosity >= 3)
514cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
515cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
516cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
517cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Now the selectors. ---*/
518cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   nBytes = s->numZ;
519cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW ( s, 3, nGroups );
520cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bsW ( s, 15, nSelectors );
521cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < nSelectors; i++) {
522cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
523cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsW(s,1,0);
524cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
525cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->verbosity >= 3)
526cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      VPrintf1( "selectors %d, ", s->numZ-nBytes );
527cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
528cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Now the coding tables. ---*/
529cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   nBytes = s->numZ;
530cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
531cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (t = 0; t < nGroups; t++) {
532cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Int32 curr = s->len[t][0];
533cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsW ( s, 5, curr );
534cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < alphaSize; i++) {
535cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
536cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
537cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         bsW ( s, 1, 0 );
538cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
539cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
540cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
541cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->verbosity >= 3)
542cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
543cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
544cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- And finally, the block data proper ---*/
545cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   nBytes = s->numZ;
546cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   selCtr = 0;
547cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   gs = 0;
548cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (True) {
549cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (gs >= s->nMTF) break;
550cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      ge = gs + BZ_G_SIZE - 1;
551cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ge >= s->nMTF) ge = s->nMTF-1;
552cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      AssertH ( s->selector[selCtr] < nGroups, 3006 );
553cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
554cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (nGroups == 6 && 50 == ge-gs+1) {
555cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            /*--- fast track the common case ---*/
556cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            UInt16 mtfv_i;
557cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            UChar* s_len_sel_selCtr
558cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               = &(s->len[s->selector[selCtr]][0]);
559cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            Int32* s_code_sel_selCtr
560cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               = &(s->code[s->selector[selCtr]][0]);
561cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
562cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#           define BZ_ITAH(nn)                      \
563cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               mtfv_i = mtfv[gs+(nn)];              \
564cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               bsW ( s,                             \
565cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                     s_len_sel_selCtr[mtfv_i],      \
566cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                     s_code_sel_selCtr[mtfv_i] )
567cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
568cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
569cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
570cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
571cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
572cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
573cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
574cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
575cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
576cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
577cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
578cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
579cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#           undef BZ_ITAH
580cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
581cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
582cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 /*--- slow version which correctly handles all situations ---*/
583cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (i = gs; i <= ge; i++) {
584cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            bsW ( s,
585cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  s->len  [s->selector[selCtr]] [mtfv[i]],
586cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  s->code [s->selector[selCtr]] [mtfv[i]] );
587cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
588cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
589cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
590cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
591cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      gs = ge+1;
592cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      selCtr++;
593cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
594cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   AssertH( selCtr == nSelectors, 3007 );
595cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
596cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->verbosity >= 3)
597cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      VPrintf1( "codes %d\n", s->numZ-nBytes );
598cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
599cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
600cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
601cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
602cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid BZ2_compressBlock ( EState* s, Bool is_last_block )
603cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
604cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->nblock > 0) {
605cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
606cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ_FINALISE_CRC ( s->blockCRC );
607cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
608cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      s->combinedCRC ^= s->blockCRC;
609cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (s->blockNo > 1) s->numZ = 0;
610cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
611cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (s->verbosity >= 2)
612cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         VPrintf4( "    block %d: crc = 0x%08x, "
613cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "combined CRC = 0x%08x, size = %d\n",
614cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
615cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
616cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_blockSort ( s );
617cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
618cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
619cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
620cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
621cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- If this is the first block, create the stream header. --*/
622cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->blockNo == 1) {
623cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_bsInitWrite ( s );
624cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, BZ_HDR_B );
625cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, BZ_HDR_Z );
626cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, BZ_HDR_h );
627cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
628cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
629cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
630cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (s->nblock > 0) {
631cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
632cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
633cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
634cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
635cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
636cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /*-- Now the block's CRC, so it is in a known place. --*/
637cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUInt32 ( s, s->blockCRC );
638cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
639cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /*--
640cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         Now a single bit indicating (non-)randomisation.
641cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         As of version 0.9.5, we use a better sorting algorithm
642cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         which makes randomisation unnecessary.  So always set
643cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         the randomised bit to 'no'.  Of course, the decoder
644cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         still needs to be able to handle randomised blocks
645cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         so as to maintain backwards compatibility with
646cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         older versions of bzip2.
647cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      --*/
648cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsW(s,1,0);
649cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
650cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsW ( s, 24, s->origPtr );
651cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      generateMTFValues ( s );
652cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      sendMTFValues ( s );
653cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
654cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
655cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
656cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- If this is the last block, add the stream trailer. --*/
657cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (is_last_block) {
658cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
659cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
660cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
661cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
662cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsPutUInt32 ( s, s->combinedCRC );
663cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (s->verbosity >= 2)
664cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
665cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bsFinishWrite ( s );
666cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
667cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
668cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
669cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
670cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-------------------------------------------------------------*/
671cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- end                                        compress.c ---*/
672cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-------------------------------------------------------------*/
673