Coverage Report

Created: 2026-09-06 07:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bzip2/compress.c
Line
Count
Source
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 <jseward@acm.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
966
{
39
966
   s->bsLive = 0;
40
966
   s->bsBuff = 0;
41
966
}
42
43
44
/*---------------------------------------------------*/
45
static
46
void bsFinishWrite ( EState* s )
47
966
{
48
2.73k
   while (s->bsLive > 0) {
49
1.77k
      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
50
1.77k
      s->numZ++;
51
1.77k
      s->bsBuff <<= 8;
52
1.77k
      s->bsLive -= 8;
53
1.77k
   }
54
966
}
55
56
57
/*---------------------------------------------------*/
58
59.4M
#define bsNEEDW(nz)                           \
59
59.4M
{                                             \
60
82.6M
   while (s->bsLive >= 8) {                   \
61
23.2M
      s->zbits[s->numZ]                       \
62
23.2M
         = (UChar)(s->bsBuff >> 24);          \
63
23.2M
      s->numZ++;                              \
64
23.2M
      s->bsBuff <<= 8;                        \
65
23.2M
      s->bsLive -= 8;                         \
66
23.2M
   }                                          \
67
59.4M
}
68
69
70
/*---------------------------------------------------*/
71
static
72
__inline__
73
void bsW ( EState* s, Int32 n, UInt32 v )
74
59.4M
{
75
59.4M
   bsNEEDW ( n );
76
59.4M
   s->bsBuff |= (v << (32 - s->bsLive - n));
77
59.4M
   s->bsLive += n;
78
59.4M
}
79
80
81
/*---------------------------------------------------*/
82
static
83
void bsPutUInt32 ( EState* s, UInt32 u )
84
102k
{
85
102k
   bsW ( s, 8, (u >> 24) & 0xffL );
86
102k
   bsW ( s, 8, (u >> 16) & 0xffL );
87
102k
   bsW ( s, 8, (u >>  8) & 0xffL );
88
102k
   bsW ( s, 8,  u        & 0xffL );
89
102k
}
90
91
92
/*---------------------------------------------------*/
93
static
94
void bsPutUChar ( EState* s, UChar c )
95
616k
{
96
616k
   bsW( s, 8, (UInt32)c );
97
616k
}
98
99
100
/*---------------------------------------------------*/
101
/*--- The back end proper                         ---*/
102
/*---------------------------------------------------*/
103
104
/*---------------------------------------------------*/
105
static
106
void makeMaps_e ( EState* s )
107
101k
{
108
101k
   Int32 i;
109
101k
   s->nInUse = 0;
110
25.9M
   for (i = 0; i < 256; i++)
111
25.8M
      if (s->inUse[i]) {
112
2.30M
         s->unseqToSeq[i] = s->nInUse;
113
2.30M
         s->nInUse++;
114
2.30M
      }
115
101k
}
116
117
118
/*---------------------------------------------------*/
119
static
120
void generateMTFValues ( EState* s )
121
101k
{
122
101k
   UChar   yy[256];
123
101k
   Int32   i, j;
124
101k
   Int32   zPend;
125
101k
   Int32   wr;
126
101k
   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
101k
   UInt32* ptr   = s->ptr;
151
101k
   UChar* block  = s->block;
152
101k
   UInt16* mtfv  = s->mtfv;
153
154
101k
   makeMaps_e ( s );
155
101k
   EOB = s->nInUse+1;
156
157
2.60M
   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
158
159
101k
   wr = 0;
160
101k
   zPend = 0;
161
2.40M
   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
162
163
185M
   for (i = 0; i < s->nblock; i++) {
164
185M
      UChar ll_i;
165
185M
      AssertD ( wr <= i, "generateMTFValues(1)" );
166
185M
      j = ptr[i]-1; if (j < 0) j += s->nblock;
167
185M
      ll_i = s->unseqToSeq[block[j]];
168
185M
      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
169
170
185M
      if (yy[0] == ll_i) { 
171
169M
         zPend++;
172
169M
      } else {
173
174
16.1M
         if (zPend > 0) {
175
7.51M
            zPend--;
176
13.5M
            while (True) {
177
13.5M
               if (zPend & 1) {
178
4.31M
                  mtfv[wr] = BZ_RUNB; wr++; 
179
4.31M
                  s->mtfFreq[BZ_RUNB]++; 
180
9.28M
               } else {
181
9.28M
                  mtfv[wr] = BZ_RUNA; wr++; 
182
9.28M
                  s->mtfFreq[BZ_RUNA]++; 
183
9.28M
               }
184
13.5M
               if (zPend < 2) break;
185
6.08M
               zPend = (zPend - 2) / 2;
186
6.08M
            };
187
7.51M
            zPend = 0;
188
7.51M
         }
189
16.1M
         {
190
16.1M
            register UChar  rtmp;
191
16.1M
            register UChar* ryy_j;
192
16.1M
            register UChar  rll_i;
193
16.1M
            rtmp  = yy[1];
194
16.1M
            yy[1] = yy[0];
195
16.1M
            ryy_j = &(yy[1]);
196
16.1M
            rll_i = ll_i;
197
907M
            while ( rll_i != rtmp ) {
198
891M
               register UChar rtmp2;
199
891M
               ryy_j++;
200
891M
               rtmp2  = rtmp;
201
891M
               rtmp   = *ryy_j;
202
891M
               *ryy_j = rtmp2;
203
891M
            };
204
16.1M
            yy[0] = rtmp;
205
16.1M
            j = ryy_j - &(yy[0]);
206
16.1M
            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
207
16.1M
         }
208
209
16.1M
      }
210
185M
   }
211
212
101k
   if (zPend > 0) {
213
70.5k
      zPend--;
214
268k
      while (True) {
215
268k
         if (zPend & 1) {
216
83.9k
            mtfv[wr] = BZ_RUNB; wr++; 
217
83.9k
            s->mtfFreq[BZ_RUNB]++; 
218
184k
         } else {
219
184k
            mtfv[wr] = BZ_RUNA; wr++; 
220
184k
            s->mtfFreq[BZ_RUNA]++; 
221
184k
         }
222
268k
         if (zPend < 2) break;
223
198k
         zPend = (zPend - 2) / 2;
224
198k
      };
225
70.5k
      zPend = 0;
226
70.5k
   }
227
228
101k
   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
229
230
101k
   s->nMTF = wr;
231
101k
}
232
233
234
/*---------------------------------------------------*/
235
2.50M
#define BZ_LESSER_ICOST  0
236
25.0M
#define BZ_GREATER_ICOST 15
237
238
static
239
void sendMTFValues ( EState* s )
240
101k
{
241
101k
   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
242
101k
   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
243
101k
   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
101k
   UInt16 cost[BZ_N_GROUPS];
257
101k
   Int32  fave[BZ_N_GROUPS];
258
259
101k
   UInt16* mtfv = s->mtfv;
260
261
101k
   if (s->verbosity >= 3)
262
0
      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
263
101k
                "%d+2 syms in use\n", 
264
101k
                s->nblock, s->nMTF, s->nInUse );
