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