2 This file is a part of bzip2 and/or libbzip2, a program and
3 library for lossless, block-sorting data compression.
5 Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions
11 1. Redistributions of source code must retain the above copyright
12 notice, this list of conditions and the following disclaimer.
14 2. The origin of this software must not be misrepresented; you must
15 not claim that you wrote the original software. If you use this
16 software in a product, an acknowledgment in the product
17 documentation would be appreciated but is not required.
19 3. Altered source versions must be plainly marked as such, and must
20 not be misrepresented as being the original software.
22 4. The name of the author may not be used to endorse or promote
23 products derived from this software without specific prior written
26 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
27 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
30 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
32 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
34 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 Julian Seward, Cambridge, UK.
40 bzip2/libbzip2 version 1.0 of 21 March 2000
42 This program is based on (at least) the work of:
52 For more information on these sources, see the manual.
65 #define MTFA_SIZE 4096
69 #define BZ_MAX_ALPHA_SIZE 258
72 #define BZ_STREAM_END 4
73 #define BZ_SEQUENCE_ERROR (-1)
74 #define BZ_DATA_ERROR (-4)
75 #define BZ_DATA_ERROR_MAGIC (-5)
76 #define BZ_IO_ERROR (-6)
77 #define BZ_UNEXPECTED_EOF (-7)
82 #define BZ_MAX_UNUSED 5000
83 #define FILE_NAME_LEN 1034
84 /*-- states for decompression. --*/
89 #define BZ_X_MAGIC_1 10
90 #define BZ_X_MAGIC_2 11
91 #define BZ_X_MAGIC_3 12
92 #define BZ_X_MAGIC_4 13
93 #define BZ_X_BLKHDR_1 14
94 #define BZ_X_BLKHDR_2 15
95 #define BZ_X_BLKHDR_3 16
96 #define BZ_X_BLKHDR_4 17
97 #define BZ_X_BLKHDR_5 18
98 #define BZ_X_BLKHDR_6 19
99 #define BZ_X_BCRC_1 20
100 #define BZ_X_BCRC_2 21
101 #define BZ_X_BCRC_3 22
102 #define BZ_X_BCRC_4 23
103 #define BZ_X_RANDBIT 24
104 #define BZ_X_ORIGPTR_1 25
105 #define BZ_X_ORIGPTR_2 26
106 #define BZ_X_ORIGPTR_3 27
107 #define BZ_X_MAPPING_1 28
108 #define BZ_X_MAPPING_2 29
109 #define BZ_X_SELECTOR_1 30
110 #define BZ_X_SELECTOR_2 31
111 #define BZ_X_SELECTOR_3 32
112 #define BZ_X_CODING_1 33
113 #define BZ_X_CODING_2 34
114 #define BZ_X_CODING_3 35
115 #define BZ_X_MTF_1 36
116 #define BZ_X_MTF_2 37
117 #define BZ_X_MTF_3 38
118 #define BZ_X_MTF_4 39
119 #define BZ_X_MTF_5 40
120 #define BZ_X_MTF_6 41
121 #define BZ_X_ENDHDR_2 42
122 #define BZ_X_ENDHDR_3 43
123 #define BZ_X_ENDHDR_4 44
124 #define BZ_X_ENDHDR_5 45
125 #define BZ_X_ENDHDR_6 46
126 #define BZ_X_CCRC_1 47
127 #define BZ_X_CCRC_2 48
128 #define BZ_X_CCRC_3 49
129 #define BZ_X_CCRC_4 50
131 #define BZ_MAX_CODE_LEN 23
136 unsigned int avail_in;
139 unsigned int avail_out;
148 unsigned char initialisedOk;
149 char buf[BZ_MAX_UNUSED];
154 /*-- Structure holding all the decompression-side stuff. --*/
156 /* pointer back to the struct bz_stream */
159 /* state indicator for this stream */
162 /* for doing the final run-length decoding */
163 unsigned char state_out_ch;
165 unsigned char blockRandomised;
169 /* the buffer for bit stream reading */
173 /* misc administratium */
177 /* for undoing the Burrows-Wheeler transform */
186 /* for undoing the Burrows-Wheeler transform (FAST) */
189 /* stored and calculated CRCs */
190 unsigned int storedBlockCRC;
191 unsigned int storedCombinedCRC;
192 unsigned int calculatedBlockCRC;
193 unsigned int calculatedCombinedCRC;
195 /* map of bytes used in block */
197 unsigned char inUse[256];
198 unsigned char inUse16[16];
199 unsigned char seqToUnseq[256];
201 /* for decoding the MTF values */
202 unsigned char mtfa [MTFA_SIZE];
203 unsigned char selector [2 + (900000 / BZ_G_SIZE)];
204 unsigned char selectorMtf[2 + (900000 / BZ_G_SIZE)];
205 unsigned char len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
206 int mtfbase[256 / MTFL_SIZE];
208 int limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
209 int base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
210 int perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
211 int minLens[BZ_N_GROUPS];
213 /* save area for scalars in the main decompress code */
241 char inName[FILE_NAME_LEN];
242 char outName[FILE_NAME_LEN];
245 unsigned char deleteOutputOnInterrupt;
246 FILE *outputHandleJustInCase;
248 int numFilesProcessed;
251 const unsigned int BZ2_crc32Table[256] = {
253 /*-- Ugly, innit? --*/
255 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
256 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
257 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
258 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
259 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
260 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
261 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
262 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
263 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
264 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
265 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
266 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
267 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
268 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
269 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
270 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
271 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
272 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
273 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
274 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
275 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
276 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
277 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
278 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
279 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
280 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
281 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
282 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
283 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
284 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
285 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
286 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
287 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
288 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
289 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
290 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
291 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
292 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
293 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
294 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
295 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
296 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
297 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
298 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
299 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
300 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
301 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
302 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
303 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
304 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
305 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
306 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
307 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
308 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
309 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
310 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
311 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
312 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
313 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
314 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
315 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
316 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
317 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
318 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
321 static void bz_rand_udp_mask(DState *s)
323 if (s->rNToGo == 0) {
324 s->rNToGo = BZ2_rNums[s->rTPos];
326 if (s->rTPos == 512) {
333 static unsigned char myfeof(FILE *f)
343 static void BZ2_hbCreateDecodeTables(int *limit, int *base, int *perm, unsigned char *length, int minLen, int maxLen, int alphaSize )
348 for (i = minLen; i <= maxLen; i++) {
349 for (j = 0; j < alphaSize; j++) {
350 if (length[j] == i) {
357 for (i = 0; i < BZ_MAX_CODE_LEN; i++) {
361 for (i = 0; i < alphaSize; i++) {
365 for (i = 1; i < BZ_MAX_CODE_LEN; i++) {
366 base[i] += base[i-1];
369 for (i = 0; i < BZ_MAX_CODE_LEN; i++) {
374 for (i = minLen; i <= maxLen; i++) {
375 vec += (base[i+1] - base[i]);
379 for (i = minLen + 1; i <= maxLen; i++) {
380 base[i] = ((limit[i-1] + 1) << 1) - base[i];
385 static int get_bits(DState *s, int *vvv, char nnn)
388 if (s->bsLive >= nnn) {
389 *vvv = (s->bsBuff >> (s->bsLive-nnn)) & ((1 << nnn)-1);
393 if (s->strm->avail_in == 0) {
396 s->bsBuff = (s->bsBuff << 8) | ((unsigned int) (*((unsigned char*)(s->strm->next_in))));
404 static int bz_get_fast(DState *s)
407 s->tPos = s->tt[s->tPos];
408 cccc = (unsigned char)(s->tPos & 0xff);
413 /*---------------------------------------------------*/
414 static inline int BZ2_decompress(DState *s)
420 /* stuff that needs to be saved/restored */
447 int get_mtf_val_init(void)
451 if (groupNo >= nSelectors) {
452 retVal = BZ_DATA_ERROR;
455 groupPos = BZ_G_SIZE;
456 gSel = s->selector[groupNo];
457 gMinlen = s->minLens[gSel];
458 gLimit = &(s->limit[gSel][0]);
459 gPerm = &(s->perm[gSel][0]);
460 gBase = &(s->base[gSel][0]);
467 if (s->state == BZ_X_MAGIC_1) {
468 /*initialise the save area*/
472 s->save_alphaSize = 0;
474 s->save_nSelectors = 0;
477 s->save_groupPos = 0;
479 s->save_nblockMAX = 0;
490 s->save_gLimit = NULL;
491 s->save_gBase = NULL;
492 s->save_gPerm = NULL;
495 /*restore from the save area*/
499 alphaSize = s->save_alphaSize;
500 nGroups = s->save_nGroups;
501 nSelectors = s->save_nSelectors;
503 groupNo = s->save_groupNo;
504 groupPos = s->save_groupPos;
505 nextSym = s->save_nextSym;
506 nblockMAX = s->save_nblockMAX;
507 nblock = s->save_nblock;
516 gMinlen = s->save_gMinlen;
517 gLimit = s->save_gLimit;
518 gBase = s->save_gBase;
519 gPerm = s->save_gPerm;
522 switch_val = s->state;
523 switch (switch_val) {
525 s->state = BZ_X_MAGIC_1;
526 if (! get_bits(s, &uc, 8)) {
528 goto save_state_and_return;
531 retVal = BZ_DATA_ERROR_MAGIC;
532 goto save_state_and_return;
536 s->state = BZ_X_MAGIC_2;
537 if (! get_bits(s, &uc, 8)) {
539 goto save_state_and_return;
542 retVal = BZ_DATA_ERROR_MAGIC;
543 goto save_state_and_return;
547 s->state = BZ_X_MAGIC_3;
548 if (! get_bits(s, &uc, 8)) {
550 goto save_state_and_return;
553 retVal = BZ_DATA_ERROR_MAGIC;
554 goto save_state_and_return;
558 s->state = BZ_X_MAGIC_4;
559 if (! get_bits(s, &s->blockSize100k, 8)) {
561 goto save_state_and_return;
563 if ((s->blockSize100k < '1') || (s->blockSize100k > '9')) {
564 retVal = BZ_DATA_ERROR_MAGIC;
565 goto save_state_and_return;
567 s->blockSize100k -= '0';
569 s->tt = xmalloc(s->blockSize100k * 100000 * sizeof(int));
572 s->state = BZ_X_BLKHDR_1;
573 if (! get_bits(s, &uc, 8)) {
575 goto save_state_and_return;
582 retVal = BZ_DATA_ERROR;
583 goto save_state_and_return;
587 s->state = BZ_X_BLKHDR_2;
588 if (! get_bits(s, &uc, 8)) {
590 goto save_state_and_return;
593 retVal = BZ_DATA_ERROR;
594 goto save_state_and_return;
598 s->state = BZ_X_BLKHDR_3;
599 if (! get_bits(s, &uc, 8)) {
601 goto save_state_and_return;
604 retVal = BZ_DATA_ERROR;
605 goto save_state_and_return;
609 s->state = BZ_X_BLKHDR_4;
610 if (! get_bits(s, &uc, 8)) {
612 goto save_state_and_return;
615 retVal = BZ_DATA_ERROR;
616 goto save_state_and_return;
620 s->state = BZ_X_BLKHDR_5;
621 if (! get_bits(s, &uc, 8)) {
623 goto save_state_and_return;
626 retVal = BZ_DATA_ERROR;
627 goto save_state_and_return;
631 s->state = BZ_X_BLKHDR_6;
632 if (! get_bits(s, &uc, 8)) {
634 goto save_state_and_return;
637 retVal = BZ_DATA_ERROR;
638 goto save_state_and_return;
642 s->storedBlockCRC = 0;
645 s->state = BZ_X_BCRC_1;
646 if (! get_bits(s, &uc, 8)) {
648 goto save_state_and_return;
650 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc);
653 s->state = BZ_X_BCRC_2;
654 if (! get_bits(s, &uc, 8)) {
656 goto save_state_and_return;
658 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc);
661 s->state = BZ_X_BCRC_3;
662 if (! get_bits(s, &uc, 8)) {
664 goto save_state_and_return;
666 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc);
669 s->state = BZ_X_BCRC_4;
670 if (! get_bits(s, &uc, 8)) {
672 goto save_state_and_return;
674 s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc);
677 s->state = BZ_X_RANDBIT;
679 int tmp = s->blockRandomised;
680 const int ret = get_bits(s, &tmp, 1);
681 s->blockRandomised = tmp;
684 goto save_state_and_return;
691 s->state = BZ_X_ORIGPTR_1;
692 if (! get_bits(s, &uc, 8)) {
694 goto save_state_and_return;
696 s->origPtr = (s->origPtr << 8) | ((int)uc);
699 s->state = BZ_X_ORIGPTR_2;
700 if (! get_bits(s, &uc, 8)) {
702 goto save_state_and_return;
704 s->origPtr = (s->origPtr << 8) | ((int)uc);
707 s->state = BZ_X_ORIGPTR_3;
708 if (! get_bits(s, &uc, 8)) {
710 goto save_state_and_return;
712 s->origPtr = (s->origPtr << 8) | ((int)uc);
714 if (s->origPtr < 0) {
715 retVal = BZ_DATA_ERROR;
716 goto save_state_and_return;
718 if (s->origPtr > 10 + 100000*s->blockSize100k) {
719 retVal = BZ_DATA_ERROR;
720 goto save_state_and_return;
723 /*--- Receive the mapping table ---*/
725 for (i = 0; i < 16; i++) {
726 s->state = BZ_X_MAPPING_1;
727 if (! get_bits(s, &uc, 1)) {
729 goto save_state_and_return;
732 s->inUse16[i] = TRUE;
734 s->inUse16[i] = FALSE;
738 for (i = 0; i < 256; i++) {
742 for (i = 0; i < 16; i++) {
744 for (j = 0; j < 16; j++) {
746 s->state = BZ_X_MAPPING_2;
747 if (! get_bits(s, &uc, 1)) {
749 goto save_state_and_return;
752 s->inUse[i * 16 + j] = TRUE;
759 for (i = 0; i < 256; i++) {
761 s->seqToUnseq[s->nInUse] = i;
765 if (s->nInUse == 0) {
766 retVal = BZ_DATA_ERROR;
767 goto save_state_and_return;
769 alphaSize = s->nInUse+2;
771 /*--- Now the selectors ---*/
772 case BZ_X_SELECTOR_1:
773 s->state = BZ_X_SELECTOR_1;
774 if (! get_bits(s, &nGroups, 3)) {
776 goto save_state_and_return;
778 if (nGroups < 2 || nGroups > 6) {
779 retVal = BZ_DATA_ERROR;
780 goto save_state_and_return;
783 case BZ_X_SELECTOR_2:
784 s->state = BZ_X_SELECTOR_2;
785 if (! get_bits(s, &nSelectors, 15)) {
787 goto save_state_and_return;
789 if (nSelectors < 1) {
790 retVal = BZ_DATA_ERROR;
791 goto save_state_and_return;
796 for (i = 0; i < nSelectors; i++) {
799 case BZ_X_SELECTOR_3:
800 s->state = BZ_X_SELECTOR_3;
801 if (! get_bits(s, &uc, 1)) {
803 goto save_state_and_return;
810 retVal = BZ_DATA_ERROR;
811 goto save_state_and_return;
814 s->selectorMtf[i] = j;
817 /*--- Undo the MTF values for the selectors. ---*/
819 unsigned char pos[BZ_N_GROUPS], tmp, v;
820 for (v = 0; v < nGroups; v++) {
823 for (i = 0; i < nSelectors; i++) {
824 v = s->selectorMtf[i];
831 s->selector[i] = tmp;
835 /*--- Now the coding tables ---*/
836 for (t = 0; t < nGroups; t++) {
838 s->state = BZ_X_CODING_1;
839 if (! get_bits(s, &curr, 5)) {
841 goto save_state_and_return;
843 for (i = 0; i < alphaSize; i++) {
845 if (curr < 1 || curr > 20) {
846 retVal = BZ_DATA_ERROR;
847 goto save_state_and_return;
851 s->state = BZ_X_CODING_2;
852 if (! get_bits(s, &uc, 1)) {
854 goto save_state_and_return;
861 s->state = BZ_X_CODING_3;
862 if (! get_bits(s, &uc, 1)) {
864 goto save_state_and_return;
876 /*--- Create the Huffman decoding tables ---*/
877 for (t = 0; t < nGroups; t++) {
880 for (i = 0; i < alphaSize; i++) {
881 if (s->len[t][i] > maxLen) {
882 maxLen = s->len[t][i];
884 if (s->len[t][i] < minLen) {
885 minLen = s->len[t][i];
889 BZ2_hbCreateDecodeTables (
894 minLen, maxLen, alphaSize
898 s->minLens[t] = minLen;
901 /*--- Now the MTF values ---*/
904 nblockMAX = 100000 * s->blockSize100k;
908 for (i = 0; i <= 255; i++) {
915 for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
916 for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
917 s->mtfa[kk] = (unsigned char)(ii * MTFL_SIZE + jj);
920 s->mtfbase[ii] = kk + 1;
923 /*-- end MTF init --*/
927 if (! get_mtf_val_init()) {
928 goto save_state_and_return;
931 s->state = BZ_X_MTF_1;
932 if (! get_bits(s, &zvec, zn)) {
934 goto save_state_and_return;
937 if (zn > 20 /* the longest code */) {
938 retVal = BZ_DATA_ERROR;
939 goto save_state_and_return;
941 if (zvec <= gLimit[zn]) {
947 s->state = BZ_X_MTF_2;
948 if (! get_bits(s, &zj, 1)) {
950 goto save_state_and_return;
952 zvec = (zvec << 1) | zj;
954 if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) {
955 retVal = BZ_DATA_ERROR;
956 goto save_state_and_return;
958 nextSym = gPerm[zvec - gBase[zn]];
961 if (nextSym == EOB) {
965 if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
969 if (nextSym == BZ_RUNA) {
972 if (nextSym == BZ_RUNB) {
977 if (! get_mtf_val_init()) {
978 goto save_state_and_return;
981 s->state = BZ_X_MTF_3;
982 if (! get_bits(s, &zvec, zn)) {
984 goto save_state_and_return;
987 if (zn > 20 /* the longest code */) {
988 retVal = BZ_DATA_ERROR;
989 goto save_state_and_return;
991 if (zvec <= gLimit[zn]) {
997 s->state = BZ_X_MTF_4;
998 if (! get_bits(s, &zj, 1)) {
1000 goto save_state_and_return;
1002 zvec = (zvec << 1) | zj;
1004 if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) {
1005 retVal = BZ_DATA_ERROR;
1006 goto save_state_and_return;
1009 nextSym = gPerm[zvec - gBase[zn]];
1011 while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
1014 uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
1015 s->unzftab[uc] += es;
1018 if (nblock >= nblockMAX) {
1019 retVal = BZ_DATA_ERROR;
1020 goto save_state_and_return;
1022 s->tt[nblock] = (unsigned int)uc;
1028 if (nblock >= nblockMAX) {
1029 retVal = BZ_DATA_ERROR;
1030 goto save_state_and_return;
1032 /*-- uc = MTF ( nextSym-1 ) --*/
1034 int ii, jj, kk, pp, lno, off;
1036 nn = (unsigned int)(nextSym - 1);
1038 if (nn < MTFL_SIZE) {
1039 /* avoid general-case expense */
1041 uc = s->mtfa[pp+nn];
1044 s->mtfa[(z) ] = s->mtfa[(z)-1];
1045 s->mtfa[(z)-1] = s->mtfa[(z)-2];
1046 s->mtfa[(z)-2] = s->mtfa[(z)-3];
1047 s->mtfa[(z)-3] = s->mtfa[(z)-4];
1051 s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
1056 lno = nn / MTFL_SIZE;
1057 off = nn % MTFL_SIZE;
1058 pp = s->mtfbase[lno] + off;
1060 while (pp > s->mtfbase[lno]) {
1061 s->mtfa[pp] = s->mtfa[pp-1];
1067 s->mtfa[s->mtfbase[lno]] = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
1071 s->mtfa[s->mtfbase[0]] = uc;
1072 if (s->mtfbase[0] == 0) {
1074 for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
1075 for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
1076 s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
1079 s->mtfbase[ii] = kk + 1;
1084 /*-- end uc = MTF ( nextSym-1 ) --*/
1086 s->unzftab[s->seqToUnseq[uc]]++;
1087 s->tt[nblock] = (unsigned int)(s->seqToUnseq[uc]);
1090 if (! get_mtf_val_init()) {
1091 goto save_state_and_return;
1094 s->state = BZ_X_MTF_5;
1095 if (! get_bits(s, &zvec, zn)) {
1097 goto save_state_and_return;
1100 if (zn > 20 /* the longest code */) {
1101 retVal = BZ_DATA_ERROR;
1102 goto save_state_and_return;
1104 if (zvec <= gLimit[zn]) {
1110 s->state = BZ_X_MTF_6;
1111 if (! get_bits(s, &zj, 1)) {
1113 goto save_state_and_return;
1115 zvec = (zvec << 1) | zj;
1117 if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) {
1118 retVal = BZ_DATA_ERROR;
1119 goto save_state_and_return;
1121 nextSym = gPerm[zvec - gBase[zn]];
1126 /* Now we know what nblock is, we can do a better sanity
1127 check on s->origPtr.
1129 if (s->origPtr < 0 || s->origPtr >= nblock) {
1130 retVal = BZ_DATA_ERROR;
1131 goto save_state_and_return;
1133 s->state_out_len = 0;
1134 s->state_out_ch = 0;
1135 s->calculatedBlockCRC = 0xffffffffL;
1136 s->state = BZ_X_OUTPUT;
1138 /*-- Set up cftab to facilitate generation of T^(-1) --*/
1140 for (i = 1; i <= 256; i++) {
1141 s->cftab[i] = s->unzftab[i-1];
1143 for (i = 1; i <= 256; i++) {
1144 s->cftab[i] += s->cftab[i-1];
1147 /*-- compute the T^(-1) vector --*/
1148 for (i = 0; i < nblock; i++) {
1149 uc = (unsigned char)(s->tt[i] & 0xff);
1150 s->tt[s->cftab[uc]] |= (i << 8);
1154 s->tPos = s->tt[s->origPtr] >> 8;
1156 if (s->blockRandomised) {
1159 s->k0 = bz_get_fast(s);
1162 bz_rand_udp_mask(s);
1163 s->k0 ^= ((s->rNToGo == 1) ? 1 : 0);
1165 s->k0 = bz_get_fast(s);
1170 goto save_state_and_return;
1174 s->state = BZ_X_ENDHDR_2;
1175 if (! get_bits(s, &uc, 8)) {
1177 goto save_state_and_return;
1180 retVal = BZ_DATA_ERROR;
1181 goto save_state_and_return;
1185 s->state = BZ_X_ENDHDR_3;
1186 if (! get_bits(s, &uc, 8)) {
1188 goto save_state_and_return;
1191 retVal = BZ_DATA_ERROR;
1192 goto save_state_and_return;
1196 s->state = BZ_X_ENDHDR_4;
1197 if (! get_bits(s, &uc, 8)) {
1199 goto save_state_and_return;
1202 retVal = BZ_DATA_ERROR;
1203 goto save_state_and_return;
1207 s->state = BZ_X_ENDHDR_5;
1208 if (! get_bits(s, &uc, 8)) {
1210 goto save_state_and_return;
1213 retVal = BZ_DATA_ERROR;
1214 goto save_state_and_return;
1218 s->state = BZ_X_ENDHDR_6;
1219 if (! get_bits(s, &uc, 8)) {
1221 goto save_state_and_return;
1224 retVal = BZ_DATA_ERROR;
1225 goto save_state_and_return;
1227 s->storedCombinedCRC = 0;
1230 s->state = BZ_X_CCRC_1;
1231 if (! get_bits(s, &uc, 8)) {
1233 goto save_state_and_return;
1235 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((unsigned int)uc);
1237 s->state = BZ_X_CCRC_2;
1238 if (! get_bits(s, &uc, 8)) {
1240 goto save_state_and_return;
1242 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((unsigned int)uc);
1245 s->state = BZ_X_CCRC_3;
1246 if (! get_bits(s, &uc, 8)) {
1248 goto save_state_and_return;
1250 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((unsigned int)uc);
1253 s->state = BZ_X_CCRC_4;
1254 if (! get_bits(s, &uc, 8)) {
1256 goto save_state_and_return;
1258 s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((unsigned int)uc);
1260 s->state = BZ_X_IDLE;
1261 retVal = BZ_STREAM_END;
1262 goto save_state_and_return;
1266 save_state_and_return:
1270 s->save_alphaSize = alphaSize;
1271 s->save_nGroups = nGroups;
1272 s->save_nSelectors = nSelectors;
1274 s->save_groupNo = groupNo;
1275 s->save_groupPos = groupPos;
1276 s->save_nextSym = nextSym;
1277 s->save_nblockMAX = nblockMAX;
1278 s->save_nblock = nblock;
1281 s->save_curr = curr;
1284 s->save_zvec = zvec;
1286 s->save_gSel = gSel;
1287 s->save_gMinlen = gMinlen;
1288 s->save_gLimit = gLimit;
1289 s->save_gBase = gBase;
1290 s->save_gPerm = gPerm;
1295 //int BZ2_bzDecompressInit(bz_stream* strm, int verbosity_level, int small)
1296 static inline int BZ2_bzDecompressInit(bz_stream* strm)
1300 // if (verbosity_level < 0 || verbosity_level > 4) {
1301 // return BZ_PARAM_ERROR;
1303 s = xmalloc(sizeof(DState));
1306 s->state = BZ_X_MAGIC_1;
1309 s->calculatedCombinedCRC = 0;
1316 static void bz_seterr(int eee, int *bzerror, bzFile **bzf)
1318 if (bzerror != NULL) {
1322 (*bzf)->lastErr = eee;
1326 static void BZ2_bzReadClose(int *bzerror, void *b)
1328 bzFile* bzf = (bzFile*)b;
1330 bz_seterr(BZ_OK, bzerror, &bzf);
1332 if (bzf->initialisedOk) {
1333 bz_stream *strm = &(bzf->strm);
1339 if ((s == NULL) || (s->strm != strm)) {
1350 static void unRLE_obuf_to_output_FAST(DState *s)
1354 if (s->blockRandomised) {
1356 /* try to finish existing run */
1358 if (s->strm->avail_out == 0) {
1361 if (s->state_out_len == 0) {
1364 *((unsigned char *)(s->strm->next_out)) = s->state_out_ch;
1365 s->calculatedBlockCRC = (s->calculatedBlockCRC << 8) ^
1366 BZ2_crc32Table[(s->calculatedBlockCRC >> 24) ^
1367 ((unsigned char)s->state_out_ch)];
1369 s->strm->next_out++;
1370 s->strm->avail_out--;
1373 /* can a new run be started? */
1374 if (s->nblock_used == s->save_nblock+1) {
1377 s->state_out_len = 1;
1378 s->state_out_ch = s->k0;
1379 k1 = bz_get_fast(s);
1380 bz_rand_udp_mask(s);
1381 k1 ^= ((s->rNToGo == 1) ? 1 : 0);
1383 if (s->nblock_used == s->save_nblock+1) {
1391 s->state_out_len = 2;
1392 k1 = bz_get_fast(s);
1393 bz_rand_udp_mask(s);
1394 k1 ^= ((s->rNToGo == 1) ? 1 : 0);
1396 if (s->nblock_used == s->save_nblock+1) {
1403 s->state_out_len = 3;
1404 k1 = bz_get_fast(s);
1405 bz_rand_udp_mask(s);
1406 k1 ^= ((s->rNToGo == 1) ? 1 : 0);
1408 if (s->nblock_used == s->save_nblock+1) {
1416 k1 = bz_get_fast(s);
1417 bz_rand_udp_mask(s);
1418 k1 ^= ((s->rNToGo == 1) ? 1 : 0);
1420 s->state_out_len = ((int)k1) + 4;
1421 s->k0 = bz_get_fast(s);
1422 bz_rand_udp_mask(s);
1423 s->k0 ^= ((s->rNToGo == 1) ? 1 : 0);
1428 unsigned int c_calculatedBlockCRC = s->calculatedBlockCRC;
1429 unsigned char c_state_out_ch = s->state_out_ch;
1430 int c_state_out_len = s->state_out_len;
1431 int c_nblock_used = s->nblock_used;
1433 unsigned int *c_tt = s->tt;
1434 unsigned int c_tPos = s->tPos;
1435 char *cs_next_out = s->strm->next_out;
1436 unsigned int cs_avail_out = s->strm->avail_out;
1439 int s_save_nblockPP = s->save_nblock+1;
1442 /* try to finish existing run */
1443 if (c_state_out_len > 0) {
1445 if (cs_avail_out == 0) {
1448 if (c_state_out_len == 1) {
1451 *((unsigned char *)(cs_next_out)) = c_state_out_ch;
1452 c_calculatedBlockCRC = (c_calculatedBlockCRC << 8) ^
1453 BZ2_crc32Table[(c_calculatedBlockCRC >> 24) ^
1454 ((unsigned char)c_state_out_ch)];
1459 s_state_out_len_eq_one:
1461 if (cs_avail_out == 0) {
1462 c_state_out_len = 1;
1465 *((unsigned char *)(cs_next_out)) = c_state_out_ch;
1466 c_calculatedBlockCRC = (c_calculatedBlockCRC << 8) ^
1467 BZ2_crc32Table[(c_calculatedBlockCRC >> 24) ^
1468 ((unsigned char)c_state_out_ch)];
1473 /* can a new run be started? */
1474 if (c_nblock_used == s_save_nblockPP) {
1475 c_state_out_len = 0; goto return_notr;
1477 c_state_out_ch = c_k0;
1478 c_tPos = c_tt[c_tPos];
1479 k1 = (unsigned char)(c_tPos & 0xff);
1486 goto s_state_out_len_eq_one;
1489 if (c_nblock_used == s_save_nblockPP) {
1490 goto s_state_out_len_eq_one;
1493 c_state_out_len = 2;
1494 c_tPos = c_tt[c_tPos];
1495 k1 = (unsigned char)(c_tPos & 0xff);
1499 if (c_nblock_used == s_save_nblockPP) {
1507 c_state_out_len = 3;
1508 c_tPos = c_tt[c_tPos];
1509 k1 = (unsigned char)(c_tPos & 0xff);
1513 if (c_nblock_used == s_save_nblockPP) {
1521 c_tPos = c_tt[c_tPos];
1522 k1 = (unsigned char)(c_tPos & 0xff);
1526 c_state_out_len = ((int)k1) + 4;
1528 c_tPos = c_tt[c_tPos];
1529 c_k0 = (unsigned char)(c_tPos & 0xff);
1538 s->calculatedBlockCRC = c_calculatedBlockCRC;
1539 s->state_out_ch = c_state_out_ch;
1540 s->state_out_len = c_state_out_len;
1541 s->nblock_used = c_nblock_used;
1545 s->strm->next_out = cs_next_out;
1546 s->strm->avail_out = cs_avail_out;
1551 int BZ2_bzDecompress(bz_stream *strm)
1557 if (s->state == BZ_X_IDLE) {
1558 return BZ_SEQUENCE_ERROR;
1560 if (s->state == BZ_X_OUTPUT) {
1561 unRLE_obuf_to_output_FAST(s);
1562 if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
1563 s->calculatedBlockCRC = ~(s->calculatedBlockCRC);
1564 if (s->calculatedBlockCRC != s->storedBlockCRC) {
1565 return BZ_DATA_ERROR;
1567 s->calculatedCombinedCRC = (s->calculatedCombinedCRC << 1) | (s->calculatedCombinedCRC >> 31);
1568 s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
1569 s->state = BZ_X_BLKHDR_1;
1574 if (s->state >= BZ_X_MAGIC_1) {
1575 int r = BZ2_decompress(s);
1576 if (r == BZ_STREAM_END) {
1577 if (s->calculatedCombinedCRC != s->storedCombinedCRC) {
1578 return BZ_DATA_ERROR;
1582 if (s->state != BZ_X_OUTPUT) {
1588 return(0); /*NOTREACHED*/
1591 static inline int BZ2_bzRead(int *bzerror, void *b, void *buf, int len)
1594 bzFile *bzf = (bzFile*)b;
1596 bz_seterr(BZ_OK, bzerror, &bzf);
1599 bz_seterr(BZ_OK, bzerror, &bzf);
1603 bzf->strm.avail_out = len;
1604 bzf->strm.next_out = buf;
1607 if (ferror(bzf->handle)) {
1608 bz_seterr(BZ_IO_ERROR, bzerror, &bzf);
1611 if ((bzf->strm.avail_in == 0) && !myfeof(bzf->handle)) {
1612 n = fread(bzf->buf, sizeof(unsigned char), BZ_MAX_UNUSED, bzf->handle);
1613 if (ferror(bzf->handle)) {
1614 bz_seterr(BZ_IO_ERROR, bzerror, &bzf);
1618 bzf->strm.avail_in = bzf->bufN;
1619 bzf->strm.next_in = bzf->buf;
1622 ret = BZ2_bzDecompress(&(bzf->strm));
1624 if ((ret != BZ_OK) && (ret != BZ_STREAM_END)) {
1625 bz_seterr(ret, bzerror, &bzf);
1629 if ((ret == BZ_OK) && myfeof(bzf->handle) &&
1630 (bzf->strm.avail_in == 0) && (bzf->strm.avail_out > 0)) {
1631 bz_seterr(BZ_UNEXPECTED_EOF, bzerror, &bzf);
1635 if (ret == BZ_STREAM_END) {
1636 bz_seterr(BZ_STREAM_END, bzerror, &bzf);
1637 return(len - bzf->strm.avail_out);
1639 if (bzf->strm.avail_out == 0) {
1640 bz_seterr(BZ_OK, bzerror, &bzf);
1644 return(0); /*not reached*/
1647 static inline void *BZ2_bzReadOpen(int *bzerror, FILE *f, void *unused, int nUnused)
1649 bzFile *bzf = xmalloc(sizeof(bzFile));
1652 bz_seterr(BZ_OK, bzerror, &bzf);
1654 bzf->initialisedOk = FALSE;
1658 ret = BZ2_bzDecompressInit(&(bzf->strm));
1660 bz_seterr(ret, bzerror, &bzf);
1665 while (nUnused > 0) {
1666 bzf->buf[bzf->bufN] = *((unsigned char *)(unused)); bzf->bufN++;
1667 unused = ((void *)( 1 + ((unsigned char *)(unused)) ));
1670 bzf->strm.avail_in = bzf->bufN;
1671 bzf->strm.next_in = bzf->buf;
1673 bzf->initialisedOk = TRUE;
1677 extern unsigned char uncompressStream(FILE *zStream, FILE *stream)
1679 unsigned char unused[BZ_MAX_UNUSED];
1680 unsigned char *unusedTmp;
1681 unsigned char obuf[5000];
1694 if (ferror(stream)) {
1697 if (ferror(zStream)) {
1702 bzf = BZ2_bzReadOpen(&bzerr, zStream, unused, nUnused);
1703 if (bzf == NULL || bzerr != BZ_OK) {
1708 while (bzerr == BZ_OK) {
1709 nread = BZ2_bzRead(&bzerr, bzf, obuf, 5000);
1710 if (bzerr == BZ_DATA_ERROR_MAGIC) {
1713 if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0) {
1714 fwrite(obuf, sizeof(unsigned char), nread, stream);
1716 if (ferror(stream)) {
1720 if (bzerr != BZ_STREAM_END) {
1723 nUnused = bzf->strm.avail_in;
1724 unusedTmp = bzf->strm.next_in;
1725 bz_seterr(BZ_OK, &bzerr, &bzf);
1726 for (i = 0; i < nUnused; i++) {
1727 unused[i] = unusedTmp[i];
1729 BZ2_bzReadClose(&bzerr, bzf);
1730 if ((nUnused == 0) && myfeof(zStream)) {
1735 if (ferror(zStream)) {
1738 ret = fclose(zStream);
1742 if (ferror(stream)) {
1745 ret = fflush(stream);
1749 if (stream != stdout) {
1750 ret = fclose(stream);
1758 BZ2_bzReadClose ( &bzerr_dummy, bzf );
1762 error_msg("\n%s: I/O or other error, bailing out. "
1763 "Possible reason follows.\n", applet_name);
1764 perror(applet_name);
1767 error_msg("\n%s: Data integrity error when decompressing.\n", applet_name);
1769 case BZ_UNEXPECTED_EOF:
1770 error_msg("\n%s: Compressed file ends unexpectedly;\n\t"
1771 "perhaps it is corrupted? *Possible* reason follows.\n", applet_name);
1772 perror(applet_name);
1774 case BZ_DATA_ERROR_MAGIC:
1775 if (zStream != stdin) {
1778 if (stream != stdout) {
1781 if (streamNo == 1) {
1788 return(TRUE); /*notreached*/