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