Coverage Report

Created: 2025-08-26 06:45

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