summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/pdftexdir/writezip.c
diff options
context:
space:
mode:
authorMartin Schröder <martin@oneiros.de>2007-07-11 21:13:59 +0000
committerMartin Schröder <martin@oneiros.de>2007-07-11 21:13:59 +0000
commit7bf56e6bfcd7b204b3507dc9acaaaa3dce2cbcdb (patch)
tree5f8b4be4a21dc917441e4d2a1ec3e6fe25fd0192 /Build/source/texk/web2c/pdftexdir/writezip.c
parentc0da09fd6e4a542610245624c185a66f5ec814b2 (diff)
Imported pdftex 1.40.4
git-svn-id: svn://tug.org/texlive/trunk@4561 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/writezip.c')
-rw-r--r--Build/source/texk/web2c/pdftexdir/writezip.c53
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);
+ }
+}