Coverage Report

Created: 2026-03-12 06:35

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