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