style fix (stray space before ';')
[oweals/busybox.git] / archival / libunarchive / decompress_bunzip2.c
1 /* vi: set sw=4 ts=4: */
2 /* Small bzip2 deflate implementation, by Rob Landley (rob@landley.net).
3
4    Based on bzip2 decompression code by Julian R Seward (jseward@acm.org),
5    which also acknowledges contributions by Mike Burrows, David Wheeler,
6    Peter Fenwick, Alistair Moffat, Radford Neal, Ian H. Witten,
7    Robert Sedgewick, and Jon L. Bentley.
8
9    Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
10 */
11
12 /*
13         Size and speed optimizations by Manuel Novoa III  (mjn3@codepoet.org).
14
15         More efficient reading of Huffman codes, a streamlined read_bunzip()
16         function, and various other tweaks.  In (limited) tests, approximately
17         20% faster than bzcat on x86 and about 10% faster on arm.
18
19         Note that about 2/3 of the time is spent in read_unzip() reversing
20         the Burrows-Wheeler transformation.  Much of that time is delay
21         resulting from cache misses.
22
23         I would ask that anyone benefiting from this work, especially those
24         using it in commercial products, consider making a donation to my local
25         non-profit hospice organization (www.hospiceacadiana.com) in the name of
26         the woman I loved, Toni W. Hagan, who passed away Feb. 12, 2003.
27
28         Manuel
29  */
30
31 #include "libbb.h"
32 #include "unarchive.h"
33
34 /* Constants for Huffman coding */
35 #define MAX_GROUPS          6
36 #define GROUP_SIZE          50      /* 64 would have been more efficient */
37 #define MAX_HUFCODE_BITS    20      /* Longest Huffman code allowed */
38 #define MAX_SYMBOLS         258     /* 256 literals + RUNA + RUNB */
39 #define SYMBOL_RUNA         0
40 #define SYMBOL_RUNB         1
41
42 /* Status return values */
43 #define RETVAL_OK                       0
44 #define RETVAL_LAST_BLOCK               (-1)
45 #define RETVAL_NOT_BZIP_DATA            (-2)
46 #define RETVAL_UNEXPECTED_INPUT_EOF     (-3)
47 #define RETVAL_UNEXPECTED_OUTPUT_EOF    (-4)
48 #define RETVAL_DATA_ERROR               (-5)
49 #define RETVAL_OUT_OF_MEMORY            (-6)
50 #define RETVAL_OBSOLETE_INPUT           (-7)
51
52 /* Other housekeeping constants */
53 #define IOBUF_SIZE          4096
54
55 /* This is what we know about each Huffman coding group */
56 struct group_data {
57         /* We have an extra slot at the end of limit[] for a sentinal value. */
58         int limit[MAX_HUFCODE_BITS+1], base[MAX_HUFCODE_BITS], permute[MAX_SYMBOLS];
59         int minLen, maxLen;
60 };
61
62 /* Structure holding all the housekeeping data, including IO buffers and
63    memory that persists between calls to bunzip */
64
65 struct bunzip_data {
66         /* State for interrupting output loop */
67         int writeCopies, writePos, writeRunCountdown, writeCount, writeCurrent;
68
69         /* I/O tracking data (file handles, buffers, positions, etc.) */
70         int in_fd, out_fd, inbufCount, inbufPos /*, outbufPos*/;
71         unsigned char *inbuf /*,*outbuf*/;
72         unsigned inbufBitCount, inbufBits;
73
74         /* The CRC values stored in the block header and calculated from the data */
75         uint32_t headerCRC, totalCRC, writeCRC;
76
77         /* Intermediate buffer and its size (in bytes) */
78         unsigned *dbuf, dbufSize;
79
80         /* For I/O error handling */
81         jmp_buf jmpbuf;
82
83         /* Big things go last (register-relative addressing can be larger for big offsets */
84         uint32_t crc32Table[256];
85         unsigned char selectors[32768];                 /* nSelectors=15 bits */
86         struct group_data groups[MAX_GROUPS];   /* Huffman coding tables */
87 };
88 /* typedef struct bunzip_data bunzip_data; -- done in .h file */
89
90
91 /* Return the next nnn bits of input.  All reads from the compressed input
92    are done through this function.  All reads are big endian */
93
94 static unsigned get_bits(bunzip_data *bd, char bits_wanted)
95 {
96         unsigned bits = 0;
97
98         /* If we need to get more data from the byte buffer, do so.  (Loop getting
99            one byte at a time to enforce endianness and avoid unaligned access.) */
100
101         while (bd->inbufBitCount < bits_wanted) {
102
103                 /* If we need to read more data from file into byte buffer, do so */
104
105                 if (bd->inbufPos == bd->inbufCount) {
106                         /* if "no input fd" case: in_fd == -1, read fails, we jump */
107                         bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE);
108                         if (bd->inbufCount <= 0)
109                                 longjmp(bd->jmpbuf, RETVAL_UNEXPECTED_INPUT_EOF);
110                         bd->inbufPos = 0;
111                 }
112
113                 /* Avoid 32-bit overflow (dump bit buffer to top of output) */
114
115                 if (bd->inbufBitCount >= 24) {
116                         bits = bd->inbufBits & ((1 << bd->inbufBitCount) - 1);
117                         bits_wanted -= bd->inbufBitCount;
118                         bits <<= bits_wanted;
119                         bd->inbufBitCount = 0;
120                 }
121
122                 /* Grab next 8 bits of input from buffer. */
123
124                 bd->inbufBits = (bd->inbufBits<<8) | bd->inbuf[bd->inbufPos++];
125                 bd->inbufBitCount += 8;
126         }
127
128         /* Calculate result */
129
130         bd->inbufBitCount -= bits_wanted;
131         bits |= (bd->inbufBits >> bd->inbufBitCount) & ((1 << bits_wanted) - 1);
132
133         return bits;
134 }
135
136 /* Unpacks the next block and sets up for the inverse burrows-wheeler step. */
137
138 static int get_next_block(bunzip_data *bd)
139 {
140         struct group_data *hufGroup;
141         int dbufCount, nextSym, dbufSize, groupCount, *base, *limit, selector,
142                 i, j, k, t, runPos, symCount, symTotal, nSelectors, byteCount[256];
143         unsigned char uc, symToByte[256], mtfSymbol[256], *selectors;
144         unsigned *dbuf, origPtr;
145
146         dbuf = bd->dbuf;
147         dbufSize = bd->dbufSize;
148         selectors = bd->selectors;
149
150         /* Reset longjmp I/O error handling */
151
152         i = setjmp(bd->jmpbuf);
153         if (i) return i;
154
155         /* Read in header signature and CRC, then validate signature.
156            (last block signature means CRC is for whole file, return now) */
157
158         i = get_bits(bd, 24);
159         j = get_bits(bd, 24);
160         bd->headerCRC = get_bits(bd, 32);
161         if ((i == 0x177245) && (j == 0x385090)) return RETVAL_LAST_BLOCK;
162         if ((i != 0x314159) || (j != 0x265359)) return RETVAL_NOT_BZIP_DATA;
163
164         /* We can add support for blockRandomised if anybody complains.  There was
165            some code for this in busybox 1.0.0-pre3, but nobody ever noticed that
166            it didn't actually work. */
167
168         if (get_bits(bd, 1)) return RETVAL_OBSOLETE_INPUT;
169         origPtr = get_bits(bd, 24);
170         if (origPtr > dbufSize) return RETVAL_DATA_ERROR;
171
172         /* mapping table: if some byte values are never used (encoding things
173            like ascii text), the compression code removes the gaps to have fewer
174            symbols to deal with, and writes a sparse bitfield indicating which
175            values were present.  We make a translation table to convert the symbols
176            back to the corresponding bytes. */
177
178         t = get_bits(bd, 16);
179         symTotal = 0;
180         for (i = 0; i < 16; i++) {
181                 if (t & (1 << (15-i))) {
182                         k = get_bits(bd, 16);
183                         for (j = 0; j < 16; j++)
184                                 if (k & (1 << (15-j)))
185                                         symToByte[symTotal++] = (16*i) + j;
186                 }
187         }
188
189         /* How many different Huffman coding groups does this block use? */
190
191         groupCount = get_bits(bd, 3);
192         if (groupCount < 2 || groupCount > MAX_GROUPS)
193                 return RETVAL_DATA_ERROR;
194
195         /* nSelectors: Every GROUP_SIZE many symbols we select a new Huffman coding
196            group.  Read in the group selector list, which is stored as MTF encoded
197            bit runs.  (MTF=Move To Front, as each value is used it's moved to the
198            start of the list.) */
199
200         nSelectors = get_bits(bd, 15);
201         if (!nSelectors) return RETVAL_DATA_ERROR;
202         for (i = 0; i < groupCount; i++) mtfSymbol[i] = i;
203         for (i = 0; i < nSelectors; i++) {
204
205                 /* Get next value */
206
207                 for (j = 0; get_bits(bd, 1); j++)
208                         if (j>=groupCount) return RETVAL_DATA_ERROR;
209
210                 /* Decode MTF to get the next selector */
211
212                 uc = mtfSymbol[j];
213                 for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1];
214                 mtfSymbol[0] = selectors[i] = uc;
215         }
216
217         /* Read the Huffman coding tables for each group, which code for symTotal
218            literal symbols, plus two run symbols (RUNA, RUNB) */
219
220         symCount = symTotal + 2;
221         for (j = 0; j < groupCount; j++) {
222                 unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1];
223                 int minLen, maxLen, pp;
224
225                 /* Read Huffman code lengths for each symbol.  They're stored in
226                    a way similar to mtf; record a starting value for the first symbol,
227                    and an offset from the previous value for everys symbol after that.
228                    (Subtracting 1 before the loop and then adding it back at the end is
229                    an optimization that makes the test inside the loop simpler: symbol
230                    length 0 becomes negative, so an unsigned inequality catches it.) */
231
232                 t = get_bits(bd, 5) - 1;
233                 for (i = 0; i < symCount; i++) {
234                         for (;;) {
235                                 if ((unsigned)t > (MAX_HUFCODE_BITS-1))
236                                         return RETVAL_DATA_ERROR;
237
238                                 /* If first bit is 0, stop.  Else second bit indicates whether
239                                    to increment or decrement the value.  Optimization: grab 2
240                                    bits and unget the second if the first was 0. */
241
242                                 k = get_bits(bd, 2);
243                                 if (k < 2) {
244                                         bd->inbufBitCount++;
245                                         break;
246                                 }
247
248                                 /* Add one if second bit 1, else subtract 1.  Avoids if/else */
249
250                                 t += (((k+1) & 2) - 1);
251                         }
252
253                         /* Correct for the initial -1, to get the final symbol length */
254
255                         length[i] = t + 1;
256                 }
257
258                 /* Find largest and smallest lengths in this group */
259
260                 minLen = maxLen = length[0];
261                 for (i = 1; i < symCount; i++) {
262                         if (length[i] > maxLen) maxLen = length[i];
263                         else if (length[i] < minLen) minLen = length[i];
264                 }
265
266                 /* Calculate permute[], base[], and limit[] tables from length[].
267                  *
268                  * permute[] is the lookup table for converting Huffman coded symbols
269                  * into decoded symbols.  base[] is the amount to subtract from the
270                  * value of a Huffman symbol of a given length when using permute[].
271                  *
272                  * limit[] indicates the largest numerical value a symbol with a given
273                  * number of bits can have.  This is how the Huffman codes can vary in
274                  * length: each code with a value>limit[length] needs another bit.
275                  */
276
277                 hufGroup = bd->groups + j;
278                 hufGroup->minLen = minLen;
279                 hufGroup->maxLen = maxLen;
280
281                 /* Note that minLen can't be smaller than 1, so we adjust the base
282                    and limit array pointers so we're not always wasting the first
283                    entry.  We do this again when using them (during symbol decoding).*/
284
285                 base = hufGroup->base - 1;
286                 limit = hufGroup->limit - 1;
287
288                 /* Calculate permute[].  Concurently, initialize temp[] and limit[]. */
289
290                 pp = 0;
291                 for (i = minLen; i <= maxLen; i++) {
292                         temp[i] = limit[i] = 0;
293                         for (t = 0; t < symCount; t++)
294                                 if (length[t] == i)
295                                         hufGroup->permute[pp++] = t;
296                 }
297
298                 /* Count symbols coded for at each bit length */
299
300                 for (i = 0; i < symCount; i++) temp[length[i]]++;
301
302                 /* Calculate limit[] (the largest symbol-coding value at each bit
303                  * length, which is (previous limit<<1)+symbols at this level), and
304                  * base[] (number of symbols to ignore at each bit length, which is
305                  * limit minus the cumulative count of symbols coded for already). */
306
307                 pp = t = 0;
308                 for (i = minLen; i < maxLen; i++) {
309                         pp += temp[i];
310
311                         /* We read the largest possible symbol size and then unget bits
312                            after determining how many we need, and those extra bits could
313                            be set to anything.  (They're noise from future symbols.)  At
314                            each level we're really only interested in the first few bits,
315                            so here we set all the trailing to-be-ignored bits to 1 so they
316                            don't affect the value>limit[length] comparison. */
317
318                         limit[i] = (pp << (maxLen - i)) - 1;
319                         pp <<= 1;
320                         t += temp[i];
321                         base[i+1] = pp - t;
322                 }
323                 limit[maxLen+1] = INT_MAX; /* Sentinal value for reading next sym. */
324                 limit[maxLen] = pp + temp[maxLen] - 1;
325                 base[minLen] = 0;
326         }
327
328         /* We've finished reading and digesting the block header.  Now read this
329            block's Huffman coded symbols from the file and undo the Huffman coding
330            and run length encoding, saving the result into dbuf[dbufCount++]=uc */
331
332         /* Initialize symbol occurrence counters and symbol Move To Front table */
333
334         for (i = 0; i < 256; i++) {
335                 byteCount[i] = 0;
336                 mtfSymbol[i] = (unsigned char)i;
337         }
338
339         /* Loop through compressed symbols. */
340
341         runPos = dbufCount = selector = 0;
342         for (;;) {
343
344                 /* fetch next Huffman coding group from list. */
345
346                 symCount = GROUP_SIZE - 1;
347                 if (selector >= nSelectors) return RETVAL_DATA_ERROR;
348                 hufGroup = bd->groups + selectors[selector++];
349                 base = hufGroup->base - 1;
350                 limit = hufGroup->limit - 1;
351  continue_this_group:
352
353                 /* Read next Huffman-coded symbol. */
354
355                 /* Note: It is far cheaper to read maxLen bits and back up than it is
356                    to read minLen bits and then an additional bit at a time, testing
357                    as we go.  Because there is a trailing last block (with file CRC),
358                    there is no danger of the overread causing an unexpected EOF for a
359                    valid compressed file.  As a further optimization, we do the read
360                    inline (falling back to a call to get_bits if the buffer runs
361                    dry).  The following (up to got_huff_bits:) is equivalent to
362                    j = get_bits(bd, hufGroup->maxLen);
363                  */
364
365                 while (bd->inbufBitCount < hufGroup->maxLen) {
366                         if (bd->inbufPos == bd->inbufCount) {
367                                 j = get_bits(bd, hufGroup->maxLen);
368                                 goto got_huff_bits;
369                         }
370                         bd->inbufBits = (bd->inbufBits << 8) | bd->inbuf[bd->inbufPos++];
371                         bd->inbufBitCount += 8;
372                 };
373                 bd->inbufBitCount -= hufGroup->maxLen;
374                 j = (bd->inbufBits >> bd->inbufBitCount) & ((1 << hufGroup->maxLen) - 1);
375
376  got_huff_bits:
377
378                 /* Figure how how many bits are in next symbol and unget extras */
379
380                 i = hufGroup->minLen;
381                 while (j > limit[i]) ++i;
382                 bd->inbufBitCount += (hufGroup->maxLen - i);
383
384                 /* Huffman decode value to get nextSym (with bounds checking) */
385
386                 if (i > hufGroup->maxLen)
387                         return RETVAL_DATA_ERROR;
388                 j = (j >> (hufGroup->maxLen - i)) - base[i];
389                 if ((unsigned)j >= MAX_SYMBOLS)
390                         return RETVAL_DATA_ERROR;
391                 nextSym = hufGroup->permute[j];
392
393                 /* We have now decoded the symbol, which indicates either a new literal
394                    byte, or a repeated run of the most recent literal byte.  First,
395                    check if nextSym indicates a repeated run, and if so loop collecting
396                    how many times to repeat the last literal. */
397
398                 if ((unsigned)nextSym <= SYMBOL_RUNB) { /* RUNA or RUNB */
399
400                         /* If this is the start of a new run, zero out counter */
401
402                         if (!runPos) {
403                                 runPos = 1;
404                                 t = 0;
405                         }
406
407                         /* Neat trick that saves 1 symbol: instead of or-ing 0 or 1 at
408                            each bit position, add 1 or 2 instead.  For example,
409                            1011 is 1<<0 + 1<<1 + 2<<2.  1010 is 2<<0 + 2<<1 + 1<<2.
410                            You can make any bit pattern that way using 1 less symbol than
411                            the basic or 0/1 method (except all bits 0, which would use no
412                            symbols, but a run of length 0 doesn't mean anything in this
413                            context).  Thus space is saved. */
414
415                         t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */
416                         if (runPos < dbufSize) runPos <<= 1;
417                         goto end_of_huffman_loop;
418                 }
419
420                 /* When we hit the first non-run symbol after a run, we now know
421                    how many times to repeat the last literal, so append that many
422                    copies to our buffer of decoded symbols (dbuf) now.  (The last
423                    literal used is the one at the head of the mtfSymbol array.) */
424
425                 if (runPos) {
426                         runPos = 0;
427                         if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR;
428
429                         uc = symToByte[mtfSymbol[0]];
430                         byteCount[uc] += t;
431                         while (t--) dbuf[dbufCount++] = uc;
432                 }
433
434                 /* Is this the terminating symbol? */
435
436                 if (nextSym > symTotal) break;
437
438                 /* At this point, nextSym indicates a new literal character.  Subtract
439                    one to get the position in the MTF array at which this literal is
440                    currently to be found.  (Note that the result can't be -1 or 0,
441                    because 0 and 1 are RUNA and RUNB.  But another instance of the
442                    first symbol in the mtf array, position 0, would have been handled
443                    as part of a run above.  Therefore 1 unused mtf position minus
444                    2 non-literal nextSym values equals -1.) */
445
446                 if (dbufCount >= dbufSize) return RETVAL_DATA_ERROR;
447                 i = nextSym - 1;
448                 uc = mtfSymbol[i];
449
450                 /* Adjust the MTF array.  Since we typically expect to move only a
451                  * small number of symbols, and are bound by 256 in any case, using
452                  * memmove here would typically be bigger and slower due to function
453                  * call overhead and other assorted setup costs. */
454
455                 do {
456                         mtfSymbol[i] = mtfSymbol[i-1];
457                 } while (--i);
458                 mtfSymbol[0] = uc;
459                 uc = symToByte[uc];
460
461                 /* We have our literal byte.  Save it into dbuf. */
462
463                 byteCount[uc]++;
464                 dbuf[dbufCount++] = (unsigned)uc;
465
466                 /* Skip group initialization if we're not done with this group.  Done
467                  * this way to avoid compiler warning. */
468
469  end_of_huffman_loop:
470                 if (symCount--) goto continue_this_group;
471         }
472
473         /* At this point, we've read all the Huffman-coded symbols (and repeated
474            runs) for this block from the input stream, and decoded them into the
475            intermediate buffer.  There are dbufCount many decoded bytes in dbuf[].
476            Now undo the Burrows-Wheeler transform on dbuf.
477            See http://dogma.net/markn/articles/bwt/bwt.htm
478          */
479
480         /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */
481
482         j = 0;
483         for (i = 0; i < 256; i++) {
484                 k = j + byteCount[i];
485                 byteCount[i] = j;
486                 j = k;
487         }
488
489         /* Figure out what order dbuf would be in if we sorted it. */
490
491         for (i = 0; i < dbufCount; i++) {
492                 uc = (unsigned char)(dbuf[i] & 0xff);
493                 dbuf[byteCount[uc]] |= (i << 8);
494                 byteCount[uc]++;
495         }
496
497         /* Decode first byte by hand to initialize "previous" byte.  Note that it
498            doesn't get output, and if the first three characters are identical
499            it doesn't qualify as a run (hence writeRunCountdown=5). */
500
501         if (dbufCount) {
502                 if (origPtr >= dbufCount) return RETVAL_DATA_ERROR;
503                 bd->writePos = dbuf[origPtr];
504             bd->writeCurrent = (unsigned char)(bd->writePos & 0xff);
505                 bd->writePos >>= 8;
506                 bd->writeRunCountdown = 5;
507         }
508         bd->writeCount = dbufCount;
509
510         return RETVAL_OK;
511 }
512
513 /* Undo burrows-wheeler transform on intermediate buffer to produce output.
514    If start_bunzip was initialized with out_fd=-1, then up to len bytes of
515    data are written to outbuf.  Return value is number of bytes written or
516    error (all errors are negative numbers).  If out_fd!=-1, outbuf and len
517    are ignored, data is written to out_fd and return is RETVAL_OK or error.
518 */
519
520 int read_bunzip(bunzip_data *bd, char *outbuf, int len)
521 {
522         const unsigned *dbuf;
523         int pos, current, previous, gotcount;
524
525         /* If last read was short due to end of file, return last block now */
526         if (bd->writeCount < 0) return bd->writeCount;
527
528         gotcount = 0;
529         dbuf = bd->dbuf;
530         pos = bd->writePos;
531         current = bd->writeCurrent;
532
533         /* We will always have pending decoded data to write into the output
534            buffer unless this is the very first call (in which case we haven't
535            Huffman-decoded a block into the intermediate buffer yet). */
536
537         if (bd->writeCopies) {
538
539                 /* Inside the loop, writeCopies means extra copies (beyond 1) */
540
541                 --bd->writeCopies;
542
543                 /* Loop outputting bytes */
544
545                 for (;;) {
546
547                         /* If the output buffer is full, snapshot state and return */
548
549                         if (gotcount >= len) {
550                                 bd->writePos  =pos;
551                                 bd->writeCurrent = current;
552                                 bd->writeCopies++;
553                                 return len;
554                         }
555
556                         /* Write next byte into output buffer, updating CRC */
557
558                         outbuf[gotcount++] = current;
559                         bd->writeCRC = (bd->writeCRC << 8)
560                                                   ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current];
561
562                         /* Loop now if we're outputting multiple copies of this byte */
563
564                         if (bd->writeCopies) {
565                                 --bd->writeCopies;
566                                 continue;
567                         }
568  decode_next_byte:
569                         if (!bd->writeCount--) break;
570                         /* Follow sequence vector to undo Burrows-Wheeler transform */
571                         previous = current;
572                         pos = dbuf[pos];
573                         current = pos & 0xff;
574                         pos >>= 8;
575
576                         /* After 3 consecutive copies of the same byte, the 4th is a repeat
577                            count.  We count down from 4 instead
578                          * of counting up because testing for non-zero is faster */
579
580                         if (--bd->writeRunCountdown) {
581                                 if (current != previous)
582                                         bd->writeRunCountdown = 4;
583                         } else {
584
585                                 /* We have a repeated run, this byte indicates the count */
586
587                                 bd->writeCopies = current;
588                                 current = previous;
589                                 bd->writeRunCountdown = 5;
590
591                                 /* Sometimes there are just 3 bytes (run length 0) */
592
593                                 if (!bd->writeCopies) goto decode_next_byte;
594
595                                 /* Subtract the 1 copy we'd output anyway to get extras */
596
597                                 --bd->writeCopies;
598                         }
599                 }
600
601                 /* Decompression of this block completed successfully */
602
603                 bd->writeCRC = ~bd->writeCRC;
604                 bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bd->writeCRC;
605
606                 /* If this block had a CRC error, force file level CRC error. */
607
608                 if (bd->writeCRC != bd->headerCRC) {
609                         bd->totalCRC = bd->headerCRC+1;
610                         return RETVAL_LAST_BLOCK;
611                 }
612         }
613
614         /* Refill the intermediate buffer by Huffman-decoding next block of input */
615         /* (previous is just a convenient unused temp variable here) */
616
617         previous = get_next_block(bd);
618         if (previous) {
619                 bd->writeCount = previous;
620                 return (previous != RETVAL_LAST_BLOCK) ? previous : gotcount;
621         }
622         bd->writeCRC = ~0;
623         pos = bd->writePos;
624         current = bd->writeCurrent;
625         goto decode_next_byte;
626 }
627
628
629 /* Allocate the structure, read file header.  If in_fd==-1, inbuf must contain
630    a complete bunzip file (len bytes long).  If in_fd!=-1, inbuf and len are
631    ignored, and data is read from file handle into temporary buffer. */
632
633 /* Because bunzip2 is used for help text unpacking, and because bb_show_usage()
634    should work for NOFORK applets too, we must be extremely careful to not leak
635    any allocations! */
636
637 int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
638                                                 int len)
639 {
640         bunzip_data *bd;
641         unsigned i;
642         enum {
643                 BZh0 = ('B' << 24) + ('Z' << 16) + ('h' << 8) + '0'
644         };
645
646         /* Figure out how much data to allocate */
647
648         i = sizeof(bunzip_data);
649         if (in_fd != -1) i += IOBUF_SIZE;
650
651         /* Allocate bunzip_data.  Most fields initialize to zero. */
652
653         bd = *bdp = xzalloc(i);
654
655         /* Setup input buffer */
656
657         bd->in_fd = in_fd;
658         if (-1 == in_fd) {
659                 /* in this case, bd->inbuf is read-only */
660                 bd->inbuf = (void*)inbuf; /* cast away const-ness */
661                 bd->inbufCount = len;
662         } else
663                 bd->inbuf = (unsigned char *)(bd + 1);
664
665         /* Init the CRC32 table (big endian) */
666
667         crc32_filltable(bd->crc32Table, 1);
668
669         /* Setup for I/O error handling via longjmp */
670
671         i = setjmp(bd->jmpbuf);
672         if (i) return i;
673
674         /* Ensure that file starts with "BZh['1'-'9']." */
675
676         i = get_bits(bd, 32);
677         if ((unsigned)(i - BZh0 - 1) >= 9) return RETVAL_NOT_BZIP_DATA;
678
679         /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of
680            uncompressed data.  Allocate intermediate buffer for block. */
681
682         bd->dbufSize = 100000 * (i - BZh0);
683
684         /* Cannot use xmalloc - may leak bd in NOFORK case! */
685         bd->dbuf = malloc_or_warn(bd->dbufSize * sizeof(int));
686         if (!bd->dbuf) {
687                 free(bd);
688                 xfunc_die();
689         }
690         return RETVAL_OK;
691 }
692
693 void dealloc_bunzip(bunzip_data *bd)
694 {
695         free(bd->dbuf);
696         free(bd);
697 }
698
699
700 /* Decompress src_fd to dst_fd.  Stops at end of bzip data, not end of file. */
701
702 USE_DESKTOP(long long) int
703 unpack_bz2_stream(int src_fd, int dst_fd)
704 {
705         USE_DESKTOP(long long total_written = 0;)
706         char *outbuf;
707         bunzip_data *bd;
708         int i;
709
710         outbuf = xmalloc(IOBUF_SIZE);
711         i = start_bunzip(&bd, src_fd, NULL, 0);
712         if (!i) {
713                 for (;;) {
714                         i = read_bunzip(bd, outbuf, IOBUF_SIZE);
715                         if (i <= 0) break;
716                         if (i != safe_write(dst_fd, outbuf, i)) {
717                                 i = RETVAL_UNEXPECTED_OUTPUT_EOF;
718                                 break;
719                         }
720                         USE_DESKTOP(total_written += i;)
721                 }
722         }
723
724         /* Check CRC and release memory */
725
726         if (i == RETVAL_LAST_BLOCK) {
727                 if (bd->headerCRC != bd->totalCRC) {
728                         bb_error_msg("data integrity error when decompressing");
729                 } else {
730                         i = RETVAL_OK;
731                 }
732         } else if (i == RETVAL_UNEXPECTED_OUTPUT_EOF) {
733                 bb_error_msg("compressed file ends unexpectedly");
734         } else {
735                 bb_error_msg("decompression failed");
736         }
737         dealloc_bunzip(bd);
738         free(outbuf);
739
740         return i ? i : USE_DESKTOP(total_written) + 0;
741 }
742
743 #ifdef TESTING
744
745 static char *const bunzip_errors[] = {
746         NULL, "Bad file checksum", "Not bzip data",
747         "Unexpected input EOF", "Unexpected output EOF", "Data error",
748         "Out of memory", "Obsolete (pre 0.9.5) bzip format not supported"
749 };
750
751 /* Dumb little test thing, decompress stdin to stdout */
752 int main(int argc, char **argv)
753 {
754         int i = unpack_bz2_stream(0, 1);
755         char c;
756
757         if (i < 0)
758                 fprintf(stderr,"%s\n", bunzip_errors[-i]);
759         else if (read(0, &c, 1))
760                 fprintf(stderr,"Trailing garbage ignored\n");
761         return -i;
762 }
763 #endif