File Coverage

cpan/Compress-Raw-Bzip2/compress.c
Criterion Covered Total %
statement 251 251 100.0
branch n/a
condition n/a
subroutine n/a
total 251 251 100.0


line stmt bran cond sub time code
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.6 of 6 September 2010
12           Copyright (C) 1996-2010 Julian Seward
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 1134         void BZ2_bsInitWrite ( EState* s )
38           {
39 1134         s->bsLive = 0;
40 1134         s->bsBuff = 0;
41 1134         }
42            
43            
44           /*---------------------------------------------------*/
45           static
46           void bsFinishWrite ( EState* s )
47           {
48 3224         while (s->bsLive > 0) {
49 2090         s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
50 2090         s->numZ++;
51 2090         s->bsBuff <<= 8;
52 2090         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 461224         void bsW ( EState* s, Int32 n, UInt32 v )
74           {
75 461224         bsNEEDW ( n );
76 461224         s->bsBuff |= (v << (32 - s->bsLive - n));
77 461224         s->bsLive += n;
78 461224         }
79            
80            
81           /*---------------------------------------------------*/
82           static
83 2120         void bsPutUInt32 ( EState* s, UInt32 u )
84           {
85 2120         bsW ( s, 8, (u >> 24) & 0xffL );
86 2120         bsW ( s, 8, (u >> 16) & 0xffL );
87 2120         bsW ( s, 8, (u >> 8) & 0xffL );
88 2120         bsW ( s, 8, u & 0xffL );
89 2120         }
90            
91            
92           /*---------------------------------------------------*/
93           static
94 17256         void bsPutUChar ( EState* s, UChar c )
95           {
96 17256         bsW( s, 8, (UInt32)c );
97 17256         }
98            
99            
100           /*---------------------------------------------------*/
101           /*--- The back end proper ---*/
102           /*---------------------------------------------------*/
103            
104           /*---------------------------------------------------*/
105           static
106           void makeMaps_e ( EState* s )
107           {
108           Int32 i;
109 986         s->nInUse = 0;
110 252416         for (i = 0; i < 256; i++)
111 252416         if (s->inUse[i]) {
112 15410         s->unseqToSeq[i] = s->nInUse;
113 15410         s->nInUse++;
114           }
115           }
116            
117            
118           /*---------------------------------------------------*/
119           static
120 986         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 986         UInt32* ptr = s->ptr;
151 986         UChar* block = s->block;
152 986         UInt16* mtfv = s->mtfv;
153            
154           makeMaps_e ( s );
155 986         EOB = s->nInUse+1;
156            
157 986         for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
158            
159           wr = 0;
160           zPend = 0;
161 15410         for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
162            
163 1807242         for (i = 0; i < s->nblock; i++) {
164           UChar ll_i;
165           AssertD ( wr <= i, "generateMTFValues(1)" );
166 1807242         j = ptr[i]-1; if (j < 0) j += s->nblock;
167 1807242         ll_i = s->unseqToSeq[block[j]];
168           AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
169            
170 1807242         if (yy[0] == ll_i) {
171 1608070         zPend++;
172           } else {
173            
174 199172         if (zPend > 0) {
175 25570         zPend--;
176           while (True) {
177 56462         if (zPend & 1) {
178 18806         mtfv[wr] = BZ_RUNB; wr++;
179 18806         s->mtfFreq[BZ_RUNB]++;
180           } else {
181 37656         mtfv[wr] = BZ_RUNA; wr++;
182 37656         s->mtfFreq[BZ_RUNA]++;
183           }
184 56462         if (zPend < 2) break;
185 30892         zPend = (zPend - 2) / 2;
186 30892         };
187           zPend = 0;
188           }
189           {
190           register UChar rtmp;
191           register UChar* ryy_j;
192           register UChar rll_i;
193 199172         rtmp = yy[1];
194 199172         yy[1] = yy[0];
195           ryy_j = &(yy[1]);
196           rll_i = ll_i;
197 17580126         while ( rll_i != rtmp ) {
198           register UChar rtmp2;
199 17181782         ryy_j++;
200           rtmp2 = rtmp;
201 17181782         rtmp = *ryy_j;
202 17181782         *ryy_j = rtmp2;
203           };
204 199172         yy[0] = rtmp;
205 199172         j = ryy_j - &(yy[0]);
206 199172         mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
207           }
208            
209           }
210           }
211            
212 986         if (zPend > 0) {
213 146         zPend--;
214           while (True) {
215 708         if (zPend & 1) {
216 256         mtfv[wr] = BZ_RUNB; wr++;
217 256         s->mtfFreq[BZ_RUNB]++;
218           } else {
219 452         mtfv[wr] = BZ_RUNA; wr++;
220 452         s->mtfFreq[BZ_RUNA]++;
221           }
222 708         if (zPend < 2) break;
223 562         zPend = (zPend - 2) / 2;
224 562         };
225           zPend = 0;
226           }
227            
228 986         mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
229            
230 986         s->nMTF = wr;
231 986         }
232            
233            
234           /*---------------------------------------------------*/
235           #define BZ_LESSER_ICOST 0
236           #define BZ_GREATER_ICOST 15
237            
238           static
239 986         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 986         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 986         alphaSize = s->nInUse+2;
267 6902         for (t = 0; t < BZ_N_GROUPS; t++)
268 104292         for (v = 0; v < alphaSize; v++)
269 104292         s->len[t][v] = BZ_GREATER_ICOST;
270            
271           /*--- Decide how many coding tables to use ---*/
272 986         AssertH ( s->nMTF > 0, 3001 );
273 986         if (s->nMTF < 200) nGroups = 2; else
274 76         if (s->nMTF < 600) nGroups = 3; else
275 16         if (s->nMTF < 1200) nGroups = 4; else
276 16         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 986         remF = s->nMTF;
285           gs = 0;
286 4066         while (nPart > 0) {
287 2094         tFreq = remF / nPart;
288 2094         ge = gs-1;
289           aFreq = 0;
290 21602         while (aFreq < tFreq && ge < alphaSize-1) {
291 17414         ge++;
292 17414         aFreq += s->mtfFreq[ge];
293           }
294            
295 4188         if (ge > gs
296 3104         && nPart != nGroups && nPart != 1
297 56         && ((nGroups-nPart) % 2 == 1)) {
298 32         aFreq -= s->mtfFreq[ge];
299 32         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 50868         for (v = 0; v < alphaSize; v++)
309 48774         if (v >= gs && v <= ge)
310 17382         s->len[nPart-1][v] = BZ_LESSER_ICOST; else
311 31392         s->len[nPart-1][v] = BZ_GREATER_ICOST;
312          
313 2094         nPart--;
314 2094         gs = ge+1;
315 2094         remF -= aFreq;
316           }
317           }
318            
319           /*---
320           Iterate up to BZ_N_ITERS times to improve the tables.
321           ---*/
322 3944         for (iter = 0; iter < BZ_N_ITERS; iter++) {
323            
324           for (t = 0; t < nGroups; t++) fave[t] = 0;
325            
326 8376         for (t = 0; t < nGroups; t++)
327 195096         for (v = 0; v < alphaSize; v++)
328 195096         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 3944         if (nGroups == 6) {
335 11136         for (v = 0; v < alphaSize; v++) {
336 11136         s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
337 11136         s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
338 11136         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 26696         if (gs >= s->nMTF) break;
349 22752         ge = gs + BZ_G_SIZE - 1;
350 22752         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 22752         for (t = 0; t < nGroups; t++) cost[t] = 0;
357            
358 39312         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 16560         BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4);
371 16560         BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9);
372 16560         BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
373 16560         BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
374 16560         BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
375 16560         BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
376 16560         BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
377 16560         BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
378 16560         BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
379 16560         BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
380            
381           # undef BZ_ITER
382            
383 16560         cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
384 16560         cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
385 16560         cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
386            
387           } else {
388           /*--- slow version which correctly handles all situations ---*/
389 201312         for (i = gs; i <= ge; i++) {
390 201312         UInt16 icv = mtfv[i];
391 201312         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 137440         for (t = 0; t < nGroups; t++)
401 114688         if (cost[t] < bc) { bc = cost[t]; bt = t; };
402           totc += bc;
403           fave[bt]++;
404 22752         s->selector[nSelectors] = bt;
405 22752         nSelectors++;
406            
407           /*--
408           Increment the symbol frequencies for the selected table.
409           --*/
410 22752         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 16560         BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4);
416 16560         BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9);
417 16560         BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
418 16560         BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
419 16560         BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
420 16560         BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
421 16560         BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
422 16560         BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
423 16560         BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
424 16560         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 201312         for (i = gs; i <= ge; i++)
431 201312         s->rfreq[bt][ mtfv[i] ]++;
432           }
433            
434 22752         gs = ge+1;
435 22752         }
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 8376         for (t = 0; t < nGroups; t++)
450 8376         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),
451           alphaSize, 17 /*20*/ );
452           }
453            
454            
455 986         AssertH( nGroups < 8, 3002 );
456 986         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 2094         for (i = 0; i < nGroups; i++) pos[i] = i;
465 5688         for (i = 0; i < nSelectors; i++) {
466 5688         ll_i = s->selector[i];
467           j = 0;
468 5688         tmp = pos[j];
469 21222         while ( ll_i != tmp ) {
470 9846         j++;
471           tmp2 = tmp;
472 9846         tmp = pos[j];
473 9846         pos[j] = tmp2;
474           };
475 5688         pos[0] = tmp;
476 5688         s->selectorMtf[i] = j;
477           }
478           };
479            
480           /*--- Assign actual codes for the tables. --*/
481 2094         for (t = 0; t < nGroups; t++) {
482           minLen = 32;
483           maxLen = 0;
484 48774         for (i = 0; i < alphaSize; i++) {
485 48774         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
486 48774         if (s->len[t][i] < minLen) minLen = s->len[t][i];
487           }
488 2094         AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
489 2094         AssertH ( !(minLen < 1), 3005 );
490 2094         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 15776         for (i = 0; i < 16; i++) {
498 15776         inUse16[i] = False;
499 268192         for (j = 0; j < 16; j++)
500 252416         if (s->inUse[i * 16 + j]) inUse16[i] = True;
501           }
502          
503           nBytes = s->numZ;
504 15776         for (i = 0; i < 16; i++)
505 15776         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
506            
507 15776         for (i = 0; i < 16; i++)
508 15776         if (inUse16[i])
509 62688         for (j = 0; j < 16; j++) {
510 62688         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 986         bsW ( s, 3, nGroups );
520 986         bsW ( s, 15, nSelectors );
521 6674         for (i = 0; i < nSelectors; i++) {
522 9846         for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
523 5688         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 2094         for (t = 0; t < nGroups; t++) {
532 2094         Int32 curr = s->len[t][0];
533 2094         bsW ( s, 5, curr );
534 50868         for (i = 0; i < alphaSize; i++) {
535 15110         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
536 14240         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
537 48774         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 6674         if (gs >= s->nMTF) break;
550 5688         ge = gs + BZ_G_SIZE - 1;
551 5688         if (ge >= s->nMTF) ge = s->nMTF-1;
552 5688         AssertH ( s->selector[selCtr] < nGroups, 3006 );
553            
554 9828         if (nGroups == 6 && 50 == ge-gs+1) {
555           /*--- fast track the common case ---*/
556           UInt16 mtfv_i;
557 4140         UChar* s_len_sel_selCtr
558 4140         = &(s->len[s->selector[selCtr]][0]);
559 4140         Int32* s_code_sel_selCtr
560 4140         = &(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 4140         BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4);
569 4140         BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9);
570 4140         BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
571 4140         BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
572 4140         BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
573 4140         BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
574 4140         BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
575 4140         BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
576 4140         BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
577 4140         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 50328         for (i = gs; i <= ge; i++) {
584 100656         bsW ( s,
585 50328         s->len [s->selector[selCtr]] [mtfv[i]],
586 50328         s->code [s->selector[selCtr]] [mtfv[i]] );
587           }
588           }
589            
590            
591 5688         gs = ge+1;
592 5688         selCtr++;
593 5688         }
594 986         AssertH( selCtr == nSelectors, 3007 );
595            
596           if (s->verbosity >= 3)
597           VPrintf1( "codes %d\n", s->numZ-nBytes );
598 986         }
599            
600            
601           /*---------------------------------------------------*/
602 1152         void BZ2_compressBlock ( EState* s, Bool is_last_block )
603           {
604 1152         if (s->nblock > 0) {
605            
606 986         BZ_FINALISE_CRC ( s->blockCRC );
607 986         s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
608 986         s->combinedCRC ^= s->blockCRC;
609 986         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 986         BZ2_blockSort ( s );
617           }
618            
619 1152         s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
620            
621           /*-- If this is the first block, create the stream header. --*/
622 1152         if (s->blockNo == 1) {
623 1134         BZ2_bsInitWrite ( s );
624 1134         bsPutUChar ( s, BZ_HDR_B );
625 1134         bsPutUChar ( s, BZ_HDR_Z );
626 1134         bsPutUChar ( s, BZ_HDR_h );
627 1134         bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
628           }
629            
630 1152         if (s->nblock > 0) {
631            
632 986         bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
633 986         bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
634 986         bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
635            
636           /*-- Now the block's CRC, so it is in a known place. --*/
637 986         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 986         bsW(s,1,0);
649            
650 986         bsW ( s, 24, s->origPtr );
651 986         generateMTFValues ( s );
652 986         sendMTFValues ( s );
653           }
654            
655            
656           /*-- If this is the last block, add the stream trailer. --*/
657 1152         if (is_last_block) {
658            
659 1134         bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
660 1134         bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
661 1134         bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
662 1134         bsPutUInt32 ( s, s->combinedCRC );
663           if (s->verbosity >= 2)
664           VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC );
665           bsFinishWrite ( s );
666           }
667 1152         }
668            
669            
670           /*-------------------------------------------------------------*/
671           /*--- end compress.c ---*/
672           /*-------------------------------------------------------------*/