265
266
101k
   alphaSize = s->nInUse+2;
267
707k
   for (t = 0; t < BZ_N_GROUPS; t++)
268
15.6M
      for (v = 0; v < alphaSize; v++)
269
15.0M
         s->len[t][v] = BZ_GREATER_ICOST;
270
271
   /*--- Decide how many coding tables to use ---*/
272
101k
   AssertH ( s->nMTF > 0, 3001 );
273
101k
   if (s->nMTF < 200)  nGroups = 2; else
274
16.8k
   if (s->nMTF < 600)  nGroups = 3; else
275
10.4k
   if (s->nMTF < 1200) nGroups = 4; else
276
9.57k
   if (s->nMTF < 2400) nGroups = 5; else
277
7.94k
                       nGroups = 6;
278
279
   /*--- Generate an initial set of coding tables ---*/
280
101k
   { 
281
101k
      Int32 nPart, remF, tFreq, aFreq;
282
283
101k
      nPart = nGroups;
284
101k
      remF  = s->nMTF;
285
101k
      gs = 0;
286
348k
      while (nPart > 0) {
287
247k
         tFreq = remF / nPart;
288
247k
         ge = gs-1;
289
247k
         aFreq = 0;
290
2.77M
         while (aFreq < tFreq && ge < alphaSize-1) {
291
2.52M
            ge++;
292
2.52M
            aFreq += s->mtfFreq[ge];
293
2.52M
         }
294
295
247k
         if (ge > gs 
296
180k
             && nPart != nGroups && nPart != 1 
297
38.6k
             && ((nGroups-nPart) % 2 == 1)) {
298
20.7k
            aFreq -= s->mtfFreq[ge];
299
20.7k
            ge--;
300
20.7k
         }
301
302
247k
         if (s->verbosity >= 3)
303
0
            VPrintf5( "      initial group %d, [%d .. %d], "
304
247k
                      "has %d syms (%4.1f%%)\n",
305
247k
                      nPart, gs, ge, aFreq, 
306
247k
                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
307
 
308
12.7M
         for (v = 0; v < alphaSize; v++)
309
12.4M
            if (v >= gs && v <= ge) 
310
2.50M
               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
311
9.99M
               s->len[nPart-1][v] = BZ_GREATER_ICOST;
312
 
313
247k
         nPart--;
314
247k
         gs = ge+1;
315
247k
         remF -= aFreq;
316
247k
      }
317
101k
   }
318
319
   /*--- 
320
      Iterate up to BZ_N_ITERS times to improve the tables.
321
   ---*/
322
505k
   for (iter = 0; iter < BZ_N_ITERS; iter++) {
323
324
1.39M
      for (t = 0; t < nGroups; t++) fave[t] = 0;
325
326
1.39M
      for (t = 0; t < nGroups; t++)
327
50.9M
         for (v = 0; v < alphaSize; v++)
328
49.9M
            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
404k
      if (nGroups == 6) {
335
6.56M
         for (v = 0; v < alphaSize; v++) {
336
6.53M
            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
337
6.53M
            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
338
6.53M
            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
339
6.53M
   }
340
31.7k
      }
341
342
404k
      nSelectors = 0;
343
404k
      totc = 0;
344
404k
      gs = 0;
345
3.09M
      while (True) {
346
347
         /*--- Set group start & end marks. --*/
348
3.09M
         if (gs >= s->nMTF) break;
349
2.69M
         ge = gs + BZ_G_SIZE - 1; 
350
2.69M
         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
16.2M
         for (t = 0; t < nGroups; t++) cost[t] = 0;
357
358
2.69M
         if (nGroups == 6 && 50 == ge-gs+1) {
359
            /*--- fast track the common case ---*/
360
1.73M
            register UInt32 cost01, cost23, cost45;
361
1.73M
            register UInt16 icv;
362
1.73M
            cost01 = cost23 = cost45 = 0;
363
364
1.73M
#           define BZ_ITER(nn)                \
365
86.8M
               icv = mtfv[gs+(nn)];           \
366
86.8M
               cost01 += s->len_pack[icv][0]; \
367
86.8M
               cost23 += s->len_pack[icv][1]; \
368
86.8M
               cost45 += s->len_pack[icv][2]; \
369
1.73M
370
1.73M
            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
371
1.73M
            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
372
1.73M
            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
373
1.73M
            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
374
1.73M
            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
375
1.73M
            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
376
1.73M
            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
377
1.73M
            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
378
1.73M
            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
379
1.73M
            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
380
381
1.73M
#           undef BZ_ITER
382
383
1.73M
            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
384
1.73M
            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
385
1.73M
            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
386
387
1.73M
         } else {
388
      /*--- slow version which correctly handles all situations ---*/
389
34.4M
            for (i = gs; i <= ge; i++) { 
390
33.5M
               UInt16 icv = mtfv[i];
391
158M
               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
392
33.5M
            }
393
954k
         }
394
 
395
         /*-- 
396
            Find the coding table which is best for this group,
397
            and record its identity in the selector table.
398
         --*/
399
2.69M
         bc = 999999999; bt = -1;
400
16.2M
         for (t = 0; t < nGroups; t++)
401
13.5M
            if (cost[t] < bc) { bc = cost[t]; bt = t; };
402
2.69M
         totc += bc;
403
2.69M
         fave[bt]++;
404
2.69M
         s->selector[nSelectors] = bt;
405
2.69M
         nSelectors++;
406
407
         /*-- 
408
            Increment the symbol frequencies for the selected table.
409
          --*/
410
2.69M
         if (nGroups == 6 && 50 == ge-gs+1) {
411
            /*--- fast track the common case ---*/
412
413
86.8M
#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
414
415
1.73M
            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
416
1.73M
            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
417
1.73M
            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
418
1.73M
            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
419
1.73M
            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
420
1.73M
            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
421
1.73M
            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
422
1.73M
            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
423
1.73M
            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
424
1.73M
            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
425
426
1.73M
#           undef BZ_ITUR
427
428
1.73M
         } else {
429
      /*--- slow version which correctly handles all situations ---*/
430
34.4M
            for (i = gs; i <= ge; i++)
431
33.5M
               s->rfreq[bt][ mtfv[i] ]++;
432
954k
         }
433
434
2.69M
         gs = ge+1;
435
2.69M
      }
436
404k
      if (s->verbosity >= 3) {
437
0
         VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
438
0
                   iter+1, totc/8 );
439
0
         for (t = 0; t < nGroups; t++)
440
0
            VPrintf1 ( "%d ", fave[t] );
441
0
         VPrintf0 ( "\n" );
442
0
      }
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
1.39M
      for (t = 0; t < nGroups; t++)
450
988k
         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
451
988k
                                 alphaSize, 17 /*20*/ );
