Home | History | Annotate | Download | only in bzip2
      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 (at) 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 /*-------------------------------------------------------------*/
    673