~ubuntu-branches/ubuntu/wily/ruby-ferret/wily-proposed

« back to all changes in this revision

Viewing changes to ext/BZLIB_compress.c

  • Committer: Package Import Robot
  • Author(s): Antonio Terceiro
  • Date: 2015-07-14 18:35:31 UTC
  • mfrom: (1.1.3)
  • Revision ID: package-import@ubuntu.com-20150714183531-364jc4pemywyi4cz
Tags: 0.11.8.6-1
* New upstream release
  - ported to ruby2.2
* debian/copyright: add Files-Excluded to remove embedded copy of bzlib
* debian/rules: stop removing embedded copy fo bzlib which won't exist
  anymore (Closes: #743909)

Show diffs side-by-side

added added

removed removed

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