Coverage Report

Created: 2026-06-16 07:20

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