diff options
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/writezip.c')
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/writezip.c | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/writezip.c b/Build/source/texk/web2c/pdftexdir/writezip.c index a24d7fffdd1..0ae328dd316 100644 --- a/Build/source/texk/web2c/pdftexdir/writezip.c +++ b/Build/source/texk/web2c/pdftexdir/writezip.c @@ -1,5 +1,5 @@ /* -Copyright (c) 1996-2002 Han The Thanh, <thanh@pdftex.org> +Copyright (c) 1996-2007 Han The Thanh, <thanh@pdftex.org> This file is part of pdfTeX. @@ -13,11 +13,11 @@ 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. -You should have received a copy of the GNU General Public License -along with pdfTeX; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +You should have received a copy of the GNU General Public License along +with pdfTeX; if not, write to the Free Software Foundation, Inc., 51 +Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -$Id: writezip.c,v 1.2 2006/01/14 20:35:43 hahe Exp $ +$Id: writezip.c 200 2007-07-11 13:11:12Z oneiros $ */ #include "ptexlib.h" @@ -26,26 +26,42 @@ $Id: writezip.c,v 1.2 2006/01/14 20:35:43 hahe Exp $ #define ZIP_BUF_SIZE 32768 -#define check_err(f, fn) \ - if (f != Z_OK) \ - pdftex_fail("zlib: %s() failed", fn) +#define check_err(f, fn) \ + if (f != Z_OK) \ + pdftex_fail("zlib: %s() failed (error code %d)", fn, f) -static char zipbuf[ZIP_BUF_SIZE]; +static char *zipbuf = NULL; static z_stream c_stream; /* compression stream */ void writezip(boolean finish) { int err; - assert(getpdfcompresslevel() > 0); + static int level_old = 0; + int level = getpdfcompresslevel(); + assert(level > 0); cur_file_name = NULL; if (pdfstreamlength == 0) { - c_stream.zalloc = (alloc_func) 0; - c_stream.zfree = (free_func) 0; - c_stream.opaque = (voidpf) 0; - check_err(deflateInit(&c_stream, getpdfcompresslevel()), "deflateInit"); + if (zipbuf == NULL) { + zipbuf = xtalloc(ZIP_BUF_SIZE, char); + c_stream.zalloc = (alloc_func) 0; + c_stream.zfree = (free_func) 0; + c_stream.opaque = (voidpf) 0; + check_err(deflateInit(&c_stream, level), "deflateInit"); + } else { + if (level != level_old) { /* \pdfcompresslevel change in mid document */ + check_err(deflateEnd(&c_stream), "deflateEnd"); + c_stream.zalloc = (alloc_func) 0; /* these 3 lines no need, just to be safe */ + c_stream.zfree = (free_func) 0; + c_stream.opaque = (voidpf) 0; + check_err(deflateInit(&c_stream, level), "deflateInit"); + } else + check_err(deflateReset(&c_stream), "deflateReset"); + } + level_old = level; c_stream.next_out = (Bytef *) zipbuf; c_stream.avail_out = ZIP_BUF_SIZE; } + assert(zipbuf != NULL); c_stream.next_in = pdfbuf; c_stream.avail_in = pdfptr; for (;;) { @@ -68,8 +84,15 @@ void writezip(boolean finish) xfwrite(zipbuf, 1, ZIP_BUF_SIZE - c_stream.avail_out, pdffile); pdflastbyte = zipbuf[ZIP_BUF_SIZE - c_stream.avail_out - 1]; } - check_err(deflateEnd(&c_stream), "deflateEnd"); xfflush(pdffile); } pdfstreamlength = c_stream.total_out; } + +void zip_free(void) +{ + if (zipbuf != NULL) { + check_err(deflateEnd(&c_stream), "deflateEnd"); + free(zipbuf); + } +} |