diff options
Diffstat (limited to 'archival/libunarchive')
-rw-r--r-- | archival/libunarchive/decompress_uncompress.c | 98 |
1 files changed, 49 insertions, 49 deletions
diff --git a/archival/libunarchive/decompress_uncompress.c b/archival/libunarchive/decompress_uncompress.c index ba73f11..8c3c65d 100644 --- a/archival/libunarchive/decompress_uncompress.c +++ b/archival/libunarchive/decompress_uncompress.c @@ -7,7 +7,6 @@ * (see disclaimer below) */ - /* (N)compress42.c - File compression ala IEEE Computer, Mar 1992. * * Authors: @@ -34,53 +33,48 @@ #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) { USE_DESKTOP(long long total_written = 0;) + USE_DESKTOP(long long) int retval = -1; unsigned char *stackp; long code; int finchar; @@ -96,10 +90,10 @@ uncompress(int fd_in, int fd_out) 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 */ @@ -107,8 +101,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; @@ -116,7 +112,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; @@ -125,8 +121,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; @@ -140,7 +136,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; @@ -232,7 +228,7 @@ uncompress(int fd_in, int fd_out) insize, posbits, p[-1], p[0], p[1], p[2], p[3], (posbits & 07)); bb_error_msg("uncompress: corrupt input"); - return -1; + goto err; } *--stackp = (unsigned char) finchar; @@ -299,7 +295,11 @@ uncompress(int fd_in, int fd_out) USE_DESKTOP(total_written += outpos;) } - RELEASE_CONFIG_BUFFER(inbuf); - RELEASE_CONFIG_BUFFER(outbuf); - return USE_DESKTOP(total_written) + 0; + retval = USE_DESKTOP(total_written) + 0; + err: + free(inbuf); + free(outbuf); + free(htab); + free(codetab); + return retval; } |