Coverage Report

Created: 2025-08-11 08:01

/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.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
867
{
39
867
   s->bsLive = 0;
40
867
   s->bsBuff = 0;
41
867
}
42
43
44
/*---------------------------------------------------*/
45
static
46
void bsFinishWrite ( EState* s )
47
867
{
48
2.46k
   while (s->bsLive > 0) {
49
1.60k
      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
50
1.60k
      s->numZ++;
51
1.60k
      s->bsBuff <<= 8;
52
1.60k
      s->bsLive -= 8;
53
1.60k
   }
54
867
}
55
56
57
/*---------------------------------------------------*/
58
58.7M
#define bsNEEDW(nz)                           \
59
58.7M
{                                             \
60
80.7M
   while (s->bsLive >= 8) {                   \
61
22.0M
      s->zbits[s->numZ]                       \
62
22.0M
         = (UChar)(s->bsBuff >> 24);          \
63
22.0M
      s->numZ++;                              \
64
22.0M
      s->bsBuff <<= 8;                        \
65
22.0M
      s->bsLive -= 8;                         \
66
22.0M
   }                                          \
67
58.7M
}
68
69
70
/*---------------------------------------------------*/
71
static
72
__inline__
73
void bsW ( EState* s, Int32 n, UInt32 v )
74
58.7M
{
75
58.7M
   bsNEEDW ( n );
76
58.7M
   s->bsBuff |= (v << (32 - s->bsLive - n));
77
58.7M
   s->bsLive += n;
78
58.7M
}
79
80
81
/*---------------------------------------------------*/
82
static
83
void bsPutUInt32 ( EState* s, UInt32 u )
84
102k
{
85
102k
   bsW ( s, 8, (u >> 24) & 0xffL );
86
102k
   bsW ( s, 8, (u >> 16) & 0xffL );
87
102k
   bsW ( s, 8, (u >>  8) & 0xffL );
88
102k
   bsW ( s, 8,  u        & 0xffL );
89
102k
}
90
91
92
/*---------------------------------------------------*/
93
static
94
void bsPutUChar ( EState* s, UChar c )
95
617k
{
96
617k
   bsW( s, 8, (UInt32)c );
97
617k
}
98
99
100
/*---------------------------------------------------*/
101
/*--- The back end proper                         ---*/
102
/*---------------------------------------------------*/
103
104
/*---------------------------------------------------*/
105
static
106
void makeMaps_e ( EState* s )
107
101k
{
108
101k
   Int32 i;
109
101k
   s->nInUse = 0;
110
26.0M
   for (i = 0; i < 256; i++)
111
25.9M
      if (s->inUse[i]) {
112
2.32M
         s->unseqToSeq[i] = s->nInUse;
113
2.32M
         s->nInUse++;
114
2.32M
      }
115
101k
}
116
117
118
/*---------------------------------------------------*/
119
static
120
void generateMTFValues ( EState* s )
121
101k
{
122
101k
   UChar   yy[256];
123
101k
   Int32   i, j;
124
101k
   Int32   zPend;
125
101k
   Int32   wr;
126
101k
   Int32   EOB;
127
128
   /* 
129
      After sorting (eg, here),
130
         s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
131
         and
132
         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 
133
         holds the original block data.
134
135
      The first thing to do is generate the MTF values,
136
      and put them in
137
         ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
138
      Because there are strictly fewer or equal MTF values
139
      than block values, ptr values in this area are overwritten
140
      with MTF values only when they are no longer needed.
141
142
      The final compressed bitstream is generated into the
143
      area starting at
144
         (UChar*) (&((UChar*)s->arr2)[s->nblock])
145
146
      These storage aliases are set up in bzCompressInit(),
147
      except for the last one, which is arranged in 
148
      compressBlock().
149
   */
150
101k
   UInt32* ptr   = s->ptr;
151
101k
   UChar* block  = s->block;
152
101k
   UInt16* mtfv  = s->mtfv;
153
154
101k
   makeMaps_e ( s );
155
101k
   EOB = s->nInUse+1;
156
157
2.62M
   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
158
159
101k
   wr = 0;
160
101k
   zPend = 0;
161
2.42M
   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
162
163
197M
   for (i = 0; i < s->nblock; i++) {
164
197M
      UChar ll_i;
165
197M
      AssertD ( wr <= i, "generateMTFValues(1)" );
166
197M
      j = ptr[i]-1; if (j < 0) j += s->nblock;
167
197M
      ll_i = s->unseqToSeq[block[j]];
168
197M
      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
169
170
197M
      if (yy[0] == ll_i) { 
171
182M
         zPend++;
172
182M
      } else {
173
174
14.5M
         if (zPend > 0) {
175
7.71M
            zPend--;
176
14.3M
            while (True) {
177
14.3M
               if (zPend & 1) {
178
4.85M
                  mtfv[wr] = BZ_RUNB; wr++; 
179
4.85M
                  s->mtfFreq[BZ_RUNB]++; 
180
9.46M
               } else {
181
9.46M
                  mtfv[wr] = BZ_RUNA; wr++; 
182
9.46M
                  s->mtfFreq[BZ_RUNA]++; 
183
9.46M
               }
184
14.3M
               if (zPend < 2) break;
185
6.61M
               zPend = (zPend - 2) / 2;
186
6.61M
            };
187
7.71M
            zPend = 0;
188
7.71M
         }
189
14.5M
         {
190
14.5M
            register UChar  rtmp;
191
14.5M
            register UChar* ryy_j;
192
14.5M
            register UChar  rll_i;
193
14.5M
            rtmp  = yy[1];
194
14.5M
            yy[1] = yy[0];
195
14.5M
            ryy_j = &(yy[1]);
196
14.5M
            rll_i = ll_i;
197
814M
            while ( rll_i != rtmp ) {
198
800M
               register UChar rtmp2;
199
800M
               ryy_j++;
200
800M
               rtmp2  = rtmp;
201
800M
               rtmp   = *ryy_j;
202
800M
               *ryy_j = rtmp2;
203
800M
            };
204
14.5M
            yy[0] = rtmp;
205
14.5M
            j = ryy_j - &(yy[0]);
206
14.5M
            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
207
14.5M
         }
208
209
14.5M
      }
210
197M
   }
211
212
101k
   if (zPend > 0) {
213
64.0k
      zPend--;
214
235k
      while (True) {
215
235k
         if (zPend & 1) {
216
82.4k
            mtfv[wr] = BZ_RUNB; wr++; 
217
82.4k
            s->mtfFreq[BZ_RUNB]++; 
218
152k
         } else {
219
152k
            mtfv[wr] = BZ_RUNA; wr++; 
220
152k
            s->mtfFreq[BZ_RUNA]++; 
221
152k
         }
222
235k
         if (zPend < 2) break;
223
171k
         zPend = (zPend - 2) / 2;
224
171k
      };
225
64.0k
      zPend = 0;
226
64.0k
   }
227
228
101k
   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
229
230
101k
   s->nMTF = wr;
231
101k
}
232
233
234
/*---------------------------------------------------*/
235
2.52M
#define BZ_LESSER_ICOST  0
236
24.6M
#define BZ_GREATER_ICOST 15
237
238
static
239
void sendMTFValues ( EState* s )
240
101k
{
241
101k
   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
242
101k
   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
243
101k
   Int32 nGroups, nBytes;
244
245
   /*--
246
   UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
247
   is a global since the decoder also needs it.
248
249
   Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
250
   Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
251
   are also globals only used in this proc.
252
   Made global to keep stack frame size small.
253
   --*/
254
255
256
101k
   UInt16 cost[BZ_N_GROUPS];
257
101k
   Int32  fave[BZ_N_GROUPS];
258
259
101k
   UInt16* mtfv = s->mtfv;
260
261
101k
   if (s->verbosity >= 3)
262
0
      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
263
101k
                "%d+2 syms in use\n", 
264
101k
                s->nblock, s->nMTF, s->nInUse );
