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