452
404k
   }
453
454
455
101k
   AssertH( nGroups < 8, 3002 );
456
101k
   AssertH( nSelectors < 32768 &&
457
101k
            nSelectors <= BZ_MAX_SELECTORS,
458
101k
            3003 );
459
460
461
   /*--- Compute MTF values for the selectors. ---*/
462
101k
   {
463
101k
      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
464
348k
      for (i = 0; i < nGroups; i++) pos[i] = i;
465
773k
      for (i = 0; i < nSelectors; i++) {
466
672k
         ll_i = s->selector[i];
467
672k
         j = 0;
468
672k
         tmp = pos[j];
469
1.20M
         while ( ll_i != tmp ) {
470
536k
            j++;
471
536k
            tmp2 = tmp;
472
536k
            tmp = pos[j];
473
536k
            pos[j] = tmp2;
474
536k
         };
475
672k
         pos[0] = tmp;
476
672k
         s->selectorMtf[i] = j;
477
672k
      }
478
101k
   };
479
480
   /*--- Assign actual codes for the tables. --*/
481
348k
   for (t = 0; t < nGroups; t++) {
482
247k
      minLen = 32;
483
247k
      maxLen = 0;
484
12.7M
      for (i = 0; i < alphaSize; i++) {
485
12.4M
         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
486
12.4M
         if (s->len[t][i] < minLen) minLen = s->len[t][i];
487
12.4M
      }
488
247k
      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
489
247k
      AssertH ( !(minLen < 1),  3005 );
490
247k
      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
491
247k
                          minLen, maxLen, alphaSize );
