Coverage Report

Created: 2025-07-23 08:18

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