265
266
101k
   alphaSize = s->nInUse+2;
267
710k
   for (t = 0; t < BZ_N_GROUPS; t++)
268
15.7M
      for (v = 0; v < alphaSize; v++)
269
15.1M
         s->len[t][v] = BZ_GREATER_ICOST;
270
271
   /*--- Decide how many coding tables to use ---*/
272
101k
   AssertH ( s->nMTF > 0, 3001 );
273
101k
   if (s->nMTF < 200)  nGroups = 2; else
274
15.4k
   if (s->nMTF < 600)  nGroups = 3; else
275
10.0k
   if (s->nMTF < 1200) nGroups = 4; else
276
8.77k
   if (s->nMTF < 2400) nGroups = 5; else
277
7.26k
                       nGroups = 6;
278
279
   /*--- Generate an initial set of coding tables ---*/
280
101k
   { 
281
101k
      Int32 nPart, remF, tFreq, aFreq;
282
283
101k
      nPart = nGroups;
284
101k
      remF  = s->nMTF;
285
101k
      gs = 0;
286
346k
      while (nPart > 0) {
287
244k
         tFreq = remF / nPart;
288
244k
         ge = gs-1;
289
244k
         aFreq = 0;
290
2.78M
         while (aFreq < tFreq && ge < alphaSize-1) {
291
2.54M
            ge++;
292
2.54M
            aFreq += s->mtfFreq[ge];
293
2.54M
         }
294
295
244k
         if (ge > gs 
296
244k
             && nPart != nGroups && nPart != 1 
297
244k
             && ((nGroups-nPart) % 2 == 1)) {
298
17.4k
            aFreq -= s->mtfFreq[ge];
299
17.4k
            ge--;
300
17.4k
         }
301
302
244k
         if (s->verbosity >= 3)
303
0
            VPrintf5( "      initial group %d, [%d .. %d], "
304
244k
                      "has %d syms (%4.1f%%)\n",
305
244k
                      nPart, gs, ge, aFreq, 
306
244k
                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
307
 
308
12.2M
         for (v = 0; v < alphaSize; v++)
309
12.0M
            if (v >= gs && v <= ge) 
310
2.52M
               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
311
9.50M
               s->len[nPart-1][v] = BZ_GREATER_ICOST;
312
 
313
244k
         nPart--;
314
244k
         gs = ge+1;
315
244k
         remF -= aFreq;
316
244k
      }
317
101k
   }
318
319
   /*--- 
320
      Iterate up to BZ_N_ITERS times to improve the tables.
321
   ---*/
322
507k
   for (iter = 0; iter < BZ_N_ITERS; iter++) {
323
324
1.38M
      for (t = 0; t < nGroups; t++) fave[t] = 0;
325
326
1.38M
      for (t = 0; t < nGroups; t++)
327
49.1M
         for (v = 0; v < alphaSize; v++)
328
48.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
406k
      if (nGroups == 6) {
335
6.01M
         for (v = 0; v < alphaSize; v++) {
336
5.98M
            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
337
5.98M
            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
338
5.98M
            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
339
5.98M
   }
340
29.0k
      }
341
342
406k
      nSelectors = 0;
343
406k
      totc = 0;
344
406k
      gs = 0;
345
3.01M
      while (True) {
346
347
         /*--- Set group start & end marks. --*/
348
3.01M
         if (gs >= s->nMTF) break;
349
2.61M
         ge = gs + BZ_G_SIZE - 1; 
350
2.61M
         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
15.4M
         for (t = 0; t < nGroups; t++) cost[t] = 0;
357
358
2.61M
         if (nGroups == 6 && 50 == ge-gs+1) {
359
            /*--- fast track the common case ---*/
360
1.60M
            register UInt32 cost01, cost23, cost45;
361
1.60M
            register UInt16 icv;
362
1.60M
            cost01 = cost23 = cost45 = 0;
363
364
1.60M
#           define BZ_ITER(nn)                \
365
80.0M
               icv = mtfv[gs+(nn)];           \
366
80.0M
               cost01 += s->len_pack[icv][0]; \
367
80.0M
               cost23 += s->len_pack[icv][1]; \
368
80.0M
               cost45 += s->len_pack[icv][2]; \
369
1.60M
370
1.60M
            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
371
1.60M
            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
372
1.60M
            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
373
1.60M
            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
374
1.60M
            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
375
1.60M
            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
376
1.60M
            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
377
1.60M
            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
378
1.60M
            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
379
1.60M
            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
380
381
1.60M
#           undef BZ_ITER
382
383
1.60M
            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
384
1.60M
            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
385
1.60M
            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
386
387
1.60M
         } else {
388
      /*--- slow version which correctly handles all situations ---*/
389
37.8M
            for (i = gs; i <= ge; i++) { 
390
36.8M
               UInt16 icv = mtfv[i];
391
168M
               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
392
36.8M
            }
393
1.01M
         }
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.61M
         bc = 999999999; bt = -1;
400
15.4M
         for (t = 0; t < nGroups; t++)
401
12.8M
            if (cost[t] < bc) { bc = cost[t]; bt = t; };
402
2.61M
         totc += bc;
403
2.61M
         fave[bt]++;
404
2.61M
         s->selector[nSelectors] = bt;
405
2.61M
         nSelectors++;
406
407
         /*-- 
408
            Increment the symbol frequencies for the selected table.
409
          --*/
410
2.61M
         if (nGroups == 6 && 50 == ge-gs+1) {
411
            /*--- fast track the common case ---*/
412
413
80.0M
#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
414
415
1.60M
            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
416
1.60M
            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
417
1.60M
            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
418
1.60M
            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
419
1.60M
            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
420
1.60M
            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
421
1.60M
            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
422
1.60M
            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
423
1.60M
            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
424
1.60M
            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
425
426
1.60M
#           undef BZ_ITUR
427
428
1.60M
         } else {
429
      /*--- slow version which correctly handles all situations ---*/
430
37.8M
            for (i = gs; i <= ge; i++)
431
36.8M
               s->rfreq[bt][ mtfv[i] ]++;
432
1.01M
         }
433
434
2.61M
         gs = ge+1;
435
2.61M
      }
436
406k
      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.38M
      for (t = 0; t < nGroups; t++)
450
978k
         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
451
978k
                                 alphaSize, 17 /*20*/ );
452
406k
   }
