Coverage Report

Created: 2025-10-10 07:09

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