492
247k
   }
493
494
   /*--- Transmit the mapping table. ---*/
495
101k
   { 
496
101k
      Bool inUse16[16];
497
1.71M
      for (i = 0; i < 16; i++) {
498
1.61M
          inUse16[i] = False;
499
27.5M
          for (j = 0; j < 16; j++)
500
25.8M
             if (s->inUse[i * 16 + j]) inUse16[i] = True;
501
1.61M
      }
502
     
503
101k
      nBytes = s->numZ;
504
1.71M
      for (i = 0; i < 16; i++)
505
1.61M
         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
506
507
1.71M
      for (i = 0; i < 16; i++)
508
1.61M
         if (inUse16[i])
509
6.98M
            for (j = 0; j < 16; j++) {
510
6.57M
               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
511
6.57M
            }
512
513
101k
      if (s->verbosity >= 3) 
514
0
         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
515
101k
   }
516
517
   /*--- Now the selectors. ---*/
518
101k
   nBytes = s->numZ;
519
101k
   bsW ( s, 3, nGroups );
520
101k
   bsW ( s, 15, nSelectors );
521
773k
   for (i = 0; i < nSelectors; i++) { 
522
1.20M
      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
523
672k
      bsW(s,1,0);
524
672k
   }
525
101k
   if (s->verbosity >= 3)
526
0
      VPrintf1( "selectors %d, ", s->numZ-nBytes );
527
528
   /*--- Now the coding tables. ---*/
529
101k
   nBytes = s->numZ;
530
531
348k
   for (t = 0; t < nGroups; t++) {
532
247k
      Int32 curr = s->len[t][0];
533
247k
      bsW ( s, 5, curr );
534
12.7M
      for (i = 0; i < alphaSize; i++) {
535
15.5M
         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
536
15.1M
         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
537
12.4M
         bsW ( s, 1, 0 );
538
12.4M
      }
539
247k
   }
540
541
101k
   if (s->verbosity >= 3)
542
0
      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