453
454
455
101k
   AssertH( nGroups < 8, 3002 );
456
101k
   AssertH( nSelectors < 32768 &&
457
101k
            nSelectors <= BZ_MAX_SELECTORS,
458
101k
            3003 );
459
460
461
   /*--- Compute MTF values for the selectors. ---*/
462
101k
   {
463
101k
      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
464
346k
      for (i = 0; i < nGroups; i++) pos[i] = i;
465
754k
      for (i = 0; i < nSelectors; i++) {
466
652k
         ll_i = s->selector[i];
467
652k
         j = 0;
468
652k
         tmp = pos[j];
469
1.09M
         while ( ll_i != tmp ) {
470
440k
            j++;
471
440k
            tmp2 = tmp;
472
440k
            tmp = pos[j];
473
440k
            pos[j] = tmp2;
474
440k
         };
475
652k
         pos[0] = tmp;
476
652k
         s->selectorMtf[i] = j;
477
652k
      }
478
101k
   };
479
480
   /*--- Assign actual codes for the tables. --*/
481
346k
   for (t = 0; t < nGroups; t++) {
482
244k
      minLen = 32;
483
244k
      maxLen = 0;
484
12.2M
      for (i = 0; i < alphaSize; i++) {
485
12.0M
         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
486
12.0M
         if (s->len[t][i] < minLen) minLen = s->len[t][i];
487
12.0M
      }
488
244k
      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
489
244k
      AssertH ( !(minLen < 1),  3005 );
490
244k
      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
491
244k
                          minLen, maxLen, alphaSize );
