1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * This file is a modified version of bzlib_private.h from the bzip2-1.0.2 3*4882a593Smuzhiyun * distribution which can be found at http://sources.redhat.com/bzip2/ 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /*-------------------------------------------------------------*/ 7*4882a593Smuzhiyun /*--- Private header file for the library. ---*/ 8*4882a593Smuzhiyun /*--- bzlib_private.h ---*/ 9*4882a593Smuzhiyun /*-------------------------------------------------------------*/ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /*-- 12*4882a593Smuzhiyun This file is a part of bzip2 and/or libbzip2, a program and 13*4882a593Smuzhiyun library for lossless, block-sorting data compression. 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun Redistribution and use in source and binary forms, with or without 18*4882a593Smuzhiyun modification, are permitted provided that the following conditions 19*4882a593Smuzhiyun are met: 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun 1. Redistributions of source code must retain the above copyright 22*4882a593Smuzhiyun notice, this list of conditions and the following disclaimer. 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun 2. The origin of this software must not be misrepresented; you must 25*4882a593Smuzhiyun not claim that you wrote the original software. If you use this 26*4882a593Smuzhiyun software in a product, an acknowledgment in the product 27*4882a593Smuzhiyun documentation would be appreciated but is not required. 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun 3. Altered source versions must be plainly marked as such, and must 30*4882a593Smuzhiyun not be misrepresented as being the original software. 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun 4. The name of the author may not be used to endorse or promote 33*4882a593Smuzhiyun products derived from this software without specific prior written 34*4882a593Smuzhiyun permission. 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 37*4882a593Smuzhiyun OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 38*4882a593Smuzhiyun WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 39*4882a593Smuzhiyun ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 40*4882a593Smuzhiyun DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 41*4882a593Smuzhiyun DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 42*4882a593Smuzhiyun GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 43*4882a593Smuzhiyun INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 44*4882a593Smuzhiyun WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 45*4882a593Smuzhiyun NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 46*4882a593Smuzhiyun SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun Julian Seward, Cambridge, UK. 49*4882a593Smuzhiyun jseward@acm.org 50*4882a593Smuzhiyun bzip2/libbzip2 version 1.0 of 21 March 2000 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun This program is based on (at least) the work of: 53*4882a593Smuzhiyun Mike Burrows 54*4882a593Smuzhiyun David Wheeler 55*4882a593Smuzhiyun Peter Fenwick 56*4882a593Smuzhiyun Alistair Moffat 57*4882a593Smuzhiyun Radford Neal 58*4882a593Smuzhiyun Ian H. Witten 59*4882a593Smuzhiyun Robert Sedgewick 60*4882a593Smuzhiyun Jon L. Bentley 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun For more information on these sources, see the manual. 63*4882a593Smuzhiyun --*/ 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #ifndef _BZLIB_PRIVATE_H 67*4882a593Smuzhiyun #define _BZLIB_PRIVATE_H 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #include <malloc.h> 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #include "bzlib.h" 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #ifndef BZ_NO_STDIO 74*4882a593Smuzhiyun #include <stdio.h> 75*4882a593Smuzhiyun #include <ctype.h> 76*4882a593Smuzhiyun #include <string.h> 77*4882a593Smuzhiyun #endif 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /*-- General stuff. --*/ 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define BZ_VERSION "1.0.2, 30-Dec-2001" 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun typedef char Char; 85*4882a593Smuzhiyun typedef unsigned char Bool; 86*4882a593Smuzhiyun typedef unsigned char UChar; 87*4882a593Smuzhiyun typedef int Int32; 88*4882a593Smuzhiyun typedef unsigned int UInt32; 89*4882a593Smuzhiyun typedef short Int16; 90*4882a593Smuzhiyun typedef unsigned short UInt16; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define True ((Bool)1) 93*4882a593Smuzhiyun #define False ((Bool)0) 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #ifndef __GNUC__ 96*4882a593Smuzhiyun #define __inline__ /* */ 97*4882a593Smuzhiyun #endif 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #ifndef BZ_NO_STDIO 100*4882a593Smuzhiyun extern void BZ2_bz__AssertH__fail ( int errcode ); 101*4882a593Smuzhiyun #define AssertH(cond,errcode) \ 102*4882a593Smuzhiyun { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } 103*4882a593Smuzhiyun #if BZ_DEBUG 104*4882a593Smuzhiyun #define AssertD(cond,msg) \ 105*4882a593Smuzhiyun { if (!(cond)) { \ 106*4882a593Smuzhiyun fprintf ( stderr, \ 107*4882a593Smuzhiyun "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ 108*4882a593Smuzhiyun exit(1); \ 109*4882a593Smuzhiyun }} 110*4882a593Smuzhiyun #else 111*4882a593Smuzhiyun #define AssertD(cond,msg) /* */ 112*4882a593Smuzhiyun #endif 113*4882a593Smuzhiyun #define VPrintf0(zf) \ 114*4882a593Smuzhiyun fprintf(stderr,zf) 115*4882a593Smuzhiyun #define VPrintf1(zf,za1) \ 116*4882a593Smuzhiyun fprintf(stderr,zf,za1) 117*4882a593Smuzhiyun #define VPrintf2(zf,za1,za2) \ 118*4882a593Smuzhiyun fprintf(stderr,zf,za1,za2) 119*4882a593Smuzhiyun #define VPrintf3(zf,za1,za2,za3) \ 120*4882a593Smuzhiyun fprintf(stderr,zf,za1,za2,za3) 121*4882a593Smuzhiyun #define VPrintf4(zf,za1,za2,za3,za4) \ 122*4882a593Smuzhiyun fprintf(stderr,zf,za1,za2,za3,za4) 123*4882a593Smuzhiyun #define VPrintf5(zf,za1,za2,za3,za4,za5) \ 124*4882a593Smuzhiyun fprintf(stderr,zf,za1,za2,za3,za4,za5) 125*4882a593Smuzhiyun #else 126*4882a593Smuzhiyun extern void bz_internal_error ( int errcode ); 127*4882a593Smuzhiyun #define AssertH(cond,errcode) \ 128*4882a593Smuzhiyun { if (!(cond)) bz_internal_error ( errcode ); } 129*4882a593Smuzhiyun #define AssertD(cond,msg) /* */ 130*4882a593Smuzhiyun #define VPrintf0(zf) /* */ 131*4882a593Smuzhiyun #define VPrintf1(zf,za1) /* */ 132*4882a593Smuzhiyun #define VPrintf2(zf,za1,za2) /* */ 133*4882a593Smuzhiyun #define VPrintf3(zf,za1,za2,za3) /* */ 134*4882a593Smuzhiyun #define VPrintf4(zf,za1,za2,za3,za4) /* */ 135*4882a593Smuzhiyun #define VPrintf5(zf,za1,za2,za3,za4,za5) /* */ 136*4882a593Smuzhiyun #endif 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) 140*4882a593Smuzhiyun #define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /*-- Header bytes. --*/ 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define BZ_HDR_B 0x42 /* 'B' */ 146*4882a593Smuzhiyun #define BZ_HDR_Z 0x5a /* 'Z' */ 147*4882a593Smuzhiyun #define BZ_HDR_h 0x68 /* 'h' */ 148*4882a593Smuzhiyun #define BZ_HDR_0 0x30 /* '0' */ 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /*-- Constants for the back end. --*/ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define BZ_MAX_ALPHA_SIZE 258 153*4882a593Smuzhiyun #define BZ_MAX_CODE_LEN 23 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #define BZ_RUNA 0 156*4882a593Smuzhiyun #define BZ_RUNB 1 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define BZ_N_GROUPS 6 159*4882a593Smuzhiyun #define BZ_G_SIZE 50 160*4882a593Smuzhiyun #define BZ_N_ITERS 4 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /*-- Stuff for randomising repetitive blocks. --*/ 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun extern Int32 BZ2_rNums[512]; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define BZ_RAND_DECLS \ 170*4882a593Smuzhiyun Int32 rNToGo; \ 171*4882a593Smuzhiyun Int32 rTPos \ 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define BZ_RAND_INIT_MASK \ 174*4882a593Smuzhiyun s->rNToGo = 0; \ 175*4882a593Smuzhiyun s->rTPos = 0 \ 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #define BZ_RAND_UPD_MASK \ 180*4882a593Smuzhiyun if (s->rNToGo == 0) { \ 181*4882a593Smuzhiyun s->rNToGo = BZ2_rNums[s->rTPos]; \ 182*4882a593Smuzhiyun s->rTPos++; \ 183*4882a593Smuzhiyun if (s->rTPos == 512) s->rTPos = 0; \ 184*4882a593Smuzhiyun } \ 185*4882a593Smuzhiyun s->rNToGo--; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /*-- Stuff for doing CRCs. --*/ 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun extern UInt32 BZ2_crc32Table[256]; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #define BZ_INITIALISE_CRC(crcVar) \ 193*4882a593Smuzhiyun { \ 194*4882a593Smuzhiyun crcVar = 0xffffffffL; \ 195*4882a593Smuzhiyun } 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define BZ_FINALISE_CRC(crcVar) \ 198*4882a593Smuzhiyun { \ 199*4882a593Smuzhiyun crcVar = ~(crcVar); \ 200*4882a593Smuzhiyun } 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #define BZ_UPDATE_CRC(crcVar,cha) \ 203*4882a593Smuzhiyun { \ 204*4882a593Smuzhiyun crcVar = (crcVar << 8) ^ \ 205*4882a593Smuzhiyun BZ2_crc32Table[(crcVar >> 24) ^ \ 206*4882a593Smuzhiyun ((UChar)cha)]; \ 207*4882a593Smuzhiyun } 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /*-- States and modes for compression. --*/ 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define BZ_M_IDLE 1 213*4882a593Smuzhiyun #define BZ_M_RUNNING 2 214*4882a593Smuzhiyun #define BZ_M_FLUSHING 3 215*4882a593Smuzhiyun #define BZ_M_FINISHING 4 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun #define BZ_S_OUTPUT 1 218*4882a593Smuzhiyun #define BZ_S_INPUT 2 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #define BZ_N_RADIX 2 221*4882a593Smuzhiyun #define BZ_N_QSORT 12 222*4882a593Smuzhiyun #define BZ_N_SHELL 18 223*4882a593Smuzhiyun #define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /*-- Structure holding all the compression-side stuff. --*/ 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun typedef 229*4882a593Smuzhiyun struct { 230*4882a593Smuzhiyun /* pointer back to the struct bz_stream */ 231*4882a593Smuzhiyun bz_stream* strm; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* mode this stream is in, and whether inputting */ 234*4882a593Smuzhiyun /* or outputting data */ 235*4882a593Smuzhiyun Int32 mode; 236*4882a593Smuzhiyun Int32 state; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* remembers avail_in when flush/finish requested */ 239*4882a593Smuzhiyun UInt32 avail_in_expect; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /* for doing the block sorting */ 242*4882a593Smuzhiyun UInt32* arr1; 243*4882a593Smuzhiyun UInt32* arr2; 244*4882a593Smuzhiyun UInt32* ftab; 245*4882a593Smuzhiyun Int32 origPtr; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* aliases for arr1 and arr2 */ 248*4882a593Smuzhiyun UInt32* ptr; 249*4882a593Smuzhiyun UChar* block; 250*4882a593Smuzhiyun UInt16* mtfv; 251*4882a593Smuzhiyun UChar* zbits; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* for deciding when to use the fallback sorting algorithm */ 254*4882a593Smuzhiyun Int32 workFactor; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* run-length-encoding of the input */ 257*4882a593Smuzhiyun UInt32 state_in_ch; 258*4882a593Smuzhiyun Int32 state_in_len; 259*4882a593Smuzhiyun BZ_RAND_DECLS; 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /* input and output limits and current posns */ 262*4882a593Smuzhiyun Int32 nblock; 263*4882a593Smuzhiyun Int32 nblockMAX; 264*4882a593Smuzhiyun Int32 numZ; 265*4882a593Smuzhiyun Int32 state_out_pos; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* map of bytes used in block */ 268*4882a593Smuzhiyun Int32 nInUse; 269*4882a593Smuzhiyun Bool inUse[256]; 270*4882a593Smuzhiyun UChar unseqToSeq[256]; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /* the buffer for bit stream creation */ 273*4882a593Smuzhiyun UInt32 bsBuff; 274*4882a593Smuzhiyun Int32 bsLive; 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* block and combined CRCs */ 277*4882a593Smuzhiyun UInt32 blockCRC; 278*4882a593Smuzhiyun UInt32 combinedCRC; 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* misc administratium */ 281*4882a593Smuzhiyun Int32 verbosity; 282*4882a593Smuzhiyun Int32 blockNo; 283*4882a593Smuzhiyun Int32 blockSize100k; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* stuff for coding the MTF values */ 286*4882a593Smuzhiyun Int32 nMTF; 287*4882a593Smuzhiyun Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; 288*4882a593Smuzhiyun UChar selector [BZ_MAX_SELECTORS]; 289*4882a593Smuzhiyun UChar selectorMtf[BZ_MAX_SELECTORS]; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 292*4882a593Smuzhiyun Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 293*4882a593Smuzhiyun Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 294*4882a593Smuzhiyun /* second dimension: only 3 needed; 4 makes index calculations faster */ 295*4882a593Smuzhiyun UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun } 298*4882a593Smuzhiyun EState; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /*-- externs for compression. --*/ 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun extern void 304*4882a593Smuzhiyun BZ2_blockSort ( EState* ); 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun extern void 307*4882a593Smuzhiyun BZ2_compressBlock ( EState*, Bool ); 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun extern void 310*4882a593Smuzhiyun BZ2_bsInitWrite ( EState* ); 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun extern void 313*4882a593Smuzhiyun BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun extern void 316*4882a593Smuzhiyun BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /*-- states for decompression. --*/ 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun #define BZ_X_IDLE 1 322*4882a593Smuzhiyun #define BZ_X_OUTPUT 2 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #define BZ_X_MAGIC_1 10 325*4882a593Smuzhiyun #define BZ_X_MAGIC_2 11 326*4882a593Smuzhiyun #define BZ_X_MAGIC_3 12 327*4882a593Smuzhiyun #define BZ_X_MAGIC_4 13 328*4882a593Smuzhiyun #define BZ_X_BLKHDR_1 14 329*4882a593Smuzhiyun #define BZ_X_BLKHDR_2 15 330*4882a593Smuzhiyun #define BZ_X_BLKHDR_3 16 331*4882a593Smuzhiyun #define BZ_X_BLKHDR_4 17 332*4882a593Smuzhiyun #define BZ_X_BLKHDR_5 18 333*4882a593Smuzhiyun #define BZ_X_BLKHDR_6 19 334*4882a593Smuzhiyun #define BZ_X_BCRC_1 20 335*4882a593Smuzhiyun #define BZ_X_BCRC_2 21 336*4882a593Smuzhiyun #define BZ_X_BCRC_3 22 337*4882a593Smuzhiyun #define BZ_X_BCRC_4 23 338*4882a593Smuzhiyun #define BZ_X_RANDBIT 24 339*4882a593Smuzhiyun #define BZ_X_ORIGPTR_1 25 340*4882a593Smuzhiyun #define BZ_X_ORIGPTR_2 26 341*4882a593Smuzhiyun #define BZ_X_ORIGPTR_3 27 342*4882a593Smuzhiyun #define BZ_X_MAPPING_1 28 343*4882a593Smuzhiyun #define BZ_X_MAPPING_2 29 344*4882a593Smuzhiyun #define BZ_X_SELECTOR_1 30 345*4882a593Smuzhiyun #define BZ_X_SELECTOR_2 31 346*4882a593Smuzhiyun #define BZ_X_SELECTOR_3 32 347*4882a593Smuzhiyun #define BZ_X_CODING_1 33 348*4882a593Smuzhiyun #define BZ_X_CODING_2 34 349*4882a593Smuzhiyun #define BZ_X_CODING_3 35 350*4882a593Smuzhiyun #define BZ_X_MTF_1 36 351*4882a593Smuzhiyun #define BZ_X_MTF_2 37 352*4882a593Smuzhiyun #define BZ_X_MTF_3 38 353*4882a593Smuzhiyun #define BZ_X_MTF_4 39 354*4882a593Smuzhiyun #define BZ_X_MTF_5 40 355*4882a593Smuzhiyun #define BZ_X_MTF_6 41 356*4882a593Smuzhiyun #define BZ_X_ENDHDR_2 42 357*4882a593Smuzhiyun #define BZ_X_ENDHDR_3 43 358*4882a593Smuzhiyun #define BZ_X_ENDHDR_4 44 359*4882a593Smuzhiyun #define BZ_X_ENDHDR_5 45 360*4882a593Smuzhiyun #define BZ_X_ENDHDR_6 46 361*4882a593Smuzhiyun #define BZ_X_CCRC_1 47 362*4882a593Smuzhiyun #define BZ_X_CCRC_2 48 363*4882a593Smuzhiyun #define BZ_X_CCRC_3 49 364*4882a593Smuzhiyun #define BZ_X_CCRC_4 50 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /*-- Constants for the fast MTF decoder. --*/ 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun #define MTFA_SIZE 4096 370*4882a593Smuzhiyun #define MTFL_SIZE 16 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun /*-- Structure holding all the decompression-side stuff. --*/ 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun typedef 376*4882a593Smuzhiyun struct { 377*4882a593Smuzhiyun /* pointer back to the struct bz_stream */ 378*4882a593Smuzhiyun bz_stream* strm; 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun /* state indicator for this stream */ 381*4882a593Smuzhiyun Int32 state; 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun /* for doing the final run-length decoding */ 384*4882a593Smuzhiyun UChar state_out_ch; 385*4882a593Smuzhiyun Int32 state_out_len; 386*4882a593Smuzhiyun Bool blockRandomised; 387*4882a593Smuzhiyun BZ_RAND_DECLS; 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* the buffer for bit stream reading */ 390*4882a593Smuzhiyun UInt32 bsBuff; 391*4882a593Smuzhiyun Int32 bsLive; 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun /* misc administratium */ 394*4882a593Smuzhiyun Int32 blockSize100k; 395*4882a593Smuzhiyun Bool smallDecompress; 396*4882a593Smuzhiyun Int32 currBlockNo; 397*4882a593Smuzhiyun Int32 verbosity; 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun /* for undoing the Burrows-Wheeler transform */ 400*4882a593Smuzhiyun Int32 origPtr; 401*4882a593Smuzhiyun UInt32 tPos; 402*4882a593Smuzhiyun Int32 k0; 403*4882a593Smuzhiyun Int32 unzftab[256]; 404*4882a593Smuzhiyun Int32 nblock_used; 405*4882a593Smuzhiyun Int32 cftab[257]; 406*4882a593Smuzhiyun Int32 cftabCopy[257]; 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun /* for undoing the Burrows-Wheeler transform (FAST) */ 409*4882a593Smuzhiyun UInt32 *tt; 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun /* for undoing the Burrows-Wheeler transform (SMALL) */ 412*4882a593Smuzhiyun UInt16 *ll16; 413*4882a593Smuzhiyun UChar *ll4; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* stored and calculated CRCs */ 416*4882a593Smuzhiyun UInt32 storedBlockCRC; 417*4882a593Smuzhiyun UInt32 storedCombinedCRC; 418*4882a593Smuzhiyun UInt32 calculatedBlockCRC; 419*4882a593Smuzhiyun UInt32 calculatedCombinedCRC; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun /* map of bytes used in block */ 422*4882a593Smuzhiyun Int32 nInUse; 423*4882a593Smuzhiyun Bool inUse[256]; 424*4882a593Smuzhiyun Bool inUse16[16]; 425*4882a593Smuzhiyun UChar seqToUnseq[256]; 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun /* for decoding the MTF values */ 428*4882a593Smuzhiyun UChar mtfa [MTFA_SIZE]; 429*4882a593Smuzhiyun Int32 mtfbase[256 / MTFL_SIZE]; 430*4882a593Smuzhiyun UChar selector [BZ_MAX_SELECTORS]; 431*4882a593Smuzhiyun UChar selectorMtf[BZ_MAX_SELECTORS]; 432*4882a593Smuzhiyun UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 435*4882a593Smuzhiyun Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 436*4882a593Smuzhiyun Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 437*4882a593Smuzhiyun Int32 minLens[BZ_N_GROUPS]; 438*4882a593Smuzhiyun 439*4882a593Smuzhiyun /* save area for scalars in the main decompress code */ 440*4882a593Smuzhiyun Int32 save_i; 441*4882a593Smuzhiyun Int32 save_j; 442*4882a593Smuzhiyun Int32 save_t; 443*4882a593Smuzhiyun Int32 save_alphaSize; 444*4882a593Smuzhiyun Int32 save_nGroups; 445*4882a593Smuzhiyun Int32 save_nSelectors; 446*4882a593Smuzhiyun Int32 save_EOB; 447*4882a593Smuzhiyun Int32 save_groupNo; 448*4882a593Smuzhiyun Int32 save_groupPos; 449*4882a593Smuzhiyun Int32 save_nextSym; 450*4882a593Smuzhiyun Int32 save_nblockMAX; 451*4882a593Smuzhiyun Int32 save_nblock; 452*4882a593Smuzhiyun Int32 save_es; 453*4882a593Smuzhiyun Int32 save_N; 454*4882a593Smuzhiyun Int32 save_curr; 455*4882a593Smuzhiyun Int32 save_zt; 456*4882a593Smuzhiyun Int32 save_zn; 457*4882a593Smuzhiyun Int32 save_zvec; 458*4882a593Smuzhiyun Int32 save_zj; 459*4882a593Smuzhiyun Int32 save_gSel; 460*4882a593Smuzhiyun Int32 save_gMinlen; 461*4882a593Smuzhiyun Int32* save_gLimit; 462*4882a593Smuzhiyun Int32* save_gBase; 463*4882a593Smuzhiyun Int32* save_gPerm; 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun } 466*4882a593Smuzhiyun DState; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun /*-- Macros for decompression. --*/ 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun #define BZ_GET_FAST(cccc) \ 472*4882a593Smuzhiyun s->tPos = s->tt[s->tPos]; \ 473*4882a593Smuzhiyun cccc = (UChar)(s->tPos & 0xff); \ 474*4882a593Smuzhiyun s->tPos >>= 8; 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun #define BZ_GET_FAST_C(cccc) \ 477*4882a593Smuzhiyun c_tPos = c_tt[c_tPos]; \ 478*4882a593Smuzhiyun cccc = (UChar)(c_tPos & 0xff); \ 479*4882a593Smuzhiyun c_tPos >>= 8; 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun #define SET_LL4(i,n) \ 482*4882a593Smuzhiyun { if (((i) & 0x1) == 0) \ 483*4882a593Smuzhiyun s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ 484*4882a593Smuzhiyun s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ 485*4882a593Smuzhiyun } 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun #define GET_LL4(i) \ 488*4882a593Smuzhiyun ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) 489*4882a593Smuzhiyun 490*4882a593Smuzhiyun #define SET_LL(i,n) \ 491*4882a593Smuzhiyun { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ 492*4882a593Smuzhiyun SET_LL4(i, n >> 16); \ 493*4882a593Smuzhiyun } 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun #define GET_LL(i) \ 496*4882a593Smuzhiyun (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun #define BZ_GET_SMALL(cccc) \ 499*4882a593Smuzhiyun cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ 500*4882a593Smuzhiyun s->tPos = GET_LL(s->tPos); 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun /*-- externs for decompression. --*/ 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun extern Int32 506*4882a593Smuzhiyun BZ2_indexIntoF ( Int32, Int32* ); 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun extern Int32 509*4882a593Smuzhiyun BZ2_decompress ( DState* ); 510*4882a593Smuzhiyun 511*4882a593Smuzhiyun extern void 512*4882a593Smuzhiyun BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, 513*4882a593Smuzhiyun Int32, Int32, Int32 ); 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun #endif 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun /*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun #ifdef BZ_NO_STDIO 522*4882a593Smuzhiyun #ifndef NULL 523*4882a593Smuzhiyun #define NULL 0 524*4882a593Smuzhiyun #endif 525*4882a593Smuzhiyun #endif 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun /*-------------------------------------------------------------*/ 529*4882a593Smuzhiyun /*--- end bzlib_private.h ---*/ 530*4882a593Smuzhiyun /*-------------------------------------------------------------*/ 531