RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: zlib/ ChangeLog README zlib/amiga/ Makefile.sas zlib/as400/...

From: Anders F. Björklund <afb@rpm5.org>
Date: Fri 16 Nov 2007 - 20:51:25 CET
Message-Id: <20071116195125.8B2DD34845B@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Anders F. Björklund
  Root:   /v/rpm/cvs                       Email:  afb@rpm5.org
  Module: zlib                             Date:   16-Nov-2007 20:51:25
  Branch: HEAD                             Handle: 2007111619511708

  Added files:
    zlib/contrib/vstudio/vc7
                            testzlib.vcproj
    zlib/contrib/vstudio/vc8
                            miniunz.vcproj minizip.vcproj testzlib.vcproj
                            testzlibdll.vcproj zlib.rc zlibstat.vcproj
                            zlibvc.def zlibvc.sln zlibvc.vcproj
  Modified files:
    zlib                    ChangeLog README configure.ac deflate.c inftrees.c
                            make_vms.com zlib.3 zlib.h
    zlib/amiga              Makefile.sas
    zlib/as400              compile.clp readme.txt zlib.inc
    zlib/contrib/asm586     match.S
    zlib/contrib/asm686     match.S
    zlib/contrib/delphi     ZLib.pas
    zlib/contrib/dotzlib/DotZLib
                            UnitTests.cs
    zlib/contrib/infback9   inftree9.c inftree9.h
    zlib/contrib/masmx64    gvmat64.asm
    zlib/contrib/minizip    ChangeLogUnzip crypt.h ioapi.c ioapi.h iowin32.c
                            iowin32.h miniunz.c minizip.c mztools.c mztools.h
                            unzip.c unzip.h zip.c zip.h
    zlib/contrib/pascal     zlibpas.pas
    zlib/contrib/testzlib   testzlib.c
    zlib/contrib/vstudio    readme.txt
    zlib/contrib/vstudio/vc7
                            miniunz.vcproj minizip.vcproj zlib.rc
                            zlibstat.vcproj zlibvc.def zlibvc.sln
                            zlibvc.vcproj
    zlib/old                Makefile.riscos
    zlib/qnx                package.qpg
    zlib/win32              zlib1.rc

  Log:
    upgrade internal rsyncable zlib, from 1.2.2.4 to 1.2.3

  Summary:
    Revision    Changes     Path
    1.8         +5  -0      zlib/ChangeLog
    1.8         +2  -2      zlib/README
    1.4         +1  -1      zlib/amiga/Makefile.sas
    1.3         +1  -1      zlib/as400/compile.clp
    1.3         +1  -1      zlib/as400/readme.txt
    1.6         +3  -3      zlib/as400/zlib.inc
    1.11        +1  -1      zlib/configure.ac
    1.3         +364 -364   zlib/contrib/asm586/match.S
    1.3         +329 -329   zlib/contrib/asm686/match.S
    1.4         +1  -1      zlib/contrib/delphi/ZLib.pas
    1.2         +1  -1      zlib/contrib/dotzlib/DotZLib/UnitTests.cs
    1.6         +3  -3      zlib/contrib/infback9/inftree9.c
    1.2         +4  -4      zlib/contrib/infback9/inftree9.h
    1.2         +104 -55    zlib/contrib/masmx64/gvmat64.asm
    1.6         +67 -67     zlib/contrib/minizip/ChangeLogUnzip
    1.5         +132 -132   zlib/contrib/minizip/crypt.h
    1.6         +177 -177   zlib/contrib/minizip/ioapi.c
    1.5         +75 -75     zlib/contrib/minizip/ioapi.h
    1.5         +270 -270   zlib/contrib/minizip/iowin32.c
    1.5         +21 -21     zlib/contrib/minizip/iowin32.h
    1.7         +585 -585   zlib/contrib/minizip/miniunz.c
    1.6         +420 -420   zlib/contrib/minizip/minizip.c
    1.3         +281 -281   zlib/contrib/minizip/mztools.c
    1.3         +31 -31     zlib/contrib/minizip/mztools.h
    1.7         +1598 -1598 zlib/contrib/minizip/unzip.c
    1.6         +354 -354   zlib/contrib/minizip/unzip.h
    1.7         +1219 -1219 zlib/contrib/minizip/zip.c
    1.6         +235 -235   zlib/contrib/minizip/zip.h
    1.3         +1  -1      zlib/contrib/pascal/zlibpas.pas
    1.4         +25 -8      zlib/contrib/testzlib/testzlib.c
    1.4         +29 -11     zlib/contrib/vstudio/readme.txt
    1.2         +4  -2      zlib/contrib/vstudio/vc7/miniunz.vcproj
    1.2         +4  -2      zlib/contrib/vstudio/vc7/minizip.vcproj
    1.1         +126 -0     zlib/contrib/vstudio/vc7/testzlib.vcproj
    1.6         +3  -3      zlib/contrib/vstudio/vc7/zlib.rc
    1.2         +21 -17     zlib/contrib/vstudio/vc7/zlibstat.vcproj
    1.2         +2  -2      zlib/contrib/vstudio/vc7/zlibvc.def
    1.2         +12 -0      zlib/contrib/vstudio/vc7/zlibvc.sln
    1.2         +42 -33     zlib/contrib/vstudio/vc7/zlibvc.vcproj
    1.1         +566 -0     zlib/contrib/vstudio/vc8/miniunz.vcproj
    1.1         +563 -0     zlib/contrib/vstudio/vc8/minizip.vcproj
    1.1         +948 -0     zlib/contrib/vstudio/vc8/testzlib.vcproj
    1.1         +567 -0     zlib/contrib/vstudio/vc8/testzlibdll.vcproj
    1.1         +32 -0      zlib/contrib/vstudio/vc8/zlib.rc
    1.1         +870 -0     zlib/contrib/vstudio/vc8/zlibstat.vcproj
    1.1         +92 -0      zlib/contrib/vstudio/vc8/zlibvc.def
    1.1         +144 -0     zlib/contrib/vstudio/vc8/zlibvc.sln
    1.1         +1219 -0    zlib/contrib/vstudio/vc8/zlibvc.vcproj
    1.23        +1  -1      zlib/deflate.c
    1.22        +2  -2      zlib/inftrees.c
    1.3         +34 -34     zlib/make_vms.com
    1.2         +9  -9      zlib/old/Makefile.riscos
    1.6         +8  -8      zlib/qnx/package.qpg
    1.6         +4  -4      zlib/win32/zlib1.rc
    1.8         +2  -2      zlib/zlib.3
    1.32        +3  -3      zlib/zlib.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: zlib/ChangeLog
  ============================================================================
  $ cvs diff -u -r1.7 -r1.8 ChangeLog
  --- zlib/ChangeLog	16 Jul 2005 15:27:48 -0000	1.7
  +++ zlib/ChangeLog	16 Nov 2007 19:51:17 -0000	1.8
  @@ -1,6 +1,11 @@
   
                   ChangeLog file for zlib
   
  +Changes in 1.2.3 (18 July 2005)
  +- Apply security vulnerability fixes to contrib/infback9 as well
  +- Clean up some text files (carriage returns, trailing space)
  +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant]
  +
   Changes in 1.2.2.4 (11 July 2005)
   - Add inflatePrime() function for starting inflation at bit boundary
   - Avoid some Visual C warnings in deflate.c
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/README
  ============================================================================
  $ cvs diff -u -r1.7 -r1.8 README
  --- zlib/README	16 Jul 2005 15:27:48 -0000	1.7
  +++ zlib/README	16 Nov 2007 19:51:17 -0000	1.8
  @@ -1,6 +1,6 @@
   ZLIB DATA COMPRESSION LIBRARY
   
  -zlib 1.2.2.4 is a general purpose data compression library.  All the code is
  +zlib 1.2.3 is a general purpose data compression library.  All the code is
   thread safe.  The data format used by the zlib library is described by RFCs
   (Request for Comments) 1950 to 1952 in the files
   http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
  @@ -33,7 +33,7 @@
   issue of  Dr. Dobb's Journal; a copy of the article is available in
   http://dogma.net/markn/articles/zlibtool/zlibtool.htm
   
  -The changes made in version 1.2.2.4 are documented in the file ChangeLog.
  +The changes made in version 1.2.3 are documented in the file ChangeLog.
   
   Unsupported third party contributions are provided in directory "contrib".
   
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/amiga/Makefile.sas
  ============================================================================
  $ cvs diff -u -r1.3 -r1.4 Makefile.sas
  --- zlib/amiga/Makefile.sas	2 Aug 2004 20:19:49 -0000	1.3
  +++ zlib/amiga/Makefile.sas	16 Nov 2007 19:51:18 -0000	1.4
  @@ -23,7 +23,7 @@
   check: test
   test: all
   	example
  -	echo hello world | minigzip | minigzip -d 
  +	echo hello world | minigzip | minigzip -d
   
   install: z.lib
   	copy clone zlib.h zconf.h INCLUDE:
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/as400/compile.clp
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 compile.clp
  --- zlib/as400/compile.clp	9 Oct 2004 16:25:56 -0000	1.2
  +++ zlib/as400/compile.clp	16 Nov 2007 19:51:19 -0000	1.3
  @@ -118,6 +118,6 @@
                                    &MODLIB/INFTREES    &MODLIB/TREES       +
                                    &MODLIB/UNCOMPR     &MODLIB/ZUTIL)      +
                             SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) +
  -                          TEXT('ZLIB 1.2.2') TGTRLS(V4R4M0)
  +                          TEXT('ZLIB 1.2.3') TGTRLS(V4R4M0)
   
                ENDPGM
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/as400/readme.txt
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 readme.txt
  --- zlib/as400/readme.txt	9 Oct 2004 16:25:56 -0000	1.2
  +++ zlib/as400/readme.txt	16 Nov 2007 19:51:19 -0000	1.3
  @@ -1,4 +1,4 @@
  -        ZLIB version 1.2.2 for AS400 installation instructions
  +        ZLIB version 1.2.3 for AS400 installation instructions
   
   I) From an AS400 *SAVF file:
   
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/as400/zlib.inc
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 zlib.inc
  --- zlib/as400/zlib.inc	16 Jul 2005 15:27:49 -0000	1.5
  +++ zlib/as400/zlib.inc	16 Nov 2007 19:51:19 -0000	1.6
  @@ -1,7 +1,7 @@
         *  ZLIB.INC - Interface to the general purpose compression library
         *
         *  ILE RPG400 version by Patrick Monnerat, DATASPHERE.
  -      *  Version 1.2.2.4
  +      *  Version 1.2.3
         *
         *
         *  WARNING:
  @@ -22,8 +22,8 @@
         *
         *  Versioning information.
         *
  -     D ZLIB_VERSION    C                   '1.2.2.4'
  -     D ZLIB_VERNUM     C                   X'1224'
  +     D ZLIB_VERSION    C                   '1.2.3'
  +     D ZLIB_VERNUM     C                   X'1230'
         *
         *  Other equates.
         *
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/configure.ac
  ============================================================================
  $ cvs diff -u -r1.10 -r1.11 configure.ac
  --- zlib/configure.ac	18 Aug 2007 11:51:36 -0000	1.10
  +++ zlib/configure.ac	16 Nov 2007 19:51:17 -0000	1.11
  @@ -1,5 +1,5 @@
   AC_PREREQ(2.57)
  -AC_INIT(zlib, 1.2.1.1, rpm-devel@rpm5.org)
  +AC_INIT(zlib, 1.2.3, rpm-devel@rpm5.org)
   AC_CONFIG_AUX_DIR(.)
   AC_CANONICAL_SYSTEM
   AC_CONFIG_SRCDIR([gzio.c])
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/asm586/match.S
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 match.S
  --- zlib/contrib/asm586/match.S	16 Jul 2005 15:27:49 -0000	1.2
  +++ zlib/contrib/asm586/match.S	16 Nov 2007 19:51:19 -0000	1.3
  @@ -1,364 +1,364 @@
  -/* match.s -- Pentium-optimized version of longest_match()
  - * Written for zlib 1.1.2
  - * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
  - *
  - * This is free software; you can redistribute it and/or modify it
  - * under the terms of the GNU General Public License.
  - */
  -
  -#ifndef NO_UNDERLINE
  -#define	match_init	_match_init
  -#define	longest_match	_longest_match
  -#endif
  -
  -#define	MAX_MATCH	(258)
  -#define	MIN_MATCH	(3)
  -#define	MIN_LOOKAHEAD	(MAX_MATCH + MIN_MATCH + 1)
  -#define	MAX_MATCH_8	((MAX_MATCH + 7) & ~7)
  -
  -/* stack frame offsets */
  -
  -#define	wmask			0	/* local copy of s->wmask	*/
  -#define	window			4	/* local copy of s->window	*/
  -#define	windowbestlen		8	/* s->window + bestlen		*/
  -#define	chainlenscanend		12	/* high word: current chain len	*/
  -					/* low word: last bytes sought	*/
  -#define	scanstart		16	/* first two bytes of string	*/
  -#define	scanalign		20	/* dword-misalignment of string	*/
  -#define	nicematch		24	/* a good enough match size	*/
  -#define	bestlen			28	/* size of best match so far	*/
  -#define	scan			32	/* ptr to string wanting match	*/
  -
  -#define	LocalVarsSize		(36)
  -/*	saved ebx		36 */
  -/*	saved edi		40 */
  -/*	saved esi		44 */
  -/*	saved ebp		48 */
  -/*	return address		52 */
  -#define	deflatestate		56	/* the function arguments	*/
  -#define	curmatch		60
  -
  -/* Offsets for fields in the deflate_state structure. These numbers
  - * are calculated from the definition of deflate_state, with the
  - * assumption that the compiler will dword-align the fields. (Thus,
  - * changing the definition of deflate_state could easily cause this
  - * program to crash horribly, without so much as a warning at
  - * compile time. Sigh.)
  - */
  -
  -/* All the +zlib1222add offsets are due to the addition of fields
  - *  in zlib in the deflate_state structure since the asm code was first written
  - * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
  - * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
  - * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
  - */
  -
  -#define zlib1222add		(8)
  -
  -#define	dsWSize			(36+zlib1222add)
  -#define	dsWMask			(44+zlib1222add)
  -#define	dsWindow		(48+zlib1222add)
  -#define	dsPrev			(56+zlib1222add)
  -#define	dsMatchLen		(88+zlib1222add)
  -#define	dsPrevMatch		(92+zlib1222add)
  -#define	dsStrStart		(100+zlib1222add)
  -#define	dsMatchStart		(104+zlib1222add)
  -#define	dsLookahead		(108+zlib1222add)
  -#define	dsPrevLen		(112+zlib1222add)
  -#define	dsMaxChainLen		(116+zlib1222add)
  -#define	dsGoodMatch		(132+zlib1222add)
  -#define	dsNiceMatch		(136+zlib1222add)
  -
  -
  -.file "match.S"
  -
  -.globl	match_init, longest_match
  -
  -.text
  -
  -/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
  -
  -longest_match:
  -
  -/* Save registers that the compiler may be using, and adjust %esp to	*/
  -/* make room for our stack frame.					*/
  -
  -		pushl	%ebp
  -		pushl	%edi
  -		pushl	%esi
  -		pushl	%ebx
  -		subl	$LocalVarsSize, %esp
  -
  -/* Retrieve the function arguments. %ecx will hold cur_match		*/
  -/* throughout the entire function. %edx will hold the pointer to the	*/
  -/* deflate_state structure during the function's setup (before		*/
  -/* entering the main loop).						*/
  -
  -		movl	deflatestate(%esp), %edx
  -		movl	curmatch(%esp), %ecx
  -
  -/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;	*/
  -
  -		movl	dsNiceMatch(%edx), %eax
  -		movl	dsLookahead(%edx), %ebx
  -		cmpl	%eax, %ebx
  -		jl	LookaheadLess
  -		movl	%eax, %ebx
  -LookaheadLess:	movl	%ebx, nicematch(%esp)
  -
  -/* register Bytef *scan = s->window + s->strstart;			*/
  -
  -		movl	dsWindow(%edx), %esi
  -		movl	%esi, window(%esp)
  -		movl	dsStrStart(%edx), %ebp
  -		lea	(%esi,%ebp), %edi
  -		movl	%edi, scan(%esp)
  -
  -/* Determine how many bytes the scan ptr is off from being		*/
  -/* dword-aligned.							*/
  -
  -		movl	%edi, %eax
  -		negl	%eax
  -		andl	$3, %eax
  -		movl	%eax, scanalign(%esp)
  -
  -/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?			*/
  -/*     s->strstart - (IPos)MAX_DIST(s) : NIL;				*/
  -
  -		movl	dsWSize(%edx), %eax
  -		subl	$MIN_LOOKAHEAD, %eax
  -		subl	%eax, %ebp
  -		jg	LimitPositive
  -		xorl	%ebp, %ebp
  -LimitPositive:
  -
  -/* unsigned chain_length = s->max_chain_length;				*/
  -/* if (s->prev_length >= s->good_match) {				*/
  -/*     chain_length >>= 2;						*/
  -/* }									*/
  -
  -		movl	dsPrevLen(%edx), %eax
  -		movl	dsGoodMatch(%edx), %ebx
  -		cmpl	%ebx, %eax
  -		movl	dsMaxChainLen(%edx), %ebx
  -		jl	LastMatchGood
  -		shrl	$2, %ebx
  -LastMatchGood:
  -
  -/* chainlen is decremented once beforehand so that the function can	*/
  -/* use the sign flag instead of the zero flag for the exit test.	*/
  -/* It is then shifted into the high word, to make room for the scanend	*/
  -/* scanend value, which it will always accompany.			*/
  -
  -		decl	%ebx
  -		shll	$16, %ebx
  -
  -/* int best_len = s->prev_length;					*/
  -
  -		movl	dsPrevLen(%edx), %eax
  -		movl	%eax, bestlen(%esp)
  -
  -/* Store the sum of s->window + best_len in %esi locally, and in %esi.	*/
  -
  -		addl	%eax, %esi
  -		movl	%esi, windowbestlen(%esp)
  -
  -/* register ush scan_start = *(ushf*)scan;				*/
  -/* register ush scan_end   = *(ushf*)(scan+best_len-1);			*/
  -
  -		movw	(%edi), %bx
  -		movw	%bx, scanstart(%esp)
  -		movw	-1(%edi,%eax), %bx
  -		movl	%ebx, chainlenscanend(%esp)
  -
  -/* Posf *prev = s->prev;						*/
  -/* uInt wmask = s->w_mask;						*/
  -
  -		movl	dsPrev(%edx), %edi
  -		movl	dsWMask(%edx), %edx
  -		mov	%edx, wmask(%esp)
  -
  -/* Jump into the main loop.						*/
  -
  -		jmp	LoopEntry
  -
  -.balign 16
  -
  -/* do {
  - *     match = s->window + cur_match;
  - *     if (*(ushf*)(match+best_len-1) != scan_end ||
  - *         *(ushf*)match != scan_start) continue;
  - *     [...]
  - * } while ((cur_match = prev[cur_match & wmask]) > limit
  - *          && --chain_length != 0);
  - *
  - * Here is the inner loop of the function. The function will spend the
  - * majority of its time in this loop, and majority of that time will
  - * be spent in the first ten instructions.
  - *
  - * Within this loop:
  - * %ebx = chainlenscanend - i.e., ((chainlen << 16) | scanend)
  - * %ecx = curmatch
  - * %edx = curmatch & wmask
  - * %esi = windowbestlen - i.e., (window + bestlen)
  - * %edi = prev
  - * %ebp = limit
  - *
  - * Two optimization notes on the choice of instructions:
  - *
  - * The first instruction uses a 16-bit address, which costs an extra,
  - * unpairable cycle. This is cheaper than doing a 32-bit access and
  - * zeroing the high word, due to the 3-cycle misalignment penalty which
  - * would occur half the time. This also turns out to be cheaper than
  - * doing two separate 8-bit accesses, as the memory is so rarely in the
  - * L1 cache.
  - *
  - * The window buffer, however, apparently spends a lot of time in the
  - * cache, and so it is faster to retrieve the word at the end of the
  - * match string with two 8-bit loads. The instructions that test the
  - * word at the beginning of the match string, however, are executed
  - * much less frequently, and there it was cheaper to use 16-bit
  - * instructions, which avoided the necessity of saving off and
  - * subsequently reloading one of the other registers.
  - */
  -LookupLoop:
  -							/* 1 U & V  */
  -		movw	(%edi,%edx,2), %cx		/* 2 U pipe */
  -		movl	wmask(%esp), %edx		/* 2 V pipe */
  -		cmpl	%ebp, %ecx			/* 3 U pipe */
  -		jbe	LeaveNow			/* 3 V pipe */
  -		subl	$0x00010000, %ebx		/* 4 U pipe */
  -		js	LeaveNow			/* 4 V pipe */
  -LoopEntry:	movb	-1(%esi,%ecx), %al		/* 5 U pipe */
  -		andl	%ecx, %edx			/* 5 V pipe */
  -		cmpb	%bl, %al			/* 6 U pipe */
  -		jnz	LookupLoop			/* 6 V pipe */
  -		movb	(%esi,%ecx), %ah
  -		cmpb	%bh, %ah
  -		jnz	LookupLoop
  -		movl	window(%esp), %eax
  -		movw	(%eax,%ecx), %ax
  -		cmpw	scanstart(%esp), %ax
  -		jnz	LookupLoop
  -
  -/* Store the current value of chainlen.					*/
  -
  -		movl	%ebx, chainlenscanend(%esp)
  -
  -/* Point %edi to the string under scrutiny, and %esi to the string we	*/
  -/* are hoping to match it up with. In actuality, %esi and %edi are	*/
  -/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is	*/
  -/* initialized to -(MAX_MATCH_8 - scanalign).				*/
  -
  -		movl	window(%esp), %esi
  -		movl	scan(%esp), %edi
  -		addl	%ecx, %esi
  -		movl	scanalign(%esp), %eax
  -		movl	$(-MAX_MATCH_8), %edx
  -		lea	MAX_MATCH_8(%edi,%eax), %edi
  -		lea	MAX_MATCH_8(%esi,%eax), %esi
  -
  -/* Test the strings for equality, 8 bytes at a time. At the end,
  - * adjust %edx so that it is offset to the exact byte that mismatched.
  - *
  - * We already know at this point that the first three bytes of the
  - * strings match each other, and they can be safely passed over before
  - * starting the compare loop. So what this code does is skip over 0-3
  - * bytes, as much as necessary in order to dword-align the %edi
  - * pointer. (%esi will still be misaligned three times out of four.)
  - *
  - * It should be confessed that this loop usually does not represent
  - * much of the total running time. Replacing it with a more
  - * straightforward "rep cmpsb" would not drastically degrade
  - * performance.
  - */
  -LoopCmps:
  -		movl	(%esi,%edx), %eax
  -		movl	(%edi,%edx), %ebx
  -		xorl	%ebx, %eax
  -		jnz	LeaveLoopCmps
  -		movl	4(%esi,%edx), %eax
  -		movl	4(%edi,%edx), %ebx
  -		xorl	%ebx, %eax
  -		jnz	LeaveLoopCmps4
  -		addl	$8, %edx
  -		jnz	LoopCmps
  -		jmp	LenMaximum
  -LeaveLoopCmps4:	addl	$4, %edx
  -LeaveLoopCmps:	testl	$0x0000FFFF, %eax
  -		jnz	LenLower
  -		addl	$2, %edx
  -		shrl	$16, %eax
  -LenLower:	subb	$1, %al
  -		adcl	$0, %edx
  -
  -/* Calculate the length of the match. If it is longer than MAX_MATCH,	*/
  -/* then automatically accept it as the best possible match and leave.	*/
  -
  -		lea	(%edi,%edx), %eax
  -		movl	scan(%esp), %edi
  -		subl	%edi, %eax
  -		cmpl	$MAX_MATCH, %eax
  -		jge	LenMaximum
  -
  -/* If the length of the match is not longer than the best match we	*/
  -/* have so far, then forget it and return to the lookup loop.		*/
  -
  -		movl	deflatestate(%esp), %edx
  -		movl	bestlen(%esp), %ebx
  -		cmpl	%ebx, %eax
  -		jg	LongerMatch
  -		movl	chainlenscanend(%esp), %ebx
  -		movl	windowbestlen(%esp), %esi
  -		movl	dsPrev(%edx), %edi
  -		movl	wmask(%esp), %edx
  -		andl	%ecx, %edx
  -		jmp	LookupLoop
  -
  -/*         s->match_start = cur_match;					*/
  -/*         best_len = len;						*/
  -/*         if (len >= nice_match) break;				*/
  -/*         scan_end = *(ushf*)(scan+best_len-1);			*/
  -
  -LongerMatch:	movl	nicematch(%esp), %ebx
  -		movl	%eax, bestlen(%esp)
  -		movl	%ecx, dsMatchStart(%edx)
  -		cmpl	%ebx, %eax
  -		jge	LeaveNow
  -		movl	window(%esp), %esi
  -		addl	%eax, %esi
  -		movl	%esi, windowbestlen(%esp)
  -		movl	chainlenscanend(%esp), %ebx
  -		movw	-1(%edi,%eax), %bx
  -		movl	dsPrev(%edx), %edi
  -		movl	%ebx, chainlenscanend(%esp)
  -		movl	wmask(%esp), %edx
  -		andl	%ecx, %edx
  -		jmp	LookupLoop
  -
  -/* Accept the current string, with the maximum possible length.		*/
  -
  -LenMaximum:	movl	deflatestate(%esp), %edx
  -		movl	$MAX_MATCH, bestlen(%esp)
  -		movl	%ecx, dsMatchStart(%edx)
  -
  -/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;		*/
  -/* return s->lookahead;							*/
  -
  -LeaveNow:
  -		movl	deflatestate(%esp), %edx
  -		movl	bestlen(%esp), %ebx
  -		movl	dsLookahead(%edx), %eax
  -		cmpl	%eax, %ebx
  -		jg	LookaheadRet
  -		movl	%ebx, %eax
  -LookaheadRet:
  -
  -/* Restore the stack and return from whence we came.			*/
  -
  -		addl	$LocalVarsSize, %esp
  -		popl	%ebx
  -		popl	%esi
  -		popl	%edi
  -		popl	%ebp
  -match_init:	ret
  +/* match.s -- Pentium-optimized version of longest_match()
  + * Written for zlib 1.1.2
  + * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
  + *
  + * This is free software; you can redistribute it and/or modify it
  + * under the terms of the GNU General Public License.
  + */
  +
  +#ifndef NO_UNDERLINE
  +#define	match_init	_match_init
  +#define	longest_match	_longest_match
  +#endif
  +
  +#define	MAX_MATCH	(258)
  +#define	MIN_MATCH	(3)
  +#define	MIN_LOOKAHEAD	(MAX_MATCH + MIN_MATCH + 1)
  +#define	MAX_MATCH_8	((MAX_MATCH + 7) & ~7)
  +
  +/* stack frame offsets */
  +
  +#define	wmask			0	/* local copy of s->wmask	*/
  +#define	window			4	/* local copy of s->window	*/
  +#define	windowbestlen		8	/* s->window + bestlen		*/
  +#define	chainlenscanend		12	/* high word: current chain len	*/
  +					/* low word: last bytes sought	*/
  +#define	scanstart		16	/* first two bytes of string	*/
  +#define	scanalign		20	/* dword-misalignment of string	*/
  +#define	nicematch		24	/* a good enough match size	*/
  +#define	bestlen			28	/* size of best match so far	*/
  +#define	scan			32	/* ptr to string wanting match	*/
  +
  +#define	LocalVarsSize		(36)
  +/*	saved ebx		36 */
  +/*	saved edi		40 */
  +/*	saved esi		44 */
  +/*	saved ebp		48 */
  +/*	return address		52 */
  +#define	deflatestate		56	/* the function arguments	*/
  +#define	curmatch		60
  +
  +/* Offsets for fields in the deflate_state structure. These numbers
  + * are calculated from the definition of deflate_state, with the
  + * assumption that the compiler will dword-align the fields. (Thus,
  + * changing the definition of deflate_state could easily cause this
  + * program to crash horribly, without so much as a warning at
  + * compile time. Sigh.)
  + */
  +
  +/* All the +zlib1222add offsets are due to the addition of fields
  + *  in zlib in the deflate_state structure since the asm code was first written
  + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
  + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
  + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
  + */
  +
  +#define zlib1222add		(8)
  +
  +#define	dsWSize			(36+zlib1222add)
  +#define	dsWMask			(44+zlib1222add)
  +#define	dsWindow		(48+zlib1222add)
  +#define	dsPrev			(56+zlib1222add)
  +#define	dsMatchLen		(88+zlib1222add)
  +#define	dsPrevMatch		(92+zlib1222add)
  +#define	dsStrStart		(100+zlib1222add)
  +#define	dsMatchStart		(104+zlib1222add)
  +#define	dsLookahead		(108+zlib1222add)
  +#define	dsPrevLen		(112+zlib1222add)
  +#define	dsMaxChainLen		(116+zlib1222add)
  +#define	dsGoodMatch		(132+zlib1222add)
  +#define	dsNiceMatch		(136+zlib1222add)
  +
  +
  +.file "match.S"
  +
  +.globl	match_init, longest_match
  +
  +.text
  +
  +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
  +
  +longest_match:
  +
  +/* Save registers that the compiler may be using, and adjust %esp to	*/
  +/* make room for our stack frame.					*/
  +
  +		pushl	%ebp
  +		pushl	%edi
  +		pushl	%esi
  +		pushl	%ebx
  +		subl	$LocalVarsSize, %esp
  +
  +/* Retrieve the function arguments. %ecx will hold cur_match		*/
  +/* throughout the entire function. %edx will hold the pointer to the	*/
  +/* deflate_state structure during the function's setup (before		*/
  +/* entering the main loop).						*/
  +
  +		movl	deflatestate(%esp), %edx
  +		movl	curmatch(%esp), %ecx
  +
  +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;	*/
  +
  +		movl	dsNiceMatch(%edx), %eax
  +		movl	dsLookahead(%edx), %ebx
  +		cmpl	%eax, %ebx
  +		jl	LookaheadLess
  +		movl	%eax, %ebx
  +LookaheadLess:	movl	%ebx, nicematch(%esp)
  +
  +/* register Bytef *scan = s->window + s->strstart;			*/
  +
  +		movl	dsWindow(%edx), %esi
  +		movl	%esi, window(%esp)
  +		movl	dsStrStart(%edx), %ebp
  +		lea	(%esi,%ebp), %edi
  +		movl	%edi, scan(%esp)
  +
  +/* Determine how many bytes the scan ptr is off from being		*/
  +/* dword-aligned.							*/
  +
  +		movl	%edi, %eax
  +		negl	%eax
  +		andl	$3, %eax
  +		movl	%eax, scanalign(%esp)
  +
  +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?			*/
  +/*     s->strstart - (IPos)MAX_DIST(s) : NIL;				*/
  +
  +		movl	dsWSize(%edx), %eax
  +		subl	$MIN_LOOKAHEAD, %eax
  +		subl	%eax, %ebp
  +		jg	LimitPositive
  +		xorl	%ebp, %ebp
  +LimitPositive:
  +
  +/* unsigned chain_length = s->max_chain_length;				*/
  +/* if (s->prev_length >= s->good_match) {				*/
  +/*     chain_length >>= 2;						*/
  +/* }									*/
  +
  +		movl	dsPrevLen(%edx), %eax
  +		movl	dsGoodMatch(%edx), %ebx
  +		cmpl	%ebx, %eax
  +		movl	dsMaxChainLen(%edx), %ebx
  +		jl	LastMatchGood
  +		shrl	$2, %ebx
  +LastMatchGood:
  +
  +/* chainlen is decremented once beforehand so that the function can	*/
  +/* use the sign flag instead of the zero flag for the exit test.	*/
  +/* It is then shifted into the high word, to make room for the scanend	*/
  +/* scanend value, which it will always accompany.			*/
  +
  +		decl	%ebx
  +		shll	$16, %ebx
  +
  +/* int best_len = s->prev_length;					*/
  +
  +		movl	dsPrevLen(%edx), %eax
  +		movl	%eax, bestlen(%esp)
  +
  +/* Store the sum of s->window + best_len in %esi locally, and in %esi.	*/
  +
  +		addl	%eax, %esi
  +		movl	%esi, windowbestlen(%esp)
  +
  +/* register ush scan_start = *(ushf*)scan;				*/
  +/* register ush scan_end   = *(ushf*)(scan+best_len-1);			*/
  +
  +		movw	(%edi), %bx
  +		movw	%bx, scanstart(%esp)
  +		movw	-1(%edi,%eax), %bx
  +		movl	%ebx, chainlenscanend(%esp)
  +
  +/* Posf *prev = s->prev;						*/
  +/* uInt wmask = s->w_mask;						*/
  +
  +		movl	dsPrev(%edx), %edi
  +		movl	dsWMask(%edx), %edx
  +		mov	%edx, wmask(%esp)
  +
  +/* Jump into the main loop.						*/
  +
  +		jmp	LoopEntry
  +
  +.balign 16
  +
  +/* do {
  + *     match = s->window + cur_match;
  + *     if (*(ushf*)(match+best_len-1) != scan_end ||
  + *         *(ushf*)match != scan_start) continue;
  + *     [...]
  + * } while ((cur_match = prev[cur_match & wmask]) > limit
  + *          && --chain_length != 0);
  + *
  + * Here is the inner loop of the function. The function will spend the
  + * majority of its time in this loop, and majority of that time will
  + * be spent in the first ten instructions.
  + *
  + * Within this loop:
  + * %ebx = chainlenscanend - i.e., ((chainlen << 16) | scanend)
  + * %ecx = curmatch
  + * %edx = curmatch & wmask
  + * %esi = windowbestlen - i.e., (window + bestlen)
  + * %edi = prev
  + * %ebp = limit
  + *
  + * Two optimization notes on the choice of instructions:
  + *
  + * The first instruction uses a 16-bit address, which costs an extra,
  + * unpairable cycle. This is cheaper than doing a 32-bit access and
  + * zeroing the high word, due to the 3-cycle misalignment penalty which
  + * would occur half the time. This also turns out to be cheaper than
  + * doing two separate 8-bit accesses, as the memory is so rarely in the
  + * L1 cache.
  + *
  + * The window buffer, however, apparently spends a lot of time in the
  + * cache, and so it is faster to retrieve the word at the end of the
  + * match string with two 8-bit loads. The instructions that test the
  + * word at the beginning of the match string, however, are executed
  + * much less frequently, and there it was cheaper to use 16-bit
  + * instructions, which avoided the necessity of saving off and
  + * subsequently reloading one of the other registers.
  + */
  +LookupLoop:
  +							/* 1 U & V  */
  +		movw	(%edi,%edx,2), %cx		/* 2 U pipe */
  +		movl	wmask(%esp), %edx		/* 2 V pipe */
  +		cmpl	%ebp, %ecx			/* 3 U pipe */
  +		jbe	LeaveNow			/* 3 V pipe */
  +		subl	$0x00010000, %ebx		/* 4 U pipe */
  +		js	LeaveNow			/* 4 V pipe */
  +LoopEntry:	movb	-1(%esi,%ecx), %al		/* 5 U pipe */
  +		andl	%ecx, %edx			/* 5 V pipe */
  +		cmpb	%bl, %al			/* 6 U pipe */
  +		jnz	LookupLoop			/* 6 V pipe */
  +		movb	(%esi,%ecx), %ah
  +		cmpb	%bh, %ah
  +		jnz	LookupLoop
  +		movl	window(%esp), %eax
  +		movw	(%eax,%ecx), %ax
  +		cmpw	scanstart(%esp), %ax
  +		jnz	LookupLoop
  +
  +/* Store the current value of chainlen.					*/
  +
  +		movl	%ebx, chainlenscanend(%esp)
  +
  +/* Point %edi to the string under scrutiny, and %esi to the string we	*/
  +/* are hoping to match it up with. In actuality, %esi and %edi are	*/
  +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is	*/
  +/* initialized to -(MAX_MATCH_8 - scanalign).				*/
  +
  +		movl	window(%esp), %esi
  +		movl	scan(%esp), %edi
  +		addl	%ecx, %esi
  +		movl	scanalign(%esp), %eax
  +		movl	$(-MAX_MATCH_8), %edx
  +		lea	MAX_MATCH_8(%edi,%eax), %edi
  +		lea	MAX_MATCH_8(%esi,%eax), %esi
  +
  +/* Test the strings for equality, 8 bytes at a time. At the end,
  + * adjust %edx so that it is offset to the exact byte that mismatched.
  + *
  + * We already know at this point that the first three bytes of the
  + * strings match each other, and they can be safely passed over before
  + * starting the compare loop. So what this code does is skip over 0-3
  + * bytes, as much as necessary in order to dword-align the %edi
  + * pointer. (%esi will still be misaligned three times out of four.)
  + *
  + * It should be confessed that this loop usually does not represent
  + * much of the total running time. Replacing it with a more
  + * straightforward "rep cmpsb" would not drastically degrade
  + * performance.
  + */
  +LoopCmps:
  +		movl	(%esi,%edx), %eax
  +		movl	(%edi,%edx), %ebx
  +		xorl	%ebx, %eax
  +		jnz	LeaveLoopCmps
  +		movl	4(%esi,%edx), %eax
  +		movl	4(%edi,%edx), %ebx
  +		xorl	%ebx, %eax
  +		jnz	LeaveLoopCmps4
  +		addl	$8, %edx
  +		jnz	LoopCmps
  +		jmp	LenMaximum
  +LeaveLoopCmps4:	addl	$4, %edx
  +LeaveLoopCmps:	testl	$0x0000FFFF, %eax
  +		jnz	LenLower
  +		addl	$2, %edx
  +		shrl	$16, %eax
  +LenLower:	subb	$1, %al
  +		adcl	$0, %edx
  +
  +/* Calculate the length of the match. If it is longer than MAX_MATCH,	*/
  +/* then automatically accept it as the best possible match and leave.	*/
  +
  +		lea	(%edi,%edx), %eax
  +		movl	scan(%esp), %edi
  +		subl	%edi, %eax
  +		cmpl	$MAX_MATCH, %eax
  +		jge	LenMaximum
  +
  +/* If the length of the match is not longer than the best match we	*/
  +/* have so far, then forget it and return to the lookup loop.		*/
  +
  +		movl	deflatestate(%esp), %edx
  +		movl	bestlen(%esp), %ebx
  +		cmpl	%ebx, %eax
  +		jg	LongerMatch
  +		movl	chainlenscanend(%esp), %ebx
  +		movl	windowbestlen(%esp), %esi
  +		movl	dsPrev(%edx), %edi
  +		movl	wmask(%esp), %edx
  +		andl	%ecx, %edx
  +		jmp	LookupLoop
  +
  +/*         s->match_start = cur_match;					*/
  +/*         best_len = len;						*/
  +/*         if (len >= nice_match) break;				*/
  +/*         scan_end = *(ushf*)(scan+best_len-1);			*/
  +
  +LongerMatch:	movl	nicematch(%esp), %ebx
  +		movl	%eax, bestlen(%esp)
  +		movl	%ecx, dsMatchStart(%edx)
  +		cmpl	%ebx, %eax
  +		jge	LeaveNow
  +		movl	window(%esp), %esi
  +		addl	%eax, %esi
  +		movl	%esi, windowbestlen(%esp)
  +		movl	chainlenscanend(%esp), %ebx
  +		movw	-1(%edi,%eax), %bx
  +		movl	dsPrev(%edx), %edi
  +		movl	%ebx, chainlenscanend(%esp)
  +		movl	wmask(%esp), %edx
  +		andl	%ecx, %edx
  +		jmp	LookupLoop
  +
  +/* Accept the current string, with the maximum possible length.		*/
  +
  +LenMaximum:	movl	deflatestate(%esp), %edx
  +		movl	$MAX_MATCH, bestlen(%esp)
  +		movl	%ecx, dsMatchStart(%edx)
  +
  +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;		*/
  +/* return s->lookahead;							*/
  +
  +LeaveNow:
  +		movl	deflatestate(%esp), %edx
  +		movl	bestlen(%esp), %ebx
  +		movl	dsLookahead(%edx), %eax
  +		cmpl	%eax, %ebx
  +		jg	LookaheadRet
  +		movl	%ebx, %eax
  +LookaheadRet:
  +
  +/* Restore the stack and return from whence we came.			*/
  +
  +		addl	$LocalVarsSize, %esp
  +		popl	%ebx
  +		popl	%esi
  +		popl	%edi
  +		popl	%ebp
  +match_init:	ret
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/asm686/match.S
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 match.S
  --- zlib/contrib/asm686/match.S	16 Jul 2005 15:27:49 -0000	1.2
  +++ zlib/contrib/asm686/match.S	16 Nov 2007 19:51:19 -0000	1.3
  @@ -1,329 +1,329 @@
  -/* match.s -- Pentium-Pro-optimized version of longest_match()
  - * Written for zlib 1.1.2
  - * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
  - *
  - * This is free software; you can redistribute it and/or modify it
  - * under the terms of the GNU General Public License.
  - */
  -
  -#ifndef NO_UNDERLINE
  -#define	match_init	_match_init
  -#define	longest_match	_longest_match
  -#endif
  -
  -#define	MAX_MATCH	(258)
  -#define	MIN_MATCH	(3)
  -#define	MIN_LOOKAHEAD	(MAX_MATCH + MIN_MATCH + 1)
  -#define	MAX_MATCH_8	((MAX_MATCH + 7) & ~7)
  -
  -/* stack frame offsets */
  -
  -#define	chainlenwmask		0	/* high word: current chain len	*/
  -					/* low word: s->wmask		*/
  -#define	window			4	/* local copy of s->window	*/
  -#define	windowbestlen		8	/* s->window + bestlen		*/
  -#define	scanstart		16	/* first two bytes of string	*/
  -#define	scanend			12	/* last two bytes of string	*/
  -#define	scanalign		20	/* dword-misalignment of string	*/
  -#define	nicematch		24	/* a good enough match size	*/
  -#define	bestlen			28	/* size of best match so far	*/
  -#define	scan			32	/* ptr to string wanting match	*/
  -
  -#define	LocalVarsSize		(36)
  -/*	saved ebx		36 */
  -/*	saved edi		40 */
  -/*	saved esi		44 */
  -/*	saved ebp		48 */
  -/*	return address		52 */
  -#define	deflatestate		56	/* the function arguments	*/
  -#define	curmatch		60
  -
  -/* All the +zlib1222add offsets are due to the addition of fields
  - *  in zlib in the deflate_state structure since the asm code was first written
  - * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
  - * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
  - * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
  - */
  -
  -#define zlib1222add		(8)
  -
  -#define	dsWSize			(36+zlib1222add)
  -#define	dsWMask			(44+zlib1222add)
  -#define	dsWindow		(48+zlib1222add)
  -#define	dsPrev			(56+zlib1222add)
  -#define	dsMatchLen		(88+zlib1222add)
  -#define	dsPrevMatch		(92+zlib1222add)
  -#define	dsStrStart		(100+zlib1222add)
  -#define	dsMatchStart		(104+zlib1222add)
  -#define	dsLookahead		(108+zlib1222add)
  -#define	dsPrevLen		(112+zlib1222add)
  -#define	dsMaxChainLen		(116+zlib1222add)
  -#define	dsGoodMatch		(132+zlib1222add)
  -#define	dsNiceMatch		(136+zlib1222add)
  -
  -
  -.file "match.S"
  -
  -.globl	match_init, longest_match
  -
  -.text
  -
  -/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
  -
  -longest_match:
  -
  -/* Save registers that the compiler may be using, and adjust %esp to	*/
  -/* make room for our stack frame.					*/
  -
  -		pushl	%ebp
  -		pushl	%edi
  -		pushl	%esi
  -		pushl	%ebx
  -		subl	$LocalVarsSize, %esp
  -
  -/* Retrieve the function arguments. %ecx will hold cur_match		*/
  -/* throughout the entire function. %edx will hold the pointer to the	*/
  -/* deflate_state structure during the function's setup (before		*/
  -/* entering the main loop).						*/
  -
  -		movl	deflatestate(%esp), %edx
  -		movl	curmatch(%esp), %ecx
  -
  -/* uInt wmask = s->w_mask;						*/
  -/* unsigned chain_length = s->max_chain_length;				*/
  -/* if (s->prev_length >= s->good_match) {				*/
  -/*     chain_length >>= 2;						*/
  -/* }									*/
  -
  -		movl	dsPrevLen(%edx), %eax
  -		movl	dsGoodMatch(%edx), %ebx
  -		cmpl	%ebx, %eax
  -		movl	dsWMask(%edx), %eax
  -		movl	dsMaxChainLen(%edx), %ebx
  -		jl	LastMatchGood
  -		shrl	$2, %ebx
  -LastMatchGood:
  -
  -/* chainlen is decremented once beforehand so that the function can	*/
  -/* use the sign flag instead of the zero flag for the exit test.	*/
  -/* It is then shifted into the high word, to make room for the wmask	*/
  -/* value, which it will always accompany.				*/
  -
  -		decl	%ebx
  -		shll	$16, %ebx
  -		orl	%eax, %ebx
  -		movl	%ebx, chainlenwmask(%esp)
  -
  -/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;	*/
  -
  -		movl	dsNiceMatch(%edx), %eax
  -		movl	dsLookahead(%edx), %ebx
  -		cmpl	%eax, %ebx
  -		jl	LookaheadLess
  -		movl	%eax, %ebx
  -LookaheadLess:	movl	%ebx, nicematch(%esp)
  -
  -/* register Bytef *scan = s->window + s->strstart;			*/
  -
  -		movl	dsWindow(%edx), %esi
  -		movl	%esi, window(%esp)
  -		movl	dsStrStart(%edx), %ebp
  -		lea	(%esi,%ebp), %edi
  -		movl	%edi, scan(%esp)
  -
  -/* Determine how many bytes the scan ptr is off from being		*/
  -/* dword-aligned.							*/
  -
  -		movl	%edi, %eax
  -		negl	%eax
  -		andl	$3, %eax
  -		movl	%eax, scanalign(%esp)
  -
  -/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?			*/
  -/*     s->strstart - (IPos)MAX_DIST(s) : NIL;				*/
  -
  -		movl	dsWSize(%edx), %eax
  -		subl	$MIN_LOOKAHEAD, %eax
  -		subl	%eax, %ebp
  -		jg	LimitPositive
  -		xorl	%ebp, %ebp
  -LimitPositive:
  -
  -/* int best_len = s->prev_length;					*/
  -
  -		movl	dsPrevLen(%edx), %eax
  -		movl	%eax, bestlen(%esp)
  -
  -/* Store the sum of s->window + best_len in %esi locally, and in %esi.	*/
  -
  -		addl	%eax, %esi
  -		movl	%esi, windowbestlen(%esp)
  -
  -/* register ush scan_start = *(ushf*)scan;				*/
  -/* register ush scan_end   = *(ushf*)(scan+best_len-1);			*/
  -/* Posf *prev = s->prev;						*/
  -
  -		movzwl	(%edi), %ebx
  -		movl	%ebx, scanstart(%esp)
  -		movzwl	-1(%edi,%eax), %ebx
  -		movl	%ebx, scanend(%esp)
  -		movl	dsPrev(%edx), %edi
  -
  -/* Jump into the main loop.						*/
  -
  -		movl	chainlenwmask(%esp), %edx
  -		jmp	LoopEntry
  -
  -.balign 16
  -
  -/* do {
  - *     match = s->window + cur_match;
  - *     if (*(ushf*)(match+best_len-1) != scan_end ||
  - *         *(ushf*)match != scan_start) continue;
  - *     [...]
  - * } while ((cur_match = prev[cur_match & wmask]) > limit
  - *          && --chain_length != 0);
  - *
  - * Here is the inner loop of the function. The function will spend the
  - * majority of its time in this loop, and majority of that time will
  - * be spent in the first ten instructions.
  - *
  - * Within this loop:
  - * %ebx = scanend
  - * %ecx = curmatch
  - * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
  - * %esi = windowbestlen - i.e., (window + bestlen)
  - * %edi = prev
  - * %ebp = limit
  - */
  -LookupLoop:
  -		andl	%edx, %ecx
  -		movzwl	(%edi,%ecx,2), %ecx
  -		cmpl	%ebp, %ecx
  -		jbe	LeaveNow
  -		subl	$0x00010000, %edx
  -		js	LeaveNow
  -LoopEntry:	movzwl	-1(%esi,%ecx), %eax
  -		cmpl	%ebx, %eax
  -		jnz	LookupLoop
  -		movl	window(%esp), %eax
  -		movzwl	(%eax,%ecx), %eax
  -		cmpl	scanstart(%esp), %eax
  -		jnz	LookupLoop
  -
  -/* Store the current value of chainlen.					*/
  -
  -		movl	%edx, chainlenwmask(%esp)
  -
  -/* Point %edi to the string under scrutiny, and %esi to the string we	*/
  -/* are hoping to match it up with. In actuality, %esi and %edi are	*/
  -/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is	*/
  -/* initialized to -(MAX_MATCH_8 - scanalign).				*/
  -
  -		movl	window(%esp), %esi
  -		movl	scan(%esp), %edi
  -		addl	%ecx, %esi
  -		movl	scanalign(%esp), %eax
  -		movl	$(-MAX_MATCH_8), %edx
  -		lea	MAX_MATCH_8(%edi,%eax), %edi
  -		lea	MAX_MATCH_8(%esi,%eax), %esi
  -
  -/* Test the strings for equality, 8 bytes at a time. At the end,
  - * adjust %edx so that it is offset to the exact byte that mismatched.
  - *
  - * We already know at this point that the first three bytes of the
  - * strings match each other, and they can be safely passed over before
  - * starting the compare loop. So what this code does is skip over 0-3
  - * bytes, as much as necessary in order to dword-align the %edi
  - * pointer. (%esi will still be misaligned three times out of four.)
  - *
  - * It should be confessed that this loop usually does not represent
  - * much of the total running time. Replacing it with a more
  - * straightforward "rep cmpsb" would not drastically degrade
  - * performance.
  - */
  -LoopCmps:
  -		movl	(%esi,%edx), %eax
  -		xorl	(%edi,%edx), %eax
  -		jnz	LeaveLoopCmps
  -		movl	4(%esi,%edx), %eax
  -		xorl	4(%edi,%edx), %eax
  -		jnz	LeaveLoopCmps4
  -		addl	$8, %edx
  -		jnz	LoopCmps
  -		jmp	LenMaximum
  -LeaveLoopCmps4:	addl	$4, %edx
  -LeaveLoopCmps:	testl	$0x0000FFFF, %eax
  -		jnz	LenLower
  -		addl	$2, %edx
  -		shrl	$16, %eax
  -LenLower:	subb	$1, %al
  -		adcl	$0, %edx
  -
  -/* Calculate the length of the match. If it is longer than MAX_MATCH,	*/
  -/* then automatically accept it as the best possible match and leave.	*/
  -
  -		lea	(%edi,%edx), %eax
  -		movl	scan(%esp), %edi
  -		subl	%edi, %eax
  -		cmpl	$MAX_MATCH, %eax
  -		jge	LenMaximum
  -
  -/* If the length of the match is not longer than the best match we	*/
  -/* have so far, then forget it and return to the lookup loop.		*/
  -
  -		movl	deflatestate(%esp), %edx
  -		movl	bestlen(%esp), %ebx
  -		cmpl	%ebx, %eax
  -		jg	LongerMatch
  -		movl	windowbestlen(%esp), %esi
  -		movl	dsPrev(%edx), %edi
  -		movl	scanend(%esp), %ebx
  -		movl	chainlenwmask(%esp), %edx
  -		jmp	LookupLoop
  -
  -/*         s->match_start = cur_match;					*/
  -/*         best_len = len;						*/
  -/*         if (len >= nice_match) break;				*/
  -/*         scan_end = *(ushf*)(scan+best_len-1);			*/
  -
  -LongerMatch:	movl	nicematch(%esp), %ebx
  -		movl	%eax, bestlen(%esp)
  -		movl	%ecx, dsMatchStart(%edx)
  -		cmpl	%ebx, %eax
  -		jge	LeaveNow
  -		movl	window(%esp), %esi
  -		addl	%eax, %esi
  -		movl	%esi, windowbestlen(%esp)
  -		movzwl	-1(%edi,%eax), %ebx
  -		movl	dsPrev(%edx), %edi
  -		movl	%ebx, scanend(%esp)
  -		movl	chainlenwmask(%esp), %edx
  -		jmp	LookupLoop
  -
  -/* Accept the current string, with the maximum possible length.		*/
  -
  -LenMaximum:	movl	deflatestate(%esp), %edx
  -		movl	$MAX_MATCH, bestlen(%esp)
  -		movl	%ecx, dsMatchStart(%edx)
  -
  -/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;		*/
  -/* return s->lookahead;							*/
  -
  -LeaveNow:
  -		movl	deflatestate(%esp), %edx
  -		movl	bestlen(%esp), %ebx
  -		movl	dsLookahead(%edx), %eax
  -		cmpl	%eax, %ebx
  -		jg	LookaheadRet
  -		movl	%ebx, %eax
  -LookaheadRet:
  -
  -/* Restore the stack and return from whence we came.			*/
  -
  -		addl	$LocalVarsSize, %esp
  -		popl	%ebx
  -		popl	%esi
  -		popl	%edi
  -		popl	%ebp
  -match_init:	ret
  +/* match.s -- Pentium-Pro-optimized version of longest_match()
  + * Written for zlib 1.1.2
  + * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
  + *
  + * This is free software; you can redistribute it and/or modify it
  + * under the terms of the GNU General Public License.
  + */
  +
  +#ifndef NO_UNDERLINE
  +#define	match_init	_match_init
  +#define	longest_match	_longest_match
  +#endif
  +
  +#define	MAX_MATCH	(258)
  +#define	MIN_MATCH	(3)
  +#define	MIN_LOOKAHEAD	(MAX_MATCH + MIN_MATCH + 1)
  +#define	MAX_MATCH_8	((MAX_MATCH + 7) & ~7)
  +
  +/* stack frame offsets */
  +
  +#define	chainlenwmask		0	/* high word: current chain len	*/
  +					/* low word: s->wmask		*/
  +#define	window			4	/* local copy of s->window	*/
  +#define	windowbestlen		8	/* s->window + bestlen		*/
  +#define	scanstart		16	/* first two bytes of string	*/
  +#define	scanend			12	/* last two bytes of string	*/
  +#define	scanalign		20	/* dword-misalignment of string	*/
  +#define	nicematch		24	/* a good enough match size	*/
  +#define	bestlen			28	/* size of best match so far	*/
  +#define	scan			32	/* ptr to string wanting match	*/
  +
  +#define	LocalVarsSize		(36)
  +/*	saved ebx		36 */
  +/*	saved edi		40 */
  +/*	saved esi		44 */
  +/*	saved ebp		48 */
  +/*	return address		52 */
  +#define	deflatestate		56	/* the function arguments	*/
  +#define	curmatch		60
  +
  +/* All the +zlib1222add offsets are due to the addition of fields
  + *  in zlib in the deflate_state structure since the asm code was first written
  + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
  + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
  + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
  + */
  +
  +#define zlib1222add		(8)
  +
  +#define	dsWSize			(36+zlib1222add)
  +#define	dsWMask			(44+zlib1222add)
  +#define	dsWindow		(48+zlib1222add)
  +#define	dsPrev			(56+zlib1222add)
  +#define	dsMatchLen		(88+zlib1222add)
  +#define	dsPrevMatch		(92+zlib1222add)
  +#define	dsStrStart		(100+zlib1222add)
  +#define	dsMatchStart		(104+zlib1222add)
  +#define	dsLookahead		(108+zlib1222add)
  +#define	dsPrevLen		(112+zlib1222add)
  +#define	dsMaxChainLen		(116+zlib1222add)
  +#define	dsGoodMatch		(132+zlib1222add)
  +#define	dsNiceMatch		(136+zlib1222add)
  +
  +
  +.file "match.S"
  +
  +.globl	match_init, longest_match
  +
  +.text
  +
  +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
  +
  +longest_match:
  +
  +/* Save registers that the compiler may be using, and adjust %esp to	*/
  +/* make room for our stack frame.					*/
  +
  +		pushl	%ebp
  +		pushl	%edi
  +		pushl	%esi
  +		pushl	%ebx
  +		subl	$LocalVarsSize, %esp
  +
  +/* Retrieve the function arguments. %ecx will hold cur_match		*/
  +/* throughout the entire function. %edx will hold the pointer to the	*/
  +/* deflate_state structure during the function's setup (before		*/
  +/* entering the main loop).						*/
  +
  +		movl	deflatestate(%esp), %edx
  +		movl	curmatch(%esp), %ecx
  +
  +/* uInt wmask = s->w_mask;						*/
  +/* unsigned chain_length = s->max_chain_length;				*/
  +/* if (s->prev_length >= s->good_match) {				*/
  +/*     chain_length >>= 2;						*/
  +/* }									*/
  +
  +		movl	dsPrevLen(%edx), %eax
  +		movl	dsGoodMatch(%edx), %ebx
  +		cmpl	%ebx, %eax
  +		movl	dsWMask(%edx), %eax
  +		movl	dsMaxChainLen(%edx), %ebx
  +		jl	LastMatchGood
  +		shrl	$2, %ebx
  +LastMatchGood:
  +
  +/* chainlen is decremented once beforehand so that the function can	*/
  +/* use the sign flag instead of the zero flag for the exit test.	*/
  +/* It is then shifted into the high word, to make room for the wmask	*/
  +/* value, which it will always accompany.				*/
  +
  +		decl	%ebx
  +		shll	$16, %ebx
  +		orl	%eax, %ebx
  +		movl	%ebx, chainlenwmask(%esp)
  +
  +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;	*/
  +
  +		movl	dsNiceMatch(%edx), %eax
  +		movl	dsLookahead(%edx), %ebx
  +		cmpl	%eax, %ebx
  +		jl	LookaheadLess
  +		movl	%eax, %ebx
  +LookaheadLess:	movl	%ebx, nicematch(%esp)
  +
  +/* register Bytef *scan = s->window + s->strstart;			*/
  +
  +		movl	dsWindow(%edx), %esi
  +		movl	%esi, window(%esp)
  +		movl	dsStrStart(%edx), %ebp
  +		lea	(%esi,%ebp), %edi
  +		movl	%edi, scan(%esp)
  +
  +/* Determine how many bytes the scan ptr is off from being		*/
  +/* dword-aligned.							*/
  +
  +		movl	%edi, %eax
  +		negl	%eax
  +		andl	$3, %eax
  +		movl	%eax, scanalign(%esp)
  +
  +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?			*/
  +/*     s->strstart - (IPos)MAX_DIST(s) : NIL;				*/
  +
  +		movl	dsWSize(%edx), %eax
  +		subl	$MIN_LOOKAHEAD, %eax
  +		subl	%eax, %ebp
  +		jg	LimitPositive
  +		xorl	%ebp, %ebp
  +LimitPositive:
  +
  +/* int best_len = s->prev_length;					*/
  +
  +		movl	dsPrevLen(%edx), %eax
  +		movl	%eax, bestlen(%esp)
  +
  +/* Store the sum of s->window + best_len in %esi locally, and in %esi.	*/
  +
  +		addl	%eax, %esi
  +		movl	%esi, windowbestlen(%esp)
  +
  +/* register ush scan_start = *(ushf*)scan;				*/
  +/* register ush scan_end   = *(ushf*)(scan+best_len-1);			*/
  +/* Posf *prev = s->prev;						*/
  +
  +		movzwl	(%edi), %ebx
  +		movl	%ebx, scanstart(%esp)
  +		movzwl	-1(%edi,%eax), %ebx
  +		movl	%ebx, scanend(%esp)
  +		movl	dsPrev(%edx), %edi
  +
  +/* Jump into the main loop.						*/
  +
  +		movl	chainlenwmask(%esp), %edx
  +		jmp	LoopEntry
  +
  +.balign 16
  +
  +/* do {
  + *     match = s->window + cur_match;
  + *     if (*(ushf*)(match+best_len-1) != scan_end ||
  + *         *(ushf*)match != scan_start) continue;
  + *     [...]
  + * } while ((cur_match = prev[cur_match & wmask]) > limit
  + *          && --chain_length != 0);
  + *
  + * Here is the inner loop of the function. The function will spend the
  + * majority of its time in this loop, and majority of that time will
  + * be spent in the first ten instructions.
  + *
  + * Within this loop:
  + * %ebx = scanend
  + * %ecx = curmatch
  + * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
  + * %esi = windowbestlen - i.e., (window + bestlen)
  + * %edi = prev
  + * %ebp = limit
  + */
  +LookupLoop:
  +		andl	%edx, %ecx
  +		movzwl	(%edi,%ecx,2), %ecx
  +		cmpl	%ebp, %ecx
  +		jbe	LeaveNow
  +		subl	$0x00010000, %edx
  +		js	LeaveNow
  +LoopEntry:	movzwl	-1(%esi,%ecx), %eax
  +		cmpl	%ebx, %eax
  +		jnz	LookupLoop
  +		movl	window(%esp), %eax
  +		movzwl	(%eax,%ecx), %eax
  +		cmpl	scanstart(%esp), %eax
  +		jnz	LookupLoop
  +
  +/* Store the current value of chainlen.					*/
  +
  +		movl	%edx, chainlenwmask(%esp)
  +
  +/* Point %edi to the string under scrutiny, and %esi to the string we	*/
  +/* are hoping to match it up with. In actuality, %esi and %edi are	*/
  +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is	*/
  +/* initialized to -(MAX_MATCH_8 - scanalign).				*/
  +
  +		movl	window(%esp), %esi
  +		movl	scan(%esp), %edi
  +		addl	%ecx, %esi
  +		movl	scanalign(%esp), %eax
  +		movl	$(-MAX_MATCH_8), %edx
  +		lea	MAX_MATCH_8(%edi,%eax), %edi
  +		lea	MAX_MATCH_8(%esi,%eax), %esi
  +
  +/* Test the strings for equality, 8 bytes at a time. At the end,
  + * adjust %edx so that it is offset to the exact byte that mismatched.
  + *
  + * We already know at this point that the first three bytes of the
  + * strings match each other, and they can be safely passed over before
  + * starting the compare loop. So what this code does is skip over 0-3
  + * bytes, as much as necessary in order to dword-align the %edi
  + * pointer. (%esi will still be misaligned three times out of four.)
  + *
  + * It should be confessed that this loop usually does not represent
  + * much of the total running time. Replacing it with a more
  + * straightforward "rep cmpsb" would not drastically degrade
  + * performance.
  + */
  +LoopCmps:
  +		movl	(%esi,%edx), %eax
  +		xorl	(%edi,%edx), %eax
  +		jnz	LeaveLoopCmps
  +		movl	4(%esi,%edx), %eax
  +		xorl	4(%edi,%edx), %eax
  +		jnz	LeaveLoopCmps4
  +		addl	$8, %edx
  +		jnz	LoopCmps
  +		jmp	LenMaximum
  +LeaveLoopCmps4:	addl	$4, %edx
  +LeaveLoopCmps:	testl	$0x0000FFFF, %eax
  +		jnz	LenLower
  +		addl	$2, %edx
  +		shrl	$16, %eax
  +LenLower:	subb	$1, %al
  +		adcl	$0, %edx
  +
  +/* Calculate the length of the match. If it is longer than MAX_MATCH,	*/
  +/* then automatically accept it as the best possible match and leave.	*/
  +
  +		lea	(%edi,%edx), %eax
  +		movl	scan(%esp), %edi
  +		subl	%edi, %eax
  +		cmpl	$MAX_MATCH, %eax
  +		jge	LenMaximum
  +
  +/* If the length of the match is not longer than the best match we	*/
  +/* have so far, then forget it and return to the lookup loop.		*/
  +
  +		movl	deflatestate(%esp), %edx
  +		movl	bestlen(%esp), %ebx
  +		cmpl	%ebx, %eax
  +		jg	LongerMatch
  +		movl	windowbestlen(%esp), %esi
  +		movl	dsPrev(%edx), %edi
  +		movl	scanend(%esp), %ebx
  +		movl	chainlenwmask(%esp), %edx
  +		jmp	LookupLoop
  +
  +/*         s->match_start = cur_match;					*/
  +/*         best_len = len;						*/
  +/*         if (len >= nice_match) break;				*/
  +/*         scan_end = *(ushf*)(scan+best_len-1);			*/
  +
  +LongerMatch:	movl	nicematch(%esp), %ebx
  +		movl	%eax, bestlen(%esp)
  +		movl	%ecx, dsMatchStart(%edx)
  +		cmpl	%ebx, %eax
  +		jge	LeaveNow
  +		movl	window(%esp), %esi
  +		addl	%eax, %esi
  +		movl	%esi, windowbestlen(%esp)
  +		movzwl	-1(%edi,%eax), %ebx
  +		movl	dsPrev(%edx), %edi
  +		movl	%ebx, scanend(%esp)
  +		movl	chainlenwmask(%esp), %edx
  +		jmp	LookupLoop
  +
  +/* Accept the current string, with the maximum possible length.		*/
  +
  +LenMaximum:	movl	deflatestate(%esp), %edx
  +		movl	$MAX_MATCH, bestlen(%esp)
  +		movl	%ecx, dsMatchStart(%edx)
  +
  +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;		*/
  +/* return s->lookahead;							*/
  +
  +LeaveNow:
  +		movl	deflatestate(%esp), %edx
  +		movl	bestlen(%esp), %ebx
  +		movl	dsLookahead(%edx), %eax
  +		cmpl	%eax, %ebx
  +		jg	LookaheadRet
  +		movl	%ebx, %eax
  +LookaheadRet:
  +
  +/* Restore the stack and return from whence we came.			*/
  +
  +		addl	$LocalVarsSize, %esp
  +		popl	%ebx
  +		popl	%esi
  +		popl	%edi
  +		popl	%ebp
  +match_init:	ret
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/delphi/ZLib.pas
  ============================================================================
  $ cvs diff -u -r1.3 -r1.4 ZLib.pas
  --- zlib/contrib/delphi/ZLib.pas	1 Jan 2005 14:50:32 -0000	1.3
  +++ zlib/contrib/delphi/ZLib.pas	16 Nov 2007 19:51:20 -0000	1.4
  @@ -152,7 +152,7 @@
     const OutBuf: Pointer; BufSize: Integer);
   
   const
  -  zlib_version = '1.2.2';
  +  zlib_version = '1.2.3';
   
   type
     EZlibError = class(Exception);
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/dotzlib/DotZLib/UnitTests.cs
  ============================================================================
  $ cvs diff -u -r1.1 -r1.2 UnitTests.cs
  --- zlib/contrib/dotzlib/DotZLib/UnitTests.cs	1 Jan 2005 15:06:41 -0000	1.1
  +++ zlib/contrib/dotzlib/DotZLib/UnitTests.cs	16 Nov 2007 19:51:20 -0000	1.2
  @@ -156,7 +156,7 @@
           public void Info_Version()
           {
               Info info = new Info();
  -            Assert.AreEqual("1.2.2", Info.Version);
  +            Assert.AreEqual("1.2.3", Info.Version);
               Assert.AreEqual(32, info.SizeOfUInt);
               Assert.AreEqual(32, info.SizeOfULong);
               Assert.AreEqual(32, info.SizeOfPointer);
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/infback9/inftree9.c
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 inftree9.c
  --- zlib/contrib/infback9/inftree9.c	16 Jul 2005 15:27:49 -0000	1.5
  +++ zlib/contrib/infback9/inftree9.c	16 Nov 2007 19:51:20 -0000	1.6
  @@ -9,7 +9,7 @@
   #define MAXBITS 15
   
   const char inflate9_copyright[] =
  -   " inflate9 1.2.2.4 Copyright 1995-2005 Mark Adler ";
  +   " inflate9 1.2.3 Copyright 1995-2005 Mark Adler ";
   /*
     If you use the zlib library in a product, an acknowledgment is welcome
     in the documentation of your product. If for some reason you cannot
  @@ -64,7 +64,7 @@
       static const unsigned short lext[31] = { /* Length codes 257..285 extra */
           128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
           130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
  -        133, 133, 133, 133, 144, 206, 69};
  +        133, 133, 133, 133, 144, 201, 196};
       static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
           1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
           65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
  @@ -128,7 +128,7 @@
           left -= count[len];
           if (left < 0) return -1;        /* over-subscribed */
       }
  -    if (left > 0 && (type == CODES || (codes - count[0] != 1)))
  +    if (left > 0 && (type == CODES || max != 1))
           return -1;                      /* incomplete set */
   
       /* generate offsets into symbol table for each length for sorting */
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/infback9/inftree9.h
  ============================================================================
  $ cvs diff -u -r1.1 -r1.2 inftree9.h
  --- zlib/contrib/infback9/inftree9.h	2 Aug 2004 20:19:49 -0000	1.1
  +++ zlib/contrib/infback9/inftree9.h	16 Nov 2007 19:51:20 -0000	1.2
  @@ -36,12 +36,12 @@
    */
   
   /* Maximum size of dynamic tree.  The maximum found in a long but non-
  -   exhaustive search was 1004 code structures (850 for length/literals
  -   and 154 for distances, the latter actually the result of an
  +   exhaustive search was 1444 code structures (852 for length/literals
  +   and 592 for distances, the latter actually the result of an
      exhaustive search).  The true maximum is not known, but the value
      below is more than safe. */
  -#define ENOUGH 1440
  -#define MAXD 154
  +#define ENOUGH 2048
  +#define MAXD 592
   
   /* Type of code to build for inftable() */
   typedef enum {
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/masmx64/gvmat64.asm
  ============================================================================
  $ cvs diff -u -r1.1 -r1.2 gvmat64.asm
  --- zlib/contrib/masmx64/gvmat64.asm	16 Jul 2005 15:27:49 -0000	1.1
  +++ zlib/contrib/masmx64/gvmat64.asm	16 Nov 2007 19:51:20 -0000	1.2
  @@ -4,24 +4,33 @@
   
   ; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86
   ; Copyright (C) 1995-2005 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
  -; File written by Gilles Vollant, by modifiying the longest_match
  -;  from Jean-loup Gailly in deflate.c
  -;  and modifying asm686 with masm, optimised assembly code from Brian Raiter,
  -;      written 1998
  +;
  +; File written by Gilles Vollant, by converting to assembly the longest_match
  +;  from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
  +;
  +;  and by taking inspiration on asm686 with masm, optimised assembly code
  +;        from Brian Raiter, written 1998
  +;
   ;         http://www.zlib.net

   ;         http://www.winimage.com/zLibDll

   ;         http://www.muppetlabs.com/~breadbox/software/assembly.html

   ;
  -; to compile this file, I use option
  +; to compile this file for infozip Zip, I use option:
  +;   ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm
  +;
  +; to compile this file for zLib, I use option:
   ;   ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
  -;   with Microsoft Macro Assembler (x64) for AMD64
  +; Be carrefull to adapt zlib1222add below to your version of zLib
  +;   (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change
  +;    value of zlib1222add later)
   ;
  -;   ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK
  +; This file compile with Microsoft Macro Assembler (x64) for AMD64
  +;
  +;   ml64.exe is given with Visual Studio 2005 and Windows 2003 server DDK
   ;
   ;   (you can get Windows 2003 server DDK with ml64 and cl for AMD64 from
   ;      http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price)
   ;
  -; Be carrefull to adapt zlib1222add below to your version of zLib
   
   
   ;uInt longest_match(s, cur_match)
  @@ -47,7 +56,10 @@
   ;scanalign       equ  rsp + xx - LocalVarsSize   ; dword-misalignment of string r13
   ;bestlen         equ  rsp + xx - LocalVarsSize   ; size of best match so far -> r11d
   ;scan            equ  rsp + xx - LocalVarsSize   ; ptr to string wanting match -> r9
  - nicematch       equ  rsp + 16 - LocalVarsSize   ; a good enough match size -> r14
  +IFDEF INFOZIP
  +ELSE
  + nicematch       equ  (rsp + 16 - LocalVarsSize) ; a good enough match size
  +ENDIF
   
   save_rdi        equ  rsp + 24 - LocalVarsSize
   save_rsi        equ  rsp + 32 - LocalVarsSize
  @@ -84,8 +96,34 @@
   ;  (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
   ;  if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
   
  -zlib1222add     equ 8
   
  +IFDEF INFOZIP
  +
  +_DATA   SEGMENT
  +COMM    window_size:DWORD
  +; WMask ; 7fff
  +COMM    window:BYTE:010040H
  +COMM    prev:WORD:08000H
  +; MatchLen : unused
  +; PrevMatch : unused
  +COMM    strstart:DWORD
  +COMM    match_start:DWORD
  +; Lookahead : ignore
  +COMM    prev_length:DWORD ; PrevLen
  +COMM    max_chain_length:DWORD
  +COMM    good_match:DWORD
  +COMM    nice_match:DWORD
  +prev_ad equ OFFSET prev
  +window_ad equ OFFSET window
  +nicematch equ nice_match
  +_DATA ENDS
  +WMask equ 07fffh
  +
  +ELSE
  +
  +  IFNDEF zlib1222add
  +    zlib1222add equ 8
  +  ENDIF
   dsWSize         equ 56+zlib1222add+(zlib1222add/2)
   dsWMask         equ 64+zlib1222add+(zlib1222add/2)
   dsWindow        equ 72+zlib1222add
  @@ -100,6 +138,18 @@
   dsGoodMatch     equ 172+zlib1222add
   dsNiceMatch     equ 176+zlib1222add
   
  +window_size     equ [ rcx + dsWSize]
  +WMask           equ [ rcx + dsWMask]
  +window_ad       equ [ rcx + dsWindow]
  +prev_ad         equ [ rcx + dsPrev]
  +strstart        equ [ rcx + dsStrStart]
  +match_start     equ [ rcx + dsMatchStart]
  +Lookahead       equ [ rcx + dsLookahead] ; 0ffffffffh on infozip
  +prev_length     equ [ rcx + dsPrevLen]
  +max_chain_length equ [ rcx + dsMaxChainLen]
  +good_match      equ [ rcx + dsGoodMatch]
  +nice_match      equ [ rcx + dsNiceMatch]
  +ENDIF
   
   ; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
   
  @@ -107,7 +157,7 @@
   ; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp

   ;
   ; All registers must be preserved across the call, except for
  -;   rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch.
  +;   rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
   
   
   
  @@ -124,12 +174,15 @@
   
   ; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
   
  -
           mov [save_rdi],rdi
           mov [save_rsi],rsi
           mov [save_rbx],rbx
           mov [save_rbp],rbp
  +IFDEF INFOZIP
  +        mov r8d,ecx
  +ELSE
           mov r8d,edx
  +ENDIF
           mov [save_r12],r12
           mov [save_r13],r13
   ;        mov [save_r14],r14
  @@ -142,10 +195,10 @@
   ;;;     chain_length >>= 2;
   ;;; }
   
  -        mov edi, [rcx + dsPrevLen]
  -        mov esi, [rcx + dsGoodMatch]
  -        mov eax, [rcx + dsWMask]
  -        mov ebx, [rcx + dsMaxChainLen]
  +        mov edi, prev_length
  +        mov esi, good_match
  +        mov eax, WMask
  +        mov ebx, max_chain_length
           cmp edi, esi
           jl  LastMatchGood
           shr ebx, 2
  @@ -159,21 +212,25 @@
           dec ebx
           shl ebx, 16
           or  ebx, eax
  -        mov [chainlenwmask], ebx
   
  +;;; on zlib only
   ;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
   
  -        mov eax, [rcx + dsNiceMatch]
  -        mov r10d, [rcx + dsLookahead]
  +IFDEF INFOZIP
  +        mov [chainlenwmask], ebx
  +; on infozip nice_match = [nice_match]
  +ELSE
  +        mov eax, nice_match
  +        mov [chainlenwmask], ebx
  +        mov r10d, Lookahead
           cmp r10d, eax
           cmovnl r10d, eax
           mov [nicematch],r10d
  -LookaheadLess:
  +ENDIF
   
   ;;; register Bytef *scan = s->window + s->strstart;
  -
  -        mov r10, [rcx + dsWindow]
  -        mov ebp, [rcx + dsStrStart]
  +        mov r10, window_ad
  +        mov ebp, strstart
           lea r13, [r10 + rbp]
   
   ;;; Determine how many bytes the scan ptr is off from being
  @@ -185,13 +242,16 @@
   
   ;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
   ;;;     s->strstart - (IPos)MAX_DIST(s) : NIL;
  -
  -        mov eax, [rcx + dsWSize]
  +IFDEF INFOZIP
  +        mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
  +ELSE
  +        mov eax, window_size
           sub eax, MIN_LOOKAHEAD
  +ENDIF
           xor edi,edi
           sub ebp, eax
   
  -        mov r11d, [rcx + dsPrevLen]
  +        mov r11d, prev_length
   
           cmovng ebp,edi
   
  @@ -207,8 +267,9 @@
   ;;; Posf *prev = s->prev;
   
           movzx r12d,word ptr [r9]
  -        movzx   ebx, word ptr [r9 + r11 - 1]
  -        mov rdi, [rcx + dsPrev]
  +        movzx ebx, word ptr [r9 + r11 - 1]
  +
  +        mov rdi, prev_ad
   
   ;;; Jump into the main loop.
   
  @@ -312,38 +373,22 @@
   
           prefetcht1 [rsi+rdx]
           prefetcht1 [rdi+rdx]
  +
  +
   ;;; Test the strings for equality, 8 bytes at a time. At the end,
  -;;; adjust edx so that it is offset to the exact byte that mismatched.
  +;;; adjust rdx so that it is offset to the exact byte that mismatched.
   ;;;
   ;;; We already know at this point that the first three bytes of the
   ;;; strings match each other, and they can be safely passed over before
   ;;; starting the compare loop. So what this code does is skip over 0-3
   ;;; bytes, as much as necessary in order to dword-align the edi
  -;;; pointer. (esi will still be misaligned three times out of four.)
  +;;; pointer. (rsi will still be misaligned three times out of four.)
   ;;;
   ;;; It should be confessed that this loop usually does not represent
   ;;; much of the total running time. Replacing it with a more
   ;;; straightforward "rep cmpsb" would not drastically degrade
   ;;; performance.
   
  -;LoopCmps:
  -;        mov eax, [rsi + rdx]
  -;        xor eax, [rdi + rdx]
  -;        jnz LeaveLoopCmps
  -;        mov eax, [rsi + rdx + 4]
  -;        xor eax, [rdi + rdx + 4]
  -;        jnz LeaveLoopCmps4
  -;        add rdx, 8
  -;        jnz LoopCmps
  -;        jmp LenMaximum
  -;LeaveLoopCmps4: add rdx, 4
  -;LeaveLoopCmps:  test    eax, 0000FFFFh
  -;        jnz LenLower
  -;        add rdx,  2
  -;        shr eax, 16
  -;LenLower:   sub al, 1
  -;        adc rdx, 0
  -
   
   LoopCmps:
           mov rax, [rsi + rdx]
  @@ -400,7 +445,7 @@
   
           lea rsi,[r10+r11]
   
  -        mov rdi, [rcx + dsPrev]
  +        mov rdi, prev_ad
           mov edx, [chainlenwmask]
           jmp LookupLoop
   
  @@ -411,14 +456,14 @@
   
   LongerMatch:
           mov r11d, eax
  -        mov [rcx + dsMatchStart], r8d
  +        mov match_start, r8d
           cmp eax, [nicematch]
           jge LeaveNow
   
           lea rsi,[r10+rax]
   
           movzx   ebx, word ptr [r9 + rax - 1]
  -        mov rdi, [rcx + dsPrev]
  +        mov rdi, prev_ad
           mov edx, [chainlenwmask]
           jmp LookupLoop
   
  @@ -426,16 +471,19 @@
   
   LenMaximum:
           mov r11d,MAX_MATCH
  -        mov [rcx + dsMatchStart], r8d
  +        mov match_start, r8d
   
   ;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
   ;;; return s->lookahead;
   
   LeaveNow:
  -        mov eax, [rcx + dsLookahead]
  +IFDEF INFOZIP
  +        mov eax,r11d
  +ELSE
  +        mov eax, Lookahead
           cmp r11d, eax
           cmovng eax, r11d
  -
  +ENDIF
   
   ;;; Restore the stack and return from whence we came.
   
  @@ -452,7 +500,8 @@
   
           ret 0
   ; please don't remove this string !
  -; Your can freely use gvmat32 in any free or commercial app if you don't remove the string in the binary!
  +; Your can freely use gvmat64 in any free or commercial app
  +; but it is far better don't remove the string in the binary!
       db     0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
   longest_match   ENDP
   
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/ChangeLogUnzip
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 ChangeLogUnzip
  --- zlib/contrib/minizip/ChangeLogUnzip	16 Jul 2005 15:27:49 -0000	1.5
  +++ zlib/contrib/minizip/ChangeLogUnzip	16 Nov 2007 19:51:21 -0000	1.6
  @@ -1,67 +1,67 @@
  -Change in 1.01e (12 feb 05)
  -- Fix in zipOpen2 for globalcomment (Rolf Kalbermatter)
  -- Fix possible memory leak in unzip.c (Zoran Stevanovic)
  -
  -Change in 1.01b (20 may 04)
  -- Integrate patch from Debian package (submited by Mark Brown)
  -- Add tools mztools from Xavier Roche
  -
  -Change in 1.01 (8 may 04)
  -- fix buffer overrun risk in unzip.c (Xavier Roche)
  -- fix a minor buffer insecurity in minizip.c (Mike Whittaker)
  -
  -Change in 1.00: (10 sept 03)
  -- rename to 1.00
  -- cosmetic code change
  -
  -Change in 0.22: (19 May 03)
  -- crypting support (unless you define NOCRYPT)
  -- append file in existing zipfile
  -
  -Change in 0.21: (10 Mar 03)
  -- bug fixes
  -
  -Change in 0.17: (27 Jan 02)
  -- bug fixes
  -
  -Change in 0.16: (19 Jan 02)
  -- Support of ioapi for virtualize zip file access
  -
  -Change in 0.15: (19 Mar 98)
  -- fix memory leak in minizip.c
  -
  -Change in 0.14: (10 Mar 98)
  -- fix bugs in minizip.c sample for zipping big file
  -- fix problem in month in date handling
  -- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
  -    comment handling
  -
  -Change in 0.13: (6 Mar 98)
  -- fix bugs in zip.c
  -- add real minizip sample
  -
  -Change in 0.12: (4 Mar 98)
  -- add zip.c and zip.h for creates .zip file
  -- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
  -- fix miniunz.c for file without specific record for directory
  -
  -Change in 0.11: (3 Mar 98)
  -- fix bug in unzGetCurrentFileInfo for get extra field and comment
  -- enhance miniunz sample, remove the bad unztst.c sample
  -
  -Change in 0.10: (2 Mar 98)
  -- fix bug in unzReadCurrentFile
  -- rename unzip* to unz* function and structure
  -- remove Windows-like hungary notation variable name
  -- modify some structure in unzip.h
  -- add somes comment in source
  -- remove unzipGetcCurrentFile function
  -- replace ZUNZEXPORT by ZEXPORT
  -- add unzGetLocalExtrafield for get the local extrafield info
  -- add a new sample, miniunz.c
  -
  -Change in 0.4: (25 Feb 98)
  -- suppress the type unzipFileInZip.
  -  Only on file in the zipfile can be open at the same time
  -- fix somes typo in code
  -- added tm_unz structure in unzip_file_info (date/time in readable format)
  +Change in 1.01e (12 feb 05)
  +- Fix in zipOpen2 for globalcomment (Rolf Kalbermatter)
  +- Fix possible memory leak in unzip.c (Zoran Stevanovic)
  +
  +Change in 1.01b (20 may 04)
  +- Integrate patch from Debian package (submited by Mark Brown)
  +- Add tools mztools from Xavier Roche
  +
  +Change in 1.01 (8 may 04)
  +- fix buffer overrun risk in unzip.c (Xavier Roche)
  +- fix a minor buffer insecurity in minizip.c (Mike Whittaker)
  +
  +Change in 1.00: (10 sept 03)
  +- rename to 1.00
  +- cosmetic code change
  +
  +Change in 0.22: (19 May 03)
  +- crypting support (unless you define NOCRYPT)
  +- append file in existing zipfile
  +
  +Change in 0.21: (10 Mar 03)
  +- bug fixes
  +
  +Change in 0.17: (27 Jan 02)
  +- bug fixes
  +
  +Change in 0.16: (19 Jan 02)
  +- Support of ioapi for virtualize zip file access
  +
  +Change in 0.15: (19 Mar 98)
  +- fix memory leak in minizip.c
  +
  +Change in 0.14: (10 Mar 98)
  +- fix bugs in minizip.c sample for zipping big file
  +- fix problem in month in date handling
  +- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
  +    comment handling
  +
  +Change in 0.13: (6 Mar 98)
  +- fix bugs in zip.c
  +- add real minizip sample
  +
  +Change in 0.12: (4 Mar 98)
  +- add zip.c and zip.h for creates .zip file
  +- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
  +- fix miniunz.c for file without specific record for directory
  +
  +Change in 0.11: (3 Mar 98)
  +- fix bug in unzGetCurrentFileInfo for get extra field and comment
  +- enhance miniunz sample, remove the bad unztst.c sample
  +
  +Change in 0.10: (2 Mar 98)
  +- fix bug in unzReadCurrentFile
  +- rename unzip* to unz* function and structure
  +- remove Windows-like hungary notation variable name
  +- modify some structure in unzip.h
  +- add somes comment in source
  +- remove unzipGetcCurrentFile function
  +- replace ZUNZEXPORT by ZEXPORT
  +- add unzGetLocalExtrafield for get the local extrafield info
  +- add a new sample, miniunz.c
  +
  +Change in 0.4: (25 Feb 98)
  +- suppress the type unzipFileInZip.
  +  Only on file in the zipfile can be open at the same time
  +- fix somes typo in code
  +- added tm_unz structure in unzip_file_info (date/time in readable format)
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/crypt.h
  ============================================================================
  $ cvs diff -u -r1.4 -r1.5 crypt.h
  --- zlib/contrib/minizip/crypt.h	16 Jul 2005 15:27:49 -0000	1.4
  +++ zlib/contrib/minizip/crypt.h	16 Nov 2007 19:51:21 -0000	1.5
  @@ -1,132 +1,132 @@
  -/* crypt.h -- base code for crypt/uncrypt ZIPfile
  -
  -
  -   Version 1.01e, February 12th, 2005
  -
  -   Copyright (C) 1998-2005 Gilles Vollant
  -
  -   This code is a modified version of crypting code in Infozip distribution
  -
  -   The encryption/decryption parts of this source code (as opposed to the
  -   non-echoing password parts) were originally written in Europe.  The
  -   whole source package can be freely distributed, including from the USA.
  -   (Prior to January 2000, re-export from the US was a violation of US law.)
  -
  -   This encryption code is a direct transcription of the algorithm from
  -   Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
  -   file (appnote.txt) is distributed with the PKZIP program (even in the
  -   version without encryption capabilities).
  -
  -   If you don't need crypting in your application, just define symbols
  -   NOCRYPT and NOUNCRYPT.
  -
  -   This code support the "Traditional PKWARE Encryption".
  -
  -   The new AES encryption added on Zip format by Winzip (see the page
  -   http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
  -   Encryption is not supported.
  -*/
  -
  -#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
  -
  -/***********************************************************************
  - * Return the next byte in the pseudo-random sequence
  - */
  -static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
  -{
  -    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
  -                     * unpredictable manner on 16-bit systems; not a problem
  -                     * with any known compiler so far, though */
  -
  -    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
  -    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
  -}
  -
  -/***********************************************************************
  - * Update the encryption keys with the next byte of plain text
  - */
  -static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
  -{
  -    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
  -    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
  -    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
  -    {
  -      register int keyshift = (int)((*(pkeys+1)) >> 24);
  -      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
  -    }
  -    return c;
  -}
  -
  -
  -/***********************************************************************
  - * Initialize the encryption keys and the random header according to
  - * the given password.
  - */
  -static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
  -{
  -    *(pkeys+0) = 305419896L;
  -    *(pkeys+1) = 591751049L;
  -    *(pkeys+2) = 878082192L;
  -    while (*passwd != '\0') {
  -        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
  -        passwd++;
  -    }
  -}
  -
  -#define zdecode(pkeys,pcrc_32_tab,c) \
  -    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
  -
  -#define zencode(pkeys,pcrc_32_tab,c,t) \
  -    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
  -
  -#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
  -
  -#define RAND_HEAD_LEN  12
  -   /* "last resort" source for second part of crypt seed pattern */
  -#  ifndef ZCR_SEED2
  -#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
  -#  endif
  -
  -static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
  -    const char *passwd;         /* password string */
  -    unsigned char *buf;         /* where to write header */
  -    int bufSize;
  -    unsigned long* pkeys;
  -    const unsigned long* pcrc_32_tab;
  -    unsigned long crcForCrypting;
  -{
  -    int n;                       /* index in random header */
  -    int t;                       /* temporary */
  -    int c;                       /* random byte */
  -    unsigned char header[RAND_HEAD_LEN-2]; /* random header */
  -    static unsigned calls = 0;   /* ensure different random header each time */
  -
  -    if (bufSize<RAND_HEAD_LEN)
  -      return 0;
  -
  -    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
  -     * output of rand() to get less predictability, since rand() is
  -     * often poorly implemented.
  -     */
  -    if (++calls == 1)
  -    {
  -        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
  -    }
  -    init_keys(passwd, pkeys, pcrc_32_tab);
  -    for (n = 0; n < RAND_HEAD_LEN-2; n++)
  -    {
  -        c = (rand() >> 7) & 0xff;
  -        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
  -    }
  -    /* Encrypt random header (last two bytes is high word of crc) */
  -    init_keys(passwd, pkeys, pcrc_32_tab);
  -    for (n = 0; n < RAND_HEAD_LEN-2; n++)
  -    {
  -        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
  -    }
  -    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
  -    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
  -    return n;
  -}
  -
  -#endif
  +/* crypt.h -- base code for crypt/uncrypt ZIPfile
  +
  +
  +   Version 1.01e, February 12th, 2005
  +
  +   Copyright (C) 1998-2005 Gilles Vollant
  +
  +   This code is a modified version of crypting code in Infozip distribution
  +
  +   The encryption/decryption parts of this source code (as opposed to the
  +   non-echoing password parts) were originally written in Europe.  The
  +   whole source package can be freely distributed, including from the USA.
  +   (Prior to January 2000, re-export from the US was a violation of US law.)
  +
  +   This encryption code is a direct transcription of the algorithm from
  +   Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
  +   file (appnote.txt) is distributed with the PKZIP program (even in the
  +   version without encryption capabilities).
  +
  +   If you don't need crypting in your application, just define symbols
  +   NOCRYPT and NOUNCRYPT.
  +
  +   This code support the "Traditional PKWARE Encryption".
  +
  +   The new AES encryption added on Zip format by Winzip (see the page
  +   http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
  +   Encryption is not supported.
  +*/
  +
  +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
  +
  +/***********************************************************************
  + * Return the next byte in the pseudo-random sequence
  + */
  +static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
  +{
  +    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
  +                     * unpredictable manner on 16-bit systems; not a problem
  +                     * with any known compiler so far, though */
  +
  +    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
  +    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
  +}
  +
  +/***********************************************************************
  + * Update the encryption keys with the next byte of plain text
  + */
  +static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
  +{
  +    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
  +    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
  +    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
  +    {
  +      register int keyshift = (int)((*(pkeys+1)) >> 24);
  +      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
  +    }
  +    return c;
  +}
  +
  +
  +/***********************************************************************
  + * Initialize the encryption keys and the random header according to
  + * the given password.
  + */
  +static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
  +{
  +    *(pkeys+0) = 305419896L;
  +    *(pkeys+1) = 591751049L;
  +    *(pkeys+2) = 878082192L;
  +    while (*passwd != '\0') {
  +        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
  +        passwd++;
  +    }
  +}
  +
  +#define zdecode(pkeys,pcrc_32_tab,c) \
  +    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
  +
  +#define zencode(pkeys,pcrc_32_tab,c,t) \
  +    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
  +
  +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
  +
  +#define RAND_HEAD_LEN  12
  +   /* "last resort" source for second part of crypt seed pattern */
  +#  ifndef ZCR_SEED2
  +#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
  +#  endif
  +
  +static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
  +    const char *passwd;         /* password string */
  +    unsigned char *buf;         /* where to write header */
  +    int bufSize;
  +    unsigned long* pkeys;
  +    const unsigned long* pcrc_32_tab;
  +    unsigned long crcForCrypting;
  +{
  +    int n;                       /* index in random header */
  +    int t;                       /* temporary */
  +    int c;                       /* random byte */
  +    unsigned char header[RAND_HEAD_LEN-2]; /* random header */
  +    static unsigned calls = 0;   /* ensure different random header each time */
  +
  +    if (bufSize<RAND_HEAD_LEN)
  +      return 0;
  +
  +    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
  +     * output of rand() to get less predictability, since rand() is
  +     * often poorly implemented.
  +     */
  +    if (++calls == 1)
  +    {
  +        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
  +    }
  +    init_keys(passwd, pkeys, pcrc_32_tab);
  +    for (n = 0; n < RAND_HEAD_LEN-2; n++)
  +    {
  +        c = (rand() >> 7) & 0xff;
  +        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
  +    }
  +    /* Encrypt random header (last two bytes is high word of crc) */
  +    init_keys(passwd, pkeys, pcrc_32_tab);
  +    for (n = 0; n < RAND_HEAD_LEN-2; n++)
  +    {
  +        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
  +    }
  +    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
  +    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
  +    return n;
  +}
  +
  +#endif
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/ioapi.c
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 ioapi.c
  --- zlib/contrib/minizip/ioapi.c	16 Jul 2005 15:27:49 -0000	1.5
  +++ zlib/contrib/minizip/ioapi.c	16 Nov 2007 19:51:21 -0000	1.6
  @@ -1,177 +1,177 @@
  -/* ioapi.c -- IO base function header for compress/uncompress .zip
  -   files using zlib + zip or unzip API
  -
  -   Version 1.01e, February 12th, 2005
  -
  -   Copyright (C) 1998-2005 Gilles Vollant
  -*/
  -
  -#include <stdio.h>
  -#include <stdlib.h>
  -#include <string.h>
  -
  -#include "zlib.h"
  -#include "ioapi.h"
  -
  -
  -
  -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
  -
  -#ifndef SEEK_CUR
  -#define SEEK_CUR    1
  -#endif
  -
  -#ifndef SEEK_END
  -#define SEEK_END    2
  -#endif
  -
  -#ifndef SEEK_SET
  -#define SEEK_SET    0
  -#endif
  -
  -voidpf ZCALLBACK fopen_file_func OF((
  -   voidpf opaque,
  -   const char* filename,
  -   int mode));
  -
  -uLong ZCALLBACK fread_file_func OF((
  -   voidpf opaque,
  -   voidpf stream,
  -   void* buf,
  -   uLong size));
  -
  -uLong ZCALLBACK fwrite_file_func OF((
  -   voidpf opaque,
  -   voidpf stream,
  -   const void* buf,
  -   uLong size));
  -
  -long ZCALLBACK ftell_file_func OF((
  -   voidpf opaque,
  -   voidpf stream));
  -
  -long ZCALLBACK fseek_file_func OF((
  -   voidpf opaque,
  -   voidpf stream,
  -   uLong offset,
  -   int origin));
  -
  -int ZCALLBACK fclose_file_func OF((
  -   voidpf opaque,
  -   voidpf stream));
  -
  -int ZCALLBACK ferror_file_func OF((
  -   voidpf opaque,
  -   voidpf stream));
  -
  -
  -voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
  -   voidpf opaque;
  -   const char* filename;
  -   int mode;
  -{
  -    FILE* file = NULL;
  -    const char* mode_fopen = NULL;
  -    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
  -        mode_fopen = "rb";
  -    else
  -    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
  -        mode_fopen = "r+b";
  -    else
  -    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
  -        mode_fopen = "wb";
  -
  -    if ((filename!=NULL) && (mode_fopen != NULL))
  -        file = fopen(filename, mode_fopen);
  -    return file;
  -}
  -
  -
  -uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
  -   voidpf opaque;
  -   voidpf stream;
  -   void* buf;
  -   uLong size;
  -{
  -    uLong ret;
  -    ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
  -    return ret;
  -}
  -
  -
  -uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
  -   voidpf opaque;
  -   voidpf stream;
  -   const void* buf;
  -   uLong size;
  -{
  -    uLong ret;
  -    ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
  -    return ret;
  -}
  -
  -long ZCALLBACK ftell_file_func (opaque, stream)
  -   voidpf opaque;
  -   voidpf stream;
  -{
  -    long ret;
  -    ret = ftell((FILE *)stream);
  -    return ret;
  -}
  -
  -long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
  -   voidpf opaque;
  -   voidpf stream;
  -   uLong offset;
  -   int origin;
  -{
  -    int fseek_origin=0;
  -    long ret;
  -    switch (origin)
  -    {
  -    case ZLIB_FILEFUNC_SEEK_CUR :
  -        fseek_origin = SEEK_CUR;
  -        break;
  -    case ZLIB_FILEFUNC_SEEK_END :
  -        fseek_origin = SEEK_END;
  -        break;
  -    case ZLIB_FILEFUNC_SEEK_SET :
  -        fseek_origin = SEEK_SET;
  -        break;
  -    default: return -1;
  -    }
  -    ret = 0;
  -    fseek((FILE *)stream, offset, fseek_origin);
  -    return ret;
  -}
  -
  -int ZCALLBACK fclose_file_func (opaque, stream)
  -   voidpf opaque;
  -   voidpf stream;
  -{
  -    int ret;
  -    ret = fclose((FILE *)stream);
  -    return ret;
  -}
  -
  -int ZCALLBACK ferror_file_func (opaque, stream)
  -   voidpf opaque;
  -   voidpf stream;
  -{
  -    int ret;
  -    ret = ferror((FILE *)stream);
  -    return ret;
  -}
  -
  -void fill_fopen_filefunc (pzlib_filefunc_def)
  -  zlib_filefunc_def* pzlib_filefunc_def;
  -{
  -    pzlib_filefunc_def->zopen_file = fopen_file_func;
  -    pzlib_filefunc_def->zread_file = fread_file_func;
  -    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
  -    pzlib_filefunc_def->ztell_file = ftell_file_func;
  -    pzlib_filefunc_def->zseek_file = fseek_file_func;
  -    pzlib_filefunc_def->zclose_file = fclose_file_func;
  -    pzlib_filefunc_def->zerror_file = ferror_file_func;
  -    pzlib_filefunc_def->opaque = NULL;
  -}
  +/* ioapi.c -- IO base function header for compress/uncompress .zip
  +   files using zlib + zip or unzip API
  +
  +   Version 1.01e, February 12th, 2005
  +
  +   Copyright (C) 1998-2005 Gilles Vollant
  +*/
  +
  +#include <stdio.h>
  +#include <stdlib.h>
  +#include <string.h>
  +
  +#include "zlib.h"
  +#include "ioapi.h"
  +
  +
  +
  +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
  +
  +#ifndef SEEK_CUR
  +#define SEEK_CUR    1
  +#endif
  +
  +#ifndef SEEK_END
  +#define SEEK_END    2
  +#endif
  +
  +#ifndef SEEK_SET
  +#define SEEK_SET    0
  +#endif
  +
  +voidpf ZCALLBACK fopen_file_func OF((
  +   voidpf opaque,
  +   const char* filename,
  +   int mode));
  +
  +uLong ZCALLBACK fread_file_func OF((
  +   voidpf opaque,
  +   voidpf stream,
  +   void* buf,
  +   uLong size));
  +
  +uLong ZCALLBACK fwrite_file_func OF((
  +   voidpf opaque,
  +   voidpf stream,
  +   const void* buf,
  +   uLong size));
  +
  +long ZCALLBACK ftell_file_func OF((
  +   voidpf opaque,
  +   voidpf stream));
  +
  +long ZCALLBACK fseek_file_func OF((
  +   voidpf opaque,
  +   voidpf stream,
  +   uLong offset,
  +   int origin));
  +
  +int ZCALLBACK fclose_file_func OF((
  +   voidpf opaque,
  +   voidpf stream));
  +
  +int ZCALLBACK ferror_file_func OF((
  +   voidpf opaque,
  +   voidpf stream));
  +
  +
  +voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
  +   voidpf opaque;
  +   const char* filename;
  +   int mode;
  +{
  +    FILE* file = NULL;
  +    const char* mode_fopen = NULL;
  +    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
  +        mode_fopen = "rb";
  +    else
  +    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
  +        mode_fopen = "r+b";
  +    else
  +    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
  +        mode_fopen = "wb";
  +
  +    if ((filename!=NULL) && (mode_fopen != NULL))
  +        file = fopen(filename, mode_fopen);
  +    return file;
  +}
  +
  +
  +uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
  +   voidpf opaque;
  +   voidpf stream;
  +   void* buf;
  +   uLong size;
  +{
  +    uLong ret;
  +    ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
  +    return ret;
  +}
  +
  +
  +uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
  +   voidpf opaque;
  +   voidpf stream;
  +   const void* buf;
  +   uLong size;
  +{
  +    uLong ret;
  +    ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
  +    return ret;
  +}
  +
  +long ZCALLBACK ftell_file_func (opaque, stream)
  +   voidpf opaque;
  +   voidpf stream;
  +{
  +    long ret;
  +    ret = ftell((FILE *)stream);
  +    return ret;
  +}
  +
  +long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
  +   voidpf opaque;
  +   voidpf stream;
  +   uLong offset;
  +   int origin;
  +{
  +    int fseek_origin=0;
  +    long ret;
  +    switch (origin)
  +    {
  +    case ZLIB_FILEFUNC_SEEK_CUR :
  +        fseek_origin = SEEK_CUR;
  +        break;
  +    case ZLIB_FILEFUNC_SEEK_END :
  +        fseek_origin = SEEK_END;
  +        break;
  +    case ZLIB_FILEFUNC_SEEK_SET :
  +        fseek_origin = SEEK_SET;
  +        break;
  +    default: return -1;
  +    }
  +    ret = 0;
  +    fseek((FILE *)stream, offset, fseek_origin);
  +    return ret;
  +}
  +
  +int ZCALLBACK fclose_file_func (opaque, stream)
  +   voidpf opaque;
  +   voidpf stream;
  +{
  +    int ret;
  +    ret = fclose((FILE *)stream);
  +    return ret;
  +}
  +
  +int ZCALLBACK ferror_file_func (opaque, stream)
  +   voidpf opaque;
  +   voidpf stream;
  +{
  +    int ret;
  +    ret = ferror((FILE *)stream);
  +    return ret;
  +}
  +
  +void fill_fopen_filefunc (pzlib_filefunc_def)
  +  zlib_filefunc_def* pzlib_filefunc_def;
  +{
  +    pzlib_filefunc_def->zopen_file = fopen_file_func;
  +    pzlib_filefunc_def->zread_file = fread_file_func;
  +    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
  +    pzlib_filefunc_def->ztell_file = ftell_file_func;
  +    pzlib_filefunc_def->zseek_file = fseek_file_func;
  +    pzlib_filefunc_def->zclose_file = fclose_file_func;
  +    pzlib_filefunc_def->zerror_file = ferror_file_func;
  +    pzlib_filefunc_def->opaque = NULL;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/ioapi.h
  ============================================================================
  $ cvs diff -u -r1.4 -r1.5 ioapi.h
  --- zlib/contrib/minizip/ioapi.h	16 Jul 2005 15:27:49 -0000	1.4
  +++ zlib/contrib/minizip/ioapi.h	16 Nov 2007 19:51:21 -0000	1.5
  @@ -1,75 +1,75 @@
  -/* ioapi.h -- IO base function header for compress/uncompress .zip
  -   files using zlib + zip or unzip API
  -
  -   Version 1.01e, February 12th, 2005
  -
  -   Copyright (C) 1998-2005 Gilles Vollant
  -*/
  -
  -#ifndef _ZLIBIOAPI_H
  -#define _ZLIBIOAPI_H
  -
  -
  -#define ZLIB_FILEFUNC_SEEK_CUR (1)
  -#define ZLIB_FILEFUNC_SEEK_END (2)
  -#define ZLIB_FILEFUNC_SEEK_SET (0)
  -
  -#define ZLIB_FILEFUNC_MODE_READ      (1)
  -#define ZLIB_FILEFUNC_MODE_WRITE     (2)
  -#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
  -
  -#define ZLIB_FILEFUNC_MODE_EXISTING (4)
  -#define ZLIB_FILEFUNC_MODE_CREATE   (8)
  -
  -
  -#ifndef ZCALLBACK
  -
  -#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
  -#define ZCALLBACK CALLBACK
  -#else
  -#define ZCALLBACK
  -#endif
  -#endif
  -
  -#ifdef __cplusplus
  -extern "C" {
  -#endif
  -
  -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
  -typedef uLong  (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
  -typedef uLong  (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
  -typedef long   (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
  -typedef long   (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
  -typedef int    (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
  -typedef int    (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
  -
  -typedef struct zlib_filefunc_def_s
  -{
  -    open_file_func      zopen_file;
  -    read_file_func      zread_file;
  -    write_file_func     zwrite_file;
  -    tell_file_func      ztell_file;
  -    seek_file_func      zseek_file;
  -    close_file_func     zclose_file;
  -    testerror_file_func zerror_file;
  -    voidpf              opaque;
  -} zlib_filefunc_def;
  -
  -
  -
  -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
  -
  -#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
  -#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
  -#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
  -#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
  -#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
  -#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
  -
  -
  -#ifdef __cplusplus
  -}
  -#endif
  -
  -#endif
  -
  +/* ioapi.h -- IO base function header for compress/uncompress .zip
  +   files using zlib + zip or unzip API
  +
  +   Version 1.01e, February 12th, 2005
  +
  +   Copyright (C) 1998-2005 Gilles Vollant
  +*/
  +
  +#ifndef _ZLIBIOAPI_H
  +#define _ZLIBIOAPI_H
  +
  +
  +#define ZLIB_FILEFUNC_SEEK_CUR (1)
  +#define ZLIB_FILEFUNC_SEEK_END (2)
  +#define ZLIB_FILEFUNC_SEEK_SET (0)
  +
  +#define ZLIB_FILEFUNC_MODE_READ      (1)
  +#define ZLIB_FILEFUNC_MODE_WRITE     (2)
  +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
  +
  +#define ZLIB_FILEFUNC_MODE_EXISTING (4)
  +#define ZLIB_FILEFUNC_MODE_CREATE   (8)
  +
  +
  +#ifndef ZCALLBACK
  +
  +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
  +#define ZCALLBACK CALLBACK
  +#else
  +#define ZCALLBACK
  +#endif
  +#endif
  +
  +#ifdef __cplusplus
  +extern "C" {
  +#endif
  +
  +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
  +typedef uLong  (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
  +typedef uLong  (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
  +typedef long   (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
  +typedef long   (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
  +typedef int    (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
  +typedef int    (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
  +
  +typedef struct zlib_filefunc_def_s
  +{
  +    open_file_func      zopen_file;
  +    read_file_func      zread_file;
  +    write_file_func     zwrite_file;
  +    tell_file_func      ztell_file;
  +    seek_file_func      zseek_file;
  +    close_file_func     zclose_file;
  +    testerror_file_func zerror_file;
  +    voidpf              opaque;
  +} zlib_filefunc_def;
  +
  +
  +
  +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
  +
  +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
  +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
  +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
  +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
  +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
  +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
  +
  +
  +#ifdef __cplusplus
  +}
  +#endif
  +
  +#endif
  +
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/iowin32.c
  ============================================================================
  $ cvs diff -u -r1.4 -r1.5 iowin32.c
  --- zlib/contrib/minizip/iowin32.c	16 Jul 2005 15:27:49 -0000	1.4
  +++ zlib/contrib/minizip/iowin32.c	16 Nov 2007 19:51:21 -0000	1.5
  @@ -1,270 +1,270 @@
  -/* iowin32.c -- IO base function header for compress/uncompress .zip
  -   files using zlib + zip or unzip API
  -   This IO API version uses the Win32 API (for Microsoft Windows)
  -
  -   Version 1.01e, February 12th, 2005
  -
  -   Copyright (C) 1998-2005 Gilles Vollant
  -*/
  -
  -#include <stdlib.h>
  -
  -#include "zlib.h"
  -#include "ioapi.h"
  -#include "iowin32.h"
  -
  -#ifndef INVALID_HANDLE_VALUE
  -#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
  -#endif
  -
  -#ifndef INVALID_SET_FILE_POINTER
  -#define INVALID_SET_FILE_POINTER ((DWORD)-1)
  -#endif
  -
  -voidpf ZCALLBACK win32_open_file_func OF((
  -   voidpf opaque,
  -   const char* filename,
  -   int mode));
  -
  -uLong ZCALLBACK win32_read_file_func OF((
  -   voidpf opaque,
  -   voidpf stream,
  -   void* buf,
  -   uLong size));
  -
  -uLong ZCALLBACK win32_write_file_func OF((
  -   voidpf opaque,
  -   voidpf stream,
  -   const void* buf,
  -   uLong size));
  -
  -long ZCALLBACK win32_tell_file_func OF((
  -   voidpf opaque,
  -   voidpf stream));
  -
  -long ZCALLBACK win32_seek_file_func OF((
  -   voidpf opaque,
  -   voidpf stream,
  -   uLong offset,
  -   int origin));
  -
  -int ZCALLBACK win32_close_file_func OF((
  -   voidpf opaque,
  -   voidpf stream));
  -
  -int ZCALLBACK win32_error_file_func OF((
  -   voidpf opaque,
  -   voidpf stream));
  -
  -typedef struct
  -{
  -    HANDLE hf;
  -    int error;
  -} WIN32FILE_IOWIN;
  -
  -voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
  -   voidpf opaque;
  -   const char* filename;
  -   int mode;
  -{
  -    const char* mode_fopen = NULL;
  -    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
  -    HANDLE hFile = 0;
  -    voidpf ret=NULL;
  -
  -    dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
  -
  -    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
  -    {
  -        dwDesiredAccess = GENERIC_READ;
  -        dwCreationDisposition = OPEN_EXISTING;
  -        dwShareMode = FILE_SHARE_READ;
  -    }
  -    else
  -    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
  -    {
  -        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
  -        dwCreationDisposition = OPEN_EXISTING;
  -    }
  -    else
  -    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
  -    {
  -        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
  -        dwCreationDisposition = CREATE_ALWAYS;
  -    }
  -
  -    if ((filename!=NULL) && (dwDesiredAccess != 0))
  -        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
  -                      dwCreationDisposition, dwFlagsAndAttributes, NULL);
  -
  -    if (hFile == INVALID_HANDLE_VALUE)
  -        hFile = NULL;
  -
  -    if (hFile != NULL)
  -    {
  -        WIN32FILE_IOWIN w32fiow;
  -        w32fiow.hf = hFile;
  -        w32fiow.error = 0;
  -        ret = malloc(sizeof(WIN32FILE_IOWIN));
  -        if (ret==NULL)
  -            CloseHandle(hFile);
  -        else *((WIN32FILE_IOWIN*)ret) = w32fiow;
  -    }
  -    return ret;
  -}
  -
  -
  -uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
  -   voidpf opaque;
  -   voidpf stream;
  -   void* buf;
  -   uLong size;
  -{
  -    uLong ret=0;
  -    HANDLE hFile = NULL;
  -    if (stream!=NULL)
  -        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  -    if (hFile != NULL)
  -        if (!ReadFile(hFile, buf, size, &ret, NULL))
  -        {
  -            DWORD dwErr = GetLastError();
  -            if (dwErr == ERROR_HANDLE_EOF)
  -                dwErr = 0;
  -            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  -        }
  -
  -    return ret;
  -}
  -
  -
  -uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
  -   voidpf opaque;
  -   voidpf stream;
  -   const void* buf;
  -   uLong size;
  -{
  -    uLong ret=0;
  -    HANDLE hFile = NULL;
  -    if (stream!=NULL)
  -        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  -
  -    if (hFile !=NULL)
  -        if (!WriteFile(hFile, buf, size, &ret, NULL))
  -        {
  -            DWORD dwErr = GetLastError();
  -            if (dwErr == ERROR_HANDLE_EOF)
  -                dwErr = 0;
  -            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  -        }
  -
  -    return ret;
  -}
  -
  -long ZCALLBACK win32_tell_file_func (opaque, stream)
  -   voidpf opaque;
  -   voidpf stream;
  -{
  -    long ret=-1;
  -    HANDLE hFile = NULL;
  -    if (stream!=NULL)
  -        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  -    if (hFile != NULL)
  -    {
  -        DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
  -        if (dwSet == INVALID_SET_FILE_POINTER)
  -        {
  -            DWORD dwErr = GetLastError();
  -            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  -            ret = -1;
  -        }
  -        else
  -            ret=(long)dwSet;
  -    }
  -    return ret;
  -}
  -
  -long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
  -   voidpf opaque;
  -   voidpf stream;
  -   uLong offset;
  -   int origin;
  -{
  -    DWORD dwMoveMethod=0xFFFFFFFF;
  -    HANDLE hFile = NULL;
  -
  -    long ret=-1;
  -    if (stream!=NULL)
  -        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  -    switch (origin)
  -    {
  -    case ZLIB_FILEFUNC_SEEK_CUR :
  -        dwMoveMethod = FILE_CURRENT;
  -        break;
  -    case ZLIB_FILEFUNC_SEEK_END :
  -        dwMoveMethod = FILE_END;
  -        break;
  -    case ZLIB_FILEFUNC_SEEK_SET :
  -        dwMoveMethod = FILE_BEGIN;
  -        break;
  -    default: return -1;
  -    }
  -
  -    if (hFile != NULL)
  -    {
  -        DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
  -        if (dwSet == INVALID_SET_FILE_POINTER)
  -        {
  -            DWORD dwErr = GetLastError();
  -            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  -            ret = -1;
  -        }
  -        else
  -            ret=0;
  -    }
  -    return ret;
  -}
  -
  -int ZCALLBACK win32_close_file_func (opaque, stream)
  -   voidpf opaque;
  -   voidpf stream;
  -{
  -    int ret=-1;
  -
  -    if (stream!=NULL)
  -    {
  -        HANDLE hFile;
  -        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  -        if (hFile != NULL)
  -        {
  -            CloseHandle(hFile);
  -            ret=0;
  -        }
  -        free(stream);
  -    }
  -    return ret;
  -}
  -
  -int ZCALLBACK win32_error_file_func (opaque, stream)
  -   voidpf opaque;
  -   voidpf stream;
  -{
  -    int ret=-1;
  -    if (stream!=NULL)
  -    {
  -        ret = ((WIN32FILE_IOWIN*)stream) -> error;
  -    }
  -    return ret;
  -}
  -
  -void fill_win32_filefunc (pzlib_filefunc_def)
  -  zlib_filefunc_def* pzlib_filefunc_def;
  -{
  -    pzlib_filefunc_def->zopen_file = win32_open_file_func;
  -    pzlib_filefunc_def->zread_file = win32_read_file_func;
  -    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
  -    pzlib_filefunc_def->ztell_file = win32_tell_file_func;
  -    pzlib_filefunc_def->zseek_file = win32_seek_file_func;
  -    pzlib_filefunc_def->zclose_file = win32_close_file_func;
  -    pzlib_filefunc_def->zerror_file = win32_error_file_func;
  -    pzlib_filefunc_def->opaque=NULL;
  -}
  +/* iowin32.c -- IO base function header for compress/uncompress .zip
  +   files using zlib + zip or unzip API
  +   This IO API version uses the Win32 API (for Microsoft Windows)
  +
  +   Version 1.01e, February 12th, 2005
  +
  +   Copyright (C) 1998-2005 Gilles Vollant
  +*/
  +
  +#include <stdlib.h>
  +
  +#include "zlib.h"
  +#include "ioapi.h"
  +#include "iowin32.h"
  +
  +#ifndef INVALID_HANDLE_VALUE
  +#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
  +#endif
  +
  +#ifndef INVALID_SET_FILE_POINTER
  +#define INVALID_SET_FILE_POINTER ((DWORD)-1)
  +#endif
  +
  +voidpf ZCALLBACK win32_open_file_func OF((
  +   voidpf opaque,
  +   const char* filename,
  +   int mode));
  +
  +uLong ZCALLBACK win32_read_file_func OF((
  +   voidpf opaque,
  +   voidpf stream,
  +   void* buf,
  +   uLong size));
  +
  +uLong ZCALLBACK win32_write_file_func OF((
  +   voidpf opaque,
  +   voidpf stream,
  +   const void* buf,
  +   uLong size));
  +
  +long ZCALLBACK win32_tell_file_func OF((
  +   voidpf opaque,
  +   voidpf stream));
  +
  +long ZCALLBACK win32_seek_file_func OF((
  +   voidpf opaque,
  +   voidpf stream,
  +   uLong offset,
  +   int origin));
  +
  +int ZCALLBACK win32_close_file_func OF((
  +   voidpf opaque,
  +   voidpf stream));
  +
  +int ZCALLBACK win32_error_file_func OF((
  +   voidpf opaque,
  +   voidpf stream));
  +
  +typedef struct
  +{
  +    HANDLE hf;
  +    int error;
  +} WIN32FILE_IOWIN;
  +
  +voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
  +   voidpf opaque;
  +   const char* filename;
  +   int mode;
  +{
  +    const char* mode_fopen = NULL;
  +    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
  +    HANDLE hFile = 0;
  +    voidpf ret=NULL;
  +
  +    dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
  +
  +    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
  +    {
  +        dwDesiredAccess = GENERIC_READ;
  +        dwCreationDisposition = OPEN_EXISTING;
  +        dwShareMode = FILE_SHARE_READ;
  +    }
  +    else
  +    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
  +    {
  +        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
  +        dwCreationDisposition = OPEN_EXISTING;
  +    }
  +    else
  +    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
  +    {
  +        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
  +        dwCreationDisposition = CREATE_ALWAYS;
  +    }
  +
  +    if ((filename!=NULL) && (dwDesiredAccess != 0))
  +        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
  +                      dwCreationDisposition, dwFlagsAndAttributes, NULL);
  +
  +    if (hFile == INVALID_HANDLE_VALUE)
  +        hFile = NULL;
  +
  +    if (hFile != NULL)
  +    {
  +        WIN32FILE_IOWIN w32fiow;
  +        w32fiow.hf = hFile;
  +        w32fiow.error = 0;
  +        ret = malloc(sizeof(WIN32FILE_IOWIN));
  +        if (ret==NULL)
  +            CloseHandle(hFile);
  +        else *((WIN32FILE_IOWIN*)ret) = w32fiow;
  +    }
  +    return ret;
  +}
  +
  +
  +uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
  +   voidpf opaque;
  +   voidpf stream;
  +   void* buf;
  +   uLong size;
  +{
  +    uLong ret=0;
  +    HANDLE hFile = NULL;
  +    if (stream!=NULL)
  +        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  +    if (hFile != NULL)
  +        if (!ReadFile(hFile, buf, size, &ret, NULL))
  +        {
  +            DWORD dwErr = GetLastError();
  +            if (dwErr == ERROR_HANDLE_EOF)
  +                dwErr = 0;
  +            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  +        }
  +
  +    return ret;
  +}
  +
  +
  +uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
  +   voidpf opaque;
  +   voidpf stream;
  +   const void* buf;
  +   uLong size;
  +{
  +    uLong ret=0;
  +    HANDLE hFile = NULL;
  +    if (stream!=NULL)
  +        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  +
  +    if (hFile !=NULL)
  +        if (!WriteFile(hFile, buf, size, &ret, NULL))
  +        {
  +            DWORD dwErr = GetLastError();
  +            if (dwErr == ERROR_HANDLE_EOF)
  +                dwErr = 0;
  +            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  +        }
  +
  +    return ret;
  +}
  +
  +long ZCALLBACK win32_tell_file_func (opaque, stream)
  +   voidpf opaque;
  +   voidpf stream;
  +{
  +    long ret=-1;
  +    HANDLE hFile = NULL;
  +    if (stream!=NULL)
  +        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  +    if (hFile != NULL)
  +    {
  +        DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
  +        if (dwSet == INVALID_SET_FILE_POINTER)
  +        {
  +            DWORD dwErr = GetLastError();
  +            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  +            ret = -1;
  +        }
  +        else
  +            ret=(long)dwSet;
  +    }
  +    return ret;
  +}
  +
  +long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
  +   voidpf opaque;
  +   voidpf stream;
  +   uLong offset;
  +   int origin;
  +{
  +    DWORD dwMoveMethod=0xFFFFFFFF;
  +    HANDLE hFile = NULL;
  +
  +    long ret=-1;
  +    if (stream!=NULL)
  +        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  +    switch (origin)
  +    {
  +    case ZLIB_FILEFUNC_SEEK_CUR :
  +        dwMoveMethod = FILE_CURRENT;
  +        break;
  +    case ZLIB_FILEFUNC_SEEK_END :
  +        dwMoveMethod = FILE_END;
  +        break;
  +    case ZLIB_FILEFUNC_SEEK_SET :
  +        dwMoveMethod = FILE_BEGIN;
  +        break;
  +    default: return -1;
  +    }
  +
  +    if (hFile != NULL)
  +    {
  +        DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
  +        if (dwSet == INVALID_SET_FILE_POINTER)
  +        {
  +            DWORD dwErr = GetLastError();
  +            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
  +            ret = -1;
  +        }
  +        else
  +            ret=0;
  +    }
  +    return ret;
  +}
  +
  +int ZCALLBACK win32_close_file_func (opaque, stream)
  +   voidpf opaque;
  +   voidpf stream;
  +{
  +    int ret=-1;
  +
  +    if (stream!=NULL)
  +    {
  +        HANDLE hFile;
  +        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
  +        if (hFile != NULL)
  +        {
  +            CloseHandle(hFile);
  +            ret=0;
  +        }
  +        free(stream);
  +    }
  +    return ret;
  +}
  +
  +int ZCALLBACK win32_error_file_func (opaque, stream)
  +   voidpf opaque;
  +   voidpf stream;
  +{
  +    int ret=-1;
  +    if (stream!=NULL)
  +    {
  +        ret = ((WIN32FILE_IOWIN*)stream) -> error;
  +    }
  +    return ret;
  +}
  +
  +void fill_win32_filefunc (pzlib_filefunc_def)
  +  zlib_filefunc_def* pzlib_filefunc_def;
  +{
  +    pzlib_filefunc_def->zopen_file = win32_open_file_func;
  +    pzlib_filefunc_def->zread_file = win32_read_file_func;
  +    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
  +    pzlib_filefunc_def->ztell_file = win32_tell_file_func;
  +    pzlib_filefunc_def->zseek_file = win32_seek_file_func;
  +    pzlib_filefunc_def->zclose_file = win32_close_file_func;
  +    pzlib_filefunc_def->zerror_file = win32_error_file_func;
  +    pzlib_filefunc_def->opaque=NULL;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/iowin32.h
  ============================================================================
  $ cvs diff -u -r1.4 -r1.5 iowin32.h
  --- zlib/contrib/minizip/iowin32.h	16 Jul 2005 15:27:49 -0000	1.4
  +++ zlib/contrib/minizip/iowin32.h	16 Nov 2007 19:51:21 -0000	1.5
  @@ -1,21 +1,21 @@
  -/* iowin32.h -- IO base function header for compress/uncompress .zip
  -   files using zlib + zip or unzip API
  -   This IO API version uses the Win32 API (for Microsoft Windows)
  -
  -   Version 1.01e, February 12th, 2005
  -
  -   Copyright (C) 1998-2005 Gilles Vollant
  -*/
  -
  -#include <windows.h>
  -
  -
  -#ifdef __cplusplus
  -extern "C" {
  -#endif
  -
  -void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
  -
  -#ifdef __cplusplus
  -}
  -#endif
  +/* iowin32.h -- IO base function header for compress/uncompress .zip
  +   files using zlib + zip or unzip API
  +   This IO API version uses the Win32 API (for Microsoft Windows)
  +
  +   Version 1.01e, February 12th, 2005
  +
  +   Copyright (C) 1998-2005 Gilles Vollant
  +*/
  +
  +#include <windows.h>
  +
  +
  +#ifdef __cplusplus
  +extern "C" {
  +#endif
  +
  +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
  +
  +#ifdef __cplusplus
  +}
  +#endif
  @@ .
  patch -p0 <<'@@ .'
  Index: zlib/contrib/minizip/miniunz.c
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 miniunz.c
  --- zlib/contrib/minizip/miniunz.c	16 Jul 2005 15:27:49 -0000	1.6
  +++ zlib/contrib/minizip/miniunz.c	16 Nov 2007 19:51:21 -0000	1.7
  @@ -1,585 +1,585 @@
  -/*
  -   miniunz.c
  -   Version 1.01e, February 12th, 2005
  -
  -   Copyright (C) 1998-2005 Gilles Vollant
  -*/
  -
  -
  -#include <stdio.h>
  -#include <stdlib.h>
  -#include <string.h>
  -#include <time.h>
  -#include <errno.h>
  -#include <fcntl.h>
  -
  -#ifdef unix
  -# include <unistd.h>
  -# include <utime.h>
  -#else
  -# include <direct.h>
  -# include <io.h>
  -#endif
  -
  -#include "unzip.h"
  -
  -#define CASESENSITIVITY (0)
  -#define WRITEBUFFERSIZE (8192)
  -#define MAXFILENAME (256)
  -
  -#ifdef WIN32
  -#define USEWIN32IOAPI
  -#include "iowin32.h"
  -#endif
  -/*
  -  mini unzip, demo of unzip package
  -
  -  usage :
  -  Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir]
  -
  -  list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
  -    if it exists
  -*/
  -
  -
  -/* change_file_date : change the date/time of a file
  -    filename : the filename of the file where date/time must be modified
  -    dosdate : the new date at the MSDos format (4 bytes)
  -    tmu_date : the SAME new date at the tm_unz format */
  -void change_file_date(filename,dosdate,tmu_date)
  -    const char *filename;
  -    uLong dosdate;
  -    tm_unz tmu_date;
  -{
  -#ifdef WIN32
  -  HANDLE hFile;
  -  FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
  -
  -  hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,
  -                      0,NULL,OPEN_EXISTING,0,NULL);
  -  GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
  -  DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
  -  LocalFileTimeToFileTime(&ftLocal,&ftm);
  -  SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
  -  CloseHandle(hFile);
  -#else
  -#ifdef unix
  -  struct utimbuf ut;
  -  struct tm newdate;
  -  newdate.tm_sec = tmu_date.tm_sec;
  -  newdate.tm_min=tmu_date.tm_min;
  -  newdate.tm_hour=tmu_date.tm_hour;
  -  newdate.tm_mday=tmu_date.tm_mday;
  -  newdate.tm_mon=tmu_date.tm_mon;
  -  if (tmu_date.tm_year > 1900)
  -      newdate.tm_year=tmu_date.tm_year - 1900;
  -  else
  -      newdate.tm_year=tmu_date.tm_year ;
  -  newdate.tm_isdst=-1;
  -
  -  ut.actime=ut.modtime=mktime(&newdate);
  -  utime(filename,&ut);
  -#endif
  -#endif
  -}
  -
  -
  -/* mymkdir and change_file_date are not 100 % portable
  -   As I don't know well Unix, I wait feedback for the unix portion */
  -
  -int mymkdir(dirname)
  -    const char* dirname;
  -{
  -    int ret=0;
  -#ifdef WIN32
  -    ret = mkdir(dirname);
  -#else
  -#ifdef unix
  -    ret = mkdir (dirname,0775);
  -#endif
  -#endif
  -    return ret;
  -}
  -
  -int makedir (newdir)
  -    char *newdir;
  -{
  -  char *buffer ;
  -  char *p;
  -  int  len = (int)strlen(newdir);
  -
  -  if (len <= 0)
  -    return 0;
  -
  -  buffer = (char*)malloc(len+1);
  -  strcpy(buffer,newdir);
  -
  -  if (buffer[len-1] == '/') {
  -    buffer[len-1] = '\0';
  -  }
  -  if (mymkdir(buffer) == 0)
  -    {
  -      free(buffer);
  -      return 1;
  -    }
  -
  -  p = buffer+1;
  -  while (1)
  -    {
  -      char hold;
  -
  -      while(*p && *p != '\\' && *p != '/')
  -        p++;
  -      hold = *p;
  -      *p = 0;
  -      if ((mymkdir(buffer) == -1) && (errno == ENOENT))
  -        {
  -          printf("couldn't create directory %s\n",buffer);
  -          free(buffer);
  -          return 0;
  -        }
  -      if (hold == 0)
  -        break;
  -      *p++ = hold;
  -    }
  -  free(buffer);
  -  return 1;
  -}
  -
  -void do_banner()
  -{
  -    printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
  -    printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
  -}
  -
  -void do_help()
  -{
  -    printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
  -           "  -e  Extract without pathname (junk paths)\n" \
  -           "  -x  Extract with pathname\n" \
  -           "  -v  list files\n" \
  -           "  -l  list files\n" \
  -           "  -d  directory to extract into\n" \
  -           "  -o  overwrite files without prompting\n" \
  -           "  -p  extract crypted file using password\n\n");
  -}
  -
  -
  -int do_list(uf)
  -    unzFile uf;
  -{
  -    uLong i;
  -    unz_global_info gi;
  -    int err;
  -
  -    err = unzGetGlobalInfo (uf,&gi);
  -    if (err!=UNZ_OK)
  -        printf("error %d with zipfile in unzGetGlobalInfo \n",err);
  -    printf(" Length  Method   Size  Ratio   Date    Time   CRC-32     Name\n");
  -    printf(" ------  ------   ----  -----   ----    ----   ------     ----\n");
  -    for (i=0;i<gi.number_entry;i++)
  -    {
  -        char filename_inzip[256];
  -        unz_file_