]> git.sur5r.net Git - u-boot/blob - lib/bzip2/bzlib_compress.c
Merge branch 'master' of git://git.denx.de/u-boot-net
[u-boot] / lib / bzip2 / bzlib_compress.c
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
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, nBytes;
284
285    /*--
286    UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
287    is a global since the decoder also needs it.
288
289    Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
290    Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
291    are also globals only used in this proc.
292    Made global to keep stack frame size small.
293    --*/
294
295
296    UInt16 cost[BZ_N_GROUPS];
297    Int32  fave[BZ_N_GROUPS];
298
299    UInt16* mtfv = s->mtfv;
300
301    if (s->verbosity >= 3)
302       VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
303                 "%d+2 syms in use\n", 
304                 s->nblock, s->nMTF, s->nInUse );
305
306    alphaSize = s->nInUse+2;
307    for (t = 0; t < BZ_N_GROUPS; t++)
308       for (v = 0; v < alphaSize; v++)
309          s->len[t][v] = BZ_GREATER_ICOST;
310
311    /*--- Decide how many coding tables to use ---*/
312    AssertH ( s->nMTF > 0, 3001 );
313    if (s->nMTF < 200)  nGroups = 2; else
314    if (s->nMTF < 600)  nGroups = 3; else
315    if (s->nMTF < 1200) nGroups = 4; else
316    if (s->nMTF < 2400) nGroups = 5; else
317                        nGroups = 6;
318
319    /*--- Generate an initial set of coding tables ---*/
320    { 
321       Int32 nPart, remF, tFreq, aFreq;
322
323       nPart = nGroups;
324       remF  = s->nMTF;
325       gs = 0;
326       while (nPart > 0) {
327          tFreq = remF / nPart;
328          ge = gs-1;
329          aFreq = 0;
330          while (aFreq < tFreq && ge < alphaSize-1) {
331             ge++;
332             aFreq += s->mtfFreq[ge];
333          }
334
335          if (ge > gs 
336              && nPart != nGroups && nPart != 1 
337              && ((nGroups-nPart) % 2 == 1)) {
338             aFreq -= s->mtfFreq[ge];
339             ge--;
340          }
341
342          if (s->verbosity >= 3)
343             VPrintf5( "      initial group %d, [%d .. %d], "
344                       "has %d syms (%4.1f%%)\n",
345                       nPart, gs, ge, aFreq, 
346                       (100.0 * (float)aFreq) / (float)(s->nMTF) );
347  
348          for (v = 0; v < alphaSize; v++)
349             if (v >= gs && v <= ge) 
350                s->len[nPart-1][v] = BZ_LESSER_ICOST; else
351                s->len[nPart-1][v] = BZ_GREATER_ICOST;
352  
353          nPart--;
354          gs = ge+1;
355          remF -= aFreq;
356       }
357    }
358
359    /*--- 
360       Iterate up to BZ_N_ITERS times to improve the tables.
361    ---*/
362    for (iter = 0; iter < BZ_N_ITERS; iter++) {
363
364       for (t = 0; t < nGroups; t++) fave[t] = 0;
365
366       for (t = 0; t < nGroups; t++)
367          for (v = 0; v < alphaSize; v++)
368             s->rfreq[t][v] = 0;
369
370       /*---
371         Set up an auxiliary length table which is used to fast-track
372         the common case (nGroups == 6). 
373       ---*/
374       if (nGroups == 6) {
375          for (v = 0; v < alphaSize; v++) {
376             s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
377             s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
378             s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
379          }
380       }
381
382       nSelectors = 0;
383       totc = 0;
384       gs = 0;
385       while (True) {
386
387          /*--- Set group start & end marks. --*/
388          if (gs >= s->nMTF) break;
389          ge = gs + BZ_G_SIZE - 1; 
390          if (ge >= s->nMTF) ge = s->nMTF-1;
391
392          /*-- 
393             Calculate the cost of this group as coded
394             by each of the coding tables.
395          --*/
396          for (t = 0; t < nGroups; t++) cost[t] = 0;
397
398          if (nGroups == 6 && 50 == ge-gs+1) {
399             /*--- fast track the common case ---*/
400             register UInt32 cost01, cost23, cost45;
401             register UInt16 icv;
402             cost01 = cost23 = cost45 = 0;
403
404 #           define BZ_ITER(nn)                \
405                icv = mtfv[gs+(nn)];           \
406                cost01 += s->len_pack[icv][0]; \
407                cost23 += s->len_pack[icv][1]; \
408                cost45 += s->len_pack[icv][2]; \
409
410             BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
411             BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
412             BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
413             BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
414             BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
415             BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
416             BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
417             BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
418             BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
419             BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
420
421 #           undef BZ_ITER
422
423             cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
424             cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
425             cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
426
427          } else {
428             /*--- slow version which correctly handles all situations ---*/
429             for (i = gs; i <= ge; i++) { 
430                UInt16 icv = mtfv[i];
431                for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
432             }
433          }
434  
435          /*-- 
436             Find the coding table which is best for this group,
437             and record its identity in the selector table.
438          --*/
439          bc = 999999999; bt = -1;
440          for (t = 0; t < nGroups; t++)
441             if (cost[t] < bc) { bc = cost[t]; bt = t; };
442          totc += bc;
443          fave[bt]++;
444          s->selector[nSelectors] = bt;
445          nSelectors++;
446
447          /*-- 
448             Increment the symbol frequencies for the selected table.
449           --*/
450          if (nGroups == 6 && 50 == ge-gs+1) {
451             /*--- fast track the common case ---*/
452
453 #           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
454
455             BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
456             BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
457             BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
458             BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
459             BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
460             BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
461             BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
462             BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
463             BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
464             BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
465
466 #           undef BZ_ITUR
467
468          } else {
469             /*--- slow version which correctly handles all situations ---*/
470             for (i = gs; i <= ge; i++)
471                s->rfreq[bt][ mtfv[i] ]++;
472          }
473
474          gs = ge+1;
475       }
476       if (s->verbosity >= 3) {
477          VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
478                    iter+1, totc/8 );
479          for (t = 0; t < nGroups; t++)
480             VPrintf1 ( "%d ", fave[t] );
481          VPrintf0 ( "\n" );
482       }
483
484       /*--
485         Recompute the tables based on the accumulated frequencies.
486       --*/
487       /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See 
488          comment in huffman.c for details. */
489       for (t = 0; t < nGroups; t++)
490          BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
491                                  alphaSize, 17 /*20*/ );
492    }
493
494
495    AssertH( nGroups < 8, 3002 );
496    AssertH( nSelectors < 32768 &&
497             nSelectors <= (2 + (900000 / BZ_G_SIZE)),
498             3003 );
499
500
501    /*--- Compute MTF values for the selectors. ---*/
502    {
503       UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
504       for (i = 0; i < nGroups; i++) pos[i] = i;
505       for (i = 0; i < nSelectors; i++) {
506          ll_i = s->selector[i];
507          j = 0;
508          tmp = pos[j];
509          while ( ll_i != tmp ) {
510             j++;
511             tmp2 = tmp;
512             tmp = pos[j];
513             pos[j] = tmp2;
514          };
515          pos[0] = tmp;
516          s->selectorMtf[i] = j;
517       }
518    };
519
520    /*--- Assign actual codes for the tables. --*/
521    for (t = 0; t < nGroups; t++) {
522       minLen = 32;
523       maxLen = 0;
524       for (i = 0; i < alphaSize; i++) {
525          if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
526          if (s->len[t][i] < minLen) minLen = s->len[t][i];
527       }
528       AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
529       AssertH ( !(minLen < 1),  3005 );
530       BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
531                           minLen, maxLen, alphaSize );
532    }
533
534    /*--- Transmit the mapping table. ---*/
535    { 
536       Bool inUse16[16];
537       for (i = 0; i < 16; i++) {
538           inUse16[i] = False;
539           for (j = 0; j < 16; j++)
540              if (s->inUse[i * 16 + j]) inUse16[i] = True;
541       }
542      
543       nBytes = s->numZ;
544       for (i = 0; i < 16; i++)
545          if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
546
547       for (i = 0; i < 16; i++)
548          if (inUse16[i])
549             for (j = 0; j < 16; j++) {
550                if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
551             }
552
553       if (s->verbosity >= 3) 
554          VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
555    }
556
557    /*--- Now the selectors. ---*/
558    nBytes = s->numZ;
559    bsW ( s, 3, nGroups );
560    bsW ( s, 15, nSelectors );
561    for (i = 0; i < nSelectors; i++) { 
562       for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
563       bsW(s,1,0);
564    }
565    if (s->verbosity >= 3)
566       VPrintf1( "selectors %d, ", s->numZ-nBytes );
567
568    /*--- Now the coding tables. ---*/
569    nBytes = s->numZ;
570
571    for (t = 0; t < nGroups; t++) {
572       Int32 curr = s->len[t][0];
573       bsW ( s, 5, curr );
574       for (i = 0; i < alphaSize; i++) {
575          while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
576          while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
577          bsW ( s, 1, 0 );
578       }
579    }
580
581    if (s->verbosity >= 3)
582       VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
583
584    /*--- And finally, the block data proper ---*/
585    nBytes = s->numZ;
586    selCtr = 0;
587    gs = 0;
588    while (True) {
589       if (gs >= s->nMTF) break;
590       ge = gs + BZ_G_SIZE - 1; 
591       if (ge >= s->nMTF) ge = s->nMTF-1;
592       AssertH ( s->selector[selCtr] < nGroups, 3006 );
593
594       if (nGroups == 6 && 50 == ge-gs+1) {
595             /*--- fast track the common case ---*/
596             UInt16 mtfv_i;
597             UChar* s_len_sel_selCtr 
598                = &(s->len[s->selector[selCtr]][0]);
599             Int32* s_code_sel_selCtr
600                = &(s->code[s->selector[selCtr]][0]);
601
602 #           define BZ_ITAH(nn)                      \
603                mtfv_i = mtfv[gs+(nn)];              \
604                bsW ( s,                             \
605                      s_len_sel_selCtr[mtfv_i],      \
606                      s_code_sel_selCtr[mtfv_i] )
607
608             BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
609             BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
610             BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
611             BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
612             BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
613             BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
614             BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
615             BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
616             BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
617             BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
618
619 #           undef BZ_ITAH
620
621       } else {
622          /*--- slow version which correctly handles all situations ---*/
623          for (i = gs; i <= ge; i++) {
624             bsW ( s, 
625                   s->len  [s->selector[selCtr]] [mtfv[i]],
626                   s->code [s->selector[selCtr]] [mtfv[i]] );
627          }
628       }
629
630
631       gs = ge+1;
632       selCtr++;
633    }
634    AssertH( selCtr == nSelectors, 3007 );
635
636    if (s->verbosity >= 3)
637       VPrintf1( "codes %d\n", s->numZ-nBytes );
638    else /* squash compiler 'used but not set' warning */
639       nBytes = nBytes;
640 }
641
642
643 /*---------------------------------------------------*/
644 void BZ2_compressBlock ( EState* s, Bool is_last_block )
645 {
646    if (s->nblock > 0) {
647
648       BZ_FINALISE_CRC ( s->blockCRC );
649       s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
650       s->combinedCRC ^= s->blockCRC;
651       if (s->blockNo > 1) s->numZ = 0;
652
653       if (s->verbosity >= 2)
654          VPrintf4( "    block %d: crc = 0x%08x, "
655                    "combined CRC = 0x%08x, size = %d\n",
656                    s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
657
658       BZ2_blockSort ( s );
659    }
660
661    s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
662
663    /*-- If this is the first block, create the stream header. --*/
664    if (s->blockNo == 1) {
665       BZ2_bsInitWrite ( s );
666       bsPutUChar ( s, BZ_HDR_B );
667       bsPutUChar ( s, BZ_HDR_Z );
668       bsPutUChar ( s, BZ_HDR_h );
669       bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
670    }
671
672    if (s->nblock > 0) {
673
674       bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
675       bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
676       bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
677
678       /*-- Now the block's CRC, so it is in a known place. --*/
679       bsPutUInt32 ( s, s->blockCRC );
680
681       /*-- 
682          Now a single bit indicating (non-)randomisation. 
683          As of version 0.9.5, we use a better sorting algorithm
684          which makes randomisation unnecessary.  So always set
685          the randomised bit to 'no'.  Of course, the decoder
686          still needs to be able to handle randomised blocks
687          so as to maintain backwards compatibility with
688          older versions of bzip2.
689       --*/
690       bsW(s,1,0);
691
692       bsW ( s, 24, s->origPtr );
693       generateMTFValues ( s );
694       sendMTFValues ( s );
695    }
696
697
698    /*-- If this is the last block, add the stream trailer. --*/
699    if (is_last_block) {
700
701       bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
702       bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
703       bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
704       bsPutUInt32 ( s, s->combinedCRC );
705       if (s->verbosity >= 2)
706          VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
707       bsFinishWrite ( s );
708    }
709 }
710
711
712 /*-------------------------------------------------------------*/
713 /*--- end                                        compress.c ---*/
714 /*-------------------------------------------------------------*/