File Coverage

compress.c
Criterion Covered Total %
statement 297 298 99.6
branch 171 186 91.9
condition n/a
subroutine n/a
pod n/a
total 468 484 96.6


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