492
244k
   }
493
494
   /*--- Transmit the mapping table. ---*/
495
101k
   { 
496
101k
      Bool inUse16[16];
497
1.72M
      for (i = 0; i < 16; i++) {
498
1.62M
          inUse16[i] = False;
499
27.6M
          for (j = 0; j < 16; j++)
500
25.9M
             if (s->inUse[i * 16 + j]) inUse16[i] = True;
501
1.62M
      }
502
     
503
101k
      nBytes = s->numZ;
504
1.72M
      for (i = 0; i < 16; i++)
505
1.62M
         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
506
507
1.72M
      for (i = 0; i < 16; i++)
508
1.62M
         if (inUse16[i])
509
8.14M
            for (j = 0; j < 16; j++) {
510
7.66M
               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
511
7.66M
            }
512
513
101k
      if (s->verbosity >= 3) 
514
0
         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
515
101k
   }
516
517
   /*--- Now the selectors. ---*/
518
101k
   nBytes = s->numZ;
519
101k
   bsW ( s, 3, nGroups );
520
101k
   bsW ( s, 15, nSelectors );
521
754k
   for (i = 0; i < nSelectors; i++) { 
522
1.09M
      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
523
652k
      bsW(s,1,0);
524
652k
   }
525
101k
   if (s->verbosity >= 3)
526
0
      VPrintf1( "selectors %d, ", s->numZ-nBytes );
527
528
   /*--- Now the coding tables. ---*/
529
101k
   nBytes = s->numZ;
530
531
346k
   for (t = 0; t < nGroups; t++) {
532
244k
      Int32 curr = s->len[t][0];
533
244k
      bsW ( s, 5, curr );
534
12.2M
      for (i = 0; i < alphaSize; i++) {
535
14.9M
         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
536
14.5M
         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
537
12.0M
         bsW ( s, 1, 0 );
538
12.0M
      }
539
244k
   }
540
541
101k
   if (s->verbosity >= 3)
542
0
      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
543
544
   /*--- And finally, the block data proper ---*/
545
101k
   nBytes = s->numZ;
546
101k
   selCtr = 0;
547
101k
   gs = 0;
