1 2 /*-------------------------------------------------------------*/ 3 /*--- Compression machinery (not incl block sorting) ---*/ 4 /*--- compress.c ---*/ 5 /*-------------------------------------------------------------*/ 6 7 /*-- 8 This file is a part of bzip2 and/or libbzip2, a program and 9 library for lossless, block-sorting data compression. 10 11 Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 12 13 Redistribution and use in source and binary forms, with or without 14 modification, are permitted provided that the following conditions 15 are met: 16 17 1. Redistributions of source code must retain the above copyright 18 notice, this list of conditions and the following disclaimer. 19 20 2. The origin of this software must not be misrepresented; you must 21 not claim that you wrote the original software. If you use this 22 software in a product, an acknowledgment in the product 23 documentation would be appreciated but is not required. 24 25 3. Altered source versions must be plainly marked as such, and must 26 not be misrepresented as being the original software. 27 28 4. The name of the author may not be used to endorse or promote 29 products derived from this software without specific prior written 30 permission. 31 32 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 33 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 34 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 36 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 38 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 40 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 41 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 42 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 44 Julian Seward, Cambridge, UK. 45 jseward (at) acm.org 46 bzip2/libbzip2 version 1.0.6 of 6 September 2010 47 Copyright (C) 1996-2010 Julian Seward <jseward (at) bzip.org> 48 49 This program is based on (at least) the work of: 50 Mike Burrows 51 David Wheeler 52 Peter Fenwick 53 Alistair Moffat 54 Radford Neal 55 Ian H. Witten 56 Robert Sedgewick 57 Jon L. Bentley 58 59 For more information on these sources, see the manual. 60 --*/ 61 62 /* CHANGES 63 0.9.0 -- original version. 64 0.9.0a/b -- no changes in this file. 65 0.9.0c -- changed setting of nGroups in sendMTFValues() 66 so as to do a bit better on small files 67 */ 68 69 #include "bzlib_private.h" 70 #include <compiler.h> 71 72 /*---------------------------------------------------*/ 73 /*--- Bit stream I/O ---*/ 74 /*---------------------------------------------------*/ 75 76 /*---------------------------------------------------*/ 77 void BZ2_bsInitWrite ( EState* s ) 78 { 79 s->bsLive = 0; 80 s->bsBuff = 0; 81 } 82 83 84 /*---------------------------------------------------*/ 85 static 86 void bsFinishWrite ( EState* s ) 87 { 88 while (s->bsLive > 0) { 89 s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); 90 s->numZ++; 91 s->bsBuff <<= 8; 92 s->bsLive -= 8; 93 } 94 } 95 96 97 /*---------------------------------------------------*/ 98 #define bsNEEDW(nz) \ 99 { \ 100 while (s->bsLive >= 8) { \ 101 s->zbits[s->numZ] \ 102 = (UChar)(s->bsBuff >> 24); \ 103 s->numZ++; \ 104 s->bsBuff <<= 8; \ 105 s->bsLive -= 8; \ 106 } \ 107 } 108 109 110 /*---------------------------------------------------*/ 111 static 112 __inline__ 113 void bsW ( EState* s, Int32 n, UInt32 v ) 114 { 115 bsNEEDW ( n ); 116 s->bsBuff |= (v << (32 - s->bsLive - n)); 117 s->bsLive += n; 118 } 119 120 121 /*---------------------------------------------------*/ 122 static 123 void bsPutUInt32 ( EState* s, UInt32 u ) 124 { 125 bsW ( s, 8, (u >> 24) & 0xffL ); 126 bsW ( s, 8, (u >> 16) & 0xffL ); 127 bsW ( s, 8, (u >> 8) & 0xffL ); 128 bsW ( s, 8, u & 0xffL ); 129 } 130 131 132 /*---------------------------------------------------*/ 133 static 134 void bsPutUChar ( EState* s, UChar c ) 135 { 136 bsW( s, 8, (UInt32)c ); 137 } 138 139 140 /*---------------------------------------------------*/ 141 /*--- The back end proper ---*/ 142 /*---------------------------------------------------*/ 143 144 /*---------------------------------------------------*/ 145 static 146 void makeMaps_e ( EState* s ) 147 { 148 Int32 i; 149 s->nInUse = 0; 150 for (i = 0; i < 256; i++) 151 if (s->inUse[i]) { 152 s->unseqToSeq[i] = s->nInUse; 153 s->nInUse++; 154 } 155 } 156 157 158 /*---------------------------------------------------*/ 159 static 160 void generateMTFValues ( EState* s ) 161 { 162 UChar yy[256]; 163 Int32 i, j; 164 Int32 zPend; 165 Int32 wr; 166 Int32 EOB; 167 168 /* 169 After sorting (eg, here), 170 s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, 171 and 172 ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 173 holds the original block data. 174 175 The first thing to do is generate the MTF values, 176 and put them in 177 ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. 178 Because there are strictly fewer or equal MTF values 179 than block values, ptr values in this area are overwritten 180 with MTF values only when they are no longer needed. 181 182 The final compressed bitstream is generated into the 183 area starting at 184 (UChar*) (&((UChar*)s->arr2)[s->nblock]) 185 186 These storage aliases are set up in bzCompressInit(), 187 except for the last one, which is arranged in 188 compressBlock(). 189 */ 190 UInt32* ptr = s->ptr; 191 UChar* block = s->block; 192 UInt16* mtfv = s->mtfv; 193 194 makeMaps_e ( s ); 195 EOB = s->nInUse+1; 196 197 for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; 198 199 wr = 0; 200 zPend = 0; 201 for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; 202 203 for (i = 0; i < s->nblock; i++) { 204 UChar ll_i; 205 AssertD ( wr <= i, "generateMTFValues(1)" ); 206 j = ptr[i]-1; if (j < 0) j += s->nblock; 207 ll_i = s->unseqToSeq[block[j]]; 208 AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); 209 210 if (yy[0] == ll_i) { 211 zPend++; 212 } else { 213 214 if (zPend > 0) { 215 zPend--; 216 while (True) { 217 if (zPend & 1) { 218 mtfv[wr] = BZ_RUNB; wr++; 219 s->mtfFreq[BZ_RUNB]++; 220 } else { 221 mtfv[wr] = BZ_RUNA; wr++; 222 s->mtfFreq[BZ_RUNA]++; 223 } 224 if (zPend < 2) break; 225 zPend = (zPend - 2) / 2; 226 }; 227 zPend = 0; 228 } 229 { 230 register UChar rtmp; 231 register UChar* ryy_j; 232 register UChar rll_i; 233 rtmp = yy[1]; 234 yy[1] = yy[0]; 235 ryy_j = &(yy[1]); 236 rll_i = ll_i; 237 while ( rll_i != rtmp ) { 238 register UChar rtmp2; 239 ryy_j++; 240 rtmp2 = rtmp; 241 rtmp = *ryy_j; 242 *ryy_j = rtmp2; 243 }; 244 yy[0] = rtmp; 245 j = ryy_j - &(yy[0]); 246 mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; 247 } 248 249 } 250 } 251 252 if (zPend > 0) { 253 zPend--; 254 while (True) { 255 if (zPend & 1) { 256 mtfv[wr] = BZ_RUNB; wr++; 257 s->mtfFreq[BZ_RUNB]++; 258 } else { 259 mtfv[wr] = BZ_RUNA; wr++; 260 s->mtfFreq[BZ_RUNA]++; 261 } 262 if (zPend < 2) break; 263 zPend = (zPend - 2) / 2; 264 }; 265 zPend = 0; 266 } 267 268 mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; 269 270 s->nMTF = wr; 271 } 272 273 274 /*---------------------------------------------------*/ 275 #define BZ_LESSER_ICOST 0 276 #define BZ_GREATER_ICOST 15 277 278 static 279 void sendMTFValues ( EState* s ) 280 { 281 Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; 282 Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; 283 Int32 nGroups; 284 Int32 nBytes __maybe_unused; 285 286 /*-- 287 UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 288 is a global since the decoder also needs it. 289 290 Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 291 Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 292 are also globals only used in this proc. 293 Made global to keep stack frame size small. 294 --*/ 295 296 297 UInt16 cost[BZ_N_GROUPS]; 298 Int32 fave[BZ_N_GROUPS]; 299 300 UInt16* mtfv = s->mtfv; 301 302 if (s->verbosity >= 3) 303 VPrintf3( " %d in block, %d after MTF & 1-2 coding, " 304 "%d+2 syms in use\n", 305 s->nblock, s->nMTF, s->nInUse ); 306 307 alphaSize = s->nInUse+2; 308 for (t = 0; t < BZ_N_GROUPS; t++) 309 for (v = 0; v < alphaSize; v++) 310 s->len[t][v] = BZ_GREATER_ICOST; 311 312 /*--- Decide how many coding tables to use ---*/ 313 AssertH ( s->nMTF > 0, 3001 ); 314 if (s->nMTF < 200) nGroups = 2; else 315 if (s->nMTF < 600) nGroups = 3; else 316 if (s->nMTF < 1200) nGroups = 4; else 317 if (s->nMTF < 2400) nGroups = 5; else 318 nGroups = 6; 319 320 /*--- Generate an initial set of coding tables ---*/ 321 { 322 Int32 nPart, remF, tFreq, aFreq; 323 324 nPart = nGroups; 325 remF = s->nMTF; 326 gs = 0; 327 while (nPart > 0) { 328 tFreq = remF / nPart; 329 ge = gs-1; 330 aFreq = 0; 331 while (aFreq < tFreq && ge < alphaSize-1) { 332 ge++; 333 aFreq += s->mtfFreq[ge]; 334 } 335 336 if (ge > gs 337 && nPart != nGroups && nPart != 1 338 && ((nGroups-nPart) % 2 == 1)) { 339 aFreq -= s->mtfFreq[ge]; 340 ge--; 341 } 342 343 if (s->verbosity >= 3) 344 VPrintf5( " initial group %d, [%d .. %d], " 345 "has %d syms (%4.1f%%)\n", 346 nPart, gs, ge, aFreq, 347 (100.0 * (float)aFreq) / (float)(s->nMTF) ); 348 349 for (v = 0; v < alphaSize; v++) 350 if (v >= gs && v <= ge) 351 s->len[nPart-1][v] = BZ_LESSER_ICOST; else 352 s->len[nPart-1][v] = BZ_GREATER_ICOST; 353 354 nPart--; 355 gs = ge+1; 356 remF -= aFreq; 357 } 358 } 359 360 /*--- 361 Iterate up to BZ_N_ITERS times to improve the tables. 362 ---*/ 363 for (iter = 0; iter < BZ_N_ITERS; iter++) { 364 365 for (t = 0; t < nGroups; t++) fave[t] = 0; 366 367 for (t = 0; t < nGroups; t++) 368 for (v = 0; v < alphaSize; v++) 369 s->rfreq[t][v] = 0; 370 371 /*--- 372 Set up an auxiliary length table which is used to fast-track 373 the common case (nGroups == 6). 374 ---*/ 375 if (nGroups == 6) { 376 for (v = 0; v < alphaSize; v++) { 377 s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; 378 s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; 379 s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; 380 } 381 } 382 383 nSelectors = 0; 384 totc = 0; 385 gs = 0; 386 while (True) { 387 388 /*--- Set group start & end marks. --*/ 389 if (gs >= s->nMTF) break; 390 ge = gs + BZ_G_SIZE - 1; 391 if (ge >= s->nMTF) ge = s->nMTF-1; 392 393 /*-- 394 Calculate the cost of this group as coded 395 by each of the coding tables. 396 --*/ 397 for (t = 0; t < nGroups; t++) cost[t] = 0; 398 399 if (nGroups == 6 && 50 == ge-gs+1) { 400 /*--- fast track the common case ---*/ 401 register UInt32 cost01, cost23, cost45; 402 register UInt16 icv; 403 cost01 = cost23 = cost45 = 0; 404 405 # define BZ_ITER(nn) \ 406 icv = mtfv[gs+(nn)]; \ 407 cost01 += s->len_pack[icv][0]; \ 408 cost23 += s->len_pack[icv][1]; \ 409 cost45 += s->len_pack[icv][2]; \ 410 411 BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); 412 BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); 413 BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); 414 BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); 415 BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); 416 BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); 417 BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); 418 BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); 419 BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); 420 BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); 421 422 # undef BZ_ITER 423 424 cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; 425 cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; 426 cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; 427 428 } else { 429 /*--- slow version which correctly handles all situations ---*/ 430 for (i = gs; i <= ge; i++) { 431 UInt16 icv = mtfv[i]; 432 for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; 433 } 434 } 435 436 /*-- 437 Find the coding table which is best for this group, 438 and record its identity in the selector table. 439 --*/ 440 bc = 999999999; bt = -1; 441 for (t = 0; t < nGroups; t++) 442 if (cost[t] < bc) { bc = cost[t]; bt = t; }; 443 totc += bc; 444 fave[bt]++; 445 s->selector[nSelectors] = bt; 446 nSelectors++; 447 448 /*-- 449 Increment the symbol frequencies for the selected table. 450 --*/ 451 if (nGroups == 6 && 50 == ge-gs+1) { 452 /*--- fast track the common case ---*/ 453 454 # define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ 455 456 BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); 457 BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); 458 BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); 459 BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); 460 BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); 461 BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); 462 BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); 463 BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); 464 BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); 465 BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); 466 467 # undef BZ_ITUR 468 469 } else { 470 /*--- slow version which correctly handles all situations ---*/ 471 for (i = gs; i <= ge; i++) 472 s->rfreq[bt][ mtfv[i] ]++; 473 } 474 475 gs = ge+1; 476 } 477 if (s->verbosity >= 3) { 478 VPrintf2 ( " pass %d: size is %d, grp uses are ", 479 iter+1, totc/8 ); 480 for (t = 0; t < nGroups; t++) 481 VPrintf1 ( "%d ", fave[t] ); 482 VPrintf0 ( "\n" ); 483 } 484 485 /*-- 486 Recompute the tables based on the accumulated frequencies. 487 --*/ 488 /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See 489 comment in huffman.c for details. */ 490 for (t = 0; t < nGroups; t++) 491 BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 492 alphaSize, 17 /*20*/ ); 493 } 494 495 496 AssertH( nGroups < 8, 3002 ); 497 AssertH( nSelectors < 32768 && 498 nSelectors <= (2 + (900000 / BZ_G_SIZE)), 499 3003 ); 500 501 502 /*--- Compute MTF values for the selectors. ---*/ 503 { 504 UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; 505 for (i = 0; i < nGroups; i++) pos[i] = i; 506 for (i = 0; i < nSelectors; i++) { 507 ll_i = s->selector[i]; 508 j = 0; 509 tmp = pos[j]; 510 while ( ll_i != tmp ) { 511 j++; 512 tmp2 = tmp; 513 tmp = pos[j]; 514 pos[j] = tmp2; 515 }; 516 pos[0] = tmp; 517 s->selectorMtf[i] = j; 518 } 519 }; 520 521 /*--- Assign actual codes for the tables. --*/ 522 for (t = 0; t < nGroups; t++) { 523 minLen = 32; 524 maxLen = 0; 525 for (i = 0; i < alphaSize; i++) { 526 if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; 527 if (s->len[t][i] < minLen) minLen = s->len[t][i]; 528 } 529 AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); 530 AssertH ( !(minLen < 1), 3005 ); 531 BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 532 minLen, maxLen, alphaSize ); 533 } 534 535 /*--- Transmit the mapping table. ---*/ 536 { 537 Bool inUse16[16]; 538 for (i = 0; i < 16; i++) { 539 inUse16[i] = False; 540 for (j = 0; j < 16; j++) 541 if (s->inUse[i * 16 + j]) inUse16[i] = True; 542 } 543 544 nBytes = s->numZ; 545 for (i = 0; i < 16; i++) 546 if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); 547 548 for (i = 0; i < 16; i++) 549 if (inUse16[i]) 550 for (j = 0; j < 16; j++) { 551 if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); 552 } 553 554 if (s->verbosity >= 3) 555 VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); 556 } 557 558 /*--- Now the selectors. ---*/ 559 nBytes = s->numZ; 560 bsW ( s, 3, nGroups ); 561 bsW ( s, 15, nSelectors ); 562 for (i = 0; i < nSelectors; i++) { 563 for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); 564 bsW(s,1,0); 565 } 566 if (s->verbosity >= 3) 567 VPrintf1( "selectors %d, ", s->numZ-nBytes ); 568 569 /*--- Now the coding tables. ---*/ 570 nBytes = s->numZ; 571 572 for (t = 0; t < nGroups; t++) { 573 Int32 curr = s->len[t][0]; 574 bsW ( s, 5, curr ); 575 for (i = 0; i < alphaSize; i++) { 576 while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; 577 while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; 578 bsW ( s, 1, 0 ); 579 } 580 } 581 582 if (s->verbosity >= 3) 583 VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); 584 585 /*--- And finally, the block data proper ---*/ 586 nBytes = s->numZ; 587 selCtr = 0; 588 gs = 0; 589 while (True) { 590 if (gs >= s->nMTF) break; 591 ge = gs + BZ_G_SIZE - 1; 592 if (ge >= s->nMTF) ge = s->nMTF-1; 593 AssertH ( s->selector[selCtr] < nGroups, 3006 ); 594 595 if (nGroups == 6 && 50 == ge-gs+1) { 596 /*--- fast track the common case ---*/ 597 UInt16 mtfv_i; 598 UChar* s_len_sel_selCtr 599 = &(s->len[s->selector[selCtr]][0]); 600 Int32* s_code_sel_selCtr 601 = &(s->code[s->selector[selCtr]][0]); 602 603 # define BZ_ITAH(nn) \ 604 mtfv_i = mtfv[gs+(nn)]; \ 605 bsW ( s, \ 606 s_len_sel_selCtr[mtfv_i], \ 607 s_code_sel_selCtr[mtfv_i] ) 608 609 BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); 610 BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); 611 BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); 612 BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); 613 BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); 614 BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); 615 BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); 616 BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); 617 BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); 618 BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); 619 620 # undef BZ_ITAH 621 622 } else { 623 /*--- slow version which correctly handles all situations ---*/ 624 for (i = gs; i <= ge; i++) { 625 bsW ( s, 626 s->len [s->selector[selCtr]] [mtfv[i]], 627 s->code [s->selector[selCtr]] [mtfv[i]] ); 628 } 629 } 630 631 632 gs = ge+1; 633 selCtr++; 634 } 635 AssertH( selCtr == nSelectors, 3007 ); 636 637 if (s->verbosity >= 3) 638 VPrintf1( "codes %d\n", s->numZ-nBytes ); 639 } 640 641 642 /*---------------------------------------------------*/ 643 void BZ2_compressBlock ( EState* s, Bool is_last_block ) 644 { 645 if (s->nblock > 0) { 646 647 BZ_FINALISE_CRC ( s->blockCRC ); 648 s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); 649 s->combinedCRC ^= s->blockCRC; 650 if (s->blockNo > 1) s->numZ = 0; 651 652 if (s->verbosity >= 2) 653 VPrintf4( " block %d: crc = 0x%08x, " 654 "combined CRC = 0x%08x, size = %d\n", 655 s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); 656 657 BZ2_blockSort ( s ); 658 } 659 660 s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); 661 662 /*-- If this is the first block, create the stream header. --*/ 663 if (s->blockNo == 1) { 664 BZ2_bsInitWrite ( s ); 665 bsPutUChar ( s, BZ_HDR_B ); 666 bsPutUChar ( s, BZ_HDR_Z ); 667 bsPutUChar ( s, BZ_HDR_h ); 668 bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); 669 } 670 671 if (s->nblock > 0) { 672 673 bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); 674 bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); 675 bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); 676 677 /*-- Now the block's CRC, so it is in a known place. --*/ 678 bsPutUInt32 ( s, s->blockCRC ); 679 680 /*-- 681 Now a single bit indicating (non-)randomisation. 682 As of version 0.9.5, we use a better sorting algorithm 683 which makes randomisation unnecessary. So always set 684 the randomised bit to 'no'. Of course, the decoder 685 still needs to be able to handle randomised blocks 686 so as to maintain backwards compatibility with 687 older versions of bzip2. 688 --*/ 689 bsW(s,1,0); 690 691 bsW ( s, 24, s->origPtr ); 692 generateMTFValues ( s ); 693 sendMTFValues ( s ); 694 } 695 696 697 /*-- If this is the last block, add the stream trailer. --*/ 698 if (is_last_block) { 699 700 bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); 701 bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); 702 bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); 703 bsPutUInt32 ( s, s->combinedCRC ); 704 if (s->verbosity >= 2) 705 VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC ); 706 bsFinishWrite ( s ); 707 } 708 } 709 710 711 /*-------------------------------------------------------------*/ 712 /*--- end compress.c ---*/ 713 /*-------------------------------------------------------------*/ 714