Coverage Report

Created: 2026-01-17 06:27

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