*: whitespace fixes
[oweals/busybox.git] / archival / libunarchive / decompress_uncompress.c
index 8ce3cba748c8322d6632d77dbe0fb221eb1a87c4..285b4efeb7b64df236ad6faaff5ba1715a2cba0f 100644 (file)
@@ -1,13 +1,10 @@
 /* vi: set sw=4 ts=4: */
-#include "libbb.h"
-
 /* uncompress for busybox -- (c) 2002 Robert Griebl
  *
  * based on the original compress42.c source
  * (see disclaimer below)
  */
 
-
 /* (N)compress42.c - File compression ala IEEE Computer, Mar 1992.
  *
  * Authors:
  * [... History snipped ...]
  *
  */
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
+
+#include "libbb.h"
+#include "unarchive.h"
+
 
 /* Default input buffer size */
-#define        IBUFSIZ 2048
+#define IBUFSIZ 2048
 
 /* Default output buffer size */
-#define        OBUFSIZ 2048
+#define OBUFSIZ 2048
 
 /* Defines for third byte of header */
-#define        MAGIC_1         (char_type)'\037'       /* First byte of compressed file               */
-#define        MAGIC_2         (char_type)'\235'       /* Second byte of compressed file              */
-#define BIT_MASK       0x1f    /* Mask for 'number of compresssion bits'       */
-                                                       /* Masks 0x20 and 0x40 are free.                */
-                                                       /* I think 0x20 should mean that there is       */
-                                                       /* a fourth header byte (for expansion).        */
-#define BLOCK_MODE     0x80    /* Block compresssion if table is full and      */
-                       /* compression rate is dropping flush tables    */
-                       /* the next two codes should not be changed lightly, as they must not   */
-                       /* lie within the contiguous general code space.                        */
-#define FIRST  257             /* first free entry                             */
-#define        CLEAR   256             /* table clear output code                      */
-
-#define INIT_BITS 9            /* initial number of bits/code */
-
+#define BIT_MASK        0x1f    /* Mask for 'number of compresssion bits'       */
+                                /* Masks 0x20 and 0x40 are free.                */
+                                /* I think 0x20 should mean that there is       */
+                                /* a fourth header byte (for expansion).        */
+#define BLOCK_MODE      0x80    /* Block compression if table is full and       */
+                                /* compression rate is dropping flush tables    */
+                                /* the next two codes should not be changed lightly, as they must not   */
+                                /* lie within the contiguous general code space.                        */
+#define FIRST   257     /* first free entry */
+#define CLEAR   256     /* table clear output code */
 
-/* machine variants which require cc -Dmachine:  pdp11, z8000, DOS */
-#define FAST
+#define INIT_BITS 9     /* initial number of bits/code */
 
-#define        HBITS           17      /* 50% occupancy */
-#define        HSIZE      (1<<HBITS)
-#define        HMASK      (HSIZE-1)
-#define        HPRIME           9941
-#define        BITS               16
-#undef MAXSEG_64K
-#define MAXCODE(n)     (1L << (n))
-
-#define        htabof(i)                               htab[i]
-#define        codetabof(i)                    codetab[i]
-#define        tab_prefixof(i)                 codetabof(i)
-#define        tab_suffixof(i)                 ((unsigned char *)(htab))[i]
-#define        de_stack                                ((unsigned char *)&(htab[HSIZE-1]))
-#define        clear_htab()                    memset(htab, -1, HSIZE)
-#define        clear_tab_prefixof()    memset(codetab, 0, 256);
 
+/* machine variants which require cc -Dmachine:  pdp11, z8000, DOS */
+#define HBITS      17   /* 50% occupancy */
+#define HSIZE      (1<<HBITS)
+#define HMASK      (HSIZE-1)    /* unused */
+#define HPRIME     9941         /* unused */
+#define BITS       16
+#define BITS_STR   "16"
+#undef  MAXSEG_64K              /* unused */
+#define MAXCODE(n) (1L << (n))
+
+#define htabof(i)               htab[i]
+#define codetabof(i)            codetab[i]
+#define tab_prefixof(i)         codetabof(i)
+#define tab_suffixof(i)         ((unsigned char *)(htab))[i]
+#define de_stack                ((unsigned char *)&(htab[HSIZE-1]))
+#define clear_tab_prefixof()    memset(codetab, 0, 256)
 
 /*
  * Decompress stdin to stdout.  This routine adapts to the codes in the
  * file building the "string" table on-the-fly; requiring no table to
- * be stored in the compressed file.  The tables used herein are shared
- * with those of the compress() routine.  See the definitions above.
+ * be stored in the compressed file.
  */
 
