1*ca3e8d88SDave Plauger 2*ca3e8d88SDave Plauger /*-------------------------------------------------------------*/ 3*ca3e8d88SDave Plauger /*--- Decompression machinery ---*/ 4*ca3e8d88SDave Plauger /*--- decompress.c ---*/ 5*ca3e8d88SDave Plauger /*-------------------------------------------------------------*/ 6*ca3e8d88SDave Plauger 7*ca3e8d88SDave Plauger /* ------------------------------------------------------------------ 8*ca3e8d88SDave Plauger This file is part of bzip2/libbzip2, a program and library for 9*ca3e8d88SDave Plauger lossless, block-sorting data compression. 10*ca3e8d88SDave Plauger 11*ca3e8d88SDave Plauger bzip2/libbzip2 version 1.0.5 of 10 December 2007 12*ca3e8d88SDave Plauger Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org> 13*ca3e8d88SDave Plauger 14*ca3e8d88SDave Plauger Please read the WARNING, DISCLAIMER and PATENTS sections in the 15*ca3e8d88SDave Plauger README file. 16*ca3e8d88SDave Plauger 17*ca3e8d88SDave Plauger This program is released under the terms of the license contained 18*ca3e8d88SDave Plauger in the file LICENSE. 19*ca3e8d88SDave Plauger ------------------------------------------------------------------ */ 20*ca3e8d88SDave Plauger 21*ca3e8d88SDave Plauger 22*ca3e8d88SDave Plauger #include "bzlib_private.h" 23*ca3e8d88SDave Plauger 24*ca3e8d88SDave Plauger 25*ca3e8d88SDave Plauger /*---------------------------------------------------*/ 26*ca3e8d88SDave Plauger static 27*ca3e8d88SDave Plauger void makeMaps_d ( DState* s ) 28*ca3e8d88SDave Plauger { 29*ca3e8d88SDave Plauger Int32 i; 30*ca3e8d88SDave Plauger s->nInUse = 0; 31*ca3e8d88SDave Plauger for (i = 0; i < 256; i++) 32*ca3e8d88SDave Plauger if (s->inUse[i]) { 33*ca3e8d88SDave Plauger s->seqToUnseq[s->nInUse] = i; 34*ca3e8d88SDave Plauger s->nInUse++; 35*ca3e8d88SDave Plauger } 36*ca3e8d88SDave Plauger } 37*ca3e8d88SDave Plauger 38*ca3e8d88SDave Plauger 39*ca3e8d88SDave Plauger /*---------------------------------------------------*/ 40*ca3e8d88SDave Plauger #define RETURN(rrr) \ 41*ca3e8d88SDave Plauger { retVal = rrr; goto save_state_and_return; } 42*ca3e8d88SDave Plauger 43*ca3e8d88SDave Plauger #define GET_BITS(lll,vvv,nnn) \ 44*ca3e8d88SDave Plauger case lll: s->state = lll; \ 45*ca3e8d88SDave Plauger while (True) { \ 46*ca3e8d88SDave Plauger if (s->bsLive >= nnn) { \ 47*ca3e8d88SDave Plauger UInt32 v; \ 48*ca3e8d88SDave Plauger v = (s->bsBuff >> \ 49*ca3e8d88SDave Plauger (s->bsLive-nnn)) & ((1 << nnn)-1); \ 50*ca3e8d88SDave Plauger s->bsLive -= nnn; \ 51*ca3e8d88SDave Plauger vvv = v; \ 52*ca3e8d88SDave Plauger break; \ 53*ca3e8d88SDave Plauger } \ 54*ca3e8d88SDave Plauger if (s->strm->avail_in == 0) RETURN(BZ_OK); \ 55*ca3e8d88SDave Plauger s->bsBuff \ 56*ca3e8d88SDave Plauger = (s->bsBuff << 8) | \ 57*ca3e8d88SDave Plauger ((UInt32) \ 58*ca3e8d88SDave Plauger (*((UChar*)(s->strm->next_in)))); \ 59*ca3e8d88SDave Plauger s->bsLive += 8; \ 60*ca3e8d88SDave Plauger s->strm->next_in++; \ 61*ca3e8d88SDave Plauger s->strm->avail_in--; \ 62*ca3e8d88SDave Plauger s->strm->total_in_lo32++; \ 63*ca3e8d88SDave Plauger if (s->strm->total_in_lo32 == 0) \ 64*ca3e8d88SDave Plauger s->strm->total_in_hi32++; \ 65*ca3e8d88SDave Plauger } 66*ca3e8d88SDave Plauger 67*ca3e8d88SDave Plauger #define GET_UCHAR(lll,uuu) \ 68*ca3e8d88SDave Plauger GET_BITS(lll,uuu,8) 69*ca3e8d88SDave Plauger 70*ca3e8d88SDave Plauger #define GET_BIT(lll,uuu) \ 71*ca3e8d88SDave Plauger GET_BITS(lll,uuu,1) 72*ca3e8d88SDave Plauger 73*ca3e8d88SDave Plauger /*---------------------------------------------------*/ 74*ca3e8d88SDave Plauger #define GET_MTF_VAL(label1,label2,lval) \ 75*ca3e8d88SDave Plauger { \ 76*ca3e8d88SDave Plauger if (groupPos == 0) { \ 77*ca3e8d88SDave Plauger groupNo++; \ 78*ca3e8d88SDave Plauger if (groupNo >= nSelectors) \ 79*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR); \ 80*ca3e8d88SDave Plauger groupPos = BZ_G_SIZE; \ 81*ca3e8d88SDave Plauger gSel = s->selector[groupNo]; \ 82*ca3e8d88SDave Plauger gMinlen = s->minLens[gSel]; \ 83*ca3e8d88SDave Plauger gLimit = &(s->limit[gSel][0]); \ 84*ca3e8d88SDave Plauger gPerm = &(s->perm[gSel][0]); \ 85*ca3e8d88SDave Plauger gBase = &(s->base[gSel][0]); \ 86*ca3e8d88SDave Plauger } \ 87*ca3e8d88SDave Plauger groupPos--; \ 88*ca3e8d88SDave Plauger zn = gMinlen; \ 89*ca3e8d88SDave Plauger GET_BITS(label1, zvec, zn); \ 90*ca3e8d88SDave Plauger while (1) { \ 91*ca3e8d88SDave Plauger if (zn > 20 /* the longest code */) \ 92*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR); \ 93*ca3e8d88SDave Plauger if (zvec <= gLimit[zn]) break; \ 94*ca3e8d88SDave Plauger zn++; \ 95*ca3e8d88SDave Plauger GET_BIT(label2, zj); \ 96*ca3e8d88SDave Plauger zvec = (zvec << 1) | zj; \ 97*ca3e8d88SDave Plauger }; \ 98*ca3e8d88SDave Plauger if (zvec - gBase[zn] < 0 \ 99*ca3e8d88SDave Plauger || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ 100*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR); \ 101*ca3e8d88SDave Plauger lval = gPerm[zvec - gBase[zn]]; \ 102*ca3e8d88SDave Plauger } 103*ca3e8d88SDave Plauger 104*ca3e8d88SDave Plauger 105*ca3e8d88SDave Plauger /*---------------------------------------------------*/ 106*ca3e8d88SDave Plauger Int32 BZ2_decompress ( DState* s ) 107*ca3e8d88SDave Plauger { 108*ca3e8d88SDave Plauger UChar uc; 109*ca3e8d88SDave Plauger Int32 retVal; 110*ca3e8d88SDave Plauger Int32 minLen, maxLen; 111*ca3e8d88SDave Plauger bz_stream* strm = s->strm; 112*ca3e8d88SDave Plauger 113*ca3e8d88SDave Plauger /* stuff that needs to be saved/restored */ 114*ca3e8d88SDave Plauger Int32 i; 115*ca3e8d88SDave Plauger Int32 j; 116*ca3e8d88SDave Plauger Int32 t; 117*ca3e8d88SDave Plauger Int32 alphaSize; 118*ca3e8d88SDave Plauger Int32 nGroups; 119*ca3e8d88SDave Plauger Int32 nSelectors; 120*ca3e8d88SDave Plauger Int32 EOB; 121*ca3e8d88SDave Plauger Int32 groupNo; 122*ca3e8d88SDave Plauger Int32 groupPos; 123*ca3e8d88SDave Plauger Int32 nextSym; 124*ca3e8d88SDave Plauger Int32 nblockMAX; 125*ca3e8d88SDave Plauger Int32 nblock; 126*ca3e8d88SDave Plauger Int32 es; 127*ca3e8d88SDave Plauger Int32 N; 128*ca3e8d88SDave Plauger Int32 curr; 129*ca3e8d88SDave Plauger Int32 zt; 130*ca3e8d88SDave Plauger Int32 zn; 131*ca3e8d88SDave Plauger Int32 zvec; 132*ca3e8d88SDave Plauger Int32 zj; 133*ca3e8d88SDave Plauger Int32 gSel; 134*ca3e8d88SDave Plauger Int32 gMinlen; 135*ca3e8d88SDave Plauger Int32* gLimit; 136*ca3e8d88SDave Plauger Int32* gBase; 137*ca3e8d88SDave Plauger Int32* gPerm; 138*ca3e8d88SDave Plauger 139*ca3e8d88SDave Plauger if (s->state == BZ_X_MAGIC_1) { 140*ca3e8d88SDave Plauger /*initialise the save area*/ 141*ca3e8d88SDave Plauger s->save_i = 0; 142*ca3e8d88SDave Plauger s->save_j = 0; 143*ca3e8d88SDave Plauger s->save_t = 0; 144*ca3e8d88SDave Plauger s->save_alphaSize = 0; 145*ca3e8d88SDave Plauger s->save_nGroups = 0; 146*ca3e8d88SDave Plauger s->save_nSelectors = 0; 147*ca3e8d88SDave Plauger s->save_EOB = 0; 148*ca3e8d88SDave Plauger s->save_groupNo = 0; 149*ca3e8d88SDave Plauger s->save_groupPos = 0; 150*ca3e8d88SDave Plauger s->save_nextSym = 0; 151*ca3e8d88SDave Plauger s->save_nblockMAX = 0; 152*ca3e8d88SDave Plauger s->save_nblock = 0; 153*ca3e8d88SDave Plauger s->save_es = 0; 154*ca3e8d88SDave Plauger s->save_N = 0; 155*ca3e8d88SDave Plauger s->save_curr = 0; 156*ca3e8d88SDave Plauger s->save_zt = 0; 157*ca3e8d88SDave Plauger s->save_zn = 0; 158*ca3e8d88SDave Plauger s->save_zvec = 0; 159*ca3e8d88SDave Plauger s->save_zj = 0; 160*ca3e8d88SDave Plauger s->save_gSel = 0; 161*ca3e8d88SDave Plauger s->save_gMinlen = 0; 162*ca3e8d88SDave Plauger s->save_gLimit = NULL; 163*ca3e8d88SDave Plauger s->save_gBase = NULL; 164*ca3e8d88SDave Plauger s->save_gPerm = NULL; 165*ca3e8d88SDave Plauger } 166*ca3e8d88SDave Plauger 167*ca3e8d88SDave Plauger /*restore from the save area*/ 168*ca3e8d88SDave Plauger i = s->save_i; 169*ca3e8d88SDave Plauger j = s->save_j; 170*ca3e8d88SDave Plauger t = s->save_t; 171*ca3e8d88SDave Plauger alphaSize = s->save_alphaSize; 172*ca3e8d88SDave Plauger nGroups = s->save_nGroups; 173*ca3e8d88SDave Plauger nSelectors = s->save_nSelectors; 174*ca3e8d88SDave Plauger EOB = s->save_EOB; 175*ca3e8d88SDave Plauger groupNo = s->save_groupNo; 176*ca3e8d88SDave Plauger groupPos = s->save_groupPos; 177*ca3e8d88SDave Plauger nextSym = s->save_nextSym; 178*ca3e8d88SDave Plauger nblockMAX = s->save_nblockMAX; 179*ca3e8d88SDave Plauger nblock = s->save_nblock; 180*ca3e8d88SDave Plauger es = s->save_es; 181*ca3e8d88SDave Plauger N = s->save_N; 182*ca3e8d88SDave Plauger curr = s->save_curr; 183*ca3e8d88SDave Plauger zt = s->save_zt; 184*ca3e8d88SDave Plauger zn = s->save_zn; 185*ca3e8d88SDave Plauger zvec = s->save_zvec; 186*ca3e8d88SDave Plauger zj = s->save_zj; 187*ca3e8d88SDave Plauger gSel = s->save_gSel; 188*ca3e8d88SDave Plauger gMinlen = s->save_gMinlen; 189*ca3e8d88SDave Plauger gLimit = s->save_gLimit; 190*ca3e8d88SDave Plauger gBase = s->save_gBase; 191*ca3e8d88SDave Plauger gPerm = s->save_gPerm; 192*ca3e8d88SDave Plauger 193*ca3e8d88SDave Plauger retVal = BZ_OK; 194*ca3e8d88SDave Plauger 195*ca3e8d88SDave Plauger switch (s->state) { 196*ca3e8d88SDave Plauger 197*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_MAGIC_1, uc); 198*ca3e8d88SDave Plauger if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); 199*ca3e8d88SDave Plauger 200*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_MAGIC_2, uc); 201*ca3e8d88SDave Plauger if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); 202*ca3e8d88SDave Plauger 203*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_MAGIC_3, uc) 204*ca3e8d88SDave Plauger if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); 205*ca3e8d88SDave Plauger 206*ca3e8d88SDave Plauger GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) 207*ca3e8d88SDave Plauger if (s->blockSize100k < (BZ_HDR_0 + 1) || 208*ca3e8d88SDave Plauger s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); 209*ca3e8d88SDave Plauger s->blockSize100k -= BZ_HDR_0; 210*ca3e8d88SDave Plauger 211*ca3e8d88SDave Plauger if (s->smallDecompress) { 212*ca3e8d88SDave Plauger s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); 213*ca3e8d88SDave Plauger s->ll4 = BZALLOC( 214*ca3e8d88SDave Plauger ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 215*ca3e8d88SDave Plauger ); 216*ca3e8d88SDave Plauger if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); 217*ca3e8d88SDave Plauger } else { 218*ca3e8d88SDave Plauger s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); 219*ca3e8d88SDave Plauger if (s->tt == NULL) RETURN(BZ_MEM_ERROR); 220*ca3e8d88SDave Plauger } 221*ca3e8d88SDave Plauger 222*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BLKHDR_1, uc); 223*ca3e8d88SDave Plauger 224*ca3e8d88SDave Plauger if (uc == 0x17) goto endhdr_2; 225*ca3e8d88SDave Plauger if (uc != 0x31) RETURN(BZ_DATA_ERROR); 226*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BLKHDR_2, uc); 227*ca3e8d88SDave Plauger if (uc != 0x41) RETURN(BZ_DATA_ERROR); 228*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BLKHDR_3, uc); 229*ca3e8d88SDave Plauger if (uc != 0x59) RETURN(BZ_DATA_ERROR); 230*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BLKHDR_4, uc); 231*ca3e8d88SDave Plauger if (uc != 0x26) RETURN(BZ_DATA_ERROR); 232*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BLKHDR_5, uc); 233*ca3e8d88SDave Plauger if (uc != 0x53) RETURN(BZ_DATA_ERROR); 234*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BLKHDR_6, uc); 235*ca3e8d88SDave Plauger if (uc != 0x59) RETURN(BZ_DATA_ERROR); 236*ca3e8d88SDave Plauger 237*ca3e8d88SDave Plauger s->currBlockNo++; 238*ca3e8d88SDave Plauger if (s->verbosity >= 2) 239*ca3e8d88SDave Plauger VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); 240*ca3e8d88SDave Plauger 241*ca3e8d88SDave Plauger s->storedBlockCRC = 0; 242*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BCRC_1, uc); 243*ca3e8d88SDave Plauger s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 244*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BCRC_2, uc); 245*ca3e8d88SDave Plauger s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 246*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BCRC_3, uc); 247*ca3e8d88SDave Plauger s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 248*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_BCRC_4, uc); 249*ca3e8d88SDave Plauger s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 250*ca3e8d88SDave Plauger 251*ca3e8d88SDave Plauger GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); 252*ca3e8d88SDave Plauger 253*ca3e8d88SDave Plauger s->origPtr = 0; 254*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ORIGPTR_1, uc); 255*ca3e8d88SDave Plauger s->origPtr = (s->origPtr << 8) | ((Int32)uc); 256*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ORIGPTR_2, uc); 257*ca3e8d88SDave Plauger s->origPtr = (s->origPtr << 8) | ((Int32)uc); 258*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ORIGPTR_3, uc); 259*ca3e8d88SDave Plauger s->origPtr = (s->origPtr << 8) | ((Int32)uc); 260*ca3e8d88SDave Plauger 261*ca3e8d88SDave Plauger if (s->origPtr < 0) 262*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR); 263*ca3e8d88SDave Plauger if (s->origPtr > 10 + 100000*s->blockSize100k) 264*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR); 265*ca3e8d88SDave Plauger 266*ca3e8d88SDave Plauger /*--- Receive the mapping table ---*/ 267*ca3e8d88SDave Plauger for (i = 0; i < 16; i++) { 268*ca3e8d88SDave Plauger GET_BIT(BZ_X_MAPPING_1, uc); 269*ca3e8d88SDave Plauger if (uc == 1) 270*ca3e8d88SDave Plauger s->inUse16[i] = True; else 271*ca3e8d88SDave Plauger s->inUse16[i] = False; 272*ca3e8d88SDave Plauger } 273*ca3e8d88SDave Plauger 274*ca3e8d88SDave Plauger for (i = 0; i < 256; i++) s->inUse[i] = False; 275*ca3e8d88SDave Plauger 276*ca3e8d88SDave Plauger for (i = 0; i < 16; i++) 277*ca3e8d88SDave Plauger if (s->inUse16[i]) 278*ca3e8d88SDave Plauger for (j = 0; j < 16; j++) { 279*ca3e8d88SDave Plauger GET_BIT(BZ_X_MAPPING_2, uc); 280*ca3e8d88SDave Plauger if (uc == 1) s->inUse[i * 16 + j] = True; 281*ca3e8d88SDave Plauger } 282*ca3e8d88SDave Plauger makeMaps_d ( s ); 283*ca3e8d88SDave Plauger if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); 284*ca3e8d88SDave Plauger alphaSize = s->nInUse+2; 285*ca3e8d88SDave Plauger 286*ca3e8d88SDave Plauger /*--- Now the selectors ---*/ 287*ca3e8d88SDave Plauger GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); 288*ca3e8d88SDave Plauger if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); 289*ca3e8d88SDave Plauger GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); 290*ca3e8d88SDave Plauger if (nSelectors < 1) RETURN(BZ_DATA_ERROR); 291*ca3e8d88SDave Plauger for (i = 0; i < nSelectors; i++) { 292*ca3e8d88SDave Plauger j = 0; 293*ca3e8d88SDave Plauger while (True) { 294*ca3e8d88SDave Plauger GET_BIT(BZ_X_SELECTOR_3, uc); 295*ca3e8d88SDave Plauger if (uc == 0) break; 296*ca3e8d88SDave Plauger j++; 297*ca3e8d88SDave Plauger if (j >= nGroups) RETURN(BZ_DATA_ERROR); 298*ca3e8d88SDave Plauger } 299*ca3e8d88SDave Plauger s->selectorMtf[i] = j; 300*ca3e8d88SDave Plauger } 301*ca3e8d88SDave Plauger 302*ca3e8d88SDave Plauger /*--- Undo the MTF values for the selectors. ---*/ 303*ca3e8d88SDave Plauger { 304*ca3e8d88SDave Plauger UChar pos[BZ_N_GROUPS], tmp, v; 305*ca3e8d88SDave Plauger for (v = 0; v < nGroups; v++) pos[v] = v; 306*ca3e8d88SDave Plauger 307*ca3e8d88SDave Plauger for (i = 0; i < nSelectors; i++) { 308*ca3e8d88SDave Plauger v = s->selectorMtf[i]; 309*ca3e8d88SDave Plauger tmp = pos[v]; 310*ca3e8d88SDave Plauger while (v > 0) { pos[v] = pos[v-1]; v--; } 311*ca3e8d88SDave Plauger pos[0] = tmp; 312*ca3e8d88SDave Plauger s->selector[i] = tmp; 313*ca3e8d88SDave Plauger } 314*ca3e8d88SDave Plauger } 315*ca3e8d88SDave Plauger 316*ca3e8d88SDave Plauger /*--- Now the coding tables ---*/ 317*ca3e8d88SDave Plauger for (t = 0; t < nGroups; t++) { 318*ca3e8d88SDave Plauger GET_BITS(BZ_X_CODING_1, curr, 5); 319*ca3e8d88SDave Plauger for (i = 0; i < alphaSize; i++) { 320*ca3e8d88SDave Plauger while (True) { 321*ca3e8d88SDave Plauger if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); 322*ca3e8d88SDave Plauger GET_BIT(BZ_X_CODING_2, uc); 323*ca3e8d88SDave Plauger if (uc == 0) break; 324*ca3e8d88SDave Plauger GET_BIT(BZ_X_CODING_3, uc); 325*ca3e8d88SDave Plauger if (uc == 0) curr++; else curr--; 326*ca3e8d88SDave Plauger } 327*ca3e8d88SDave Plauger s->len[t][i] = curr; 328*ca3e8d88SDave Plauger } 329*ca3e8d88SDave Plauger } 330*ca3e8d88SDave Plauger 331*ca3e8d88SDave Plauger /*--- Create the Huffman decoding tables ---*/ 332*ca3e8d88SDave Plauger for (t = 0; t < nGroups; t++) { 333*ca3e8d88SDave Plauger minLen = 32; 334*ca3e8d88SDave Plauger maxLen = 0; 335*ca3e8d88SDave Plauger for (i = 0; i < alphaSize; i++) { 336*ca3e8d88SDave Plauger if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; 337*ca3e8d88SDave Plauger if (s->len[t][i] < minLen) minLen = s->len[t][i]; 338*ca3e8d88SDave Plauger } 339*ca3e8d88SDave Plauger BZ2_hbCreateDecodeTables ( 340*ca3e8d88SDave Plauger &(s->limit[t][0]), 341*ca3e8d88SDave Plauger &(s->base[t][0]), 342*ca3e8d88SDave Plauger &(s->perm[t][0]), 343*ca3e8d88SDave Plauger &(s->len[t][0]), 344*ca3e8d88SDave Plauger minLen, maxLen, alphaSize 345*ca3e8d88SDave Plauger ); 346*ca3e8d88SDave Plauger s->minLens[t] = minLen; 347*ca3e8d88SDave Plauger } 348*ca3e8d88SDave Plauger 349*ca3e8d88SDave Plauger /*--- Now the MTF values ---*/ 350*ca3e8d88SDave Plauger 351*ca3e8d88SDave Plauger EOB = s->nInUse+1; 352*ca3e8d88SDave Plauger nblockMAX = 100000 * s->blockSize100k; 353*ca3e8d88SDave Plauger groupNo = -1; 354*ca3e8d88SDave Plauger groupPos = 0; 355*ca3e8d88SDave Plauger 356*ca3e8d88SDave Plauger for (i = 0; i <= 255; i++) s->unzftab[i] = 0; 357*ca3e8d88SDave Plauger 358*ca3e8d88SDave Plauger /*-- MTF init --*/ 359*ca3e8d88SDave Plauger { 360*ca3e8d88SDave Plauger Int32 ii, jj, kk; 361*ca3e8d88SDave Plauger kk = MTFA_SIZE-1; 362*ca3e8d88SDave Plauger for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { 363*ca3e8d88SDave Plauger for (jj = MTFL_SIZE-1; jj >= 0; jj--) { 364*ca3e8d88SDave Plauger s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); 365*ca3e8d88SDave Plauger kk--; 366*ca3e8d88SDave Plauger } 367*ca3e8d88SDave Plauger s->mtfbase[ii] = kk + 1; 368*ca3e8d88SDave Plauger } 369*ca3e8d88SDave Plauger } 370*ca3e8d88SDave Plauger /*-- end MTF init --*/ 371*ca3e8d88SDave Plauger 372*ca3e8d88SDave Plauger nblock = 0; 373*ca3e8d88SDave Plauger GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); 374*ca3e8d88SDave Plauger 375*ca3e8d88SDave Plauger while (True) { 376*ca3e8d88SDave Plauger 377*ca3e8d88SDave Plauger if (nextSym == EOB) break; 378*ca3e8d88SDave Plauger 379*ca3e8d88SDave Plauger if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { 380*ca3e8d88SDave Plauger 381*ca3e8d88SDave Plauger es = -1; 382*ca3e8d88SDave Plauger N = 1; 383*ca3e8d88SDave Plauger do { 384*ca3e8d88SDave Plauger if (nextSym == BZ_RUNA) es = es + (0+1) * N; else 385*ca3e8d88SDave Plauger if (nextSym == BZ_RUNB) es = es + (1+1) * N; 386*ca3e8d88SDave Plauger N = N * 2; 387*ca3e8d88SDave Plauger GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); 388*ca3e8d88SDave Plauger } 389*ca3e8d88SDave Plauger while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); 390*ca3e8d88SDave Plauger 391*ca3e8d88SDave Plauger es++; 392*ca3e8d88SDave Plauger uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; 393*ca3e8d88SDave Plauger s->unzftab[uc] += es; 394*ca3e8d88SDave Plauger 395*ca3e8d88SDave Plauger if (s->smallDecompress) 396*ca3e8d88SDave Plauger while (es > 0) { 397*ca3e8d88SDave Plauger if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); 398*ca3e8d88SDave Plauger s->ll16[nblock] = (UInt16)uc; 399*ca3e8d88SDave Plauger nblock++; 400*ca3e8d88SDave Plauger es--; 401*ca3e8d88SDave Plauger } 402*ca3e8d88SDave Plauger else 403*ca3e8d88SDave Plauger while (es > 0) { 404*ca3e8d88SDave Plauger if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); 405*ca3e8d88SDave Plauger s->tt[nblock] = (UInt32)uc; 406*ca3e8d88SDave Plauger nblock++; 407*ca3e8d88SDave Plauger es--; 408*ca3e8d88SDave Plauger }; 409*ca3e8d88SDave Plauger 410*ca3e8d88SDave Plauger continue; 411*ca3e8d88SDave Plauger 412*ca3e8d88SDave Plauger } else { 413*ca3e8d88SDave Plauger 414*ca3e8d88SDave Plauger if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); 415*ca3e8d88SDave Plauger 416*ca3e8d88SDave Plauger /*-- uc = MTF ( nextSym-1 ) --*/ 417*ca3e8d88SDave Plauger { 418*ca3e8d88SDave Plauger Int32 ii, jj, kk, pp, lno, off; 419*ca3e8d88SDave Plauger UInt32 nn; 420*ca3e8d88SDave Plauger nn = (UInt32)(nextSym - 1); 421*ca3e8d88SDave Plauger 422*ca3e8d88SDave Plauger if (nn < MTFL_SIZE) { 423*ca3e8d88SDave Plauger /* avoid general-case expense */ 424*ca3e8d88SDave Plauger pp = s->mtfbase[0]; 425*ca3e8d88SDave Plauger uc = s->mtfa[pp+nn]; 426*ca3e8d88SDave Plauger while (nn > 3) { 427*ca3e8d88SDave Plauger Int32 z = pp+nn; 428*ca3e8d88SDave Plauger s->mtfa[(z) ] = s->mtfa[(z)-1]; 429*ca3e8d88SDave Plauger s->mtfa[(z)-1] = s->mtfa[(z)-2]; 430*ca3e8d88SDave Plauger s->mtfa[(z)-2] = s->mtfa[(z)-3]; 431*ca3e8d88SDave Plauger s->mtfa[(z)-3] = s->mtfa[(z)-4]; 432*ca3e8d88SDave Plauger nn -= 4; 433*ca3e8d88SDave Plauger } 434*ca3e8d88SDave Plauger while (nn > 0) { 435*ca3e8d88SDave Plauger s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 436*ca3e8d88SDave Plauger }; 437*ca3e8d88SDave Plauger s->mtfa[pp] = uc; 438*ca3e8d88SDave Plauger } else { 439*ca3e8d88SDave Plauger /* general case */ 440*ca3e8d88SDave Plauger lno = nn / MTFL_SIZE; 441*ca3e8d88SDave Plauger off = nn % MTFL_SIZE; 442*ca3e8d88SDave Plauger pp = s->mtfbase[lno] + off; 443*ca3e8d88SDave Plauger uc = s->mtfa[pp]; 444*ca3e8d88SDave Plauger while (pp > s->mtfbase[lno]) { 445*ca3e8d88SDave Plauger s->mtfa[pp] = s->mtfa[pp-1]; pp--; 446*ca3e8d88SDave Plauger }; 447*ca3e8d88SDave Plauger s->mtfbase[lno]++; 448*ca3e8d88SDave Plauger while (lno > 0) { 449*ca3e8d88SDave Plauger s->mtfbase[lno]--; 450*ca3e8d88SDave Plauger s->mtfa[s->mtfbase[lno]] 451*ca3e8d88SDave Plauger = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; 452*ca3e8d88SDave Plauger lno--; 453*ca3e8d88SDave Plauger } 454*ca3e8d88SDave Plauger s->mtfbase[0]--; 455*ca3e8d88SDave Plauger s->mtfa[s->mtfbase[0]] = uc; 456*ca3e8d88SDave Plauger if (s->mtfbase[0] == 0) { 457*ca3e8d88SDave Plauger kk = MTFA_SIZE-1; 458*ca3e8d88SDave Plauger for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { 459*ca3e8d88SDave Plauger for (jj = MTFL_SIZE-1; jj >= 0; jj--) { 460*ca3e8d88SDave Plauger s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; 461*ca3e8d88SDave Plauger kk--; 462*ca3e8d88SDave Plauger } 463*ca3e8d88SDave Plauger s->mtfbase[ii] = kk + 1; 464*ca3e8d88SDave Plauger } 465*ca3e8d88SDave Plauger } 466*ca3e8d88SDave Plauger } 467*ca3e8d88SDave Plauger } 468*ca3e8d88SDave Plauger /*-- end uc = MTF ( nextSym-1 ) --*/ 469*ca3e8d88SDave Plauger 470*ca3e8d88SDave Plauger s->unzftab[s->seqToUnseq[uc]]++; 471*ca3e8d88SDave Plauger if (s->smallDecompress) 472*ca3e8d88SDave Plauger s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else 473*ca3e8d88SDave Plauger s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); 474*ca3e8d88SDave Plauger nblock++; 475*ca3e8d88SDave Plauger 476*ca3e8d88SDave Plauger GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); 477*ca3e8d88SDave Plauger continue; 478*ca3e8d88SDave Plauger } 479*ca3e8d88SDave Plauger } 480*ca3e8d88SDave Plauger 481*ca3e8d88SDave Plauger /* Now we know what nblock is, we can do a better sanity 482*ca3e8d88SDave Plauger check on s->origPtr. 483*ca3e8d88SDave Plauger */ 484*ca3e8d88SDave Plauger if (s->origPtr < 0 || s->origPtr >= nblock) 485*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR); 486*ca3e8d88SDave Plauger 487*ca3e8d88SDave Plauger /*-- Set up cftab to facilitate generation of T^(-1) --*/ 488*ca3e8d88SDave Plauger s->cftab[0] = 0; 489*ca3e8d88SDave Plauger for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; 490*ca3e8d88SDave Plauger for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; 491*ca3e8d88SDave Plauger for (i = 0; i <= 256; i++) { 492*ca3e8d88SDave Plauger if (s->cftab[i] < 0 || s->cftab[i] > nblock) { 493*ca3e8d88SDave Plauger /* s->cftab[i] can legitimately be == nblock */ 494*ca3e8d88SDave Plauger RETURN(BZ_DATA_ERROR) 495*ca3e8d88SDave Plauger } 496*ca3e8d88SDave Plauger } 497*ca3e8d88SDave Plauger 498*ca3e8d88SDave Plauger s->state_out_len = 0; 499*ca3e8d88SDave Plauger s->state_out_ch = 0; 500*ca3e8d88SDave Plauger BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); 501*ca3e8d88SDave Plauger s->state = BZ_X_OUTPUT; 502*ca3e8d88SDave Plauger if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); 503*ca3e8d88SDave Plauger 504*ca3e8d88SDave Plauger if (s->smallDecompress) { 505*ca3e8d88SDave Plauger 506*ca3e8d88SDave Plauger /*-- Make a copy of cftab, used in generation of T --*/ 507*ca3e8d88SDave Plauger for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; 508*ca3e8d88SDave Plauger 509*ca3e8d88SDave Plauger /*-- compute the T vector --*/ 510*ca3e8d88SDave Plauger for (i = 0; i < nblock; i++) { 511*ca3e8d88SDave Plauger uc = (UChar)(s->ll16[i]); 512*ca3e8d88SDave Plauger SET_LL(i, s->cftabCopy[uc]); 513*ca3e8d88SDave Plauger s->cftabCopy[uc]++; 514*ca3e8d88SDave Plauger } 515*ca3e8d88SDave Plauger 516*ca3e8d88SDave Plauger /*-- Compute T^(-1) by pointer reversal on T --*/ 517*ca3e8d88SDave Plauger i = s->origPtr; 518*ca3e8d88SDave Plauger j = GET_LL(i); 519*ca3e8d88SDave Plauger do { 520*ca3e8d88SDave Plauger Int32 tmp = GET_LL(j); 521*ca3e8d88SDave Plauger SET_LL(j, i); 522*ca3e8d88SDave Plauger i = j; 523*ca3e8d88SDave Plauger j = tmp; 524*ca3e8d88SDave Plauger } 525*ca3e8d88SDave Plauger while (i != s->origPtr); 526*ca3e8d88SDave Plauger 527*ca3e8d88SDave Plauger s->tPos = s->origPtr; 528*ca3e8d88SDave Plauger s->nblock_used = 0; 529*ca3e8d88SDave Plauger if (s->blockRandomised) { 530*ca3e8d88SDave Plauger BZ_RAND_INIT_MASK; 531*ca3e8d88SDave Plauger BZ_GET_SMALL(s->k0); s->nblock_used++; 532*ca3e8d88SDave Plauger BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 533*ca3e8d88SDave Plauger } else { 534*ca3e8d88SDave Plauger BZ_GET_SMALL(s->k0); s->nblock_used++; 535*ca3e8d88SDave Plauger } 536*ca3e8d88SDave Plauger 537*ca3e8d88SDave Plauger } else { 538*ca3e8d88SDave Plauger 539*ca3e8d88SDave Plauger /*-- compute the T^(-1) vector --*/ 540*ca3e8d88SDave Plauger for (i = 0; i < nblock; i++) { 541*ca3e8d88SDave Plauger uc = (UChar)(s->tt[i] & 0xff); 542*ca3e8d88SDave Plauger s->tt[s->cftab[uc]] |= (i << 8); 543*ca3e8d88SDave Plauger s->cftab[uc]++; 544*ca3e8d88SDave Plauger } 545*ca3e8d88SDave Plauger 546*ca3e8d88SDave Plauger s->tPos = s->tt[s->origPtr] >> 8; 547*ca3e8d88SDave Plauger s->nblock_used = 0; 548*ca3e8d88SDave Plauger if (s->blockRandomised) { 549*ca3e8d88SDave Plauger BZ_RAND_INIT_MASK; 550*ca3e8d88SDave Plauger BZ_GET_FAST(s->k0); s->nblock_used++; 551*ca3e8d88SDave Plauger BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 552*ca3e8d88SDave Plauger } else { 553*ca3e8d88SDave Plauger BZ_GET_FAST(s->k0); s->nblock_used++; 554*ca3e8d88SDave Plauger } 555*ca3e8d88SDave Plauger 556*ca3e8d88SDave Plauger } 557*ca3e8d88SDave Plauger 558*ca3e8d88SDave Plauger RETURN(BZ_OK) 559*ca3e8d88SDave Plauger 560*ca3e8d88SDave Plauger 561*ca3e8d88SDave Plauger 562*ca3e8d88SDave Plauger endhdr_2: 563*ca3e8d88SDave Plauger 564*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ENDHDR_2, uc); 565*ca3e8d88SDave Plauger if (uc != 0x72) RETURN(BZ_DATA_ERROR); 566*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ENDHDR_3, uc); 567*ca3e8d88SDave Plauger if (uc != 0x45) RETURN(BZ_DATA_ERROR); 568*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ENDHDR_4, uc); 569*ca3e8d88SDave Plauger if (uc != 0x38) RETURN(BZ_DATA_ERROR); 570*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ENDHDR_5, uc); 571*ca3e8d88SDave Plauger if (uc != 0x50) RETURN(BZ_DATA_ERROR); 572*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_ENDHDR_6, uc); 573*ca3e8d88SDave Plauger if (uc != 0x90) RETURN(BZ_DATA_ERROR); 574*ca3e8d88SDave Plauger 575*ca3e8d88SDave Plauger s->storedCombinedCRC = 0; 576*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_CCRC_1, uc); 577*ca3e8d88SDave Plauger s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 578*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_CCRC_2, uc); 579*ca3e8d88SDave Plauger s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 580*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_CCRC_3, uc); 581*ca3e8d88SDave Plauger s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 582*ca3e8d88SDave Plauger GET_UCHAR(BZ_X_CCRC_4, uc); 583*ca3e8d88SDave Plauger s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 584*ca3e8d88SDave Plauger 585*ca3e8d88SDave Plauger s->state = BZ_X_IDLE; 586*ca3e8d88SDave Plauger RETURN(BZ_STREAM_END) 587*ca3e8d88SDave Plauger 588*ca3e8d88SDave Plauger default: AssertH ( False, 4001 ); 589*ca3e8d88SDave Plauger } 590*ca3e8d88SDave Plauger 591*ca3e8d88SDave Plauger AssertH ( False, 4002 ); 592*ca3e8d88SDave Plauger 593*ca3e8d88SDave Plauger save_state_and_return: 594*ca3e8d88SDave Plauger 595*ca3e8d88SDave Plauger s->save_i = i; 596*ca3e8d88SDave Plauger s->save_j = j; 597*ca3e8d88SDave Plauger s->save_t = t; 598*ca3e8d88SDave Plauger s->save_alphaSize = alphaSize; 599*ca3e8d88SDave Plauger s->save_nGroups = nGroups; 600*ca3e8d88SDave Plauger s->save_nSelectors = nSelectors; 601*ca3e8d88SDave Plauger s->save_EOB = EOB; 602*ca3e8d88SDave Plauger s->save_groupNo = groupNo; 603*ca3e8d88SDave Plauger s->save_groupPos = groupPos; 604*ca3e8d88SDave Plauger s->save_nextSym = nextSym; 605*ca3e8d88SDave Plauger s->save_nblockMAX = nblockMAX; 606*ca3e8d88SDave Plauger s->save_nblock = nblock; 607*ca3e8d88SDave Plauger s->save_es = es; 608*ca3e8d88SDave Plauger s->save_N = N; 609*ca3e8d88SDave Plauger s->save_curr = curr; 610*ca3e8d88SDave Plauger s->save_zt = zt; 611*ca3e8d88SDave Plauger s->save_zn = zn; 612*ca3e8d88SDave Plauger s->save_zvec = zvec; 613*ca3e8d88SDave Plauger s->save_zj = zj; 614*ca3e8d88SDave Plauger s->save_gSel = gSel; 615*ca3e8d88SDave Plauger s->save_gMinlen = gMinlen; 616*ca3e8d88SDave Plauger s->save_gLimit = gLimit; 617*ca3e8d88SDave Plauger s->save_gBase = gBase; 618*ca3e8d88SDave Plauger s->save_gPerm = gPerm; 619*ca3e8d88SDave Plauger 620*ca3e8d88SDave Plauger return retVal; 621*ca3e8d88SDave Plauger } 622*ca3e8d88SDave Plauger 623*ca3e8d88SDave Plauger 624*ca3e8d88SDave Plauger /*-------------------------------------------------------------*/ 625*ca3e8d88SDave Plauger /*--- end decompress.c ---*/ 626*ca3e8d88SDave Plauger /*-------------------------------------------------------------*/ 627