X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=inflate.c;h=75353e2d72b50f0fb48d51a5ef6498d324dbf901;hb=6701dbd4a272e4a185cc69b2412da7d1c568f845;hp=cfb0d57b5eb883ddf37d248d7779e011382f2a61;hpb=8ba3484138b5d1e72fd4ef49d27159263cb6bea6;p=debian%2Fgzip diff --git a/inflate.c b/inflate.c index cfb0d57..75353e2 100644 --- a/inflate.c +++ b/inflate.c @@ -1,21 +1,21 @@ /* Inflate deflated data - Copyright (C) 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + Copyright (C) 1997-1999, 2002, 2006, 2009-2010 Free Software Foundation, + Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. - If not, write to the Free Software Foundation, - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Not copyrighted 1992 by Mark Adler version c10p1, 10 January 1993 */ @@ -62,7 +62,7 @@ chunks), otherwise the dynamic method is used. In the latter case, the codes are customized to the probabilities in the current block, and so can code it much better than the pre-determined fixed codes. - + The Huffman codes themselves are decoded using a multi-level table lookup, in order to maximize the speed of decoding plus the speed of building the decoding tables. See the comments below that precede the @@ -115,16 +115,10 @@ the two sets of lengths. */ -#ifdef RCSID -static char rcsid[] = "$Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp $"; -#endif - #include #include "tailor.h" -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include -#endif +#include #include "gzip.h" #define slide window @@ -193,7 +187,7 @@ static ush cpdext[] = { /* Extra bits for distance codes */ /* Macros for inflate() bit peeking and grabbing. The usage is: - + NEEDBITS(j) x = b & mask_bits[j]; DUMPBITS(j) @@ -328,16 +322,25 @@ int *m; /* maximum lookup bits, returns actual */ memzero(c, sizeof(c)); p = b; i = n; do { - Tracecv(*p, (stderr, (n-i >= ' ' && n-i <= '~' ? "%c %d\n" : "0x%x %d\n"), + Tracecv(*p, (stderr, (n-i >= ' ' && n-i <= '~' ? "%c %d\n" : "0x%x %d\n"), n-i, *p)); c[*p]++; /* assume all entries <= BMAX */ p++; /* Can't combine with above line (Solaris bug) */ } while (--i); if (c[0] == n) /* null input--all zero length codes */ { - *t = (struct huft *)NULL; - *m = 0; - return 2; + q = (struct huft *) malloc (3 * sizeof *q); + if (!q) + return 3; + hufts += 3; + q[0].v.t = (struct huft *) NULL; + q[1].e = 99; /* invalid code marker */ + q[1].b = 1; + q[2].e = 99; /* invalid code marker */ + q[2].b = 1; + *t = q + 1; + *m = 1; + return 0; } @@ -503,9 +506,9 @@ struct huft *t; /* table to free */ while (p != (struct huft *)NULL) { q = (--p)->v.t; - free((char*)p); + free(p); p = q; - } + } return 0; } @@ -586,7 +589,8 @@ int bl, bd; /* number of bits decoded by tl[] and td[] */ do { n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); #if !defined(NOMEMCPY) && !defined(DEBUG) - if (w - d >= e) /* (this test assumes unsigned comparison) */ + unsigned int delta = w > d ? w - d : d - w; + if (delta >= e) { memcpy(slide + w, slide + d, e); w += e; @@ -856,7 +860,7 @@ int inflate_dynamic() if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) { if (i == 1) { - fprintf(stderr, " incomplete literal tree\n"); + Trace ((stderr, " incomplete literal tree\n")); huft_free(tl); } return i; /* incomplete code set */ @@ -865,7 +869,7 @@ int inflate_dynamic() if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) { if (i == 1) { - fprintf(stderr, " incomplete distance tree\n"); + Trace ((stderr, " incomplete distance tree\n")); #ifdef PKZIP_BUG_WORKAROUND i = 0; } @@ -878,15 +882,16 @@ int inflate_dynamic() } - /* decompress until an end-of-block code */ - if (inflate_codes(tl, td, bl, bd)) - return 1; + { + /* decompress until an end-of-block code */ + int err = inflate_codes(tl, td, bl, bd) ? 1 : 0; + /* free the decoding tables */ + huft_free(tl); + huft_free(td); - /* free the decoding tables, return */ - huft_free(tl); - huft_free(td); - return 0; + return err; + } } @@ -976,8 +981,6 @@ int inflate() /* return success */ -#ifdef DEBUG - fprintf(stderr, "<%u> ", h); -#endif /* DEBUG */ + Trace ((stderr, "<%u> ", h)); return 0; }