2
/*-------------------------------------------------------------*/
3
/*--- Private header file for the library. ---*/
4
/*--- bzlib_private.h ---*/
5
/*-------------------------------------------------------------*/
7
/* ------------------------------------------------------------------
8
This file is part of bzip2/libbzip2, a program and library for
9
lossless, block-sorting data compression.
11
bzip2/libbzip2 version 1.0.5 of 10 December 2007
12
Copyright (C) 1996-2007 Julian Seward <jseward@bzip.org>
14
Please read the WARNING, DISCLAIMER and PATENTS sections in the
17
This program is released under the terms of the license contained
19
------------------------------------------------------------------ */
22
#ifndef _BZLIB_PRIVATE_H
23
#define _BZLIB_PRIVATE_H
37
/*-- General stuff. --*/
39
#define BZ_VERSION "1.0.5, 10-Dec-2007"
42
typedef unsigned char Bool;
43
typedef unsigned char UChar;
45
typedef unsigned int UInt32;
47
typedef unsigned short UInt16;
49
#define True ((Bool)1)
50
#define False ((Bool)0)
53
#define __inline__ /* */
58
extern void BZ2_bz__AssertH__fail ( int errcode );
59
#define AssertH(cond,errcode) \
60
{ if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
63
#define AssertD(cond,msg) \
66
"\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
70
#define AssertD(cond,msg) /* */
73
#define VPrintf0(zf) \
75
#define VPrintf1(zf,za1) \
76
fprintf(stderr,zf,za1)
77
#define VPrintf2(zf,za1,za2) \
78
fprintf(stderr,zf,za1,za2)
79
#define VPrintf3(zf,za1,za2,za3) \
80
fprintf(stderr,zf,za1,za2,za3)
81
#define VPrintf4(zf,za1,za2,za3,za4) \
82
fprintf(stderr,zf,za1,za2,za3,za4)
83
#define VPrintf5(zf,za1,za2,za3,za4,za5) \
84
fprintf(stderr,zf,za1,za2,za3,za4,za5)
88
extern void bz_internal_error ( int errcode );
89
#define AssertH(cond,errcode) \
90
{ if (!(cond)) bz_internal_error ( errcode ); }
91
#define AssertD(cond,msg) do { } while (0)
92
#define VPrintf0(zf) do { } while (0)
93
#define VPrintf1(zf,za1) do { } while (0)
94
#define VPrintf2(zf,za1,za2) do { } while (0)
95
#define VPrintf3(zf,za1,za2,za3) do { } while (0)
96
#define VPrintf4(zf,za1,za2,za3,za4) do { } while (0)
97
#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0)
102
#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
103
#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp))
106
/*-- Header bytes. --*/
108
#define BZ_HDR_B 0x42 /* 'B' */
109
#define BZ_HDR_Z 0x5a /* 'Z' */
110
#define BZ_HDR_h 0x68 /* 'h' */
111
#define BZ_HDR_0 0x30 /* '0' */
113
/*-- Constants for the back end. --*/
115
#define BZ_MAX_ALPHA_SIZE 258
116
#define BZ_MAX_CODE_LEN 23
121
#define BZ_N_GROUPS 6
125
#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
129
/*-- Stuff for randomising repetitive blocks. --*/
131
extern Int32 BZ2_rNums[512];
133
#define BZ_RAND_DECLS \
137
#define BZ_RAND_INIT_MASK \
141
#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
143
#define BZ_RAND_UPD_MASK \
144
if (s->rNToGo == 0) { \
145
s->rNToGo = BZ2_rNums[s->rTPos]; \
147
if (s->rTPos == 512) s->rTPos = 0; \
153
/*-- Stuff for doing CRCs. --*/
155
extern UInt32 BZ2_crc32Table[256];
157
#define BZ_INITIALISE_CRC(crcVar) \
159
crcVar = 0xffffffffL; \
162
#define BZ_FINALISE_CRC(crcVar) \
164
crcVar = ~(crcVar); \
167
#define BZ_UPDATE_CRC(crcVar,cha) \
169
crcVar = (crcVar << 8) ^ \
170
BZ2_crc32Table[(crcVar >> 24) ^ \
176
/*-- States and modes for compression. --*/
179
#define BZ_M_RUNNING 2
180
#define BZ_M_FLUSHING 3
181
#define BZ_M_FINISHING 4
183
#define BZ_S_OUTPUT 1
187
#define BZ_N_QSORT 12
188
#define BZ_N_SHELL 18
189
#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
194
/*-- Structure holding all the compression-side stuff. --*/
198
/* pointer back to the struct bz_stream */
201
/* mode this stream is in, and whether inputting */
202
/* or outputting data */
206
/* remembers avail_in when flush/finish requested */
207
UInt32 avail_in_expect;
209
/* for doing the block sorting */
215
/* aliases for arr1 and arr2 */
221
/* for deciding when to use the fallback sorting algorithm */
224
/* run-length-encoding of the input */
229
/* input and output limits and current posns */
235
/* map of bytes used in block */
238
UChar unseqToSeq[256];
240
/* the buffer for bit stream creation */
244
/* block and combined CRCs */
248
/* misc administratium */
253
/* stuff for coding the MTF values */
255
Int32 mtfFreq [BZ_MAX_ALPHA_SIZE];
256
UChar selector [BZ_MAX_SELECTORS];
257
UChar selectorMtf[BZ_MAX_SELECTORS];
259
UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
260
Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
261
Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
262
/* second dimension: only 3 needed; 4 makes index calculations faster */
263
UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4];
270
/*-- externs for compression. --*/
273
BZ2_blockSort ( EState* );
276
BZ2_compressBlock ( EState*, Bool );
279
BZ2_bsInitWrite ( EState* );
282
BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
285
BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
289
/*-- states for decompression. --*/
292
#define BZ_X_OUTPUT 2
294
#define BZ_X_MAGIC_1 10
295
#define BZ_X_MAGIC_2 11
296
#define BZ_X_MAGIC_3 12
297
#define BZ_X_MAGIC_4 13
298
#define BZ_X_BLKHDR_1 14
299
#define BZ_X_BLKHDR_2 15
300
#define BZ_X_BLKHDR_3 16
301
#define BZ_X_BLKHDR_4 17
302
#define BZ_X_BLKHDR_5 18
303
#define BZ_X_BLKHDR_6 19
304
#define BZ_X_BCRC_1 20
305
#define BZ_X_BCRC_2 21
306
#define BZ_X_BCRC_3 22
307
#define BZ_X_BCRC_4 23
308
#define BZ_X_RANDBIT 24
309
#define BZ_X_ORIGPTR_1 25
310
#define BZ_X_ORIGPTR_2 26
311
#define BZ_X_ORIGPTR_3 27
312
#define BZ_X_MAPPING_1 28
313
#define BZ_X_MAPPING_2 29
314
#define BZ_X_SELECTOR_1 30
315
#define BZ_X_SELECTOR_2 31
316
#define BZ_X_SELECTOR_3 32
317
#define BZ_X_CODING_1 33
318
#define BZ_X_CODING_2 34
319
#define BZ_X_CODING_3 35
320
#define BZ_X_MTF_1 36
321
#define BZ_X_MTF_2 37
322
#define BZ_X_MTF_3 38
323
#define BZ_X_MTF_4 39
324
#define BZ_X_MTF_5 40
325
#define BZ_X_MTF_6 41
326
#define BZ_X_ENDHDR_2 42
327
#define BZ_X_ENDHDR_3 43
328
#define BZ_X_ENDHDR_4 44
329
#define BZ_X_ENDHDR_5 45
330
#define BZ_X_ENDHDR_6 46
331
#define BZ_X_CCRC_1 47
332
#define BZ_X_CCRC_2 48
333
#define BZ_X_CCRC_3 49
334
#define BZ_X_CCRC_4 50
338
/*-- Constants for the fast MTF decoder. --*/
340
#define MTFA_SIZE 4096
345
/*-- Structure holding all the decompression-side stuff. --*/
349
/* pointer back to the struct bz_stream */
352
/* state indicator for this stream */
355
/* for doing the final run-length decoding */
358
Bool blockRandomised;
361
/* the buffer for bit stream reading */
365
/* misc administratium */
367
Bool smallDecompress;
371
/* for undoing the Burrows-Wheeler transform */
378
Int32 cftabCopy[257];
380
/* for undoing the Burrows-Wheeler transform (FAST) */
383
/* for undoing the Burrows-Wheeler transform (SMALL) */
387
/* stored and calculated CRCs */
388
UInt32 storedBlockCRC;
389
UInt32 storedCombinedCRC;
390
UInt32 calculatedBlockCRC;
391
UInt32 calculatedCombinedCRC;
393
/* map of bytes used in block */
397
UChar seqToUnseq[256];
399
/* for decoding the MTF values */
400
UChar mtfa [MTFA_SIZE];
401
Int32 mtfbase[256 / MTFL_SIZE];
402
UChar selector [BZ_MAX_SELECTORS];
403
UChar selectorMtf[BZ_MAX_SELECTORS];
404
UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
406
Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
407
Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
408
Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
409
Int32 minLens[BZ_N_GROUPS];
411
/* save area for scalars in the main decompress code */
415
Int32 save_alphaSize;
417
Int32 save_nSelectors;
422
Int32 save_nblockMAX;
442
/*-- Macros for decompression. --*/
444
#define BZ_GET_FAST(cccc) \
445
/* c_tPos is unsigned, hence test < 0 is pointless. */ \
446
if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
447
s->tPos = s->tt[s->tPos]; \
448
cccc = (UChar)(s->tPos & 0xff); \
451
#define BZ_GET_FAST_C(cccc) \
452
/* c_tPos is unsigned, hence test < 0 is pointless. */ \
453
if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \
454
c_tPos = c_tt[c_tPos]; \
455
cccc = (UChar)(c_tPos & 0xff); \
458
#define SET_LL4(i,n) \
459
{ if (((i) & 0x1) == 0) \
460
s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \
461
s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \
465
((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
467
#define SET_LL(i,n) \
468
{ s->ll16[i] = (UInt16)(n & 0x0000ffff); \
469
SET_LL4(i, n >> 16); \
473
(((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
475
#define BZ_GET_SMALL(cccc) \
476
/* c_tPos is unsigned, hence test < 0 is pointless. */ \
477
if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
478
cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \
479
s->tPos = GET_LL(s->tPos);
482
/*-- externs for decompression. --*/
485
BZ2_indexIntoF ( Int32, Int32* );
488
BZ2_decompress ( DState* );
491
BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
492
Int32, Int32, Int32 );
498
/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
507
/*-------------------------------------------------------------*/
508
/*--- end bzlib_private.h ---*/
509
/*-------------------------------------------------------------*/