-USE_DESKTOP(long long) int
-uncompress(int fd_in, int fd_out)
+IF_DESKTOP(long long) int FAST_FUNC
+unpack_Z_stream(int fd_in, int fd_out)
 {
-       USE_DESKTOP(long long total_written = 0;)
+       IF_DESKTOP(long long total_written = 0;)
+       IF_DESKTOP(long long) int retval = -1;
        unsigned char *stackp;
-       long int code;
+       long code;
        int finchar;
-       long int oldcode;
-       long int incode;
+       long oldcode;
+       long incode;
        int inbits;
        int posbits;
        int outpos;
        int insize;
        int bitmask;
-       long int free_ent;
-       long int maxcode;
-       long int maxmaxcode;
+       long free_ent;
+       long maxcode;
+       long maxmaxcode;
        int n_bits;
        int rsize = 0;
-       RESERVE_CONFIG_UBUFFER(inbuf, IBUFSIZ + 64);
-       RESERVE_CONFIG_UBUFFER(outbuf, OBUFSIZ + 2048);
-       unsigned char htab[HSIZE];
-       unsigned short codetab[HSIZE];
+       unsigned char *inbuf; /* were eating insane amounts of stack - */
+       unsigned char *outbuf; /* bad for some embedded targets */
+       unsigned char *htab;
+       unsigned short *codetab;
 
        /* Hmm, these were statics - why?! */
        /* user settable max # bits/code */
@@ -110,8 +103,10 @@ uncompress(int fd_in, int fd_out)
        /* block compress mode -C compatible with 2.0 */
        int block_mode; /* = BLOCK_MODE; */
 
-       memset(inbuf, 0, IBUFSIZ + 64);
-       memset(outbuf, 0, OBUFSIZ + 2048);
+       inbuf = xzalloc(IBUFSIZ + 64);
+       outbuf = xzalloc(OBUFSIZ + 2048);
+       htab = xzalloc(HSIZE);  /* wsn't zeroed out before, maybe can xmalloc? */
+       codetab = xzalloc(HSIZE * sizeof(codetab[0]));
 
        insize = 0;
 
@@ -119,7 +114,7 @@ uncompress(int fd_in, int fd_out)
         * to do some cleanup (e.g. delete incomplete unpacked file etc) */
        if (full_read(fd_in, inbuf, 1) != 1) {
                bb_error_msg("short read");
-               return -1;
+               goto err;
        }
 
        maxbits = inbuf[0] & BIT_MASK;
@@ -128,8 +123,8 @@ uncompress(int fd_in, int fd_out)
 
        if (maxbits > BITS) {
                bb_error_msg("compressed with %d bits, can only handle "
-                               "%d bits", maxbits, BITS);
-               return -1;
+                               BITS_STR" bits", maxbits);
+               goto err;
        }
 
        n_bits = INIT_BITS;
@@ -143,7 +138,7 @@ uncompress(int fd_in, int fd_out)
        free_ent = ((block_mode) ? FIRST : 256);
 
        /* As above, initialize the first 256 entries in the table. */
-       clear_tab_prefixof();
+       /*clear_tab_prefixof(); - done by xzalloc */
 
        for (code = 255; code >= 0; --code) {
                tab_suffixof(code) = (unsigned char) code;
@@ -234,8 +229,8 @@ uncompress(int fd_in, int fd_out)
                                                ("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)",
                                                 insize, posbits, p[-1], p[0], p[1], p[2], p[3],
                                                 (posbits & 07));
-                                       bb_error_msg("uncompress: corrupt input");
-                                       return -1;
+                                       bb_error_msg("corrupted data");
+                                       goto err;
                                }
 
                                *--stackp = (unsigned char) finchar;
@@ -243,7 +238,7 @@ uncompress(int fd_in, int fd_out)
                        }
 
                        /* Generate output characters in reverse order */
-                       while ((long int) code >= (long int) 256) {
+                       while ((long) code >= (long) 256) {
                                *--stackp = tab_suffixof(code);
                                code = tab_prefixof(code);
                        }
@@ -270,7 +265,7 @@ uncompress(int fd_in, int fd_out)
                                                if (outpos >= OBUFSIZ) {
                                                        full_write(fd_out, outbuf, outpos);
 //error check??
-                                                       USE_DESKTOP(total_written += outpos;)
+                                                       IF_DESKTOP(total_written += outpos;)
                                                        outpos = 0;
                                                }
                                                stackp += i;
@@ -299,10 +294,14 @@ uncompress(int fd_in, int fd_out)
        if (outpos > 0) {
                full_write(fd_out, outbuf, outpos);
 //error check??
-               USE_DESKTOP(total_written += outpos;)
+               IF_DESKTOP(total_written += outpos;)
        }
 
-       RELEASE_CONFIG_BUFFER(inbuf);
-       RELEASE_CONFIG_BUFFER(outbuf);
-       return USE_DESKTOP(total_written) + 0;
+       retval = IF_DESKTOP(total_written) + 0;
+ err:
+       free(inbuf);
+       free(outbuf);
+       free(htab);
+       free(codetab);
+       return retval;
 }