xref: /plan9/sys/src/cmd/bzip2/lib/bzlib_private.h (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
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