543
544
   /*--- And finally, the block data proper ---*/
545
101k
   nBytes = s->numZ;
546
101k
   selCtr = 0;
547
101k
   gs = 0;
548
773k
   while (True) {
549
773k
      if (gs >= s->nMTF) break;
550
672k
      ge = gs + BZ_G_SIZE - 1; 
551
672k
      if (ge >= s->nMTF) ge = s->nMTF-1;
552
672k
      AssertH ( s->selector[selCtr] < nGroups, 3006 );
553
554
672k
      if (nGroups == 6 && 50 == ge-gs+1) {
555
            /*--- fast track the common case ---*/
556
434k
            UInt16 mtfv_i;
557
434k
            UChar* s_len_sel_selCtr 
558
434k
               = &(s->len[s->selector[selCtr]][0]);
559
434k
            Int32* s_code_sel_selCtr
560
434k
               = &(s->code[s->selector[selCtr]][0]);
561
562
434k
#           define BZ_ITAH(nn)                      \
563
21.7M
               mtfv_i = mtfv[gs+(nn)];              \
564
21.7M
               bsW ( s,                             \
565
21.7M
                     s_len_sel_selCtr[mtfv_i],      \
566
21.7M
                     s_code_sel_selCtr[mtfv_i] )
567
568
434k
            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
569
434k
            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
570
434k
            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
571
434k
            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
572
434k
            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
573
434k
            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
574
434k
            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
575
434k
            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
576
434k
            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
577
434k
            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
578
579
434k
#           undef BZ_ITAH
580
581
434k
      } else {
582
   /*--- slow version which correctly handles all situations ---*/
583
8.61M
         for (i = gs; i <= ge; i++) {
584
8.37M
            bsW ( s, 
585
8.37M
                  s->len  [s->selector[selCtr]] [mtfv[i]],
586
8.37M
                  s->code [s->selector[selCtr]] [mtfv[i]] );
587
8.37M
         }
588
238k
      }
589
590
591
672k
      gs = ge+1;
592
672k
      selCtr++;
593
672k
   }
594
101k
   AssertH( selCtr == nSelectors, 3007 );
595
596
101k
   if (s->verbosity >= 3)
597
0
      VPrintf1( "codes %d\n", s->numZ-nBytes );
598
101k
}
599
600
601
/*---------------------------------------------------*/
602
void BZ2_compressBlock ( EState* s, Bool is_last_block )
603
102k
{
604
102k
   if (s->nblock > 0) {
605
606
101k
      BZ_FINALISE_CRC ( s->blockCRC );
607
101k
      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
608
101k
      s->combinedCRC ^= s->blockCRC;
609
101k
      if (s->blockNo > 1) s->numZ = 0;
610
611
101k
      if (s->verbosity >= 2)
612
0
         VPrintf4( "    block %d: crc = 0x%08x, "
613
101k
                   "combined CRC = 0x%08x, size = %d\n",
614
101k
                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
615
616
101k
      BZ2_blockSort ( s );
617
101k
   }
618
619
102k
   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
620
621
   /*-- If this is the first block, create the stream header. --*/
622
102k
   if (s->blockNo == 1) {
623
966
      BZ2_bsInitWrite ( s );
624
966
      bsPutUChar ( s, BZ_HDR_B );
625
966
      bsPutUChar ( s, BZ_HDR_Z );
626
966
      bsPutUChar ( s, BZ_HDR_h );
627
966
      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
628
966
   }
629
630
102k
   if (s->nblock > 0) {
631
632
101k
      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
633
101k
      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
634
101k
      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
635
636
      /*-- Now the block's CRC, so it is in a known place. --*/
637
101k
      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
101k
      bsW(s,1,0);
649
650
101k
      bsW ( s, 24, s->origPtr );
651
101k
      generateMTFValues ( s );
652
101k
      sendMTFValues ( s );
653
101k
   }
654
655
656
   /*-- If this is the last block, add the stream trailer. --*/
657
102k
   if (is_last_block) {
658
659
966
      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
660
966
      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
661
966
      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
662
966
      bsPutUInt32 ( s, s->combinedCRC );
663
966
      if (s->verbosity >= 2)
664
         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
665
966
      bsFinishWrite ( s );
666
966
   }
667
102k
}
668
669
670
/*-------------------------------------------------------------*/
671
/*--- end                                        compress.c ---*/
672
/*-------------------------------------------------------------*/