Coverage Report

Created: 2026-11-12 06:35

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