提交 abf180a0 编写于 作者: M Mark Adler

zlib 1.2.3

上级 9c3a5830
ChangeLog file for zlib 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) Changes in 1.2.2.4 (11 July 2005)
- Add inflatePrime() function for starting inflation at bit boundary - Add inflatePrime() function for starting inflation at bit boundary
- Avoid some Visual C warnings in deflate.c - Avoid some Visual C warnings in deflate.c
......
...@@ -30,7 +30,7 @@ CPP=$(CC) -E ...@@ -30,7 +30,7 @@ CPP=$(CC) -E
LIBS=libz.a LIBS=libz.a
SHAREDLIB=libz.so SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.2.4 SHAREDLIBV=libz.so.1.2.3
SHAREDLIBM=libz.so.1 SHAREDLIBM=libz.so.1
AR=ar rc AR=ar rc
......
...@@ -30,7 +30,7 @@ CPP=$(CC) -E ...@@ -30,7 +30,7 @@ CPP=$(CC) -E
LIBS=libz.a LIBS=libz.a
SHAREDLIB=libz.so SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.2.4 SHAREDLIBV=libz.so.1.2.3
SHAREDLIBM=libz.so.1 SHAREDLIBM=libz.so.1
AR=ar rc AR=ar rc
......
ZLIB DATA COMPRESSION LIBRARY 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 thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files (Request for Comments) 1950 to 1952 in the files
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
...@@ -33,7 +33,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 ...@@ -33,7 +33,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available in issue of Dr. Dobb's Journal; a copy of the article is available in
http://dogma.net/markn/articles/zlibtool/zlibtool.htm 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". Unsupported third party contributions are provided in directory "contrib".
......
...@@ -23,7 +23,7 @@ all: SCOPTIONS example minigzip ...@@ -23,7 +23,7 @@ all: SCOPTIONS example minigzip
check: test check: test
test: all test: all
example example
echo hello world | minigzip | minigzip -d echo hello world | minigzip | minigzip -d
install: z.lib install: z.lib
copy clone zlib.h zconf.h INCLUDE: copy clone zlib.h zconf.h INCLUDE:
......
...@@ -118,6 +118,6 @@ ...@@ -118,6 +118,6 @@
&MODLIB/INFTREES &MODLIB/TREES + &MODLIB/INFTREES &MODLIB/TREES +
&MODLIB/UNCOMPR &MODLIB/ZUTIL) + &MODLIB/UNCOMPR &MODLIB/ZUTIL) +
SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) + SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) +
TEXT('ZLIB 1.2.2') TGTRLS(V4R4M0) TEXT('ZLIB 1.2.3') TGTRLS(V4R4M0)
ENDPGM ENDPGM
ZLIB version 1.2.2 for AS400 installation instructions ZLIB version 1.2.3 for AS400 installation instructions
I) From an AS400 *SAVF file: I) From an AS400 *SAVF file:
......
* ZLIB.INC - Interface to the general purpose compression library * ZLIB.INC - Interface to the general purpose compression library
* *
* ILE RPG400 version by Patrick Monnerat, DATASPHERE. * ILE RPG400 version by Patrick Monnerat, DATASPHERE.
* Version 1.2.2.4 * Version 1.2.3
* *
* *
* WARNING: * WARNING:
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
* *
* Versioning information. * Versioning information.
* *
D ZLIB_VERSION C '1.2.2.4' D ZLIB_VERSION C '1.2.3'
D ZLIB_VERNUM C X'1224' D ZLIB_VERNUM C X'1230'
* *
* Other equates. * Other equates.
* *
......
此差异已折叠。
/* match.s -- Pentium-Pro-optimized version of longest_match() /* match.s -- Pentium-Pro-optimized version of longest_match()
* Written for zlib 1.1.2 * Written for zlib 1.1.2
* Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com> * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
* *
* This is free software; you can redistribute it and/or modify it * This is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License. * under the terms of the GNU General Public License.
*/ */
#ifndef NO_UNDERLINE #ifndef NO_UNDERLINE
#define match_init _match_init #define match_init _match_init
#define longest_match _longest_match #define longest_match _longest_match
#endif #endif
#define MAX_MATCH (258) #define MAX_MATCH (258)
#define MIN_MATCH (3) #define MIN_MATCH (3)
#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) #define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) #define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
/* stack frame offsets */ /* stack frame offsets */
#define chainlenwmask 0 /* high word: current chain len */ #define chainlenwmask 0 /* high word: current chain len */
/* low word: s->wmask */ /* low word: s->wmask */
#define window 4 /* local copy of s->window */ #define window 4 /* local copy of s->window */
#define windowbestlen 8 /* s->window + bestlen */ #define windowbestlen 8 /* s->window + bestlen */
#define scanstart 16 /* first two bytes of string */ #define scanstart 16 /* first two bytes of string */
#define scanend 12 /* last two bytes of string */ #define scanend 12 /* last two bytes of string */
#define scanalign 20 /* dword-misalignment of string */ #define scanalign 20 /* dword-misalignment of string */
#define nicematch 24 /* a good enough match size */ #define nicematch 24 /* a good enough match size */
#define bestlen 28 /* size of best match so far */ #define bestlen 28 /* size of best match so far */
#define scan 32 /* ptr to string wanting match */ #define scan 32 /* ptr to string wanting match */
#define LocalVarsSize (36) #define LocalVarsSize (36)
/* saved ebx 36 */ /* saved ebx 36 */
/* saved edi 40 */ /* saved edi 40 */
/* saved esi 44 */ /* saved esi 44 */
/* saved ebp 48 */ /* saved ebp 48 */
/* return address 52 */ /* return address 52 */
#define deflatestate 56 /* the function arguments */ #define deflatestate 56 /* the function arguments */
#define curmatch 60 #define curmatch 60
/* All the +zlib1222add offsets are due to the addition of fields /* 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 * 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 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 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"). * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
*/ */
#define zlib1222add (8) #define zlib1222add (8)
#define dsWSize (36+zlib1222add) #define dsWSize (36+zlib1222add)
#define dsWMask (44+zlib1222add) #define dsWMask (44+zlib1222add)
#define dsWindow (48+zlib1222add) #define dsWindow (48+zlib1222add)
#define dsPrev (56+zlib1222add) #define dsPrev (56+zlib1222add)
#define dsMatchLen (88+zlib1222add) #define dsMatchLen (88+zlib1222add)
#define dsPrevMatch (92+zlib1222add) #define dsPrevMatch (92+zlib1222add)
#define dsStrStart (100+zlib1222add) #define dsStrStart (100+zlib1222add)
#define dsMatchStart (104+zlib1222add) #define dsMatchStart (104+zlib1222add)
#define dsLookahead (108+zlib1222add) #define dsLookahead (108+zlib1222add)
#define dsPrevLen (112+zlib1222add) #define dsPrevLen (112+zlib1222add)
#define dsMaxChainLen (116+zlib1222add) #define dsMaxChainLen (116+zlib1222add)
#define dsGoodMatch (132+zlib1222add) #define dsGoodMatch (132+zlib1222add)
#define dsNiceMatch (136+zlib1222add) #define dsNiceMatch (136+zlib1222add)
.file "match.S" .file "match.S"
.globl match_init, longest_match .globl match_init, longest_match
.text .text
/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ /* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
longest_match: longest_match:
/* Save registers that the compiler may be using, and adjust %esp to */ /* Save registers that the compiler may be using, and adjust %esp to */
/* make room for our stack frame. */ /* make room for our stack frame. */
pushl %ebp pushl %ebp
pushl %edi pushl %edi
pushl %esi pushl %esi
pushl %ebx pushl %ebx
subl $LocalVarsSize, %esp subl $LocalVarsSize, %esp
/* Retrieve the function arguments. %ecx will hold cur_match */ /* Retrieve the function arguments. %ecx will hold cur_match */
/* throughout the entire function. %edx will hold the pointer to the */ /* throughout the entire function. %edx will hold the pointer to the */
/* deflate_state structure during the function's setup (before */ /* deflate_state structure during the function's setup (before */
/* entering the main loop). */ /* entering the main loop). */
movl deflatestate(%esp), %edx movl deflatestate(%esp), %edx
movl curmatch(%esp), %ecx movl curmatch(%esp), %ecx
/* uInt wmask = s->w_mask; */ /* uInt wmask = s->w_mask; */
/* unsigned chain_length = s->max_chain_length; */ /* unsigned chain_length = s->max_chain_length; */
/* if (s->prev_length >= s->good_match) { */ /* if (s->prev_length >= s->good_match) { */
/* chain_length >>= 2; */ /* chain_length >>= 2; */
/* } */ /* } */
movl dsPrevLen(%edx), %eax movl dsPrevLen(%edx), %eax
movl dsGoodMatch(%edx), %ebx movl dsGoodMatch(%edx), %ebx
cmpl %ebx, %eax cmpl %ebx, %eax
movl dsWMask(%edx), %eax movl dsWMask(%edx), %eax
movl dsMaxChainLen(%edx), %ebx movl dsMaxChainLen(%edx), %ebx
jl LastMatchGood jl LastMatchGood
shrl $2, %ebx shrl $2, %ebx
LastMatchGood: LastMatchGood:
/* chainlen is decremented once beforehand so that the function can */ /* chainlen is decremented once beforehand so that the function can */
/* use the sign flag instead of the zero flag for the exit test. */ /* 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 */ /* It is then shifted into the high word, to make room for the wmask */
/* value, which it will always accompany. */ /* value, which it will always accompany. */
decl %ebx decl %ebx
shll $16, %ebx shll $16, %ebx
orl %eax, %ebx orl %eax, %ebx
movl %ebx, chainlenwmask(%esp) movl %ebx, chainlenwmask(%esp)
/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ /* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
movl dsNiceMatch(%edx), %eax movl dsNiceMatch(%edx), %eax
movl dsLookahead(%edx), %ebx movl dsLookahead(%edx), %ebx
cmpl %eax, %ebx cmpl %eax, %ebx
jl LookaheadLess jl LookaheadLess
movl %eax, %ebx movl %eax, %ebx
LookaheadLess: movl %ebx, nicematch(%esp) LookaheadLess: movl %ebx, nicematch(%esp)
/* register Bytef *scan = s->window + s->strstart; */ /* register Bytef *scan = s->window + s->strstart; */
movl dsWindow(%edx), %esi movl dsWindow(%edx), %esi
movl %esi, window(%esp) movl %esi, window(%esp)
movl dsStrStart(%edx), %ebp movl dsStrStart(%edx), %ebp
lea (%esi,%ebp), %edi lea (%esi,%ebp), %edi
movl %edi, scan(%esp) movl %edi, scan(%esp)
/* Determine how many bytes the scan ptr is off from being */ /* Determine how many bytes the scan ptr is off from being */
/* dword-aligned. */ /* dword-aligned. */
movl %edi, %eax movl %edi, %eax
negl %eax negl %eax
andl $3, %eax andl $3, %eax
movl %eax, scanalign(%esp) movl %eax, scanalign(%esp)
/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ /* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ /* s->strstart - (IPos)MAX_DIST(s) : NIL; */
movl dsWSize(%edx), %eax movl dsWSize(%edx), %eax
subl $MIN_LOOKAHEAD, %eax subl $MIN_LOOKAHEAD, %eax
subl %eax, %ebp subl %eax, %ebp
jg LimitPositive jg LimitPositive
xorl %ebp, %ebp xorl %ebp, %ebp
LimitPositive: LimitPositive:
/* int best_len = s->prev_length; */ /* int best_len = s->prev_length; */
movl dsPrevLen(%edx), %eax movl dsPrevLen(%edx), %eax
movl %eax, bestlen(%esp) movl %eax, bestlen(%esp)
/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ /* Store the sum of s->window + best_len in %esi locally, and in %esi. */
addl %eax, %esi addl %eax, %esi
movl %esi, windowbestlen(%esp) movl %esi, windowbestlen(%esp)
/* register ush scan_start = *(ushf*)scan; */ /* register ush scan_start = *(ushf*)scan; */
/* register ush scan_end = *(ushf*)(scan+best_len-1); */ /* register ush scan_end = *(ushf*)(scan+best_len-1); */
/* Posf *prev = s->prev; */ /* Posf *prev = s->prev; */
movzwl (%edi), %ebx movzwl (%edi), %ebx
movl %ebx, scanstart(%esp) movl %ebx, scanstart(%esp)
movzwl -1(%edi,%eax), %ebx movzwl -1(%edi,%eax), %ebx
movl %ebx, scanend(%esp) movl %ebx, scanend(%esp)
movl dsPrev(%edx), %edi movl dsPrev(%edx), %edi
/* Jump into the main loop. */ /* Jump into the main loop. */
movl chainlenwmask(%esp), %edx movl chainlenwmask(%esp), %edx
jmp LoopEntry jmp LoopEntry
.balign 16 .balign 16
/* do { /* do {
* match = s->window + cur_match; * match = s->window + cur_match;
* if (*(ushf*)(match+best_len-1) != scan_end || * if (*(ushf*)(match+best_len-1) != scan_end ||
* *(ushf*)match != scan_start) continue; * *(ushf*)match != scan_start) continue;
* [...] * [...]
* } while ((cur_match = prev[cur_match & wmask]) > limit * } while ((cur_match = prev[cur_match & wmask]) > limit
* && --chain_length != 0); * && --chain_length != 0);
* *
* Here is the inner loop of the function. The function will spend the * 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 * majority of its time in this loop, and majority of that time will
* be spent in the first ten instructions. * be spent in the first ten instructions.
* *
* Within this loop: * Within this loop:
* %ebx = scanend * %ebx = scanend
* %ecx = curmatch * %ecx = curmatch
* %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
* %esi = windowbestlen - i.e., (window + bestlen) * %esi = windowbestlen - i.e., (window + bestlen)
* %edi = prev * %edi = prev
* %ebp = limit * %ebp = limit
*/ */
LookupLoop: LookupLoop:
andl %edx, %ecx andl %edx, %ecx
movzwl (%edi,%ecx,2), %ecx movzwl (%edi,%ecx,2), %ecx
cmpl %ebp, %ecx cmpl %ebp, %ecx
jbe LeaveNow jbe LeaveNow
subl $0x00010000, %edx subl $0x00010000, %edx
js LeaveNow js LeaveNow
LoopEntry: movzwl -1(%esi,%ecx), %eax LoopEntry: movzwl -1(%esi,%ecx), %eax
cmpl %ebx, %eax cmpl %ebx, %eax
jnz LookupLoop jnz LookupLoop
movl window(%esp), %eax movl window(%esp), %eax
movzwl (%eax,%ecx), %eax movzwl (%eax,%ecx), %eax
cmpl scanstart(%esp), %eax cmpl scanstart(%esp), %eax
jnz LookupLoop jnz LookupLoop
/* Store the current value of chainlen. */ /* Store the current value of chainlen. */
movl %edx, chainlenwmask(%esp) movl %edx, chainlenwmask(%esp)
/* Point %edi to the string under scrutiny, and %esi to the string we */ /* 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 */ /* are hoping to match it up with. In actuality, %esi and %edi are */
/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ /* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
/* initialized to -(MAX_MATCH_8 - scanalign). */ /* initialized to -(MAX_MATCH_8 - scanalign). */
movl window(%esp), %esi movl window(%esp), %esi
movl scan(%esp), %edi movl scan(%esp), %edi
addl %ecx, %esi addl %ecx, %esi
movl scanalign(%esp), %eax movl scanalign(%esp), %eax
movl $(-MAX_MATCH_8), %edx movl $(-MAX_MATCH_8), %edx
lea MAX_MATCH_8(%edi,%eax), %edi lea MAX_MATCH_8(%edi,%eax), %edi
lea MAX_MATCH_8(%esi,%eax), %esi lea MAX_MATCH_8(%esi,%eax), %esi
/* Test the strings for equality, 8 bytes at a time. At the end, /* 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 %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 * 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 * 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 * 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 * bytes, as much as necessary in order to dword-align the %edi
* pointer. (%esi will still be misaligned three times out of four.) * pointer. (%esi will still be misaligned three times out of four.)
* *
* It should be confessed that this loop usually does not represent * It should be confessed that this loop usually does not represent
* much of the total running time. Replacing it with a more * much of the total running time. Replacing it with a more
* straightforward "rep cmpsb" would not drastically degrade * straightforward "rep cmpsb" would not drastically degrade
* performance. * performance.
*/ */
LoopCmps: LoopCmps:
movl (%esi,%edx), %eax movl (%esi,%edx), %eax
xorl (%edi,%edx), %eax xorl (%edi,%edx), %eax
jnz LeaveLoopCmps jnz LeaveLoopCmps
movl 4(%esi,%edx), %eax movl 4(%esi,%edx), %eax
xorl 4(%edi,%edx), %eax xorl 4(%edi,%edx), %eax
jnz LeaveLoopCmps4 jnz LeaveLoopCmps4
addl $8, %edx addl $8, %edx
jnz LoopCmps jnz LoopCmps
jmp LenMaximum jmp LenMaximum
LeaveLoopCmps4: addl $4, %edx LeaveLoopCmps4: addl $4, %edx
LeaveLoopCmps: testl $0x0000FFFF, %eax LeaveLoopCmps: testl $0x0000FFFF, %eax
jnz LenLower jnz LenLower
addl $2, %edx addl $2, %edx
shrl $16, %eax shrl $16, %eax
LenLower: subb $1, %al LenLower: subb $1, %al
adcl $0, %edx adcl $0, %edx
/* Calculate the length of the match. If it is longer than MAX_MATCH, */ /* Calculate the length of the match. If it is longer than MAX_MATCH, */
/* then automatically accept it as the best possible match and leave. */ /* then automatically accept it as the best possible match and leave. */
lea (%edi,%edx), %eax lea (%edi,%edx), %eax
movl scan(%esp), %edi movl scan(%esp), %edi
subl %edi, %eax subl %edi, %eax
cmpl $MAX_MATCH, %eax cmpl $MAX_MATCH, %eax
jge LenMaximum jge LenMaximum
/* If the length of the match is not longer than the best match we */ /* 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. */ /* have so far, then forget it and return to the lookup loop. */
movl deflatestate(%esp), %edx movl deflatestate(%esp), %edx
movl bestlen(%esp), %ebx movl bestlen(%esp), %ebx
cmpl %ebx, %eax cmpl %ebx, %eax
jg LongerMatch jg LongerMatch
movl windowbestlen(%esp), %esi movl windowbestlen(%esp), %esi
movl dsPrev(%edx), %edi movl dsPrev(%edx), %edi
movl scanend(%esp), %ebx movl scanend(%esp), %ebx
movl chainlenwmask(%esp), %edx movl chainlenwmask(%esp), %edx
jmp LookupLoop jmp LookupLoop
/* s->match_start = cur_match; */ /* s->match_start = cur_match; */
/* best_len = len; */ /* best_len = len; */
/* if (len >= nice_match) break; */ /* if (len >= nice_match) break; */
/* scan_end = *(ushf*)(scan+best_len-1); */ /* scan_end = *(ushf*)(scan+best_len-1); */
LongerMatch: movl nicematch(%esp), %ebx LongerMatch: movl nicematch(%esp), %ebx
movl %eax, bestlen(%esp) movl %eax, bestlen(%esp)
movl %ecx, dsMatchStart(%edx) movl %ecx, dsMatchStart(%edx)
cmpl %ebx, %eax cmpl %ebx, %eax
jge LeaveNow jge LeaveNow
movl window(%esp), %esi movl window(%esp), %esi
addl %eax, %esi addl %eax, %esi
movl %esi, windowbestlen(%esp) movl %esi, windowbestlen(%esp)
movzwl -1(%edi,%eax), %ebx movzwl -1(%edi,%eax), %ebx
movl dsPrev(%edx), %edi movl dsPrev(%edx), %edi
movl %ebx, scanend(%esp) movl %ebx, scanend(%esp)
movl chainlenwmask(%esp), %edx movl chainlenwmask(%esp), %edx
jmp LookupLoop jmp LookupLoop
/* Accept the current string, with the maximum possible length. */ /* Accept the current string, with the maximum possible length. */
LenMaximum: movl deflatestate(%esp), %edx LenMaximum: movl deflatestate(%esp), %edx
movl $MAX_MATCH, bestlen(%esp) movl $MAX_MATCH, bestlen(%esp)
movl %ecx, dsMatchStart(%edx) movl %ecx, dsMatchStart(%edx)
/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ /* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
/* return s->lookahead; */ /* return s->lookahead; */
LeaveNow: LeaveNow:
movl deflatestate(%esp), %edx movl deflatestate(%esp), %edx
movl bestlen(%esp), %ebx movl bestlen(%esp), %ebx
movl dsLookahead(%edx), %eax movl dsLookahead(%edx), %eax
cmpl %eax, %ebx cmpl %eax, %ebx
jg LookaheadRet jg LookaheadRet
movl %ebx, %eax movl %ebx, %eax
LookaheadRet: LookaheadRet:
/* Restore the stack and return from whence we came. */ /* Restore the stack and return from whence we came. */
addl $LocalVarsSize, %esp addl $LocalVarsSize, %esp
popl %ebx popl %ebx
popl %esi popl %esi
popl %edi popl %edi
popl %ebp popl %ebp
match_init: ret match_init: ret
...@@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; ...@@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
const OutBuf: Pointer; BufSize: Integer); const OutBuf: Pointer; BufSize: Integer);
const const
zlib_version = '1.2.2'; zlib_version = '1.2.3';
type type
EZlibError = class(Exception); EZlibError = class(Exception);
......
...@@ -156,7 +156,7 @@ namespace DotZLibTests ...@@ -156,7 +156,7 @@ namespace DotZLibTests
public void Info_Version() public void Info_Version()
{ {
Info info = new Info(); 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.SizeOfUInt);
Assert.AreEqual(32, info.SizeOfULong); Assert.AreEqual(32, info.SizeOfULong);
Assert.AreEqual(32, info.SizeOfPointer); Assert.AreEqual(32, info.SizeOfPointer);
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#define MAXBITS 15 #define MAXBITS 15
const char inflate9_copyright[] = 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 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 in the documentation of your product. If for some reason you cannot
...@@ -64,7 +64,7 @@ unsigned short FAR *work; ...@@ -64,7 +64,7 @@ unsigned short FAR *work;
static const unsigned short lext[31] = { /* Length codes 257..285 extra */ static const unsigned short lext[31] = { /* Length codes 257..285 extra */
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, 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 */ static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
...@@ -128,7 +128,7 @@ unsigned short FAR *work; ...@@ -128,7 +128,7 @@ unsigned short FAR *work;
left -= count[len]; left -= count[len];
if (left < 0) return -1; /* over-subscribed */ 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 */ return -1; /* incomplete set */
/* generate offsets into symbol table for each length for sorting */ /* generate offsets into symbol table for each length for sorting */
......
...@@ -36,12 +36,12 @@ typedef struct { ...@@ -36,12 +36,12 @@ typedef struct {
*/ */
/* Maximum size of dynamic tree. The maximum found in a long but non- /* Maximum size of dynamic tree. The maximum found in a long but non-
exhaustive search was 1004 code structures (850 for length/literals exhaustive search was 1444 code structures (852 for length/literals
and 154 for distances, the latter actually the result of an and 592 for distances, the latter actually the result of an
exhaustive search). The true maximum is not known, but the value exhaustive search). The true maximum is not known, but the value
below is more than safe. */ below is more than safe. */
#define ENOUGH 1440 #define ENOUGH 2048
#define MAXD 154 #define MAXD 592
/* Type of code to build for inftable() */ /* Type of code to build for inftable() */
typedef enum { typedef enum {
......
...@@ -4,24 +4,33 @@ ...@@ -4,24 +4,33 @@
; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86 ; 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. ; 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 ; File written by Gilles Vollant, by converting to assembly the longest_match
; and modifying asm686 with masm, optimised assembly code from Brian Raiter, ; from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
; written 1998 ;
; and by taking inspiration on asm686 with masm, optimised assembly code
; from Brian Raiter, written 1998
;
; http://www.zlib.net ; http://www.zlib.net
; http://www.winimage.com/zLibDll ; http://www.winimage.com/zLibDll
; http://www.muppetlabs.com/~breadbox/software/assembly.html ; 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 ; 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 ; (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) ; 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) ;uInt longest_match(s, cur_match)
...@@ -47,7 +56,10 @@ longest_match PROC ...@@ -47,7 +56,10 @@ longest_match PROC
;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 ;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13
;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d ;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d
;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 ;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_rdi equ rsp + 24 - LocalVarsSize
save_rsi equ rsp + 32 - LocalVarsSize save_rsi equ rsp + 32 - LocalVarsSize
...@@ -84,8 +96,34 @@ save_r13 equ rsp + 64 - LocalVarsSize ...@@ -84,8 +96,34 @@ save_r13 equ rsp + 64 - LocalVarsSize
; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). ; (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"). ; 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) dsWSize equ 56+zlib1222add+(zlib1222add/2)
dsWMask equ 64+zlib1222add+(zlib1222add/2) dsWMask equ 64+zlib1222add+(zlib1222add/2)
dsWindow equ 72+zlib1222add dsWindow equ 72+zlib1222add
...@@ -100,6 +138,18 @@ dsMaxChainLen equ 156+zlib1222add ...@@ -100,6 +138,18 @@ dsMaxChainLen equ 156+zlib1222add
dsGoodMatch equ 172+zlib1222add dsGoodMatch equ 172+zlib1222add
dsNiceMatch equ 176+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) ; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
...@@ -107,7 +157,7 @@ dsNiceMatch equ 176+zlib1222add ...@@ -107,7 +157,7 @@ dsNiceMatch equ 176+zlib1222add
; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp ; 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 ; 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 @@ dsNiceMatch equ 176+zlib1222add ...@@ -124,12 +174,15 @@ dsNiceMatch equ 176+zlib1222add
; this clear high 32 bits of r8, which can be garbage in both r8 and rdx ; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
mov [save_rdi],rdi mov [save_rdi],rdi
mov [save_rsi],rsi mov [save_rsi],rsi
mov [save_rbx],rbx mov [save_rbx],rbx
mov [save_rbp],rbp mov [save_rbp],rbp
IFDEF INFOZIP
mov r8d,ecx
ELSE
mov r8d,edx mov r8d,edx
ENDIF
mov [save_r12],r12 mov [save_r12],r12
mov [save_r13],r13 mov [save_r13],r13
; mov [save_r14],r14 ; mov [save_r14],r14
...@@ -142,10 +195,10 @@ dsNiceMatch equ 176+zlib1222add ...@@ -142,10 +195,10 @@ dsNiceMatch equ 176+zlib1222add
;;; chain_length >>= 2; ;;; chain_length >>= 2;
;;; } ;;; }
mov edi, [rcx + dsPrevLen] mov edi, prev_length
mov esi, [rcx + dsGoodMatch] mov esi, good_match
mov eax, [rcx + dsWMask] mov eax, WMask
mov ebx, [rcx + dsMaxChainLen] mov ebx, max_chain_length
cmp edi, esi cmp edi, esi
jl LastMatchGood jl LastMatchGood
shr ebx, 2 shr ebx, 2
...@@ -159,21 +212,25 @@ LastMatchGood: ...@@ -159,21 +212,25 @@ LastMatchGood:
dec ebx dec ebx
shl ebx, 16 shl ebx, 16
or ebx, eax or ebx, eax
mov [chainlenwmask], ebx
;;; on zlib only
;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; ;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
mov eax, [rcx + dsNiceMatch] IFDEF INFOZIP
mov r10d, [rcx + dsLookahead] mov [chainlenwmask], ebx
; on infozip nice_match = [nice_match]
ELSE
mov eax, nice_match
mov [chainlenwmask], ebx
mov r10d, Lookahead
cmp r10d, eax cmp r10d, eax
cmovnl r10d, eax cmovnl r10d, eax
mov [nicematch],r10d mov [nicematch],r10d
LookaheadLess: ENDIF
;;; register Bytef *scan = s->window + s->strstart; ;;; register Bytef *scan = s->window + s->strstart;
mov r10, window_ad
mov r10, [rcx + dsWindow] mov ebp, strstart
mov ebp, [rcx + dsStrStart]
lea r13, [r10 + rbp] lea r13, [r10 + rbp]
;;; Determine how many bytes the scan ptr is off from being ;;; Determine how many bytes the scan ptr is off from being
...@@ -185,13 +242,16 @@ LookaheadLess: ...@@ -185,13 +242,16 @@ LookaheadLess:
;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? ;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
;;; s->strstart - (IPos)MAX_DIST(s) : NIL; ;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
IFDEF INFOZIP
mov eax, [rcx + dsWSize] mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
ELSE
mov eax, window_size
sub eax, MIN_LOOKAHEAD sub eax, MIN_LOOKAHEAD
ENDIF
xor edi,edi xor edi,edi
sub ebp, eax sub ebp, eax
mov r11d, [rcx + dsPrevLen] mov r11d, prev_length
cmovng ebp,edi cmovng ebp,edi
...@@ -207,8 +267,9 @@ LookaheadLess: ...@@ -207,8 +267,9 @@ LookaheadLess:
;;; Posf *prev = s->prev; ;;; Posf *prev = s->prev;
movzx r12d,word ptr [r9] movzx r12d,word ptr [r9]
movzx ebx, word ptr [r9 + r11 - 1] movzx ebx, word ptr [r9 + r11 - 1]
mov rdi, [rcx + dsPrev]
mov rdi, prev_ad
;;; Jump into the main loop. ;;; Jump into the main loop.
...@@ -312,38 +373,22 @@ LookupLoopIsZero: ...@@ -312,38 +373,22 @@ LookupLoopIsZero:
prefetcht1 [rsi+rdx] prefetcht1 [rsi+rdx]
prefetcht1 [rdi+rdx] prefetcht1 [rdi+rdx]
;;; Test the strings for equality, 8 bytes at a time. At the end, ;;; 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 ;;; 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 ;;; 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 ;;; 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 ;;; 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 ;;; It should be confessed that this loop usually does not represent
;;; much of the total running time. Replacing it with a more ;;; much of the total running time. Replacing it with a more
;;; straightforward "rep cmpsb" would not drastically degrade ;;; straightforward "rep cmpsb" would not drastically degrade
;;; performance. ;;; 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: LoopCmps:
mov rax, [rsi + rdx] mov rax, [rsi + rdx]
...@@ -400,7 +445,7 @@ LenLower: sub al, 1 ...@@ -400,7 +445,7 @@ LenLower: sub al, 1
lea rsi,[r10+r11] lea rsi,[r10+r11]
mov rdi, [rcx + dsPrev] mov rdi, prev_ad
mov edx, [chainlenwmask] mov edx, [chainlenwmask]
jmp LookupLoop jmp LookupLoop
...@@ -411,14 +456,14 @@ LenLower: sub al, 1 ...@@ -411,14 +456,14 @@ LenLower: sub al, 1
LongerMatch: LongerMatch:
mov r11d, eax mov r11d, eax
mov [rcx + dsMatchStart], r8d mov match_start, r8d
cmp eax, [nicematch] cmp eax, [nicematch]
jge LeaveNow jge LeaveNow
lea rsi,[r10+rax] lea rsi,[r10+rax]
movzx ebx, word ptr [r9 + rax - 1] movzx ebx, word ptr [r9 + rax - 1]
mov rdi, [rcx + dsPrev] mov rdi, prev_ad
mov edx, [chainlenwmask] mov edx, [chainlenwmask]
jmp LookupLoop jmp LookupLoop
...@@ -426,16 +471,19 @@ LongerMatch: ...@@ -426,16 +471,19 @@ LongerMatch:
LenMaximum: LenMaximum:
mov r11d,MAX_MATCH mov r11d,MAX_MATCH
mov [rcx + dsMatchStart], r8d mov match_start, r8d
;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; ;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
;;; return s->lookahead; ;;; return s->lookahead;
LeaveNow: LeaveNow:
mov eax, [rcx + dsLookahead] IFDEF INFOZIP
mov eax,r11d
ELSE
mov eax, Lookahead
cmp r11d, eax cmp r11d, eax
cmovng eax, r11d cmovng eax, r11d
ENDIF
;;; Restore the stack and return from whence we came. ;;; Restore the stack and return from whence we came.
...@@ -452,7 +500,8 @@ LeaveNow: ...@@ -452,7 +500,8 @@ LeaveNow:
ret 0 ret 0
; please don't remove this string ! ; 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 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 longest_match ENDP
......
Change in 1.01e (12 feb 05) Change in 1.01e (12 feb 05)
- Fix in zipOpen2 for globalcomment (Rolf Kalbermatter) - Fix in zipOpen2 for globalcomment (Rolf Kalbermatter)
- Fix possible memory leak in unzip.c (Zoran Stevanovic) - Fix possible memory leak in unzip.c (Zoran Stevanovic)
Change in 1.01b (20 may 04) Change in 1.01b (20 may 04)
- Integrate patch from Debian package (submited by Mark Brown) - Integrate patch from Debian package (submited by Mark Brown)
- Add tools mztools from Xavier Roche - Add tools mztools from Xavier Roche
Change in 1.01 (8 may 04) Change in 1.01 (8 may 04)
- fix buffer overrun risk in unzip.c (Xavier Roche) - fix buffer overrun risk in unzip.c (Xavier Roche)
- fix a minor buffer insecurity in minizip.c (Mike Whittaker) - fix a minor buffer insecurity in minizip.c (Mike Whittaker)
Change in 1.00: (10 sept 03) Change in 1.00: (10 sept 03)
- rename to 1.00 - rename to 1.00
- cosmetic code change - cosmetic code change
Change in 0.22: (19 May 03) Change in 0.22: (19 May 03)
- crypting support (unless you define NOCRYPT) - crypting support (unless you define NOCRYPT)
- append file in existing zipfile - append file in existing zipfile
Change in 0.21: (10 Mar 03) Change in 0.21: (10 Mar 03)
- bug fixes - bug fixes
Change in 0.17: (27 Jan 02) Change in 0.17: (27 Jan 02)
- bug fixes - bug fixes
Change in 0.16: (19 Jan 02) Change in 0.16: (19 Jan 02)
- Support of ioapi for virtualize zip file access - Support of ioapi for virtualize zip file access
Change in 0.15: (19 Mar 98) Change in 0.15: (19 Mar 98)
- fix memory leak in minizip.c - fix memory leak in minizip.c
Change in 0.14: (10 Mar 98) Change in 0.14: (10 Mar 98)
- fix bugs in minizip.c sample for zipping big file - fix bugs in minizip.c sample for zipping big file
- fix problem in month in date handling - fix problem in month in date handling
- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for - fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
comment handling comment handling
Change in 0.13: (6 Mar 98) Change in 0.13: (6 Mar 98)
- fix bugs in zip.c - fix bugs in zip.c
- add real minizip sample - add real minizip sample
Change in 0.12: (4 Mar 98) Change in 0.12: (4 Mar 98)
- add zip.c and zip.h for creates .zip file - add zip.c and zip.h for creates .zip file
- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly) - fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
- fix miniunz.c for file without specific record for directory - fix miniunz.c for file without specific record for directory
Change in 0.11: (3 Mar 98) Change in 0.11: (3 Mar 98)
- fix bug in unzGetCurrentFileInfo for get extra field and comment - fix bug in unzGetCurrentFileInfo for get extra field and comment
- enhance miniunz sample, remove the bad unztst.c sample - enhance miniunz sample, remove the bad unztst.c sample
Change in 0.10: (2 Mar 98) Change in 0.10: (2 Mar 98)
- fix bug in unzReadCurrentFile - fix bug in unzReadCurrentFile
- rename unzip* to unz* function and structure - rename unzip* to unz* function and structure
- remove Windows-like hungary notation variable name - remove Windows-like hungary notation variable name
- modify some structure in unzip.h - modify some structure in unzip.h
- add somes comment in source - add somes comment in source
- remove unzipGetcCurrentFile function - remove unzipGetcCurrentFile function
- replace ZUNZEXPORT by ZEXPORT - replace ZUNZEXPORT by ZEXPORT
- add unzGetLocalExtrafield for get the local extrafield info - add unzGetLocalExtrafield for get the local extrafield info
- add a new sample, miniunz.c - add a new sample, miniunz.c
Change in 0.4: (25 Feb 98) Change in 0.4: (25 Feb 98)
- suppress the type unzipFileInZip. - suppress the type unzipFileInZip.
Only on file in the zipfile can be open at the same time Only on file in the zipfile can be open at the same time
- fix somes typo in code - fix somes typo in code
- added tm_unz structure in unzip_file_info (date/time in readable format) - added tm_unz structure in unzip_file_info (date/time in readable format)
CC=cc CC=cc
CFLAGS=-O -I../.. CFLAGS=-O -I../..
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
.c.o: .c.o:
$(CC) -c $(CFLAGS) $*.c $(CC) -c $(CFLAGS) $*.c
all: miniunz minizip all: miniunz minizip
miniunz: $(UNZ_OBJS) miniunz: $(UNZ_OBJS)
$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
minizip: $(ZIP_OBJS) minizip: $(ZIP_OBJS)
$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
test: miniunz minizip test: miniunz minizip
./minizip test readme.txt ./minizip test readme.txt
./miniunz -l test.zip ./miniunz -l test.zip
mv readme.txt readme.old mv readme.txt readme.old
./miniunz test.zip ./miniunz test.zip
clean: clean:
/bin/rm -f *.o *~ minizip miniunz /bin/rm -f *.o *~ minizip miniunz
/* crypt.h -- base code for crypt/uncrypt ZIPfile /* crypt.h -- base code for crypt/uncrypt ZIPfile
Version 1.01e, February 12th, 2005 Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant Copyright (C) 1998-2005 Gilles Vollant
This code is a modified version of crypting code in Infozip distribution This code is a modified version of crypting code in Infozip distribution
The encryption/decryption parts of this source code (as opposed to the The encryption/decryption parts of this source code (as opposed to the
non-echoing password parts) were originally written in Europe. The non-echoing password parts) were originally written in Europe. The
whole source package can be freely distributed, including from the USA. 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.) (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 This encryption code is a direct transcription of the algorithm from
Roger Schlafly, described by Phil Katz in the file appnote.txt. This Roger Schlafly, described by Phil Katz in the file appnote.txt. This
file (appnote.txt) is distributed with the PKZIP program (even in the file (appnote.txt) is distributed with the PKZIP program (even in the
version without encryption capabilities). version without encryption capabilities).
If you don't need crypting in your application, just define symbols If you don't need crypting in your application, just define symbols
NOCRYPT and NOUNCRYPT. NOCRYPT and NOUNCRYPT.
This code support the "Traditional PKWARE Encryption". This code support the "Traditional PKWARE Encryption".
The new AES encryption added on Zip format by Winzip (see the page 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 http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
Encryption is not supported. Encryption is not supported.
*/ */
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
/*********************************************************************** /***********************************************************************
* Return the next byte in the pseudo-random sequence * Return the next byte in the pseudo-random sequence
*/ */
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
{ {
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
* unpredictable manner on 16-bit systems; not a problem * unpredictable manner on 16-bit systems; not a problem
* with any known compiler so far, though */ * with any known compiler so far, though */
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
} }
/*********************************************************************** /***********************************************************************
* Update the encryption keys with the next byte of plain text * 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) static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
{ {
(*(pkeys+0)) = CRC32((*(pkeys+0)), c); (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
(*(pkeys+1)) += (*(pkeys+0)) & 0xff; (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
{ {
register int keyshift = (int)((*(pkeys+1)) >> 24); register int keyshift = (int)((*(pkeys+1)) >> 24);
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
} }
return c; return c;
} }
/*********************************************************************** /***********************************************************************
* Initialize the encryption keys and the random header according to * Initialize the encryption keys and the random header according to
* the given password. * the given password.
*/ */
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
{ {
*(pkeys+0) = 305419896L; *(pkeys+0) = 305419896L;
*(pkeys+1) = 591751049L; *(pkeys+1) = 591751049L;
*(pkeys+2) = 878082192L; *(pkeys+2) = 878082192L;
while (*passwd != '\0') { while (*passwd != '\0') {
update_keys(pkeys,pcrc_32_tab,(int)*passwd); update_keys(pkeys,pcrc_32_tab,(int)*passwd);
passwd++; passwd++;
} }
} }
#define zdecode(pkeys,pcrc_32_tab,c) \ #define zdecode(pkeys,pcrc_32_tab,c) \
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
#define zencode(pkeys,pcrc_32_tab,c,t) \ #define zencode(pkeys,pcrc_32_tab,c,t) \
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
#define RAND_HEAD_LEN 12 #define RAND_HEAD_LEN 12
/* "last resort" source for second part of crypt seed pattern */ /* "last resort" source for second part of crypt seed pattern */
# ifndef ZCR_SEED2 # ifndef ZCR_SEED2
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # define ZCR_SEED2 3141592654UL /* use PI as default pattern */
# endif # endif
static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
const char *passwd; /* password string */ const char *passwd; /* password string */
unsigned char *buf; /* where to write header */ unsigned char *buf; /* where to write header */
int bufSize; int bufSize;
unsigned long* pkeys; unsigned long* pkeys;
const unsigned long* pcrc_32_tab; const unsigned long* pcrc_32_tab;
unsigned long crcForCrypting; unsigned long crcForCrypting;
{ {
int n; /* index in random header */ int n; /* index in random header */
int t; /* temporary */ int t; /* temporary */
int c; /* random byte */ int c; /* random byte */
unsigned char header[RAND_HEAD_LEN-2]; /* random header */ unsigned char header[RAND_HEAD_LEN-2]; /* random header */
static unsigned calls = 0; /* ensure different random header each time */ static unsigned calls = 0; /* ensure different random header each time */
if (bufSize<RAND_HEAD_LEN) if (bufSize<RAND_HEAD_LEN)
return 0; return 0;
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
* output of rand() to get less predictability, since rand() is * output of rand() to get less predictability, since rand() is
* often poorly implemented. * often poorly implemented.
*/ */
if (++calls == 1) if (++calls == 1)
{ {
srand((unsigned)(time(NULL) ^ ZCR_SEED2)); srand((unsigned)(time(NULL) ^ ZCR_SEED2));
} }
init_keys(passwd, pkeys, pcrc_32_tab); init_keys(passwd, pkeys, pcrc_32_tab);
for (n = 0; n < RAND_HEAD_LEN-2; n++) for (n = 0; n < RAND_HEAD_LEN-2; n++)
{ {
c = (rand() >> 7) & 0xff; c = (rand() >> 7) & 0xff;
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
} }
/* Encrypt random header (last two bytes is high word of crc) */ /* Encrypt random header (last two bytes is high word of crc) */
init_keys(passwd, pkeys, pcrc_32_tab); init_keys(passwd, pkeys, pcrc_32_tab);
for (n = 0; n < RAND_HEAD_LEN-2; n++) for (n = 0; n < RAND_HEAD_LEN-2; n++)
{ {
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); 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 >> 16) & 0xff, t);
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
return n; return n;
} }
#endif #endif
/* ioapi.c -- IO base function header for compress/uncompress .zip /* ioapi.c -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
Version 1.01e, February 12th, 2005 Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant Copyright (C) 1998-2005 Gilles Vollant
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "zlib.h" #include "zlib.h"
#include "ioapi.h" #include "ioapi.h"
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
#ifndef SEEK_CUR #ifndef SEEK_CUR
#define SEEK_CUR 1 #define SEEK_CUR 1
#endif #endif
#ifndef SEEK_END #ifndef SEEK_END
#define SEEK_END 2 #define SEEK_END 2
#endif #endif
#ifndef SEEK_SET #ifndef SEEK_SET
#define SEEK_SET 0 #define SEEK_SET 0
#endif #endif
voidpf ZCALLBACK fopen_file_func OF(( voidpf ZCALLBACK fopen_file_func OF((
voidpf opaque, voidpf opaque,
const char* filename, const char* filename,
int mode)); int mode));
uLong ZCALLBACK fread_file_func OF(( uLong ZCALLBACK fread_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
void* buf, void* buf,
uLong size)); uLong size));
uLong ZCALLBACK fwrite_file_func OF(( uLong ZCALLBACK fwrite_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
const void* buf, const void* buf,
uLong size)); uLong size));
long ZCALLBACK ftell_file_func OF(( long ZCALLBACK ftell_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
long ZCALLBACK fseek_file_func OF(( long ZCALLBACK fseek_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
uLong offset, uLong offset,
int origin)); int origin));
int ZCALLBACK fclose_file_func OF(( int ZCALLBACK fclose_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
int ZCALLBACK ferror_file_func OF(( int ZCALLBACK ferror_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
voidpf opaque; voidpf opaque;
const char* filename; const char* filename;
int mode; int mode;
{ {
FILE* file = NULL; FILE* file = NULL;
const char* mode_fopen = NULL; const char* mode_fopen = NULL;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
mode_fopen = "rb"; mode_fopen = "rb";
else else
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
mode_fopen = "r+b"; mode_fopen = "r+b";
else else
if (mode & ZLIB_FILEFUNC_MODE_CREATE) if (mode & ZLIB_FILEFUNC_MODE_CREATE)
mode_fopen = "wb"; mode_fopen = "wb";
if ((filename!=NULL) && (mode_fopen != NULL)) if ((filename!=NULL) && (mode_fopen != NULL))
file = fopen(filename, mode_fopen); file = fopen(filename, mode_fopen);
return file; return file;
} }
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
void* buf; void* buf;
uLong size; uLong size;
{ {
uLong ret; uLong ret;
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
return ret; return ret;
} }
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
const void* buf; const void* buf;
uLong size; uLong size;
{ {
uLong ret; uLong ret;
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
return ret; return ret;
} }
long ZCALLBACK ftell_file_func (opaque, stream) long ZCALLBACK ftell_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
long ret; long ret;
ret = ftell((FILE *)stream); ret = ftell((FILE *)stream);
return ret; return ret;
} }
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
uLong offset; uLong offset;
int origin; int origin;
{ {
int fseek_origin=0; int fseek_origin=0;
long ret; long ret;
switch (origin) switch (origin)
{ {
case ZLIB_FILEFUNC_SEEK_CUR : case ZLIB_FILEFUNC_SEEK_CUR :
fseek_origin = SEEK_CUR; fseek_origin = SEEK_CUR;
break; break;
case ZLIB_FILEFUNC_SEEK_END : case ZLIB_FILEFUNC_SEEK_END :
fseek_origin = SEEK_END; fseek_origin = SEEK_END;
break; break;
case ZLIB_FILEFUNC_SEEK_SET : case ZLIB_FILEFUNC_SEEK_SET :
fseek_origin = SEEK_SET; fseek_origin = SEEK_SET;
break; break;
default: return -1; default: return -1;
} }
ret = 0; ret = 0;
fseek((FILE *)stream, offset, fseek_origin); fseek((FILE *)stream, offset, fseek_origin);
return ret; return ret;
} }
int ZCALLBACK fclose_file_func (opaque, stream) int ZCALLBACK fclose_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
int ret; int ret;
ret = fclose((FILE *)stream); ret = fclose((FILE *)stream);
return ret; return ret;
} }
int ZCALLBACK ferror_file_func (opaque, stream) int ZCALLBACK ferror_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
int ret; int ret;
ret = ferror((FILE *)stream); ret = ferror((FILE *)stream);
return ret; return ret;
} }
void fill_fopen_filefunc (pzlib_filefunc_def) void fill_fopen_filefunc (pzlib_filefunc_def)
zlib_filefunc_def* pzlib_filefunc_def; zlib_filefunc_def* pzlib_filefunc_def;
{ {
pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zopen_file = fopen_file_func;
pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zread_file = fread_file_func;
pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func;
pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func;
pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func;
pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func;
pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func;
pzlib_filefunc_def->opaque = NULL; pzlib_filefunc_def->opaque = NULL;
} }
/* ioapi.h -- IO base function header for compress/uncompress .zip /* ioapi.h -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
Version 1.01e, February 12th, 2005 Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant Copyright (C) 1998-2005 Gilles Vollant
*/ */
#ifndef _ZLIBIOAPI_H #ifndef _ZLIBIOAPI_H
#define _ZLIBIOAPI_H #define _ZLIBIOAPI_H
#define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_SEEK_SET (0)
#define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_READ (1)
#define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_WRITE (2)
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
#define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_EXISTING (4)
#define ZLIB_FILEFUNC_MODE_CREATE (8) #define ZLIB_FILEFUNC_MODE_CREATE (8)
#ifndef ZCALLBACK #ifndef ZCALLBACK
#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
#define ZCALLBACK CALLBACK #define ZCALLBACK CALLBACK
#else #else
#define ZCALLBACK #define ZCALLBACK
#endif #endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); 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 *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 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 *tell_file_func) OF((voidpf opaque, voidpf stream));
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); 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 *close_file_func) OF((voidpf opaque, voidpf stream));
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
typedef struct zlib_filefunc_def_s typedef struct zlib_filefunc_def_s
{ {
open_file_func zopen_file; open_file_func zopen_file;
read_file_func zread_file; read_file_func zread_file;
write_file_func zwrite_file; write_file_func zwrite_file;
tell_file_func ztell_file; tell_file_func ztell_file;
seek_file_func zseek_file; seek_file_func zseek_file;
close_file_func zclose_file; close_file_func zclose_file;
testerror_file_func zerror_file; testerror_file_func zerror_file;
voidpf opaque; voidpf opaque;
} zlib_filefunc_def; } zlib_filefunc_def;
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_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 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 ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) #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 ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) #define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) #define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif
/* iowin32.c -- IO base function header for compress/uncompress .zip /* iowin32.c -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
This IO API version uses the Win32 API (for Microsoft Windows) This IO API version uses the Win32 API (for Microsoft Windows)
Version 1.01e, February 12th, 2005 Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant Copyright (C) 1998-2005 Gilles Vollant
*/ */
#include <stdlib.h> #include <stdlib.h>
#include "zlib.h" #include "zlib.h"
#include "ioapi.h" #include "ioapi.h"
#include "iowin32.h" #include "iowin32.h"
#ifndef INVALID_HANDLE_VALUE #ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE (0xFFFFFFFF) #define INVALID_HANDLE_VALUE (0xFFFFFFFF)
#endif #endif
#ifndef INVALID_SET_FILE_POINTER #ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER ((DWORD)-1) #define INVALID_SET_FILE_POINTER ((DWORD)-1)
#endif #endif
voidpf ZCALLBACK win32_open_file_func OF(( voidpf ZCALLBACK win32_open_file_func OF((
voidpf opaque, voidpf opaque,
const char* filename, const char* filename,
int mode)); int mode));
uLong ZCALLBACK win32_read_file_func OF(( uLong ZCALLBACK win32_read_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
void* buf, void* buf,
uLong size)); uLong size));
uLong ZCALLBACK win32_write_file_func OF(( uLong ZCALLBACK win32_write_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
const void* buf, const void* buf,
uLong size)); uLong size));
long ZCALLBACK win32_tell_file_func OF(( long ZCALLBACK win32_tell_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
long ZCALLBACK win32_seek_file_func OF(( long ZCALLBACK win32_seek_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
uLong offset, uLong offset,
int origin)); int origin));
int ZCALLBACK win32_close_file_func OF(( int ZCALLBACK win32_close_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
int ZCALLBACK win32_error_file_func OF(( int ZCALLBACK win32_error_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
typedef struct typedef struct
{ {
HANDLE hf; HANDLE hf;
int error; int error;
} WIN32FILE_IOWIN; } WIN32FILE_IOWIN;
voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode) voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
voidpf opaque; voidpf opaque;
const char* filename; const char* filename;
int mode; int mode;
{ {
const char* mode_fopen = NULL; const char* mode_fopen = NULL;
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
HANDLE hFile = 0; HANDLE hFile = 0;
voidpf ret=NULL; voidpf ret=NULL;
dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0; dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
{ {
dwDesiredAccess = GENERIC_READ; dwDesiredAccess = GENERIC_READ;
dwCreationDisposition = OPEN_EXISTING; dwCreationDisposition = OPEN_EXISTING;
dwShareMode = FILE_SHARE_READ; dwShareMode = FILE_SHARE_READ;
} }
else else
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
{ {
dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
dwCreationDisposition = OPEN_EXISTING; dwCreationDisposition = OPEN_EXISTING;
} }
else else
if (mode & ZLIB_FILEFUNC_MODE_CREATE) if (mode & ZLIB_FILEFUNC_MODE_CREATE)
{ {
dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
dwCreationDisposition = CREATE_ALWAYS; dwCreationDisposition = CREATE_ALWAYS;
} }
if ((filename!=NULL) && (dwDesiredAccess != 0)) if ((filename!=NULL) && (dwDesiredAccess != 0))
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
dwCreationDisposition, dwFlagsAndAttributes, NULL); dwCreationDisposition, dwFlagsAndAttributes, NULL);
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
hFile = NULL; hFile = NULL;
if (hFile != NULL) if (hFile != NULL)
{ {
WIN32FILE_IOWIN w32fiow; WIN32FILE_IOWIN w32fiow;
w32fiow.hf = hFile; w32fiow.hf = hFile;
w32fiow.error = 0; w32fiow.error = 0;
ret = malloc(sizeof(WIN32FILE_IOWIN)); ret = malloc(sizeof(WIN32FILE_IOWIN));
if (ret==NULL) if (ret==NULL)
CloseHandle(hFile); CloseHandle(hFile);
else *((WIN32FILE_IOWIN*)ret) = w32fiow; else *((WIN32FILE_IOWIN*)ret) = w32fiow;
} }
return ret; return ret;
} }
uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size) uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
void* buf; void* buf;
uLong size; uLong size;
{ {
uLong ret=0; uLong ret=0;
HANDLE hFile = NULL; HANDLE hFile = NULL;
if (stream!=NULL) if (stream!=NULL)
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
if (hFile != NULL) if (hFile != NULL)
if (!ReadFile(hFile, buf, size, &ret, NULL)) if (!ReadFile(hFile, buf, size, &ret, NULL))
{ {
DWORD dwErr = GetLastError(); DWORD dwErr = GetLastError();
if (dwErr == ERROR_HANDLE_EOF) if (dwErr == ERROR_HANDLE_EOF)
dwErr = 0; dwErr = 0;
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
} }
return ret; return ret;
} }
uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size) uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
const void* buf; const void* buf;
uLong size; uLong size;
{ {
uLong ret=0; uLong ret=0;
HANDLE hFile = NULL; HANDLE hFile = NULL;
if (stream!=NULL) if (stream!=NULL)
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
if (hFile !=NULL) if (hFile !=NULL)
if (!WriteFile(hFile, buf, size, &ret, NULL)) if (!WriteFile(hFile, buf, size, &ret, NULL))
{ {
DWORD dwErr = GetLastError(); DWORD dwErr = GetLastError();
if (dwErr == ERROR_HANDLE_EOF) if (dwErr == ERROR_HANDLE_EOF)
dwErr = 0; dwErr = 0;
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
} }
return ret; return ret;
} }
long ZCALLBACK win32_tell_file_func (opaque, stream) long ZCALLBACK win32_tell_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
long ret=-1; long ret=-1;
HANDLE hFile = NULL; HANDLE hFile = NULL;
if (stream!=NULL) if (stream!=NULL)
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
if (hFile != NULL) if (hFile != NULL)
{ {
DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
if (dwSet == INVALID_SET_FILE_POINTER) if (dwSet == INVALID_SET_FILE_POINTER)
{ {
DWORD dwErr = GetLastError(); DWORD dwErr = GetLastError();
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
ret = -1; ret = -1;
} }
else else
ret=(long)dwSet; ret=(long)dwSet;
} }
return ret; return ret;
} }
long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin) long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
uLong offset; uLong offset;
int origin; int origin;
{ {
DWORD dwMoveMethod=0xFFFFFFFF; DWORD dwMoveMethod=0xFFFFFFFF;
HANDLE hFile = NULL; HANDLE hFile = NULL;
long ret=-1; long ret=-1;
if (stream!=NULL) if (stream!=NULL)
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
switch (origin) switch (origin)
{ {
case ZLIB_FILEFUNC_SEEK_CUR : case ZLIB_FILEFUNC_SEEK_CUR :
dwMoveMethod = FILE_CURRENT; dwMoveMethod = FILE_CURRENT;
break; break;
case ZLIB_FILEFUNC_SEEK_END : case ZLIB_FILEFUNC_SEEK_END :
dwMoveMethod = FILE_END; dwMoveMethod = FILE_END;
break; break;
case ZLIB_FILEFUNC_SEEK_SET : case ZLIB_FILEFUNC_SEEK_SET :
dwMoveMethod = FILE_BEGIN; dwMoveMethod = FILE_BEGIN;
break; break;
default: return -1; default: return -1;
} }
if (hFile != NULL) if (hFile != NULL)
{ {
DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
if (dwSet == INVALID_SET_FILE_POINTER) if (dwSet == INVALID_SET_FILE_POINTER)
{ {
DWORD dwErr = GetLastError(); DWORD dwErr = GetLastError();
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
ret = -1; ret = -1;
} }
else else
ret=0; ret=0;
} }
return ret; return ret;
} }
int ZCALLBACK win32_close_file_func (opaque, stream) int ZCALLBACK win32_close_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
int ret=-1; int ret=-1;
if (stream!=NULL) if (stream!=NULL)
{ {
HANDLE hFile; HANDLE hFile;
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
if (hFile != NULL) if (hFile != NULL)
{ {
CloseHandle(hFile); CloseHandle(hFile);
ret=0; ret=0;
} }
free(stream); free(stream);
} }
return ret; return ret;
} }
int ZCALLBACK win32_error_file_func (opaque, stream) int ZCALLBACK win32_error_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
int ret=-1; int ret=-1;
if (stream!=NULL) if (stream!=NULL)
{ {
ret = ((WIN32FILE_IOWIN*)stream) -> error; ret = ((WIN32FILE_IOWIN*)stream) -> error;
} }
return ret; return ret;
} }
void fill_win32_filefunc (pzlib_filefunc_def) void fill_win32_filefunc (pzlib_filefunc_def)
zlib_filefunc_def* pzlib_filefunc_def; zlib_filefunc_def* pzlib_filefunc_def;
{ {
pzlib_filefunc_def->zopen_file = win32_open_file_func; pzlib_filefunc_def->zopen_file = win32_open_file_func;
pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func;
pzlib_filefunc_def->zwrite_file = win32_write_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func;
pzlib_filefunc_def->ztell_file = win32_tell_file_func; pzlib_filefunc_def->ztell_file = win32_tell_file_func;
pzlib_filefunc_def->zseek_file = win32_seek_file_func; pzlib_filefunc_def->zseek_file = win32_seek_file_func;
pzlib_filefunc_def->zclose_file = win32_close_file_func; pzlib_filefunc_def->zclose_file = win32_close_file_func;
pzlib_filefunc_def->zerror_file = win32_error_file_func; pzlib_filefunc_def->zerror_file = win32_error_file_func;
pzlib_filefunc_def->opaque=NULL; pzlib_filefunc_def->opaque=NULL;
} }
/* iowin32.h -- IO base function header for compress/uncompress .zip /* iowin32.h -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
This IO API version uses the Win32 API (for Microsoft Windows) This IO API version uses the Win32 API (for Microsoft Windows)
Version 1.01e, February 12th, 2005 Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant Copyright (C) 1998-2005 Gilles Vollant
*/ */
#include <windows.h> #include <windows.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
此差异已折叠。
此差异已折叠。
此差异已折叠。
/* /*
Additional tools for Minizip Additional tools for Minizip
Code: Xavier Roche '2004 Code: Xavier Roche '2004
License: Same as ZLIB (www.gzip.org) License: Same as ZLIB (www.gzip.org)
*/ */
#ifndef _zip_tools_H #ifndef _zip_tools_H
#define _zip_tools_H #define _zip_tools_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#ifndef _ZLIB_H #ifndef _ZLIB_H
#include "zlib.h" #include "zlib.h"
#endif #endif
#include "unzip.h" #include "unzip.h"
/* Repair a ZIP file (missing central directory) /* Repair a ZIP file (missing central directory)
file: file to recover file: file to recover
fileOut: output file after recovery fileOut: output file after recovery
fileOutTmp: temporary file name used for recovery fileOutTmp: temporary file name used for recovery
*/ */
extern int ZEXPORT unzRepair(const char* file, extern int ZEXPORT unzRepair(const char* file,
const char* fileOut, const char* fileOut,
const char* fileOutTmp, const char* fileOutTmp,
uLong* nRecovered, uLong* nRecovered,
uLong* bytesRecovered); uLong* bytesRecovered);
#endif #endif
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -10,7 +10,7 @@ unit zlibpas; ...@@ -10,7 +10,7 @@ unit zlibpas;
interface interface
const const
ZLIB_VERSION = '1.2.2'; ZLIB_VERSION = '1.2.3';
type type
alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; alloc_func = function(opaque: Pointer; items, size: Integer): Pointer;
......
; rdtsc64.asm
;
; unsigned _int64 myrdtsc();
;
; return the performance rdtsc value, on AMD64/Intel EM64T
;
; compile with :
; ml64.exe" /Flrdtsc64 /c /Zi rdtsc64.asm
;
.code
myrdtsc PROC
rdtsc
shl rdx,32
or rax,rdx
ret
myrdtsc ENDP
END
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <windows.h> #include <windows.h>
#include "zlib.h" #include "zlib.h"
...@@ -17,23 +17,25 @@ void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) ...@@ -17,23 +17,25 @@ void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
} }
} }
#ifdef _AMD64_ #ifdef _M_X64
unsigned _int64 myrdtsc(); // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
unsigned __int64 __rdtsc(void);
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{ {
// printf("rdtsc = %I64x\n",myrdtsc()); // printf("rdtsc = %I64x\n",__rdtsc());
pbeginTime64->QuadPart=myrdtsc(); pbeginTime64->QuadPart=__rdtsc();
} }
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{ {
LARGE_INTEGER LIres; LARGE_INTEGER LIres;
unsigned _int64 res=myrdtsc()-((unsigned _int64)(beginTime64.QuadPart)); unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
LIres.QuadPart=res; LIres.QuadPart=res;
// printf("rdtsc = %I64x\n",myrdtsc()); // printf("rdtsc = %I64x\n",__rdtsc());
return LIres; return LIres;
} }
#else #else
#ifdef _M_IX86
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{ {
DWORD dwEdx,dwEax; DWORD dwEdx,dwEax;
...@@ -61,8 +63,23 @@ LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) ...@@ -61,8 +63,23 @@ LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
MyDoMinus64(&LIres,endTime64,beginTime64); MyDoMinus64(&LIres,endTime64,beginTime64);
return LIres; return LIres;
} }
#endif #else
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
}
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER lr;
lr.QuadPart=0;
return lr;
}
#endif
#endif
void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
{ {
......
Microsoft Visual Studio Solution File, Format Version 7.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
ConfigName.0 = Debug
ConfigName.1 = Release
EndGlobalSection
GlobalSection(ProjectDependencies) = postSolution
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug.ActiveCfg = Debug|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug.Build.0 = Debug|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release.ActiveCfg = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib8", "testzlib8.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|Win64 (AMD64) = Debug|Win64 (AMD64)
Release|Win32 = Release|Win32
Release|Win64 (AMD64) = Release|Win64 (AMD64)
ReleaseAsm|Win32 = ReleaseAsm|Win32
ReleaseAsm|Win64 (AMD64) = ReleaseAsm|Win64 (AMD64)
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win64 (AMD64).ActiveCfg = Debug|Win64 (AMD64)
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win64 (AMD64).Build.0 = Debug|Win64 (AMD64)
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win64 (AMD64).ActiveCfg = Release|Win64 (AMD64)
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win64 (AMD64).Build.0 = Release|Win64 (AMD64)
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseAsm|Win32.ActiveCfg = ReleaseAsm|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseAsm|Win32.Build.0 = ReleaseAsm|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseAsm|Win64 (AMD64).ActiveCfg = ReleaseAsm|Win64 (AMD64)
{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseAsm|Win64 (AMD64).Build.0 = ReleaseAsm|Win64 (AMD64)
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
Building instructions for the DLL versions of Zlib 1.2.x Building instructions for the DLL versions of Zlib 1.2.3
======================================================= ========================================================
This directory contains projects that build zlib and minizip using This directory contains projects that build zlib and minizip using
Microsoft Visual C++ 7.0/7.1. Microsoft Visual C++ 7.0/7.1, and Visual C++ .
You don't need to build these projects yourself. You can download the You don't need to build these projects yourself. You can download the
binaries from: binaries from:
...@@ -11,18 +11,36 @@ binaries from: ...@@ -11,18 +11,36 @@ binaries from:
More information can be found at this site. More information can be found at this site.
Build instructions Build instructions for Visual Studio 7.x (32 bits)
------------------ --------------------------------------------------
- Unzip zlib*.zip and copy the files from contrib\vstudio\vc7, - Uncompress current zlib, including all contrib/* files
from contrib\vstudio\masmx86 and from contrib\minizip into the same
directory.
- Download the crtdll library from - Download the crtdll library from
http://www.winimage.com/zLibDll/crtdll.zip http://www.winimage.com/zLibDll/crtdll.zip
Unzip crtdll.zip to extract crtdll.lib. Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc7.
- If you are using x86, use the Release target. - Open contrib\vstudio\vc7\zlibvc.sln with Microsoft Visual C++ 7.x
- Open zlibvc.sln with Microsoft Visual C++ 7.0 or 7.1
(Visual Studio .Net 2002 or 2003). (Visual Studio .Net 2002 or 2003).
Build instructions for Visual Studio 2005 (32 bits or 64 bits)
--------------------------------------------------------------
- Uncompress current zlib, including all contrib/* files
- For 32 bits only: download the crtdll library from
http://www.winimage.com/zLibDll/crtdll.zip
Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc8.
- Open contrib\vstudio\vc8\zlibvc.sln with Microsoft Visual C++ 8.0
Build instructions for Visual Studio 2005 64 bits, PSDK compiler
----------------------------------------------------------------
at the time of writing this text file, Visual Studio 2005 (and
Microsoft Visual C++ 8.0) is on the beta 2 stage.
Using you can get the free 64 bits compiler from Platform SDK,
which is NOT a beta, and compile using the Visual studio 2005 IDE
see http://www.winimage.com/misc/sdk64onvs2005/ for instruction
- Uncompress current zlib, including all contrib/* files
- start Visual Studio 2005 from a platform SDK command prompt, using
the /useenv switch
- Open contrib\vstudio\vc8\zlibvc.sln with Microsoft Visual C++ 8.0
Important Important
--------- ---------
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
Optimization="2" Optimization="2"
InlineFunctionExpansion="1" InlineFunctionExpansion="1"
OmitFramePointers="TRUE" OmitFramePointers="TRUE"
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"
StringPooling="TRUE" StringPooling="TRUE"
RuntimeLibrary="4" RuntimeLibrary="4"
...@@ -104,7 +106,7 @@ ...@@ -104,7 +106,7 @@
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File <File
RelativePath="miniunz.c"> RelativePath="..\..\minizip\miniunz.c">
</File> </File>
</Filter> </Filter>
<Filter <Filter
...@@ -116,7 +118,7 @@ ...@@ -116,7 +118,7 @@
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter> </Filter>
<File <File
RelativePath="zlibwapi.lib"> RelativePath="ReleaseDll\zlibwapi.lib">
</File> </File>
</Files> </Files>
<Globals> <Globals>
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
Optimization="2" Optimization="2"
InlineFunctionExpansion="1" InlineFunctionExpansion="1"
OmitFramePointers="TRUE" OmitFramePointers="TRUE"
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"
StringPooling="TRUE" StringPooling="TRUE"
RuntimeLibrary="4" RuntimeLibrary="4"
...@@ -104,7 +106,7 @@ ...@@ -104,7 +106,7 @@
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File <File
RelativePath="minizip.c"> RelativePath="..\..\minizip\minizip.c">
</File> </File>
</Filter> </Filter>
<Filter <Filter
...@@ -116,7 +118,7 @@ ...@@ -116,7 +118,7 @@
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter> </Filter>
<File <File
RelativePath="zlibwapi.lib"> RelativePath="ReleaseDll\zlibwapi.lib">
</File> </File>
</Files> </Files>
<Globals> <Globals>
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="7.00" Version="7.00"
Name="testzlib" Name="testZlibDll"
ProjectGUID="{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" ProjectGUID="{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}"
Keyword="Win32Proj"> Keyword="Win32Proj">
<Platforms> <Platforms>
<Platform <Platform
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
Optimization="2" Optimization="2"
InlineFunctionExpansion="1" InlineFunctionExpansion="1"
OmitFramePointers="TRUE" OmitFramePointers="TRUE"
AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"
StringPooling="TRUE" StringPooling="TRUE"
RuntimeLibrary="4" RuntimeLibrary="4"
...@@ -104,7 +106,7 @@ ...@@ -104,7 +106,7 @@
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File <File
RelativePath="testzlib.c"> RelativePath="..\..\testzlib\testzlib.c">
</File> </File>
</Filter> </Filter>
<Filter <Filter
...@@ -116,7 +118,7 @@ ...@@ -116,7 +118,7 @@
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter> </Filter>
<File <File
RelativePath="zlibwapi.lib"> RelativePath="ReleaseDll\zlibwapi.lib">
</File> </File>
</Files> </Files>
<Globals> <Globals>
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
#define IDR_VERSION1 1 #define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1,2,2,4 FILEVERSION 1,2,3,0
PRODUCTVERSION 1,2,2,4 PRODUCTVERSION 1,2,3,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0 FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32 FILEOS VOS_DOS_WINDOWS32
...@@ -17,7 +17,7 @@ BEGIN ...@@ -17,7 +17,7 @@ BEGIN
BEGIN BEGIN
VALUE "FileDescription", "zlib data compression library\0" VALUE "FileDescription", "zlib data compression library\0"
VALUE "FileVersion", "1.2.2.4\0" VALUE "FileVersion", "1.2.3.0\0"
VALUE "InternalName", "zlib\0" VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlib.dll\0" VALUE "OriginalFilename", "zlib.dll\0"
VALUE "ProductName", "ZLib.DLL\0" VALUE "ProductName", "ZLib.DLL\0"
......
此差异已折叠。
VERSION 1.21 VERSION 1.23
HEAPSIZE 1048576,8192 HEAPSIZE 1048576,8192
...@@ -53,7 +53,7 @@ EXPORTS ...@@ -53,7 +53,7 @@ EXPORTS
deflateBound @47 deflateBound @47
gzclearerr @48 gzclearerr @48
gzungetc @49 gzungetc @49
zlibCompileFlags @50 zlibCompileFlags @50
deflatePrime @51 deflatePrime @51
unzOpen @61 unzOpen @61
......
...@@ -7,6 +7,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", ...@@ -7,6 +7,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj",
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testZlibDll", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}"
EndProject
Global Global
GlobalSection(SolutionConfiguration) = preSolution GlobalSection(SolutionConfiguration) = preSolution
ConfigName.0 = Debug ConfigName.0 = Debug
...@@ -58,6 +60,16 @@ Global ...@@ -58,6 +60,16 @@ Global
{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm.Build.0 = Release|Win32 {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm.Build.0 = Release|Win32
{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32 {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32
{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.Build.0 = Release|Win32 {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.Build.0 = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Debug.ActiveCfg = Debug|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Debug.Build.0 = Debug|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Release.ActiveCfg = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Release.Build.0 = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseAxp.ActiveCfg = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseAxp.Build.0 = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutAsm.ActiveCfg = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutAsm.Build.0 = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32
{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutCrtdll.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection EndGlobalSection
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
#include <windows.h>
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1,2,3,0
PRODUCTVERSION 1,2,3,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE 0 // not used
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
//language ID = U.S. English, char set = Windows, Multilingual
BEGIN
VALUE "FileDescription", "zlib data compression library\0"
VALUE "FileVersion", "1.2.3.0\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlib.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
VALUE "LegalCopyright", "(C) 1995-2003 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 1252
END
END
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
#include "deflate.h" #include "deflate.h"
const char deflate_copyright[] = const char deflate_copyright[] =
" deflate 1.2.2.4 Copyright 1995-2005 Jean-loup Gailly "; " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly ";
/* /*
If you use the zlib library in a product, an acknowledgment is welcome 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 in the documentation of your product. If for some reason you cannot
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
.TH ZLIB 3 "11 July 2005" .TH ZLIB 3 "18 July 2005"
.SH NAME .SH NAME
zlib \- compression/decompression library zlib \- compression/decompression library
.SH SYNOPSIS .SH SYNOPSIS
...@@ -133,7 +133,7 @@ before asking for help. ...@@ -133,7 +133,7 @@ before asking for help.
Send questions and/or comments to zlib@gzip.org, Send questions and/or comments to zlib@gzip.org,
or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
.SH AUTHORS .SH AUTHORS
Version 1.2.2.4 Version 1.2.3
Copyright (C) 1995-2005 Jean-loup Gailly (jloup@gzip.org) Copyright (C) 1995-2005 Jean-loup Gailly (jloup@gzip.org)
and Mark Adler (madler@alumni.caltech.edu). and Mark Adler (madler@alumni.caltech.edu).
.LP .LP
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册