548
754k
   while (True) {
549
754k
      if (gs >= s->nMTF) break;
550
652k
      ge = gs + BZ_G_SIZE - 1; 
551
652k
      if (ge >= s->nMTF) ge = s->nMTF-1;
552
652k
      AssertH ( s->selector[selCtr] < nGroups, 3006 );
553
554
652k
      if (nGroups == 6 && 50 == ge-gs+1) {
555
            /*--- fast track the common case ---*/
556
400k
            UInt16 mtfv_i;
557
400k
            UChar* s_len_sel_selCtr 
558
400k
               = &(s->len[s->selector[selCtr]][0]);
559
400k
            Int32* s_code_sel_selCtr
560
400k
               = &(s->code[s->selector[selCtr]][0]);
561
562
400k
#           define BZ_ITAH(nn)                      \
563
20.0M
               mtfv_i = mtfv[gs+(nn)];              \
564
20.0M
               bsW ( s,                             \
565
20.0M
                     s_len_sel_selCtr[mtfv_i],      \
566
20.0M
                     s_code_sel_selCtr[mtfv_i] )
567
568
400k
            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
569
400k
            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
570
400k
            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
571
400k
            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
572
400k
            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
573
400k
            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
574
400k
            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
575
400k
            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
576
400k
            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
577
400k
            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
578
579
400k
#           undef BZ_ITAH
580
581
400k
      } else {
582
   /*--- slow version which correctly handles all situations ---*/
583
9.45M
         for (i = gs; i <= ge; i++) {
584
9.20M
            bsW ( s, 
585
9.20M
                  s->len  [s->selector[selCtr]] [mtfv[i]],
586
9.20M
                  s->code [s->selector[selCtr]] [mtfv[i]] );
587
9.20M
         }
588
252k
      }
589
590
591
652k
      gs = ge+1;
592
652k
      selCtr++;
593
652k
   }
594
101k
   AssertH( selCtr == nSelectors, 3007 );
595
596
101k
   if (s->verbosity >= 3)
597
0
      VPrintf1( "codes %d\n", s->numZ-nBytes );
598
101k
}
599
600
601
/*---------------------------------------------------*/
602
void BZ2_compressBlock ( EState* s, Bool is_last_block )
603
102k
{
604
102k
   if (s->nblock > 0) {
605
606
101k
      BZ_FINALISE_CRC ( s->blockCRC );
607
101k
      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
608
101k
      s->combinedCRC ^= s->blockCRC;
609
101k
      if (s->blockNo > 1) s->numZ = 0;
610
611
101k
      if (s->verbosity >= 2)
612
0
         VPrintf4( "    block %d: crc = 0x%08x, "
613
101k
                   "combined CRC = 0x%08x, size = %d\n",
614
101k
                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
615
616
101k
      BZ2_blockSort ( s );
617
101k
   }
618
619
102k
   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
620
621
   /*-- If this is the first block, create the stream header. --*/
622
102k
   if (s->blockNo == 1) {
623
867
      BZ2_bsInitWrite ( s );
624
867
      bsPutUChar ( s, BZ_HDR_B );
625
867
      bsPutUChar ( s, BZ_HDR_Z );
626
867
      bsPutUChar ( s, BZ_HDR_h );
627
867
      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
628
867
   }
629
630
102k
   if (s->nblock > 0) {
631
632
101k
      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
633
101k
      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
634
101k
      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
635
636
      /*-- Now the block's CRC, so it is in a known place. --*/
637
101k
      bsPutUInt32 ( s, s->blockCRC );
638
639
      /*-- 
640
         Now a single bit indicating (non-)randomisation. 
641
         As of version 0.9.5, we use a better sorting algorithm
642
         which makes randomisation unnecessary.  So always set
643
         the randomised bit to 'no'.  Of course, the decoder
644
         still needs to be able to handle randomised blocks
645
         so as to maintain backwards compatibility with
646
         older versions of bzip2.
647
      --*/
648
101k
      bsW(s,1,0);
649
650
101k
      bsW ( s, 24, s->origPtr );
651
101k
      generateMTFValues ( s );
652
101k
      sendMTFValues ( s );
653
101k
   }
654
655
656
   /*-- If this is the last block, add the stream trailer. --*/
657
102k
   if (is_last_block) {
658
659
867
      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
660
867
      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
661
867
      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
662
867
      bsPutUInt32 ( s, s->combinedCRC );
663
867
      if (s->verbosity >= 2)
664
0
         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
665
867
      bsFinishWrite ( s );
666
867
   }
667
102k
}
668
669
670
/*-------------------------------------------------------------*/
671
/*--- end                                        compress.c ---*/
672
/*-------------------------------------------------------------*/