mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 07:40:25 +08:00
This commit was generated by cvs2svn to compensate for changes in r104181,
which included commits to RCS files with non-trunk default branches. From-SVN: r104182
This commit is contained in:
parent
303ae446cf
commit
3ec980b182
@ -118,6 +118,6 @@
|
||||
&MODLIB/INFTREES &MODLIB/TREES +
|
||||
&MODLIB/UNCOMPR &MODLIB/ZUTIL) +
|
||||
SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) +
|
||||
TEXT('ZLIB 1.2.1') TGTRLS(V4R4M0)
|
||||
TEXT('ZLIB 1.2.3') TGTRLS(V4R4M0)
|
||||
|
||||
ENDPGM
|
||||
|
@ -1,4 +1,4 @@
|
||||
ZLIB version 1.2.1 for AS400 installation instructions
|
||||
ZLIB version 1.2.3 for AS400 installation instructions
|
||||
|
||||
I) From an AS400 *SAVF file:
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
* ZLIB.INC - Interface to the general purpose compression library
|
||||
*
|
||||
* ILE RPG400 version by Patrick Monnerat, DATASPHERE.
|
||||
* Version 1.2.1
|
||||
* Version 1.2.3
|
||||
*
|
||||
*
|
||||
* WARNING:
|
||||
@ -20,8 +20,12 @@
|
||||
* Constants
|
||||
**************************************************************************
|
||||
*
|
||||
D ZLIB_VERSION C '1.2.1' Header's version
|
||||
D ZLIB_VERNUM C X'1210'
|
||||
* Versioning information.
|
||||
*
|
||||
D ZLIB_VERSION C '1.2.3'
|
||||
D ZLIB_VERNUM C X'1230'
|
||||
*
|
||||
* Other equates.
|
||||
*
|
||||
D Z_NO_FLUSH C 0
|
||||
D Z_SYNC_FLUSH C 2
|
||||
|
@ -5,10 +5,10 @@
|
||||
-- --
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
-- Continuous test for ZLib multithreading. If the test is fail
|
||||
-- Wou should provide thread safe allocation routines for the Z_Stream.
|
||||
-- Continuous test for ZLib multithreading. If the test would fail
|
||||
-- we should provide thread safe allocation routines for the Z_Stream.
|
||||
--
|
||||
-- $Id: mtest.adb,v 1.2 2003/08/12 12:11:05 vagul Exp $
|
||||
-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $
|
||||
|
||||
with ZLib;
|
||||
with Ada.Streams;
|
||||
@ -148,6 +148,9 @@ procedure MTest is
|
||||
|
||||
pragma Unreferenced (Test);
|
||||
|
||||
Dummy : Character;
|
||||
|
||||
begin
|
||||
null;
|
||||
Ada.Text_IO.Get_Immediate (Dummy);
|
||||
Stop := True;
|
||||
end MTest;
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
|
||||
-- $Id: read.adb,v 1.7 2003/08/12 12:12:35 vagul Exp $
|
||||
-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $
|
||||
|
||||
-- Test/demo program for the generic read interface.
|
||||
|
||||
@ -68,7 +68,11 @@ procedure Read is
|
||||
-- ZLib.Read
|
||||
-- reading data from the File_In.
|
||||
|
||||
procedure Read is new ZLib.Read (Read, Read_Buffer, Read_First, Read_Last);
|
||||
procedure Read is new ZLib.Read
|
||||
(Read,
|
||||
Read_Buffer,
|
||||
Rest_First => Read_First,
|
||||
Rest_Last => Read_Last);
|
||||
|
||||
----------
|
||||
-- Read --
|
||||
@ -103,6 +107,7 @@ procedure Read is
|
||||
Pack_Size := 0;
|
||||
Offset := 1;
|
||||
Read_First := Read_Buffer'Last + 1;
|
||||
Read_Last := Read_Buffer'Last;
|
||||
end Reset;
|
||||
|
||||
begin
|
||||
|
@ -1,23 +1,34 @@
|
||||
|
||||
ZLib for Ada thick binding (ZLib.Ada)
|
||||
Release 1.2
|
||||
ZLib for Ada thick binding (ZLib.Ada)
|
||||
Release 1.3
|
||||
|
||||
ZLib.Ada is a thick binding interface to the popular ZLib data
|
||||
compression library, available at http://www.gzip.org/zlib/.
|
||||
It provides Ada-style access to the ZLib C library.
|
||||
|
||||
|
||||
Here are the main changes since ZLib.Ada 1.1:
|
||||
Here are the main changes since ZLib.Ada 1.2:
|
||||
|
||||
- The default header type has a name "Default" now. Auto is used only for
|
||||
automatic GZip/ZLib header detection.
|
||||
- Attension: ZLib.Read generic routine have a initialization requirement
|
||||
for Read_Last parameter now. It is a bit incompartible with previous version,
|
||||
but extends functionality, we could use new parameters Allow_Read_Some and
|
||||
Flush now.
|
||||
|
||||
- Added test for multitasking mtest.adb.
|
||||
- Added Is_Open routines to ZLib and ZLib.Streams packages.
|
||||
|
||||
- Added GNAT project file zlib.gpr.
|
||||
- Add pragma Assert to check Stream_Element is 8 bit.
|
||||
|
||||
- Fix extraction to buffer with exact known decompressed size. Error reported by
|
||||
Steve Sangwine.
|
||||
|
||||
- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits
|
||||
computers. Patch provided by Pascal Obry.
|
||||
|
||||
- Add Status_Error exception definition.
|
||||
|
||||
- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit.
|
||||
|
||||
|
||||
How to build ZLib.Ada under GNAT
|
||||
How to build ZLib.Ada under GNAT
|
||||
|
||||
You should have the ZLib library already build on your computer, before
|
||||
building ZLib.Ada. Make the directory of ZLib.Ada sources current and
|
||||
@ -30,7 +41,7 @@ Or use the GNAT project file build for GNAT 3.15 or later:
|
||||
gnatmake -Pzlib.gpr -L<directory where libz.a is>
|
||||
|
||||
|
||||
How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
|
||||
How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
|
||||
|
||||
1. Make a project with all *.ads and *.adb files from the distribution.
|
||||
2. Build the libz.a library from the ZLib C sources.
|
||||
@ -40,7 +51,7 @@ Or use the GNAT project file build for GNAT 3.15 or later:
|
||||
6. Build the executable using test.adb as a main procedure.
|
||||
|
||||
|
||||
How to use ZLib.Ada
|
||||
How to use ZLib.Ada
|
||||
|
||||
The source files test.adb and read.adb are small demo programs that show
|
||||
the main functionality of ZLib.Ada.
|
||||
@ -50,3 +61,5 @@ The routines from the package specifications are commented.
|
||||
|
||||
Homepage: http://zlib-ada.sourceforge.net/
|
||||
Author: Dmitriy Anisimkov <anisimkov@yahoo.com>
|
||||
|
||||
Contributors: Pascal Obry <pascal@obry.org>, Steve Sangwine <sjs@essex.ac.uk>
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
|
||||
-- $Id: zlib-streams.adb,v 1.9 2003/08/12 13:15:31 vagul Exp $
|
||||
-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $
|
||||
|
||||
with Ada.Unchecked_Deallocation;
|
||||
|
||||
@ -90,6 +90,7 @@ package body ZLib.Streams is
|
||||
|
||||
Stream.Buffer := new Buffer_Subtype;
|
||||
Stream.Rest_First := Stream.Buffer'Last + 1;
|
||||
Stream.Rest_Last := Stream.Buffer'Last;
|
||||
end if;
|
||||
end Create;
|
||||
|
||||
@ -113,6 +114,15 @@ package body ZLib.Streams is
|
||||
end loop;
|
||||
end Flush;
|
||||
|
||||
-------------
|
||||
-- Is_Open --
|
||||
-------------
|
||||
|
||||
function Is_Open (Stream : Stream_Type) return Boolean is
|
||||
begin
|
||||
return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer);
|
||||
end Is_Open;
|
||||
|
||||
----------
|
||||
-- Read --
|
||||
----------
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
|
||||
-- $Id: zlib-streams.ads,v 1.11 2003/08/12 13:15:31 vagul Exp $
|
||||
-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $
|
||||
|
||||
package ZLib.Streams is
|
||||
|
||||
@ -77,6 +77,8 @@ package ZLib.Streams is
|
||||
-- !!! When the Need_Header is False ZLib-Ada is using undocumented
|
||||
-- ZLib 1.1.4 functionality to do not create/wait for ZLib headers.
|
||||
|
||||
function Is_Open (Stream : Stream_Type) return Boolean;
|
||||
|
||||
procedure Close (Stream : in out Stream_Type);
|
||||
|
||||
private
|
||||
|
@ -6,12 +6,11 @@
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
|
||||
-- $Id: zlib-thin.adb,v 1.6 2003/01/21 15:26:37 vagul Exp $
|
||||
-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $
|
||||
|
||||
package body ZLib.Thin is
|
||||
|
||||
ZLIB_VERSION : constant Chars_Ptr :=
|
||||
Interfaces.C.Strings.New_String ("1.1.4");
|
||||
ZLIB_VERSION : constant Chars_Ptr := zlibVersion;
|
||||
|
||||
Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit;
|
||||
|
||||
@ -37,14 +36,6 @@ package body ZLib.Thin is
|
||||
-- Deflate_Init --
|
||||
------------------
|
||||
|
||||
function Deflate_Init
|
||||
(strm : in Z_Streamp;
|
||||
level : in Int := Z_DEFAULT_COMPRESSION)
|
||||
return Int is
|
||||
begin
|
||||
return deflateInit (strm, level, ZLIB_VERSION, Z_Stream_Size);
|
||||
end Deflate_Init;
|
||||
|
||||
function Deflate_Init
|
||||
(strm : Z_Streamp;
|
||||
level : Int;
|
||||
@ -69,16 +60,15 @@ package body ZLib.Thin is
|
||||
-- Inflate_Init --
|
||||
------------------
|
||||
|
||||
function Inflate_Init (strm : Z_Streamp) return Int is
|
||||
begin
|
||||
return inflateInit (strm, ZLIB_VERSION, Z_Stream_Size);
|
||||
end Inflate_Init;
|
||||
|
||||
function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is
|
||||
begin
|
||||
return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size);
|
||||
end Inflate_Init;
|
||||
|
||||
------------------------
|
||||
-- Last_Error_Message --
|
||||
------------------------
|
||||
|
||||
function Last_Error_Message (Strm : in Z_Stream) return String is
|
||||
use Interfaces.C.Strings;
|
||||
begin
|
||||
@ -89,54 +79,28 @@ package body ZLib.Thin is
|
||||
end if;
|
||||
end Last_Error_Message;
|
||||
|
||||
-------------
|
||||
-- Need_In --
|
||||
-------------
|
||||
|
||||
function Need_In (strm : Z_Stream) return Boolean is
|
||||
begin
|
||||
return strm.Avail_In = 0;
|
||||
end Need_In;
|
||||
|
||||
--------------
|
||||
-- Need_Out --
|
||||
--------------
|
||||
|
||||
function Need_Out (strm : Z_Stream) return Boolean is
|
||||
begin
|
||||
return strm.Avail_Out = 0;
|
||||
end Need_Out;
|
||||
|
||||
------------
|
||||
-- Set_In --
|
||||
------------
|
||||
|
||||
procedure Set_In
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Byte_Access;
|
||||
Size : in UInt) is
|
||||
Buffer : in Voidp;
|
||||
Size : in UInt) is
|
||||
begin
|
||||
Strm.Next_In := Buffer;
|
||||
Strm.Avail_In := Size;
|
||||
end Set_In;
|
||||
|
||||
procedure Set_In
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Voidp;
|
||||
Size : in UInt) is
|
||||
begin
|
||||
Set_In (Strm, Bytes.To_Pointer (Buffer), Size);
|
||||
end Set_In;
|
||||
|
||||
------------------
|
||||
-- Set_Mem_Func --
|
||||
------------------
|
||||
|
||||
procedure Set_Mem_Func
|
||||
(Strm : in out Z_Stream;
|
||||
Opaque : in Voidp;
|
||||
Alloc : in alloc_func;
|
||||
Free : in free_func) is
|
||||
Opaque : in Voidp;
|
||||
Alloc : in alloc_func;
|
||||
Free : in free_func) is
|
||||
begin
|
||||
Strm.opaque := Opaque;
|
||||
Strm.zalloc := Alloc;
|
||||
@ -149,21 +113,13 @@ package body ZLib.Thin is
|
||||
|
||||
procedure Set_Out
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Byte_Access;
|
||||
Size : in UInt) is
|
||||
Buffer : in Voidp;
|
||||
Size : in UInt) is
|
||||
begin
|
||||
Strm.Next_Out := Buffer;
|
||||
Strm.Avail_Out := Size;
|
||||
end Set_Out;
|
||||
|
||||
procedure Set_Out
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Voidp;
|
||||
Size : in UInt) is
|
||||
begin
|
||||
Set_Out (Strm, Bytes.To_Pointer (Buffer), Size);
|
||||
end Set_Out;
|
||||
|
||||
--------------
|
||||
-- Total_In --
|
||||
--------------
|
||||
|
@ -6,10 +6,11 @@
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
|
||||
-- $Id: zlib-thin.ads,v 1.8 2003/08/12 13:16:51 vagul Exp $
|
||||
-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $
|
||||
|
||||
with Interfaces.C.Strings;
|
||||
with System.Address_To_Access_Conversions;
|
||||
|
||||
with System;
|
||||
|
||||
private package ZLib.Thin is
|
||||
|
||||
@ -36,18 +37,18 @@ private package ZLib.Thin is
|
||||
-- zconf.h:216
|
||||
type Int is new Interfaces.C.int;
|
||||
|
||||
type ULong is new Interfaces.C.unsigned; -- 32 bits or more
|
||||
-- zconf.h:217
|
||||
type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more
|
||||
-- zconf.h:217
|
||||
subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr;
|
||||
|
||||
type ULong_Access is access ULong;
|
||||
type Int_Access is access Int;
|
||||
|
||||
subtype Voidp is System.Address; -- zconf.h:232
|
||||
|
||||
package Bytes is new System.Address_To_Access_Conversions (Byte);
|
||||
|
||||
subtype Byte_Access is Bytes.Object_Pointer;
|
||||
subtype Byte_Access is Voidp;
|
||||
|
||||
Nul : constant Voidp := System.Null_Address;
|
||||
-- end from zconf
|
||||
|
||||
Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125
|
||||
@ -251,12 +252,6 @@ private package ZLib.Thin is
|
||||
stream_size : Int)
|
||||
return Int;
|
||||
|
||||
function Deflate_Init
|
||||
(strm : in Z_Streamp;
|
||||
level : in Int := Z_DEFAULT_COMPRESSION)
|
||||
return Int;
|
||||
pragma Inline (Deflate_Init);
|
||||
|
||||
function deflateInit2
|
||||
(strm : Z_Streamp;
|
||||
level : Int;
|
||||
@ -284,9 +279,6 @@ private package ZLib.Thin is
|
||||
stream_size : Int)
|
||||
return Int;
|
||||
|
||||
function Inflate_Init (strm : Z_Streamp) return Int;
|
||||
pragma Inline (Inflate_Init);
|
||||
|
||||
function inflateInit2
|
||||
(strm : in Z_Streamp;
|
||||
windowBits : in Int;
|
||||
@ -318,32 +310,12 @@ private package ZLib.Thin is
|
||||
-- has dropped to zero. The application must initialize zalloc, zfree and
|
||||
-- opaque before calling the init function.
|
||||
|
||||
function Need_In (strm : in Z_Stream) return Boolean;
|
||||
-- return true when we do not need to setup Next_In and Avail_In fields.
|
||||
pragma Inline (Need_In);
|
||||
|
||||
function Need_Out (strm : in Z_Stream) return Boolean;
|
||||
-- return true when we do not need to setup Next_Out and Avail_Out field.
|
||||
pragma Inline (Need_Out);
|
||||
|
||||
procedure Set_In
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Byte_Access;
|
||||
Size : in UInt);
|
||||
pragma Inline (Set_In);
|
||||
|
||||
procedure Set_In
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Voidp;
|
||||
Size : in UInt);
|
||||
pragma Inline (Set_In);
|
||||
|
||||
procedure Set_Out
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Byte_Access;
|
||||
Size : in UInt);
|
||||
pragma Inline (Set_Out);
|
||||
|
||||
procedure Set_Out
|
||||
(Strm : in out Z_Stream;
|
||||
Buffer : in Voidp;
|
||||
@ -388,19 +360,13 @@ private package ZLib.Thin is
|
||||
|
||||
function zlibCompileFlags return ULong;
|
||||
|
||||
function deflatePrime
|
||||
(strm : Z_Streamp;
|
||||
bits : Int;
|
||||
value : Int)
|
||||
return Int;
|
||||
|
||||
private
|
||||
|
||||
type Z_Stream is record -- zlib.h:68
|
||||
Next_In : Byte_Access; -- next input byte
|
||||
Next_In : Voidp := Nul; -- next input byte
|
||||
Avail_In : UInt := 0; -- number of bytes available at next_in
|
||||
Total_In : ULong := 0; -- total nb of input bytes read so far
|
||||
Next_Out : Byte_Access; -- next output byte should be put there
|
||||
Next_Out : Voidp := Nul; -- next output byte should be put there
|
||||
Avail_Out : UInt := 0; -- remaining free space at next_out
|
||||
Total_Out : ULong := 0; -- total nb of bytes output so far
|
||||
msg : Chars_Ptr; -- last error message, NULL if no error
|
||||
@ -460,14 +426,13 @@ private
|
||||
pragma Import (C, inflateSyncPoint, "inflateSyncPoint");
|
||||
pragma Import (C, get_crc_table, "get_crc_table");
|
||||
|
||||
-- added in zlib 1.2.1:
|
||||
-- since zlib 1.2.0:
|
||||
|
||||
pragma Import (C, inflateCopy, "inflateCopy");
|
||||
pragma Import (C, compressBound, "compressBound");
|
||||
pragma Import (C, deflateBound, "deflateBound");
|
||||
pragma Import (C, gzungetc, "gzungetc");
|
||||
pragma Import (C, zlibCompileFlags, "zlibCompileFlags");
|
||||
pragma Import (C, deflatePrime, "deflatePrime");
|
||||
|
||||
pragma Import (C, inflateBackInit, "inflateBackInit_");
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
----------------------------------------------------------------
|
||||
-- ZLib for Ada thick binding. --
|
||||
-- --
|
||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
||||
-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
|
||||
-- --
|
||||
-- Open source license information is in the zlib.ads file. --
|
||||
----------------------------------------------------------------
|
||||
|
||||
-- $Id: zlib.adb,v 1.19 2003/07/13 16:02:19 vagul Exp $
|
||||
-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $
|
||||
|
||||
with Ada.Exceptions;
|
||||
with Ada.Unchecked_Conversion;
|
||||
@ -34,7 +34,7 @@ package body ZLib is
|
||||
VERSION_ERROR);
|
||||
|
||||
type Flate_Step_Function is access
|
||||
function (Strm : Thin.Z_Streamp; flush : Thin.Int) return Thin.Int;
|
||||
function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int;
|
||||
pragma Convention (C, Flate_Step_Function);
|
||||
|
||||
type Flate_End_Function is access
|
||||
@ -82,13 +82,13 @@ package body ZLib is
|
||||
Flush_Finish : constant array (Boolean) of Flush_Mode
|
||||
:= (True => Finish, False => No_Flush);
|
||||
|
||||
procedure Raise_Error (Stream : Z_Stream);
|
||||
procedure Raise_Error (Stream : in Z_Stream);
|
||||
pragma Inline (Raise_Error);
|
||||
|
||||
procedure Raise_Error (Message : String);
|
||||
procedure Raise_Error (Message : in String);
|
||||
pragma Inline (Raise_Error);
|
||||
|
||||
procedure Check_Error (Stream : Z_Stream; Code : Thin.Int);
|
||||
procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int);
|
||||
|
||||
procedure Free is new Ada.Unchecked_Deallocation
|
||||
(Z_Stream, Z_Stream_Access);
|
||||
@ -118,7 +118,7 @@ package body ZLib is
|
||||
-- Check_Error --
|
||||
-----------------
|
||||
|
||||
procedure Check_Error (Stream : Z_Stream; Code : Thin.Int) is
|
||||
procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is
|
||||
use type Thin.Int;
|
||||
begin
|
||||
if Code /= Thin.Z_OK then
|
||||
@ -138,10 +138,11 @@ package body ZLib is
|
||||
is
|
||||
Code : Thin.Int;
|
||||
begin
|
||||
Code := Flate (Filter.Compression).Done
|
||||
(To_Thin_Access (Filter.Strm));
|
||||
if not Ignore_Error and then not Is_Open (Filter) then
|
||||
raise Status_Error;
|
||||
end if;
|
||||
|
||||
Filter.Opened := False;
|
||||
Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm));
|
||||
|
||||
if Ignore_Error or else Code = Thin.Z_OK then
|
||||
Free (Filter.Strm);
|
||||
@ -154,7 +155,7 @@ package body ZLib is
|
||||
Ada.Exceptions.Raise_Exception
|
||||
(ZLib_Error'Identity,
|
||||
Return_Code_Enum'Image (Return_Code (Code))
|
||||
& ": " & Error_Message);
|
||||
& ": " & Error_Message);
|
||||
end;
|
||||
end if;
|
||||
end Close;
|
||||
@ -170,10 +171,9 @@ package body ZLib is
|
||||
is
|
||||
use Thin;
|
||||
begin
|
||||
return Unsigned_32 (crc32
|
||||
(ULong (CRC),
|
||||
Bytes.To_Pointer (Data'Address),
|
||||
Data'Length));
|
||||
return Unsigned_32 (crc32 (ULong (CRC),
|
||||
Data'Address,
|
||||
Data'Length));
|
||||
end CRC32;
|
||||
|
||||
procedure CRC32
|
||||
@ -192,13 +192,17 @@ package body ZLib is
|
||||
Level : in Compression_Level := Default_Compression;
|
||||
Strategy : in Strategy_Type := Default_Strategy;
|
||||
Method : in Compression_Method := Deflated;
|
||||
Window_Bits : in Window_Bits_Type := 15;
|
||||
Memory_Level : in Memory_Level_Type := 8;
|
||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
||||
Memory_Level : in Memory_Level_Type := Default_Memory_Level;
|
||||
Header : in Header_Type := Default)
|
||||
is
|
||||
use type Thin.Int;
|
||||
Win_Bits : Thin.Int := Thin.Int (Window_Bits);
|
||||
begin
|
||||
if Is_Open (Filter) then
|
||||
raise Status_Error;
|
||||
end if;
|
||||
|
||||
-- We allow ZLib to make header only in case of default header type.
|
||||
-- Otherwise we would either do header by ourselfs, or do not do
|
||||
-- header at all.
|
||||
@ -216,10 +220,9 @@ package body ZLib is
|
||||
Filter.Offset := Simple_GZip_Header'Last + 1;
|
||||
end if;
|
||||
|
||||
Filter.Strm := new Z_Stream;
|
||||
Filter.Strm := new Z_Stream;
|
||||
Filter.Compression := True;
|
||||
Filter.Stream_End := False;
|
||||
Filter.Opened := True;
|
||||
Filter.Header := Header;
|
||||
|
||||
if Thin.Deflate_Init
|
||||
@ -255,18 +258,18 @@ package body ZLib is
|
||||
-----------------------
|
||||
|
||||
procedure Generic_Translate
|
||||
(Filter : in out ZLib.Filter_Type;
|
||||
In_Buffer_Size : Integer := Default_Buffer_Size;
|
||||
Out_Buffer_Size : Integer := Default_Buffer_Size)
|
||||
(Filter : in out ZLib.Filter_Type;
|
||||
In_Buffer_Size : in Integer := Default_Buffer_Size;
|
||||
Out_Buffer_Size : in Integer := Default_Buffer_Size)
|
||||
is
|
||||
In_Buffer : Stream_Element_Array
|
||||
(1 .. Stream_Element_Offset (In_Buffer_Size));
|
||||
In_Buffer : Stream_Element_Array
|
||||
(1 .. Stream_Element_Offset (In_Buffer_Size));
|
||||
Out_Buffer : Stream_Element_Array
|
||||
(1 .. Stream_Element_Offset (Out_Buffer_Size));
|
||||
Last : Stream_Element_Offset;
|
||||
In_Last : Stream_Element_Offset;
|
||||
In_First : Stream_Element_Offset;
|
||||
Out_Last : Stream_Element_Offset;
|
||||
(1 .. Stream_Element_Offset (Out_Buffer_Size));
|
||||
Last : Stream_Element_Offset;
|
||||
In_Last : Stream_Element_Offset;
|
||||
In_First : Stream_Element_Offset;
|
||||
Out_Last : Stream_Element_Offset;
|
||||
begin
|
||||
Main : loop
|
||||
Data_In (In_Buffer, Last);
|
||||
@ -275,18 +278,21 @@ package body ZLib is
|
||||
|
||||
loop
|
||||
Translate
|
||||
(Filter,
|
||||
In_Buffer (In_First .. Last),
|
||||
In_Last,
|
||||
Out_Buffer,
|
||||
Out_Last,
|
||||
Flush_Finish (Last < In_Buffer'First));
|
||||
(Filter => Filter,
|
||||
In_Data => In_Buffer (In_First .. Last),
|
||||
In_Last => In_Last,
|
||||
Out_Data => Out_Buffer,
|
||||
Out_Last => Out_Last,
|
||||
Flush => Flush_Finish (Last < In_Buffer'First));
|
||||
|
||||
Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
|
||||
if Out_Buffer'First <= Out_Last then
|
||||
Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
|
||||
end if;
|
||||
|
||||
exit Main when Stream_End (Filter);
|
||||
|
||||
-- The end of in buffer.
|
||||
|
||||
exit when In_Last = Last;
|
||||
|
||||
In_First := In_Last + 1;
|
||||
@ -301,7 +307,7 @@ package body ZLib is
|
||||
|
||||
procedure Inflate_Init
|
||||
(Filter : in out Filter_Type;
|
||||
Window_Bits : in Window_Bits_Type := 15;
|
||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
||||
Header : in Header_Type := Default)
|
||||
is
|
||||
use type Thin.Int;
|
||||
@ -320,6 +326,10 @@ package body ZLib is
|
||||
end Check_Version;
|
||||
|
||||
begin
|
||||
if Is_Open (Filter) then
|
||||
raise Status_Error;
|
||||
end if;
|
||||
|
||||
case Header is
|
||||
when None =>
|
||||
Check_Version;
|
||||
@ -344,10 +354,9 @@ package body ZLib is
|
||||
when Default => null;
|
||||
end case;
|
||||
|
||||
Filter.Strm := new Z_Stream;
|
||||
Filter.Strm := new Z_Stream;
|
||||
Filter.Compression := False;
|
||||
Filter.Stream_End := False;
|
||||
Filter.Opened := True;
|
||||
Filter.Header := Header;
|
||||
|
||||
if Thin.Inflate_Init
|
||||
@ -357,16 +366,25 @@ package body ZLib is
|
||||
end if;
|
||||
end Inflate_Init;
|
||||
|
||||
-------------
|
||||
-- Is_Open --
|
||||
-------------
|
||||
|
||||
function Is_Open (Filter : in Filter_Type) return Boolean is
|
||||
begin
|
||||
return Filter.Strm /= null;
|
||||
end Is_Open;
|
||||
|
||||
-----------------
|
||||
-- Raise_Error --
|
||||
-----------------
|
||||
|
||||
procedure Raise_Error (Message : String) is
|
||||
procedure Raise_Error (Message : in String) is
|
||||
begin
|
||||
Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);
|
||||
end Raise_Error;
|
||||
|
||||
procedure Raise_Error (Stream : Z_Stream) is
|
||||
procedure Raise_Error (Stream : in Z_Stream) is
|
||||
begin
|
||||
Raise_Error (Last_Error_Message (Stream));
|
||||
end Raise_Error;
|
||||
@ -378,21 +396,29 @@ package body ZLib is
|
||||
procedure Read
|
||||
(Filter : in out Filter_Type;
|
||||
Item : out Ada.Streams.Stream_Element_Array;
|
||||
Last : out Ada.Streams.Stream_Element_Offset)
|
||||
Last : out Ada.Streams.Stream_Element_Offset;
|
||||
Flush : in Flush_Mode := No_Flush)
|
||||
is
|
||||
In_Last : Stream_Element_Offset;
|
||||
Item_First : Ada.Streams.Stream_Element_Offset := Item'First;
|
||||
V_Flush : Flush_Mode := Flush;
|
||||
|
||||
begin
|
||||
pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);
|
||||
pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
|
||||
|
||||
loop
|
||||
if Rest_First > Buffer'Last then
|
||||
if Rest_Last = Buffer'First - 1 then
|
||||
V_Flush := Finish;
|
||||
|
||||
elsif Rest_First > Rest_Last then
|
||||
Read (Buffer, Rest_Last);
|
||||
Rest_First := Buffer'First;
|
||||
end if;
|
||||
|
||||
pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
|
||||
if Rest_Last < Buffer'First then
|
||||
V_Flush := Finish;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
Translate
|
||||
(Filter => Filter,
|
||||
@ -400,11 +426,13 @@ package body ZLib is
|
||||
In_Last => In_Last,
|
||||
Out_Data => Item (Item_First .. Item'Last),
|
||||
Out_Last => Last,
|
||||
Flush => Flush_Finish (Rest_Last < Rest_First));
|
||||
Flush => V_Flush);
|
||||
|
||||
Rest_First := In_Last + 1;
|
||||
|
||||
exit when Last = Item'Last or else Stream_End (Filter);
|
||||
exit when Stream_End (Filter)
|
||||
or else Last = Item'Last
|
||||
or else (Last >= Item'First and then Allow_Read_Some);
|
||||
|
||||
Item_First := Last + 1;
|
||||
end loop;
|
||||
@ -489,11 +517,11 @@ package body ZLib is
|
||||
Code : Thin.Int;
|
||||
|
||||
begin
|
||||
if Filter.Opened = False then
|
||||
raise ZLib_Error;
|
||||
if not Is_Open (Filter) then
|
||||
raise Status_Error;
|
||||
end if;
|
||||
|
||||
if Out_Data'Length = 0 then
|
||||
if Out_Data'Length = 0 and then In_Data'Length = 0 then
|
||||
raise Constraint_Error;
|
||||
end if;
|
||||
|
||||
@ -514,7 +542,6 @@ package body ZLib is
|
||||
- Stream_Element_Offset (Avail_In (Filter.Strm.all));
|
||||
Out_Last := Out_Data'Last
|
||||
- Stream_Element_Offset (Avail_Out (Filter.Strm.all));
|
||||
|
||||
end Translate_Auto;
|
||||
|
||||
--------------------
|
||||
@ -529,7 +556,7 @@ package body ZLib is
|
||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
||||
Flush : in Flush_Mode)
|
||||
is
|
||||
Out_First : Stream_Element_Offset;
|
||||
Out_First : Stream_Element_Offset;
|
||||
|
||||
procedure Add_Data (Data : in Stream_Element_Array);
|
||||
-- Add data to stream from the Filter.Offset till necessary,
|
||||
@ -596,7 +623,7 @@ package body ZLib is
|
||||
Add_Data (Simple_GZip_Header);
|
||||
|
||||
Translate_Auto
|
||||
(Filter => Filter,
|
||||
(Filter => Filter,
|
||||
In_Data => In_Data,
|
||||
In_Last => In_Last,
|
||||
Out_Data => Out_Data (Out_First .. Out_Data'Last),
|
||||
@ -604,7 +631,6 @@ package body ZLib is
|
||||
Flush => Flush);
|
||||
|
||||
CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));
|
||||
|
||||
end if;
|
||||
|
||||
if Filter.Stream_End and then Out_Last <= Out_Data'Last then
|
||||
@ -642,10 +668,11 @@ package body ZLib is
|
||||
procedure Write
|
||||
(Filter : in out Filter_Type;
|
||||
Item : in Ada.Streams.Stream_Element_Array;
|
||||
Flush : in Flush_Mode)
|
||||
Flush : in Flush_Mode := No_Flush)
|
||||
is
|
||||
Buffer : Stream_Element_Array (1 .. Buffer_Size);
|
||||
In_Last, Out_Last : Stream_Element_Offset;
|
||||
Buffer : Stream_Element_Array (1 .. Buffer_Size);
|
||||
In_Last : Stream_Element_Offset;
|
||||
Out_Last : Stream_Element_Offset;
|
||||
In_First : Stream_Element_Offset := Item'First;
|
||||
begin
|
||||
if Item'Length = 0 and Flush = No_Flush then
|
||||
@ -654,7 +681,7 @@ package body ZLib is
|
||||
|
||||
loop
|
||||
Translate
|
||||
(Filter => Filter,
|
||||
(Filter => Filter,
|
||||
In_Data => Item (In_First .. Item'Last),
|
||||
In_Last => In_Last,
|
||||
Out_Data => Buffer,
|
||||
|
@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- ZLib for Ada thick binding. --
|
||||
-- --
|
||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
||||
-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
|
||||
-- --
|
||||
-- This library is free software; you can redistribute it and/or modify --
|
||||
-- it under the terms of the GNU General Public License as published by --
|
||||
@ -25,7 +25,7 @@
|
||||
-- covered by the GNU Public License. --
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
-- $Id: zlib.ads,v 1.17 2003/08/12 13:19:07 vagul Exp $
|
||||
-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $
|
||||
|
||||
with Ada.Streams;
|
||||
|
||||
@ -33,7 +33,8 @@ with Interfaces;
|
||||
|
||||
package ZLib is
|
||||
|
||||
ZLib_Error : exception;
|
||||
ZLib_Error : exception;
|
||||
Status_Error : exception;
|
||||
|
||||
type Compression_Level is new Integer range -1 .. 9;
|
||||
|
||||
@ -55,12 +56,15 @@ package ZLib is
|
||||
|
||||
subtype Count is Ada.Streams.Stream_Element_Count;
|
||||
|
||||
Default_Memory_Level : constant Memory_Level_Type := 8;
|
||||
Default_Window_Bits : constant Window_Bits_Type := 15;
|
||||
|
||||
----------------------------------
|
||||
-- Compression method constants --
|
||||
----------------------------------
|
||||
|
||||
Deflated : constant Compression_Method;
|
||||
-- Only one method allowed in this ZLib version.
|
||||
-- Only one method allowed in this ZLib version
|
||||
|
||||
---------------------------------
|
||||
-- Compression level constants --
|
||||
@ -79,21 +83,29 @@ package ZLib is
|
||||
-- Regular way for compression, no flush
|
||||
|
||||
Partial_Flush : constant Flush_Mode;
|
||||
-- will be removed, use Z_SYNC_FLUSH instead
|
||||
-- Will be removed, use Z_SYNC_FLUSH instead
|
||||
|
||||
Sync_Flush : constant Flush_Mode;
|
||||
-- all pending output is flushed to the output buffer and the output
|
||||
-- All pending output is flushed to the output buffer and the output
|
||||
-- is aligned on a byte boundary, so that the decompressor can get all
|
||||
-- input data available so far. (In particular avail_in is zero after the
|
||||
-- call if enough output space has been provided before the call.)
|
||||
-- Flushing may degrade compression for some compression algorithms and so
|
||||
-- it should be used only when necessary.
|
||||
|
||||
Block_Flush : constant Flush_Mode;
|
||||
-- Z_BLOCK requests that inflate() stop
|
||||
-- if and when it get to the next deflate block boundary. When decoding the
|
||||
-- zlib or gzip format, this will cause inflate() to return immediately
|
||||
-- after the header and before the first block. When doing a raw inflate,
|
||||
-- inflate() will go ahead and process the first block, and will return
|
||||
-- when it gets to the end of that block, or when it runs out of data.
|
||||
|
||||
Full_Flush : constant Flush_Mode;
|
||||
-- all output is flushed as with SYNC_FLUSH, and the compression state
|
||||
-- All output is flushed as with SYNC_FLUSH, and the compression state
|
||||
-- is reset so that decompression can restart from this point if previous
|
||||
-- compressed data has been damaged or if random access is desired. Using
|
||||
-- FULL_FLUSH too often can seriously degrade the compression.
|
||||
-- Full_Flush too often can seriously degrade the compression.
|
||||
|
||||
Finish : constant Flush_Mode;
|
||||
-- Just for tell the compressor that input data is complete.
|
||||
@ -111,7 +123,7 @@ package ZLib is
|
||||
|
||||
Default_Buffer_Size : constant := 4096;
|
||||
|
||||
type Filter_Type is limited private;
|
||||
type Filter_Type is tagged limited private;
|
||||
-- The filter is for compression and for decompression.
|
||||
-- The usage of the type is depend of its initialization.
|
||||
|
||||
@ -124,8 +136,8 @@ package ZLib is
|
||||
Level : in Compression_Level := Default_Compression;
|
||||
Strategy : in Strategy_Type := Default_Strategy;
|
||||
Method : in Compression_Method := Deflated;
|
||||
Window_Bits : in Window_Bits_Type := 15;
|
||||
Memory_Level : in Memory_Level_Type := 8;
|
||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
||||
Memory_Level : in Memory_Level_Type := Default_Memory_Level;
|
||||
Header : in Header_Type := Default);
|
||||
-- Compressor initialization.
|
||||
-- When Header parameter is Auto or Default, then default zlib header
|
||||
@ -136,7 +148,7 @@ package ZLib is
|
||||
|
||||
procedure Inflate_Init
|
||||
(Filter : in out Filter_Type;
|
||||
Window_Bits : in Window_Bits_Type := 15;
|
||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
||||
Header : in Header_Type := Default);
|
||||
-- Decompressor initialization.
|
||||
-- Default header type mean that ZLib default header is expecting in the
|
||||
@ -146,10 +158,14 @@ package ZLib is
|
||||
-- input compressed stream.
|
||||
-- Auto header type mean that header type (GZip or Native) would be
|
||||
-- detected automatically in the input stream.
|
||||
-- Note that header types parameter values None, GZip and Auto is
|
||||
-- supporting for inflate routine only in ZLib versions 1.2.0.2 and later.
|
||||
-- Note that header types parameter values None, GZip and Auto are
|
||||
-- supported for inflate routine only in ZLib versions 1.2.0.2 and later.
|
||||
-- Deflate_Init is supporting all header types.
|
||||
|
||||
function Is_Open (Filter : in Filter_Type) return Boolean;
|
||||
pragma Inline (Is_Open);
|
||||
-- Is the filter opened for compression or decompression.
|
||||
|
||||
procedure Close
|
||||
(Filter : in out Filter_Type;
|
||||
Ignore_Error : in Boolean := False);
|
||||
@ -167,31 +183,31 @@ package ZLib is
|
||||
(Filter : in out Filter_Type;
|
||||
In_Buffer_Size : in Integer := Default_Buffer_Size;
|
||||
Out_Buffer_Size : in Integer := Default_Buffer_Size);
|
||||
-- Compressing/decompressing data arrived from Data_In routine
|
||||
-- Compress/decompress data fetch from Data_In routine and pass the result
|
||||
-- to the Data_Out routine. User should provide Data_In and Data_Out
|
||||
-- for compression/decompression data flow.
|
||||
-- Compression or decompression depend on initialization of Filter.
|
||||
-- Compression or decompression depend on Filter initialization.
|
||||
|
||||
function Total_In (Filter : in Filter_Type) return Count;
|
||||
pragma Inline (Total_In);
|
||||
-- Return total number of input bytes read so far.
|
||||
-- Returns total number of input bytes read so far
|
||||
|
||||
function Total_Out (Filter : in Filter_Type) return Count;
|
||||
pragma Inline (Total_Out);
|
||||
-- Return total number of bytes output so far.
|
||||
-- Returns total number of bytes output so far
|
||||
|
||||
function CRC32
|
||||
(CRC : in Unsigned_32;
|
||||
Data : in Ada.Streams.Stream_Element_Array)
|
||||
return Unsigned_32;
|
||||
pragma Inline (CRC32);
|
||||
-- Calculate CRC32, it could be necessary for make gzip format.
|
||||
-- Compute CRC32, it could be necessary for make gzip format
|
||||
|
||||
procedure CRC32
|
||||
(CRC : in out Unsigned_32;
|
||||
Data : in Ada.Streams.Stream_Element_Array);
|
||||
pragma Inline (CRC32);
|
||||
-- Calculate CRC32, it could be necessary for make gzip format.
|
||||
-- Compute CRC32, it could be necessary for make gzip format
|
||||
|
||||
-------------------------------------------------
|
||||
-- Below is more complex low level routines. --
|
||||
@ -204,15 +220,11 @@ package ZLib is
|
||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
||||
Flush : in Flush_Mode);
|
||||
-- Compressing/decompressing the datas from In_Data buffer to the
|
||||
-- Out_Data buffer.
|
||||
-- In_Data is incoming data portion,
|
||||
-- In_Last is the index of last element from In_Data accepted by the
|
||||
-- Filter.
|
||||
-- Out_Data is the buffer for output data from the filter.
|
||||
-- Out_Last is the last element of the received data from Filter.
|
||||
-- To tell the filter that incoming data is complete put the
|
||||
-- Flush parameter to FINISH.
|
||||
-- Compress/decompress the In_Data buffer and place the result into
|
||||
-- Out_Data. In_Last is the index of last element from In_Data accepted by
|
||||
-- the Filter. Out_Last is the last element of the received data from
|
||||
-- Filter. To tell the filter that incoming data are complete put the
|
||||
-- Flush parameter to Finish.
|
||||
|
||||
function Stream_End (Filter : in Filter_Type) return Boolean;
|
||||
pragma Inline (Stream_End);
|
||||
@ -239,10 +251,9 @@ package ZLib is
|
||||
procedure Write
|
||||
(Filter : in out Filter_Type;
|
||||
Item : in Ada.Streams.Stream_Element_Array;
|
||||
Flush : in Flush_Mode);
|
||||
-- Compressing/Decompressing data from Item to the
|
||||
-- generic parameter procedure Write.
|
||||
-- Output buffer size could be set in Buffer_Size generic parameter.
|
||||
Flush : in Flush_Mode := No_Flush);
|
||||
-- Compress/Decompress data from Item to the generic parameter procedure
|
||||
-- Write. Output buffer size could be set in Buffer_Size generic parameter.
|
||||
|
||||
generic
|
||||
with procedure Read
|
||||
@ -257,33 +268,41 @@ package ZLib is
|
||||
|
||||
Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset;
|
||||
-- Rest_First have to be initialized to Buffer'Last + 1
|
||||
-- Rest_Last have to be initialized to Buffer'Last
|
||||
-- before usage.
|
||||
|
||||
Allow_Read_Some : in Boolean := False;
|
||||
-- Is it allowed to return Last < Item'Last before end of data.
|
||||
|
||||
procedure Read
|
||||
(Filter : in out Filter_Type;
|
||||
Item : out Ada.Streams.Stream_Element_Array;
|
||||
Last : out Ada.Streams.Stream_Element_Offset);
|
||||
-- Compressing/Decompressing data from generic parameter
|
||||
-- procedure Read to the Item.
|
||||
-- User should provide Buffer for the operation
|
||||
-- and Rest_First variable first time initialized to the Buffer'Last + 1.
|
||||
Last : out Ada.Streams.Stream_Element_Offset;
|
||||
Flush : in Flush_Mode := No_Flush);
|
||||
-- Compress/Decompress data from generic parameter procedure Read to the
|
||||
-- Item. User should provide Buffer and initialized Rest_First, Rest_Last
|
||||
-- indicators. If Allow_Read_Some is True, Read routines could return
|
||||
-- Last < Item'Last only at end of stream.
|
||||
|
||||
private
|
||||
|
||||
use Ada.Streams;
|
||||
|
||||
type Flush_Mode is new Integer range 0 .. 4;
|
||||
pragma Assert (Ada.Streams.Stream_Element'Size = 8);
|
||||
pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8);
|
||||
|
||||
type Flush_Mode is new Integer range 0 .. 5;
|
||||
|
||||
type Compression_Method is new Integer range 8 .. 8;
|
||||
|
||||
type Strategy_Type is new Integer range 0 .. 3;
|
||||
|
||||
No_Flush : constant Flush_Mode := 0;
|
||||
Partial_Flush : constant Flush_Mode := 1;
|
||||
Sync_Flush : constant Flush_Mode := 2;
|
||||
Full_Flush : constant Flush_Mode := 3;
|
||||
Finish : constant Flush_Mode := 4;
|
||||
Partial_Flush : constant Flush_Mode := 1;
|
||||
-- will be removed, use Z_SYNC_FLUSH instead
|
||||
Block_Flush : constant Flush_Mode := 5;
|
||||
|
||||
Filtered : constant Strategy_Type := 1;
|
||||
Huffman_Only : constant Strategy_Type := 2;
|
||||
@ -296,7 +315,7 @@ private
|
||||
|
||||
type Z_Stream_Access is access all Z_Stream;
|
||||
|
||||
type Filter_Type is record
|
||||
type Filter_Type is tagged limited record
|
||||
Strm : Z_Stream_Access;
|
||||
Compression : Boolean;
|
||||
Stream_End : Boolean;
|
||||
@ -304,8 +323,6 @@ private
|
||||
CRC : Unsigned_32;
|
||||
Offset : Stream_Element_Offset;
|
||||
-- Offset for gzip header/footer output.
|
||||
|
||||
Opened : Boolean := False;
|
||||
end record;
|
||||
|
||||
end ZLib;
|
||||
|
@ -3,10 +3,10 @@ project Zlib is
|
||||
for Languages use ("Ada");
|
||||
for Source_Dirs use (".");
|
||||
for Object_Dir use ".";
|
||||
for Main use ("test.adb", "mtest.adb", "read.adb");
|
||||
for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo");
|
||||
|
||||
package Compiler is
|
||||
for Default_Switches ("ada") use ("-gnatwbcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
|
||||
for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
|
||||
end Compiler;
|
||||
|
||||
package Linker is
|
||||
@ -18,4 +18,3 @@ project Zlib is
|
||||
end Builder;
|
||||
|
||||
end Zlib;
|
||||
|
||||
|
@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
|
||||
const OutBuf: Pointer; BufSize: Integer);
|
||||
|
||||
const
|
||||
zlib_version = '1.2.1';
|
||||
zlib_version = '1.2.3';
|
||||
|
||||
type
|
||||
EZlibError = class(Exception);
|
||||
@ -344,7 +344,7 @@ begin
|
||||
strm.avail_out := OutBytes;
|
||||
DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
|
||||
try
|
||||
while DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END do
|
||||
while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do
|
||||
begin
|
||||
P := OutBuf;
|
||||
Inc(OutBytes, BufInc);
|
||||
@ -510,7 +510,7 @@ begin
|
||||
Result := Count - FZRec.avail_out;
|
||||
Exit;
|
||||
end;
|
||||
FZRec.next_in := FBuffer;
|
||||
FZRec.next_in := FBuffer;
|
||||
FStrmPos := FStrm.Position;
|
||||
Progress(Self);
|
||||
end;
|
||||
|
@ -430,6 +430,9 @@ void FAR *out_desc;
|
||||
}
|
||||
}
|
||||
|
||||
/* handle error breaks in while */
|
||||
if (mode == BAD) break;
|
||||
|
||||
/* build code tables */
|
||||
state->next = state->codes;
|
||||
lencode = (code const FAR *)(state->next);
|
||||
|
@ -16,6 +16,10 @@
|
||||
* zlib.h must be included before this header file.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm,
|
||||
in_func in, void FAR *in_desc,
|
||||
out_func out, void FAR *out_desc));
|
||||
@ -27,3 +31,7 @@ ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm,
|
||||
#define inflateBack9Init(strm, window) \
|
||||
inflateBack9Init_((strm), (window), \
|
||||
ZLIB_VERSION, sizeof(z_stream))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* inftree9.c -- generate Huffman trees for efficient decoding
|
||||
* Copyright (C) 1995-2003 Mark Adler
|
||||
* Copyright (C) 1995-2005 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
#define MAXBITS 15
|
||||
|
||||
const char inflate9_copyright[] =
|
||||
" inflate9 1.2.1 Copyright 1995-2003 Mark Adler ";
|
||||
" inflate9 1.2.3 Copyright 1995-2005 Mark Adler ";
|
||||
/*
|
||||
If you use the zlib library in a product, an acknowledgment is welcome
|
||||
in the documentation of your product. If for some reason you cannot
|
||||
@ -64,7 +64,7 @@ unsigned short FAR *work;
|
||||
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
||||
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
|
||||
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
|
||||
133, 133, 133, 133, 144, 76, 66};
|
||||
133, 133, 133, 133, 144, 201, 196};
|
||||
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
|
||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
|
||||
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
|
||||
@ -128,7 +128,7 @@ unsigned short FAR *work;
|
||||
left -= count[len];
|
||||
if (left < 0) return -1; /* over-subscribed */
|
||||
}
|
||||
if (left > 0 && (type == CODES || (codes - count[0] != 1)))
|
||||
if (left > 0 && (type == CODES || max != 1))
|
||||
return -1; /* incomplete set */
|
||||
|
||||
/* generate offsets into symbol table for each length for sorting */
|
||||
|
@ -36,12 +36,12 @@ typedef struct {
|
||||
*/
|
||||
|
||||
/* Maximum size of dynamic tree. The maximum found in a long but non-
|
||||
exhaustive search was 1004 code structures (850 for length/literals
|
||||
and 154 for distances, the latter actually the result of an
|
||||
exhaustive search was 1444 code structures (852 for length/literals
|
||||
and 592 for distances, the latter actually the result of an
|
||||
exhaustive search). The true maximum is not known, but the value
|
||||
below is more than safe. */
|
||||
#define ENOUGH 1440
|
||||
#define MAXD 154
|
||||
#define ENOUGH 2048
|
||||
#define MAXD 592
|
||||
|
||||
/* Type of code to build for inftable() */
|
||||
typedef enum {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -188,17 +188,8 @@
|
||||
/*
|
||||
* typedef enum inflate_mode consts, in inflate.h
|
||||
*/
|
||||
#ifndef NO_GUNZIP
|
||||
#define GUNZIP
|
||||
#endif
|
||||
|
||||
#ifdef GUNZIP
|
||||
#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */
|
||||
#define INFLATE_MODE_BAD 26
|
||||
#else
|
||||
#define INFLATE_MODE_TYPE 3
|
||||
#define INFLATE_MODE_BAD 17
|
||||
#endif
|
||||
|
||||
|
||||
#if ! defined( USE_MMX ) && ! defined( NO_MMX )
|
||||
|
@ -1,408 +1,413 @@
|
||||
|
||||
; match.asm -- Pentium-Pro optimized version of longest_match()
|
||||
;
|
||||
; Updated for zlib 1.1.3 and converted to MASM 6.1x
|
||||
; Copyright (C) 2000 Dan Higdon <hdan@kinesoft.com>
|
||||
; and Chuck Walbourn <chuckw@kinesoft.com>
|
||||
; Corrections by Cosmin Truta <cosmint@cs.ubbcluj.ro>
|
||||
;
|
||||
; This is free software; you can redistribute it and/or modify it
|
||||
; under the terms of the GNU General Public License.
|
||||
|
||||
; Based on match.S
|
||||
; Written for zlib 1.1.2
|
||||
; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
|
||||
|
||||
.686P
|
||||
.MODEL FLAT
|
||||
|
||||
;===========================================================================
|
||||
; EQUATES
|
||||
;===========================================================================
|
||||
|
||||
MAX_MATCH EQU 258
|
||||
MIN_MATCH EQU 3
|
||||
MIN_LOOKAHEAD EQU (MAX_MATCH + MIN_MATCH + 1)
|
||||
MAX_MATCH_8 EQU ((MAX_MATCH + 7) AND (NOT 7))
|
||||
|
||||
;===========================================================================
|
||||
; STRUCTURES
|
||||
;===========================================================================
|
||||
|
||||
; This STRUCT assumes a 4-byte alignment
|
||||
|
||||
DEFLATE_STATE STRUCT
|
||||
ds_strm dd ?
|
||||
ds_status dd ?
|
||||
ds_pending_buf dd ?
|
||||
ds_pending_buf_size dd ?
|
||||
ds_pending_out dd ?
|
||||
ds_pending dd ?
|
||||
ds_wrap dd ?
|
||||
ds_data_type db ?
|
||||
ds_method db ?
|
||||
db ? ; padding
|
||||
db ? ; padding
|
||||
ds_last_flush dd ?
|
||||
ds_w_size dd ? ; used
|
||||
ds_w_bits dd ?
|
||||
ds_w_mask dd ? ; used
|
||||
ds_window dd ? ; used
|
||||
ds_window_size dd ?
|
||||
ds_prev dd ? ; used
|
||||
ds_head dd ?
|
||||
ds_ins_h dd ?
|
||||
ds_hash_size dd ?
|
||||
ds_hash_bits dd ?
|
||||
ds_hash_mask dd ?
|
||||
ds_hash_shift dd ?
|
||||
ds_block_start dd ?
|
||||
ds_match_length dd ? ; used
|
||||
ds_prev_match dd ? ; used
|
||||
ds_match_available dd ?
|
||||
ds_strstart dd ? ; used
|
||||
ds_match_start dd ? ; used
|
||||
ds_lookahead dd ? ; used
|
||||
ds_prev_length dd ? ; used
|
||||
ds_max_chain_length dd ? ; used
|
||||
ds_max_laxy_match dd ?
|
||||
ds_level dd ?
|
||||
ds_strategy dd ?
|
||||
ds_good_match dd ? ; used
|
||||
ds_nice_match dd ? ; used
|
||||
|
||||
; Don't need anymore of the struct for match
|
||||
DEFLATE_STATE ENDS
|
||||
|
||||
;===========================================================================
|
||||
; CODE
|
||||
;===========================================================================
|
||||
_TEXT SEGMENT
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
; match_init
|
||||
;---------------------------------------------------------------------------
|
||||
ALIGN 4
|
||||
PUBLIC _match_init
|
||||
_match_init PROC
|
||||
; no initialization needed
|
||||
ret
|
||||
_match_init ENDP
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
|
||||
;---------------------------------------------------------------------------
|
||||
ALIGN 4
|
||||
|
||||
PUBLIC _longest_match
|
||||
_longest_match PROC
|
||||
|
||||
; Since this code uses EBP for a scratch register, the stack frame must
|
||||
; be manually constructed and referenced relative to the ESP register.
|
||||
|
||||
; Stack image
|
||||
; Variables
|
||||
chainlenwmask = 0 ; high word: current chain len
|
||||
; low word: s->wmask
|
||||
window = 4 ; local copy of s->window
|
||||
windowbestlen = 8 ; s->window + bestlen
|
||||
scanend = 12 ; last two bytes of string
|
||||
scanstart = 16 ; first two bytes of string
|
||||
scanalign = 20 ; dword-misalignment of string
|
||||
nicematch = 24 ; a good enough match size
|
||||
bestlen = 28 ; size of best match so far
|
||||
scan = 32 ; ptr to string wanting match
|
||||
varsize = 36 ; number of bytes (also offset to last saved register)
|
||||
|
||||
; Saved Registers (actually pushed into place)
|
||||
ebx_save = 36
|
||||
edi_save = 40
|
||||
esi_save = 44
|
||||
ebp_save = 48
|
||||
|
||||
; Parameters
|
||||
retaddr = 52
|
||||
deflatestate = 56
|
||||
curmatch = 60
|
||||
|
||||
; Save registers that the compiler may be using
|
||||
push ebp
|
||||
push edi
|
||||
push esi
|
||||
push ebx
|
||||
|
||||
; Allocate local variable space
|
||||
sub esp,varsize
|
||||
|
||||
; Retrieve the function arguments. ecx will hold cur_match
|
||||
; throughout the entire function. edx will hold the pointer to the
|
||||
; deflate_state structure during the function's setup (before
|
||||
; entering the main loop).
|
||||
|
||||
mov edx, [esp+deflatestate]
|
||||
ASSUME edx:PTR DEFLATE_STATE
|
||||
|
||||
mov ecx, [esp+curmatch]
|
||||
|
||||
; uInt wmask = s->w_mask;
|
||||
; unsigned chain_length = s->max_chain_length;
|
||||
; if (s->prev_length >= s->good_match) {
|
||||
; chain_length >>= 2;
|
||||
; }
|
||||
|
||||
mov eax, [edx].ds_prev_length
|
||||
mov ebx, [edx].ds_good_match
|
||||
cmp eax, ebx
|
||||
mov eax, [edx].ds_w_mask
|
||||
mov ebx, [edx].ds_max_chain_length
|
||||
jl SHORT LastMatchGood
|
||||
shr ebx, 2
|
||||
LastMatchGood:
|
||||
|
||||
; chainlen is decremented once beforehand so that the function can
|
||||
; use the sign flag instead of the zero flag for the exit test.
|
||||
; It is then shifted into the high word, to make room for the wmask
|
||||
; value, which it will always accompany.
|
||||
|
||||
dec ebx
|
||||
shl ebx, 16
|
||||
or ebx, eax
|
||||
mov [esp+chainlenwmask], ebx
|
||||
|
||||
; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
|
||||
|
||||
mov eax, [edx].ds_nice_match
|
||||
mov ebx, [edx].ds_lookahead
|
||||
cmp ebx, eax
|
||||
jl SHORT LookaheadLess
|
||||
mov ebx, eax
|
||||
LookaheadLess:
|
||||
mov [esp+nicematch], ebx
|
||||
|
||||
;/* register Bytef *scan = s->window + s->strstart; */
|
||||
|
||||
mov esi, [edx].ds_window
|
||||
mov [esp+window], esi
|
||||
mov ebp, [edx].ds_strstart
|
||||
lea edi, [esi+ebp]
|
||||
mov [esp+scan],edi
|
||||
|
||||
;/* Determine how many bytes the scan ptr is off from being */
|
||||
;/* dword-aligned. */
|
||||
|
||||
mov eax, edi
|
||||
neg eax
|
||||
and eax, 3
|
||||
mov [esp+scanalign], eax
|
||||
|
||||
;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
|
||||
;/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
|
||||
|
||||
mov eax, [edx].ds_w_size
|
||||
sub eax, MIN_LOOKAHEAD
|
||||
sub ebp, eax
|
||||
jg SHORT LimitPositive
|
||||
xor ebp, ebp
|
||||
LimitPositive:
|
||||
|
||||
;/* int best_len = s->prev_length; */
|
||||
|
||||
mov eax, [edx].ds_prev_length
|
||||
mov [esp+bestlen], eax
|
||||
|
||||
;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
|
||||
|
||||
add esi, eax
|
||||
mov [esp+windowbestlen], esi
|
||||
|
||||
;/* register ush scan_start = *(ushf*)scan; */
|
||||
;/* register ush scan_end = *(ushf*)(scan+best_len-1); */
|
||||
;/* Posf *prev = s->prev; */
|
||||
|
||||
movzx ebx, WORD PTR[edi]
|
||||
mov [esp+scanstart], ebx
|
||||
movzx ebx, WORD PTR[eax+edi-1]
|
||||
mov [esp+scanend], ebx
|
||||
mov edi, [edx].ds_prev
|
||||
|
||||
;/* Jump into the main loop. */
|
||||
|
||||
mov edx, [esp+chainlenwmask]
|
||||
jmp SHORT LoopEntry
|
||||
|
||||
;/* do {
|
||||
; * match = s->window + cur_match;
|
||||
; * if (*(ushf*)(match+best_len-1) != scan_end ||
|
||||
; * *(ushf*)match != scan_start) continue;
|
||||
; * [...]
|
||||
; * } while ((cur_match = prev[cur_match & wmask]) > limit
|
||||
; * && --chain_length != 0);
|
||||
; *
|
||||
; * Here is the inner loop of the function. The function will spend the
|
||||
; * majority of its time in this loop, and majority of that time will
|
||||
; * be spent in the first ten instructions.
|
||||
; *
|
||||
; * Within this loop:
|
||||
; * %ebx = scanend
|
||||
; * %ecx = curmatch
|
||||
; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
|
||||
; * %esi = windowbestlen - i.e., (window + bestlen)
|
||||
; * %edi = prev
|
||||
; * %ebp = limit
|
||||
; */
|
||||
|
||||
ALIGN 4
|
||||
LookupLoop:
|
||||
and ecx, edx
|
||||
movzx ecx, WORD PTR[edi+ecx*2]
|
||||
cmp ecx, ebp
|
||||
jbe LeaveNow
|
||||
sub edx, 000010000H
|
||||
js LeaveNow
|
||||
|
||||
LoopEntry:
|
||||
movzx eax, WORD PTR[esi+ecx-1]
|
||||
cmp eax, ebx
|
||||
jnz SHORT LookupLoop
|
||||
|
||||
mov eax, [esp+window]
|
||||
movzx eax, WORD PTR[eax+ecx]
|
||||
cmp eax, [esp+scanstart]
|
||||
jnz SHORT LookupLoop
|
||||
|
||||
;/* Store the current value of chainlen. */
|
||||
|
||||
mov [esp+chainlenwmask], edx
|
||||
|
||||
;/* Point %edi to the string under scrutiny, and %esi to the string we */
|
||||
;/* are hoping to match it up with. In actuality, %esi and %edi are */
|
||||
;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
|
||||
;/* initialized to -(MAX_MATCH_8 - scanalign). */
|
||||
|
||||
mov esi, [esp+window]
|
||||
mov edi, [esp+scan]
|
||||
add esi, ecx
|
||||
mov eax, [esp+scanalign]
|
||||
mov edx, -MAX_MATCH_8
|
||||
lea edi, [edi+eax+MAX_MATCH_8]
|
||||
lea esi, [esi+eax+MAX_MATCH_8]
|
||||
|
||||
;/* Test the strings for equality, 8 bytes at a time. At the end,
|
||||
; * adjust %edx so that it is offset to the exact byte that mismatched.
|
||||
; *
|
||||
; * We already know at this point that the first three bytes of the
|
||||
; * strings match each other, and they can be safely passed over before
|
||||
; * starting the compare loop. So what this code does is skip over 0-3
|
||||
; * bytes, as much as necessary in order to dword-align the %edi
|
||||
; * pointer. (%esi will still be misaligned three times out of four.)
|
||||
; *
|
||||
; * It should be confessed that this loop usually does not represent
|
||||
; * much of the total running time. Replacing it with a more
|
||||
; * straightforward "rep cmpsb" would not drastically degrade
|
||||
; * performance.
|
||||
; */
|
||||
|
||||
LoopCmps:
|
||||
mov eax, DWORD PTR[esi+edx]
|
||||
xor eax, DWORD PTR[edi+edx]
|
||||
jnz SHORT LeaveLoopCmps
|
||||
|
||||
mov eax, DWORD PTR[esi+edx+4]
|
||||
xor eax, DWORD PTR[edi+edx+4]
|
||||
jnz SHORT LeaveLoopCmps4
|
||||
|
||||
add edx, 8
|
||||
jnz SHORT LoopCmps
|
||||
jmp LenMaximum
|
||||
ALIGN 4
|
||||
|
||||
LeaveLoopCmps4:
|
||||
add edx, 4
|
||||
|
||||
LeaveLoopCmps:
|
||||
test eax, 00000FFFFH
|
||||
jnz SHORT LenLower
|
||||
|
||||
add edx, 2
|
||||
shr eax, 16
|
||||
|
||||
LenLower:
|
||||
sub al, 1
|
||||
adc edx, 0
|
||||
|
||||
;/* Calculate the length of the match. If it is longer than MAX_MATCH, */
|
||||
;/* then automatically accept it as the best possible match and leave. */
|
||||
|
||||
lea eax, [edi+edx]
|
||||
mov edi, [esp+scan]
|
||||
sub eax, edi
|
||||
cmp eax, MAX_MATCH
|
||||
jge SHORT LenMaximum
|
||||
|
||||
;/* If the length of the match is not longer than the best match we */
|
||||
;/* have so far, then forget it and return to the lookup loop. */
|
||||
|
||||
mov edx, [esp+deflatestate]
|
||||
mov ebx, [esp+bestlen]
|
||||
cmp eax, ebx
|
||||
jg SHORT LongerMatch
|
||||
mov esi, [esp+windowbestlen]
|
||||
mov edi, [edx].ds_prev
|
||||
mov ebx, [esp+scanend]
|
||||
mov edx, [esp+chainlenwmask]
|
||||
jmp LookupLoop
|
||||
ALIGN 4
|
||||
|
||||
;/* s->match_start = cur_match; */
|
||||
;/* best_len = len; */
|
||||
;/* if (len >= nice_match) break; */
|
||||
;/* scan_end = *(ushf*)(scan+best_len-1); */
|
||||
|
||||
LongerMatch:
|
||||
mov ebx, [esp+nicematch]
|
||||
mov [esp+bestlen], eax
|
||||
mov [edx].ds_match_start, ecx
|
||||
cmp eax, ebx
|
||||
jge SHORT LeaveNow
|
||||
mov esi, [esp+window]
|
||||
add esi, eax
|
||||
mov [esp+windowbestlen], esi
|
||||
movzx ebx, WORD PTR[edi+eax-1]
|
||||
mov edi, [edx].ds_prev
|
||||
mov [esp+scanend], ebx
|
||||
mov edx, [esp+chainlenwmask]
|
||||
jmp LookupLoop
|
||||
ALIGN 4
|
||||
|
||||
;/* Accept the current string, with the maximum possible length. */
|
||||
|
||||
LenMaximum:
|
||||
mov edx, [esp+deflatestate]
|
||||
mov DWORD PTR[esp+bestlen], MAX_MATCH
|
||||
mov [edx].ds_match_start, ecx
|
||||
|
||||
;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
|
||||
;/* return s->lookahead; */
|
||||
|
||||
LeaveNow:
|
||||
mov edx, [esp+deflatestate]
|
||||
mov ebx, [esp+bestlen]
|
||||
mov eax, [edx].ds_lookahead
|
||||
cmp ebx, eax
|
||||
jg SHORT LookaheadRet
|
||||
mov eax, ebx
|
||||
LookaheadRet:
|
||||
|
||||
; Restore the stack and return from whence we came.
|
||||
|
||||
add esp, varsize
|
||||
pop ebx
|
||||
pop esi
|
||||
pop edi
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
_longest_match ENDP
|
||||
|
||||
_TEXT ENDS
|
||||
END
|
||||
|
||||
; match.asm -- Pentium-Pro optimized version of longest_match()
|
||||
;
|
||||
; Updated for zlib 1.1.3 and converted to MASM 6.1x
|
||||
; Copyright (C) 2000 Dan Higdon <hdan@kinesoft.com>
|
||||
; and Chuck Walbourn <chuckw@kinesoft.com>
|
||||
; Corrections by Cosmin Truta <cosmint@cs.ubbcluj.ro>
|
||||
;
|
||||
; This is free software; you can redistribute it and/or modify it
|
||||
; under the terms of the GNU General Public License.
|
||||
|
||||
; Based on match.S
|
||||
; Written for zlib 1.1.2
|
||||
; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
|
||||
;
|
||||
; Modified by Gilles Vollant (2005) for add gzhead and gzindex
|
||||
|
||||
.686P
|
||||
.MODEL FLAT
|
||||
|
||||
;===========================================================================
|
||||
; EQUATES
|
||||
;===========================================================================
|
||||
|
||||
MAX_MATCH EQU 258
|
||||
MIN_MATCH EQU 3
|
||||
MIN_LOOKAHEAD EQU (MAX_MATCH + MIN_MATCH + 1)
|
||||
MAX_MATCH_8 EQU ((MAX_MATCH + 7) AND (NOT 7))
|
||||
|
||||
;===========================================================================
|
||||
; STRUCTURES
|
||||
;===========================================================================
|
||||
|
||||
; This STRUCT assumes a 4-byte alignment
|
||||
|
||||
DEFLATE_STATE STRUCT
|
||||
ds_strm dd ?
|
||||
ds_status dd ?
|
||||
ds_pending_buf dd ?
|
||||
ds_pending_buf_size dd ?
|
||||
ds_pending_out dd ?
|
||||
ds_pending dd ?
|
||||
ds_wrap dd ?
|
||||
; gzhead and gzindex are added in zlib 1.2.2.2 (see deflate.h)
|
||||
ds_gzhead dd ?
|
||||
ds_gzindex dd ?
|
||||
ds_data_type db ?
|
||||
ds_method db ?
|
||||
db ? ; padding
|
||||
db ? ; padding
|
||||
ds_last_flush dd ?
|
||||
ds_w_size dd ? ; used
|
||||
ds_w_bits dd ?
|
||||
ds_w_mask dd ? ; used
|
||||
ds_window dd ? ; used
|
||||
ds_window_size dd ?
|
||||
ds_prev dd ? ; used
|
||||
ds_head dd ?
|
||||
ds_ins_h dd ?
|
||||
ds_hash_size dd ?
|
||||
ds_hash_bits dd ?
|
||||
ds_hash_mask dd ?
|
||||
ds_hash_shift dd ?
|
||||
ds_block_start dd ?
|
||||
ds_match_length dd ? ; used
|
||||
ds_prev_match dd ? ; used
|
||||
ds_match_available dd ?
|
||||
ds_strstart dd ? ; used
|
||||
ds_match_start dd ? ; used
|
||||
ds_lookahead dd ? ; used
|
||||
ds_prev_length dd ? ; used
|
||||
ds_max_chain_length dd ? ; used
|
||||
ds_max_laxy_match dd ?
|
||||
ds_level dd ?
|
||||
ds_strategy dd ?
|
||||
ds_good_match dd ? ; used
|
||||
ds_nice_match dd ? ; used
|
||||
|
||||
; Don't need anymore of the struct for match
|
||||
DEFLATE_STATE ENDS
|
||||
|
||||
;===========================================================================
|
||||
; CODE
|
||||
;===========================================================================
|
||||
_TEXT SEGMENT
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
; match_init
|
||||
;---------------------------------------------------------------------------
|
||||
ALIGN 4
|
||||
PUBLIC _match_init
|
||||
_match_init PROC
|
||||
; no initialization needed
|
||||
ret
|
||||
_match_init ENDP
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
|
||||
;---------------------------------------------------------------------------
|
||||
ALIGN 4
|
||||
|
||||
PUBLIC _longest_match
|
||||
_longest_match PROC
|
||||
|
||||
; Since this code uses EBP for a scratch register, the stack frame must
|
||||
; be manually constructed and referenced relative to the ESP register.
|
||||
|
||||
; Stack image
|
||||
; Variables
|
||||
chainlenwmask = 0 ; high word: current chain len
|
||||
; low word: s->wmask
|
||||
window = 4 ; local copy of s->window
|
||||
windowbestlen = 8 ; s->window + bestlen
|
||||
scanend = 12 ; last two bytes of string
|
||||
scanstart = 16 ; first two bytes of string
|
||||
scanalign = 20 ; dword-misalignment of string
|
||||
nicematch = 24 ; a good enough match size
|
||||
bestlen = 28 ; size of best match so far
|
||||
scan = 32 ; ptr to string wanting match
|
||||
varsize = 36 ; number of bytes (also offset to last saved register)
|
||||
|
||||
; Saved Registers (actually pushed into place)
|
||||
ebx_save = 36
|
||||
edi_save = 40
|
||||
esi_save = 44
|
||||
ebp_save = 48
|
||||
|
||||
; Parameters
|
||||
retaddr = 52
|
||||
deflatestate = 56
|
||||
curmatch = 60
|
||||
|
||||
; Save registers that the compiler may be using
|
||||
push ebp
|
||||
push edi
|
||||
push esi
|
||||
push ebx
|
||||
|
||||
; Allocate local variable space
|
||||
sub esp,varsize
|
||||
|
||||
; Retrieve the function arguments. ecx will hold cur_match
|
||||
; throughout the entire function. edx will hold the pointer to the
|
||||
; deflate_state structure during the function's setup (before
|
||||
; entering the main loop).
|
||||
|
||||
mov edx, [esp+deflatestate]
|
||||
ASSUME edx:PTR DEFLATE_STATE
|
||||
|
||||
mov ecx, [esp+curmatch]
|
||||
|
||||
; uInt wmask = s->w_mask;
|
||||
; unsigned chain_length = s->max_chain_length;
|
||||
; if (s->prev_length >= s->good_match) {
|
||||
; chain_length >>= 2;
|
||||
; }
|
||||
|
||||
mov eax, [edx].ds_prev_length
|
||||
mov ebx, [edx].ds_good_match
|
||||
cmp eax, ebx
|
||||
mov eax, [edx].ds_w_mask
|
||||
mov ebx, [edx].ds_max_chain_length
|
||||
jl SHORT LastMatchGood
|
||||
shr ebx, 2
|
||||
LastMatchGood:
|
||||
|
||||
; chainlen is decremented once beforehand so that the function can
|
||||
; use the sign flag instead of the zero flag for the exit test.
|
||||
; It is then shifted into the high word, to make room for the wmask
|
||||
; value, which it will always accompany.
|
||||
|
||||
dec ebx
|
||||
shl ebx, 16
|
||||
or ebx, eax
|
||||
mov [esp+chainlenwmask], ebx
|
||||
|
||||
; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
|
||||
|
||||
mov eax, [edx].ds_nice_match
|
||||
mov ebx, [edx].ds_lookahead
|
||||
cmp ebx, eax
|
||||
jl SHORT LookaheadLess
|
||||
mov ebx, eax
|
||||
LookaheadLess:
|
||||
mov [esp+nicematch], ebx
|
||||
|
||||
;/* register Bytef *scan = s->window + s->strstart; */
|
||||
|
||||
mov esi, [edx].ds_window
|
||||
mov [esp+window], esi
|
||||
mov ebp, [edx].ds_strstart
|
||||
lea edi, [esi+ebp]
|
||||
mov [esp+scan],edi
|
||||
|
||||
;/* Determine how many bytes the scan ptr is off from being */
|
||||
;/* dword-aligned. */
|
||||
|
||||
mov eax, edi
|
||||
neg eax
|
||||
and eax, 3
|
||||
mov [esp+scanalign], eax
|
||||
|
||||
;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
|
||||
;/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
|
||||
|
||||
mov eax, [edx].ds_w_size
|
||||
sub eax, MIN_LOOKAHEAD
|
||||
sub ebp, eax
|
||||
jg SHORT LimitPositive
|
||||
xor ebp, ebp
|
||||
LimitPositive:
|
||||
|
||||
;/* int best_len = s->prev_length; */
|
||||
|
||||
mov eax, [edx].ds_prev_length
|
||||
mov [esp+bestlen], eax
|
||||
|
||||
;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
|
||||
|
||||
add esi, eax
|
||||
mov [esp+windowbestlen], esi
|
||||
|
||||
;/* register ush scan_start = *(ushf*)scan; */
|
||||
;/* register ush scan_end = *(ushf*)(scan+best_len-1); */
|
||||
;/* Posf *prev = s->prev; */
|
||||
|
||||
movzx ebx, WORD PTR[edi]
|
||||
mov [esp+scanstart], ebx
|
||||
movzx ebx, WORD PTR[eax+edi-1]
|
||||
mov [esp+scanend], ebx
|
||||
mov edi, [edx].ds_prev
|
||||
|
||||
;/* Jump into the main loop. */
|
||||
|
||||
mov edx, [esp+chainlenwmask]
|
||||
jmp SHORT LoopEntry
|
||||
|
||||
;/* do {
|
||||
; * match = s->window + cur_match;
|
||||
; * if (*(ushf*)(match+best_len-1) != scan_end ||
|
||||
; * *(ushf*)match != scan_start) continue;
|
||||
; * [...]
|
||||
; * } while ((cur_match = prev[cur_match & wmask]) > limit
|
||||
; * && --chain_length != 0);
|
||||
; *
|
||||
; * Here is the inner loop of the function. The function will spend the
|
||||
; * majority of its time in this loop, and majority of that time will
|
||||
; * be spent in the first ten instructions.
|
||||
; *
|
||||
; * Within this loop:
|
||||
; * %ebx = scanend
|
||||
; * %ecx = curmatch
|
||||
; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
|
||||
; * %esi = windowbestlen - i.e., (window + bestlen)
|
||||
; * %edi = prev
|
||||
; * %ebp = limit
|
||||
; */
|
||||
|
||||
ALIGN 4
|
||||
LookupLoop:
|
||||
and ecx, edx
|
||||
movzx ecx, WORD PTR[edi+ecx*2]
|
||||
cmp ecx, ebp
|
||||
jbe LeaveNow
|
||||
sub edx, 000010000H
|
||||
js LeaveNow
|
||||
|
||||
LoopEntry:
|
||||
movzx eax, WORD PTR[esi+ecx-1]
|
||||
cmp eax, ebx
|
||||
jnz SHORT LookupLoop
|
||||
|
||||
mov eax, [esp+window]
|
||||
movzx eax, WORD PTR[eax+ecx]
|
||||
cmp eax, [esp+scanstart]
|
||||
jnz SHORT LookupLoop
|
||||
|
||||
;/* Store the current value of chainlen. */
|
||||
|
||||
mov [esp+chainlenwmask], edx
|
||||
|
||||
;/* Point %edi to the string under scrutiny, and %esi to the string we */
|
||||
;/* are hoping to match it up with. In actuality, %esi and %edi are */
|
||||
;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
|
||||
;/* initialized to -(MAX_MATCH_8 - scanalign). */
|
||||
|
||||
mov esi, [esp+window]
|
||||
mov edi, [esp+scan]
|
||||
add esi, ecx
|
||||
mov eax, [esp+scanalign]
|
||||
mov edx, -MAX_MATCH_8
|
||||
lea edi, [edi+eax+MAX_MATCH_8]
|
||||
lea esi, [esi+eax+MAX_MATCH_8]
|
||||
|
||||
;/* Test the strings for equality, 8 bytes at a time. At the end,
|
||||
; * adjust %edx so that it is offset to the exact byte that mismatched.
|
||||
; *
|
||||
; * We already know at this point that the first three bytes of the
|
||||
; * strings match each other, and they can be safely passed over before
|
||||
; * starting the compare loop. So what this code does is skip over 0-3
|
||||
; * bytes, as much as necessary in order to dword-align the %edi
|
||||
; * pointer. (%esi will still be misaligned three times out of four.)
|
||||
; *
|
||||
; * It should be confessed that this loop usually does not represent
|
||||
; * much of the total running time. Replacing it with a more
|
||||
; * straightforward "rep cmpsb" would not drastically degrade
|
||||
; * performance.
|
||||
; */
|
||||
|
||||
LoopCmps:
|
||||
mov eax, DWORD PTR[esi+edx]
|
||||
xor eax, DWORD PTR[edi+edx]
|
||||
jnz SHORT LeaveLoopCmps
|
||||
|
||||
mov eax, DWORD PTR[esi+edx+4]
|
||||
xor eax, DWORD PTR[edi+edx+4]
|
||||
jnz SHORT LeaveLoopCmps4
|
||||
|
||||
add edx, 8
|
||||
jnz SHORT LoopCmps
|
||||
jmp LenMaximum
|
||||
ALIGN 4
|
||||
|
||||
LeaveLoopCmps4:
|
||||
add edx, 4
|
||||
|
||||
LeaveLoopCmps:
|
||||
test eax, 00000FFFFH
|
||||
jnz SHORT LenLower
|
||||
|
||||
add edx, 2
|
||||
shr eax, 16
|
||||
|
||||
LenLower:
|
||||
sub al, 1
|
||||
adc edx, 0
|
||||
|
||||
;/* Calculate the length of the match. If it is longer than MAX_MATCH, */
|
||||
;/* then automatically accept it as the best possible match and leave. */
|
||||
|
||||
lea eax, [edi+edx]
|
||||
mov edi, [esp+scan]
|
||||
sub eax, edi
|
||||
cmp eax, MAX_MATCH
|
||||
jge SHORT LenMaximum
|
||||
|
||||
;/* If the length of the match is not longer than the best match we */
|
||||
;/* have so far, then forget it and return to the lookup loop. */
|
||||
|
||||
mov edx, [esp+deflatestate]
|
||||
mov ebx, [esp+bestlen]
|
||||
cmp eax, ebx
|
||||
jg SHORT LongerMatch
|
||||
mov esi, [esp+windowbestlen]
|
||||
mov edi, [edx].ds_prev
|
||||
mov ebx, [esp+scanend]
|
||||
mov edx, [esp+chainlenwmask]
|
||||
jmp LookupLoop
|
||||
ALIGN 4
|
||||
|
||||
;/* s->match_start = cur_match; */
|
||||
;/* best_len = len; */
|
||||
;/* if (len >= nice_match) break; */
|
||||
;/* scan_end = *(ushf*)(scan+best_len-1); */
|
||||
|
||||
LongerMatch:
|
||||
mov ebx, [esp+nicematch]
|
||||
mov [esp+bestlen], eax
|
||||
mov [edx].ds_match_start, ecx
|
||||
cmp eax, ebx
|
||||
jge SHORT LeaveNow
|
||||
mov esi, [esp+window]
|
||||
add esi, eax
|
||||
mov [esp+windowbestlen], esi
|
||||
movzx ebx, WORD PTR[edi+eax-1]
|
||||
mov edi, [edx].ds_prev
|
||||
mov [esp+scanend], ebx
|
||||
mov edx, [esp+chainlenwmask]
|
||||
jmp LookupLoop
|
||||
ALIGN 4
|
||||
|
||||
;/* Accept the current string, with the maximum possible length. */
|
||||
|
||||
LenMaximum:
|
||||
mov edx, [esp+deflatestate]
|
||||
mov DWORD PTR[esp+bestlen], MAX_MATCH
|
||||
mov [edx].ds_match_start, ecx
|
||||
|
||||
;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
|
||||
;/* return s->lookahead; */
|
||||
|
||||
LeaveNow:
|
||||
mov edx, [esp+deflatestate]
|
||||
mov ebx, [esp+bestlen]
|
||||
mov eax, [edx].ds_lookahead
|
||||
cmp ebx, eax
|
||||
jg SHORT LookaheadRet
|
||||
mov eax, ebx
|
||||
LookaheadRet:
|
||||
|
||||
; Restore the stack and return from whence we came.
|
||||
|
||||
add esp, varsize
|
||||
pop ebx
|
||||
pop esi
|
||||
pop edi
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
_longest_match ENDP
|
||||
|
||||
_TEXT ENDS
|
||||
END
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,206 +1,62 @@
|
||||
/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
|
||||
* Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
|
||||
* File written by Gilles Vollant, by modifiying the longest_match
|
||||
* from Jean-loup Gailly in deflate.c
|
||||
* it prepare all parameters and call the assembly longest_match_gvasm
|
||||
* longest_match execute standard C code is wmask != 0x7fff
|
||||
* (assembly code is faster with a fixed wmask)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "deflate.h"
|
||||
|
||||
#ifdef ASMV
|
||||
#define NIL 0
|
||||
|
||||
#define UNALIGNED_OK
|
||||
|
||||
|
||||
/* if your C compiler don't add underline before function name,
|
||||
define ADD_UNDERLINE_ASMFUNC */
|
||||
#ifdef ADD_UNDERLINE_ASMFUNC
|
||||
#define longest_match_7fff _longest_match_7fff
|
||||
#define longest_match_686 _longest_match_686
|
||||
#define cpudetect32 _cpudetect32
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
void match_init()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned long cpudetect32();
|
||||
|
||||
uInt longest_match_c(
|
||||
deflate_state *s,
|
||||
IPos cur_match); /* current match */
|
||||
|
||||
|
||||
uInt longest_match_7fff(
|
||||
deflate_state *s,
|
||||
IPos cur_match); /* current match */
|
||||
|
||||
uInt longest_match_686(
|
||||
deflate_state *s,
|
||||
IPos cur_match); /* current match */
|
||||
|
||||
uInt longest_match(
|
||||
deflate_state *s,
|
||||
IPos cur_match) /* current match */
|
||||
{
|
||||
static uInt iIsPPro=2;
|
||||
|
||||
if ((s->w_mask == 0x7fff) && (iIsPPro==0))
|
||||
return longest_match_7fff(s,cur_match);
|
||||
|
||||
if (iIsPPro==1)
|
||||
return longest_match_686(s,cur_match);
|
||||
|
||||
if (iIsPPro==2)
|
||||
iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
|
||||
|
||||
return longest_match_c(s,cur_match);
|
||||
}
|
||||
|
||||
|
||||
|
||||
uInt longest_match_c(s, cur_match)
|
||||
deflate_state *s;
|
||||
IPos cur_match; /* current match */
|
||||
{
|
||||
unsigned chain_length = s->max_chain_length;/* max hash chain length */
|
||||
register Bytef *scan = s->window + s->strstart; /* current string */
|
||||
register Bytef *match; /* matched string */
|
||||
register int len; /* length of current match */
|
||||
int best_len = s->prev_length; /* best match length so far */
|
||||
int nice_match = s->nice_match; /* stop if match long enough */
|
||||
IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
|
||||
s->strstart - (IPos)MAX_DIST(s) : NIL;
|
||||
/* Stop when cur_match becomes <= limit. To simplify the code,
|
||||
* we prevent matches with the string of window index 0.
|
||||
*/
|
||||
Posf *prev = s->prev;
|
||||
uInt wmask = s->w_mask;
|
||||
|
||||
#ifdef UNALIGNED_OK
|
||||
/* Compare two bytes at a time. Note: this is not always beneficial.
|
||||
* Try with and without -DUNALIGNED_OK to check.
|
||||
*/
|
||||
register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
|
||||
register ush scan_start = *(ushf*)scan;
|
||||
register ush scan_end = *(ushf*)(scan+best_len-1);
|
||||
#else
|
||||
register Bytef *strend = s->window + s->strstart + MAX_MATCH;
|
||||
register Byte scan_end1 = scan[best_len-1];
|
||||
register Byte scan_end = scan[best_len];
|
||||
#endif
|
||||
|
||||
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
|
||||
* It is easy to get rid of this optimization if necessary.
|
||||
*/
|
||||
Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
|
||||
|
||||
/* Do not waste too much time if we already have a good match: */
|
||||
if (s->prev_length >= s->good_match) {
|
||||
chain_length >>= 2;
|
||||
}
|
||||
/* Do not look for matches beyond the end of the input. This is necessary
|
||||
* to make deflate deterministic.
|
||||
*/
|
||||
if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
|
||||
|
||||
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
|
||||
|
||||
do {
|
||||
Assert(cur_match < s->strstart, "no future");
|
||||
match = s->window + cur_match;
|
||||
|
||||
/* Skip to next match if the match length cannot increase
|
||||
* or if the match length is less than 2:
|
||||
*/
|
||||
#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
|
||||
/* This code assumes sizeof(unsigned short) == 2. Do not use
|
||||
* UNALIGNED_OK if your compiler uses a different size.
|
||||
*/
|
||||
if (*(ushf*)(match+best_len-1) != scan_end ||
|
||||
*(ushf*)match != scan_start) continue;
|
||||
|
||||
/* It is not necessary to compare scan[2] and match[2] since they are
|
||||
* always equal when the other bytes match, given that the hash keys
|
||||
* are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
|
||||
* strstart+3, +5, ... up to strstart+257. We check for insufficient
|
||||
* lookahead only every 4th comparison; the 128th check will be made
|
||||
* at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
|
||||
* necessary to put more guard bytes at the end of the window, or
|
||||
* to check more often for insufficient lookahead.
|
||||
*/
|
||||
Assert(scan[2] == match[2], "scan[2]?");
|
||||
scan++, match++;
|
||||
do {
|
||||
} while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
|
||||
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
|
||||
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
|
||||
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
|
||||
scan < strend);
|
||||
/* The funny "do {}" generates better code on most compilers */
|
||||
|
||||
/* Here, scan <= window+strstart+257 */
|
||||
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
|
||||
if (*scan == *match) scan++;
|
||||
|
||||
len = (MAX_MATCH - 1) - (int)(strend-scan);
|
||||
scan = strend - (MAX_MATCH-1);
|
||||
|
||||
#else /* UNALIGNED_OK */
|
||||
|
||||
if (match[best_len] != scan_end ||
|
||||
match[best_len-1] != scan_end1 ||
|
||||
*match != *scan ||
|
||||
*++match != scan[1]) continue;
|
||||
|
||||
/* The check at best_len-1 can be removed because it will be made
|
||||
* again later. (This heuristic is not always a win.)
|
||||
* It is not necessary to compare scan[2] and match[2] since they
|
||||
* are always equal when the other bytes match, given that
|
||||
* the hash keys are equal and that HASH_BITS >= 8.
|
||||
*/
|
||||
scan += 2, match++;
|
||||
Assert(*scan == *match, "match[2]?");
|
||||
|
||||
/* We check for insufficient lookahead only every 8th comparison;
|
||||
* the 256th check will be made at strstart+258.
|
||||
*/
|
||||
do {
|
||||
} while (*++scan == *++match && *++scan == *++match &&
|
||||
*++scan == *++match && *++scan == *++match &&
|
||||
*++scan == *++match && *++scan == *++match &&
|
||||
*++scan == *++match && *++scan == *++match &&
|
||||
scan < strend);
|
||||
|
||||
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
|
||||
|
||||
len = MAX_MATCH - (int)(strend - scan);
|
||||
scan = strend - MAX_MATCH;
|
||||
|
||||
#endif /* UNALIGNED_OK */
|
||||
|
||||
if (len > best_len) {
|
||||
s->match_start = cur_match;
|
||||
best_len = len;
|
||||
if (len >= nice_match) break;
|
||||
#ifdef UNALIGNED_OK
|
||||
scan_end = *(ushf*)(scan+best_len-1);
|
||||
#else
|
||||
scan_end1 = scan[best_len-1];
|
||||
scan_end = scan[best_len];
|
||||
#endif
|
||||
}
|
||||
} while ((cur_match = prev[cur_match & wmask]) > limit
|
||||
&& --chain_length != 0);
|
||||
|
||||
if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
|
||||
return s->lookahead;
|
||||
}
|
||||
|
||||
#endif /* ASMV */
|
||||
/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
|
||||
* Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
|
||||
* File written by Gilles Vollant, by modifiying the longest_match
|
||||
* from Jean-loup Gailly in deflate.c
|
||||
* it prepare all parameters and call the assembly longest_match_gvasm
|
||||
* longest_match execute standard C code is wmask != 0x7fff
|
||||
* (assembly code is faster with a fixed wmask)
|
||||
*
|
||||
* Read comment at beginning of gvmat32.asm for more information
|
||||
*/
|
||||
|
||||
#if defined(ASMV) && (!defined(NOOLDPENTIUMCODE))
|
||||
#include "deflate.h"
|
||||
|
||||
/* if your C compiler don't add underline before function name,
|
||||
define ADD_UNDERLINE_ASMFUNC */
|
||||
#ifdef ADD_UNDERLINE_ASMFUNC
|
||||
#define longest_match_7fff _longest_match_7fff
|
||||
#define longest_match_686 _longest_match_686
|
||||
#define cpudetect32 _cpudetect32
|
||||
#endif
|
||||
|
||||
|
||||
unsigned long cpudetect32();
|
||||
|
||||
uInt longest_match_c(
|
||||
deflate_state *s,
|
||||
IPos cur_match); /* current match */
|
||||
|
||||
|
||||
uInt longest_match_7fff(
|
||||
deflate_state *s,
|
||||
IPos cur_match); /* current match */
|
||||
|
||||
uInt longest_match_686(
|
||||
deflate_state *s,
|
||||
IPos cur_match); /* current match */
|
||||
|
||||
|
||||
static uInt iIsPPro=2;
|
||||
|
||||
void match_init ()
|
||||
{
|
||||
iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
|
||||
}
|
||||
|
||||
uInt longest_match(
|
||||
deflate_state *s,
|
||||
IPos cur_match) /* current match */
|
||||
{
|
||||
if (iIsPPro!=0)
|
||||
return longest_match_686(s,cur_match);
|
||||
|
||||
if (s->w_mask != 0x7fff)
|
||||
return longest_match_686(s,cur_match);
|
||||
|
||||
/* now ((s->w_mask == 0x7fff) && (iIsPPro==0)) */
|
||||
return longest_match_7fff(s,cur_match);
|
||||
}
|
||||
|
||||
|
||||
#endif /* defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,3 @@
|
||||
cl /I..\.. /O2 /c gvmat32c.c
|
||||
cl /DASMV /I..\.. /O2 /c gvmat32c.c
|
||||
ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm
|
||||
ml /coff /Zi /c /Flinffas32.lst inffas32.asm
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
||||
|
||||
|
||||
Version 1.00, September 10th, 2003
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2003 Gilles Vollant
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
|
||||
This code is a modified version of crypting code in Infozip distribution
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* ioapi.c -- IO base function header for compress/uncompress .zip
|
||||
files using zlib + zip or unzip API
|
||||
|
||||
Version 1.00, September 10th, 2003
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2003 Gilles Vollant
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@ -94,7 +94,7 @@ uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
|
||||
uLong size;
|
||||
{
|
||||
uLong ret;
|
||||
ret = fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -106,7 +106,7 @@ uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
|
||||
uLong size;
|
||||
{
|
||||
uLong ret;
|
||||
ret = fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
files using zlib + zip or unzip API
|
||||
|
||||
Version 1.00, September 10th, 2003
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2003 Gilles Vollant
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
|
@ -2,9 +2,9 @@
|
||||
files using zlib + zip or unzip API
|
||||
This IO API version uses the Win32 API (for Microsoft Windows)
|
||||
|
||||
Version 1.00, September 10th, 2003
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2003 Gilles Vollant
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -2,9 +2,9 @@
|
||||
files using zlib + zip or unzip API
|
||||
This IO API version uses the Win32 API (for Microsoft Windows)
|
||||
|
||||
Version 1.00, September 10th, 2003
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2003 Gilles Vollant
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
|
@ -10,7 +10,7 @@ unit zlibpas;
|
||||
interface
|
||||
|
||||
const
|
||||
ZLIB_VERSION = '1.2.1';
|
||||
ZLIB_VERSION = '1.2.3';
|
||||
|
||||
type
|
||||
alloc_func = function(opaque: Pointer; items, size: Integer): Pointer;
|
||||
|
@ -1,8 +1,8 @@
|
||||
/*
|
||||
* puff.c
|
||||
* Copyright (C) 2002, 2003 Mark Adler
|
||||
* Copyright (C) 2002-2004 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in puff.h
|
||||
* version 1.7, 3 Mar 2003
|
||||
* version 1.8, 9 Jan 2004
|
||||
*
|
||||
* puff.c is a simple inflate written to be an unambiguous way to specify the
|
||||
* deflate format. It is not written for speed but rather simplicity. As a
|
||||
@ -60,6 +60,7 @@
|
||||
* 1.6 7 Aug 2002 - Minor format changes
|
||||
* 1.7 3 Mar 2003 - Added test code for distribution
|
||||
* - Added zlib-like license
|
||||
* 1.8 9 Jan 2004 - Added some comments on no distance codes case
|
||||
*/
|
||||
|
||||
#include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */
|
||||
@ -577,6 +578,9 @@ local int fixed(struct state *s)
|
||||
* block is fewer bits), but it is allowed by the format. So incomplete
|
||||
* literal/length codes of one symbol should also be permitted.
|
||||
*
|
||||
* - If there are only literal codes and no lengths, then there are no distance
|
||||
* codes. This is represented by one distance code with zero bits.
|
||||
*
|
||||
* - The list of up to 286 length/literal lengths and up to 30 distance lengths
|
||||
* are themselves compressed using Huffman codes and run-length encoding. In
|
||||
* the list of code lengths, a 0 symbol means no code, a 1..15 symbol means
|
||||
|
@ -1,149 +1,275 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#include "zlib.h"
|
||||
|
||||
int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr)
|
||||
{
|
||||
FILE* stream;
|
||||
void* ptr;
|
||||
int retVal=1;
|
||||
stream=fopen(filename, "rb");
|
||||
if (stream==NULL)
|
||||
return 0;
|
||||
|
||||
fseek(stream,0,SEEK_END);
|
||||
|
||||
*plFileSize=ftell(stream);
|
||||
fseek(stream,0,SEEK_SET);
|
||||
ptr=malloc((*plFileSize)+1);
|
||||
if (ptr==NULL)
|
||||
retVal=0;
|
||||
else
|
||||
{
|
||||
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
|
||||
retVal=0;
|
||||
}
|
||||
fclose(stream);
|
||||
*pFilePtr=ptr;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int BlockSizeCompress=0x8000;
|
||||
int BlockSizeUncompress=0x8000;
|
||||
int cprLevel=Z_DEFAULT_COMPRESSION ;
|
||||
long lFileSize;
|
||||
unsigned char* FilePtr;
|
||||
long lBufferSizeCpr;
|
||||
long lBufferSizeUncpr;
|
||||
long lCompressedSize=0;
|
||||
unsigned char* CprPtr;
|
||||
unsigned char* UncprPtr;
|
||||
long lSizeCpr,lSizeUncpr;
|
||||
DWORD dwGetTick;
|
||||
|
||||
if (argc<=1)
|
||||
{
|
||||
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
|
||||
{
|
||||
printf("error reading %s\n",argv[1]);
|
||||
return 1;
|
||||
}
|
||||
else printf("file %s read, %u bytes\n",argv[1],lFileSize);
|
||||
|
||||
if (argc>=3)
|
||||
BlockSizeCompress=atol(argv[2]);
|
||||
|
||||
if (argc>=4)
|
||||
BlockSizeUncompress=atol(argv[3]);
|
||||
|
||||
if (argc>=5)
|
||||
cprLevel=(int)atol(argv[4]);
|
||||
|
||||
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
|
||||
lBufferSizeUncpr = lBufferSizeCpr;
|
||||
|
||||
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
|
||||
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
|
||||
|
||||
dwGetTick=GetTickCount();
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lFileSize;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
deflateInit(&zcpr,cprLevel);
|
||||
|
||||
zcpr.next_in = FilePtr;
|
||||
zcpr.next_out = CprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
|
||||
zcpr.avail_out = BlockSizeCompress;
|
||||
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeCpr=zcpr.total_out;
|
||||
deflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
printf("total compress size = %u, in %u step\n",lSizeCpr,step);
|
||||
printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
}
|
||||
|
||||
dwGetTick=GetTickCount();
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lSizeCpr;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
inflateInit(&zcpr);
|
||||
|
||||
zcpr.next_in = CprPtr;
|
||||
zcpr.next_out = UncprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
|
||||
zcpr.avail_out = BlockSizeUncompress;
|
||||
ret=inflate(&zcpr,Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeUncpr=zcpr.total_out;
|
||||
inflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
|
||||
printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
}
|
||||
|
||||
if (lSizeUncpr==lFileSize)
|
||||
{
|
||||
if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
|
||||
printf("compare ok\n");
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
|
||||
void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
|
||||
{
|
||||
R->HighPart = A.HighPart - B.HighPart;
|
||||
if (A.LowPart >= B.LowPart)
|
||||
R->LowPart = A.LowPart - B.LowPart;
|
||||
else
|
||||
{
|
||||
R->LowPart = A.LowPart - B.LowPart;
|
||||
R->HighPart --;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _M_X64
|
||||
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
|
||||
unsigned __int64 __rdtsc(void);
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
// printf("rdtsc = %I64x\n",__rdtsc());
|
||||
pbeginTime64->QuadPart=__rdtsc();
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER LIres;
|
||||
unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
|
||||
LIres.QuadPart=res;
|
||||
// printf("rdtsc = %I64x\n",__rdtsc());
|
||||
return LIres;
|
||||
}
|
||||
#else
|
||||
#ifdef _M_IX86
|
||||
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
DWORD dwEdx,dwEax;
|
||||
_asm
|
||||
{
|
||||
rdtsc
|
||||
mov dwEax,eax
|
||||
mov dwEdx,edx
|
||||
}
|
||||
pbeginTime64->LowPart=dwEax;
|
||||
pbeginTime64->HighPart=dwEdx;
|
||||
}
|
||||
|
||||
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
|
||||
{
|
||||
myGetRDTSC32(pbeginTime64);
|
||||
}
|
||||
|
||||
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER LIres,endTime64;
|
||||
myGetRDTSC32(&endTime64);
|
||||
|
||||
LIres.LowPart=LIres.HighPart=0;
|
||||
MyDoMinus64(&LIres,endTime64,beginTime64);
|
||||
return LIres;
|
||||
}
|
||||
#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)
|
||||
{
|
||||
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
|
||||
{
|
||||
pbeginTime64->LowPart = GetTickCount();
|
||||
pbeginTime64->HighPart = 0;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
|
||||
{
|
||||
LARGE_INTEGER endTime64,ticksPerSecond,ticks;
|
||||
DWORDLONG ticksShifted,tickSecShifted;
|
||||
DWORD dwLog=16+0;
|
||||
DWORD dwRet;
|
||||
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
|
||||
dwRet = (GetTickCount() - beginTime64.LowPart)*1;
|
||||
else
|
||||
{
|
||||
MyDoMinus64(&ticks,endTime64,beginTime64);
|
||||
QueryPerformanceFrequency(&ticksPerSecond);
|
||||
|
||||
|
||||
{
|
||||
ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
|
||||
tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
|
||||
|
||||
}
|
||||
|
||||
dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
|
||||
dwRet *=1;
|
||||
}
|
||||
return dwRet;
|
||||
}
|
||||
|
||||
int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr)
|
||||
{
|
||||
FILE* stream;
|
||||
void* ptr;
|
||||
int retVal=1;
|
||||
stream=fopen(filename, "rb");
|
||||
if (stream==NULL)
|
||||
return 0;
|
||||
|
||||
fseek(stream,0,SEEK_END);
|
||||
|
||||
*plFileSize=ftell(stream);
|
||||
fseek(stream,0,SEEK_SET);
|
||||
ptr=malloc((*plFileSize)+1);
|
||||
if (ptr==NULL)
|
||||
retVal=0;
|
||||
else
|
||||
{
|
||||
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
|
||||
retVal=0;
|
||||
}
|
||||
fclose(stream);
|
||||
*pFilePtr=ptr;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int BlockSizeCompress=0x8000;
|
||||
int BlockSizeUncompress=0x8000;
|
||||
int cprLevel=Z_DEFAULT_COMPRESSION ;
|
||||
long lFileSize;
|
||||
unsigned char* FilePtr;
|
||||
long lBufferSizeCpr;
|
||||
long lBufferSizeUncpr;
|
||||
long lCompressedSize=0;
|
||||
unsigned char* CprPtr;
|
||||
unsigned char* UncprPtr;
|
||||
long lSizeCpr,lSizeUncpr;
|
||||
DWORD dwGetTick,dwMsecQP;
|
||||
LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
|
||||
|
||||
if (argc<=1)
|
||||
{
|
||||
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
|
||||
{
|
||||
printf("error reading %s\n",argv[1]);
|
||||
return 1;
|
||||
}
|
||||
else printf("file %s read, %u bytes\n",argv[1],lFileSize);
|
||||
|
||||
if (argc>=3)
|
||||
BlockSizeCompress=atol(argv[2]);
|
||||
|
||||
if (argc>=4)
|
||||
BlockSizeUncompress=atol(argv[3]);
|
||||
|
||||
if (argc>=5)
|
||||
cprLevel=(int)atol(argv[4]);
|
||||
|
||||
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
|
||||
lBufferSizeUncpr = lBufferSizeCpr;
|
||||
|
||||
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
|
||||
|
||||
BeginCountPerfCounter(&li_qp,TRUE);
|
||||
dwGetTick=GetTickCount();
|
||||
BeginCountRdtsc(&li_rdtsc);
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lFileSize;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
deflateInit(&zcpr,cprLevel);
|
||||
|
||||
zcpr.next_in = FilePtr;
|
||||
zcpr.next_out = CprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
|
||||
zcpr.avail_out = BlockSizeCompress;
|
||||
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeCpr=zcpr.total_out;
|
||||
deflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
|
||||
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
|
||||
printf("total compress size = %u, in %u step\n",lSizeCpr,step);
|
||||
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
|
||||
printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
|
||||
}
|
||||
|
||||
CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
|
||||
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
|
||||
|
||||
BeginCountPerfCounter(&li_qp,TRUE);
|
||||
dwGetTick=GetTickCount();
|
||||
BeginCountRdtsc(&li_rdtsc);
|
||||
{
|
||||
z_stream zcpr;
|
||||
int ret=Z_OK;
|
||||
long lOrigToDo = lSizeCpr;
|
||||
long lOrigDone = 0;
|
||||
int step=0;
|
||||
memset(&zcpr,0,sizeof(z_stream));
|
||||
inflateInit(&zcpr);
|
||||
|
||||
zcpr.next_in = CprPtr;
|
||||
zcpr.next_out = UncprPtr;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
long all_read_before = zcpr.total_in;
|
||||
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
|
||||
zcpr.avail_out = BlockSizeUncompress;
|
||||
ret=inflate(&zcpr,Z_SYNC_FLUSH);
|
||||
lOrigDone += (zcpr.total_in-all_read_before);
|
||||
lOrigToDo -= (zcpr.total_in-all_read_before);
|
||||
step++;
|
||||
} while (ret==Z_OK);
|
||||
|
||||
lSizeUncpr=zcpr.total_out;
|
||||
inflateEnd(&zcpr);
|
||||
dwGetTick=GetTickCount()-dwGetTick;
|
||||
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
|
||||
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
|
||||
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
|
||||
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
|
||||
printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
|
||||
printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
|
||||
}
|
||||
|
||||
if (lSizeUncpr==lFileSize)
|
||||
{
|
||||
if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
|
||||
printf("compare ok\n");
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
Building instructions for the DLL versions of Zlib 1.21
|
||||
=======================================================
|
||||
Building instructions for the DLL versions of Zlib 1.2.3
|
||||
========================================================
|
||||
|
||||
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
|
||||
binaries from:
|
||||
@ -11,18 +11,36 @@ binaries from:
|
||||
More information can be found at this site.
|
||||
|
||||
|
||||
Build instructions
|
||||
------------------
|
||||
- Unzip zlib*.zip and copy the files from contrib\vstudio\vc7,
|
||||
from contrib\vstudio\masmx86 and from contrib\minizip into the same
|
||||
directory.
|
||||
Build instructions for Visual Studio 7.x (32 bits)
|
||||
--------------------------------------------------
|
||||
- Uncompress current zlib, including all contrib/* files
|
||||
- Download the crtdll library from
|
||||
http://www.winimage.com/zLibDll/crtdll.zip
|
||||
Unzip crtdll.zip to extract crtdll.lib.
|
||||
- If you are using x86, use the Release target.
|
||||
- Open zlibvc.sln with Microsoft Visual C++ 7.0 or 7.1
|
||||
Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc7.
|
||||
- Open contrib\vstudio\vc7\zlibvc.sln with Microsoft Visual C++ 7.x
|
||||
(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
|
||||
---------
|
||||
|
@ -19,6 +19,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
@ -63,6 +64,7 @@
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OmitFramePointers="TRUE"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
@ -104,7 +106,7 @@
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
|
||||
<File
|
||||
RelativePath="miniunz.c">
|
||||
RelativePath="..\..\minizip\miniunz.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
@ -116,7 +118,7 @@
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="zlibwapi.lib">
|
||||
RelativePath="ReleaseDll\zlibwapi.lib">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
@ -19,6 +19,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
@ -63,6 +64,7 @@
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OmitFramePointers="TRUE"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\minizip"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
@ -104,7 +106,7 @@
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
|
||||
<File
|
||||
RelativePath="minizip.c">
|
||||
RelativePath="..\..\minizip\minizip.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
@ -116,7 +118,7 @@
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="zlibwapi.lib">
|
||||
RelativePath="ReleaseDll\zlibwapi.lib">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
@ -2,8 +2,8 @@
|
||||
|
||||
#define IDR_VERSION1 1
|
||||
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
|
||||
FILEVERSION 1,2,1,0
|
||||
PRODUCTVERSION 1,2,1,0
|
||||
FILEVERSION 1,2,3,0
|
||||
PRODUCTVERSION 1,2,3,0
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
FILEFLAGS 0
|
||||
FILEOS VOS_DOS_WINDOWS32
|
||||
@ -17,7 +17,7 @@ BEGIN
|
||||
|
||||
BEGIN
|
||||
VALUE "FileDescription", "zlib data compression library\0"
|
||||
VALUE "FileVersion", "1.2.1.0\0"
|
||||
VALUE "FileVersion", "1.2.3.0\0"
|
||||
VALUE "InternalName", "zlib\0"
|
||||
VALUE "OriginalFilename", "zlib.dll\0"
|
||||
VALUE "ProductName", "ZLib.DLL\0"
|
||||
|
@ -20,6 +20,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="5"
|
||||
@ -61,6 +62,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -102,6 +104,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI;ASMV;ASMINF"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -117,7 +120,7 @@
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
AdditionalOptions="gvmat32.obj inffas32.obj /NODEFAULTLIB "
|
||||
AdditionalOptions="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj /NODEFAULTLIB "
|
||||
OutputFile=".\zlibstat\zlibstat.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
@ -144,6 +147,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32;ZLIB_WINAPI"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -182,49 +186,49 @@
|
||||
Name="Source Files"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath=".\adler32.c">
|
||||
RelativePath="..\..\..\adler32.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\compress.c">
|
||||
RelativePath="..\..\..\compress.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\crc32.c">
|
||||
RelativePath="..\..\..\crc32.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\deflate.c">
|
||||
RelativePath="..\..\..\deflate.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\gvmat32c.c">
|
||||
RelativePath="..\..\masmx86\gvmat32c.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\gzio.c">
|
||||
RelativePath="..\..\..\gzio.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\infback.c">
|
||||
RelativePath="..\..\..\infback.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inffast.c">
|
||||
RelativePath="..\..\..\inffast.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inflate.c">
|
||||
RelativePath="..\..\..\inflate.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inftrees.c">
|
||||
RelativePath="..\..\..\inftrees.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ioapi.c">
|
||||
RelativePath="..\..\minizip\ioapi.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\trees.c">
|
||||
RelativePath="..\..\..\trees.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\uncompr.c">
|
||||
RelativePath="..\..\..\uncompr.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\unzip.c">
|
||||
RelativePath="..\..\minizip\unzip.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zip.c">
|
||||
RelativePath="..\..\minizip\zip.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zlib.rc">
|
||||
@ -233,7 +237,7 @@
|
||||
RelativePath=".\zlibvc.def">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zutil.c">
|
||||
RelativePath="..\..\..\zutil.c">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
|
@ -7,6 +7,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj",
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testZlibDll", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
ConfigName.0 = Debug
|
||||
@ -58,6 +60,16 @@ Global
|
||||
{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.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
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
|
@ -20,6 +20,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="1"
|
||||
@ -35,7 +36,7 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="gvmat32.obj inffas32.obj"
|
||||
AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj"
|
||||
OutputFile=".\DebugDll\zlibwapi.dll"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
@ -72,10 +73,12 @@
|
||||
IntermediateDirectory=".\zlibDllWithoutAsm"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
WholeProgramOptimization="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32,ZLIB_WINAPI"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -134,10 +137,12 @@
|
||||
IntermediateDirectory=".\zlibDllWithoutCrtDll"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
WholeProgramOptimization="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -156,7 +161,7 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="gvmat32.obj inffas32.obj "
|
||||
AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj "
|
||||
OutputFile=".\zlibDllWithoutCrtDll\zlibwapi.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
@ -196,10 +201,12 @@
|
||||
IntermediateDirectory=".\zlibvc__"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
WholeProgramOptimization="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32,ZLIB_WINAPI"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -256,10 +263,12 @@
|
||||
IntermediateDirectory=".\ReleaseDll"
|
||||
ConfigurationType="2"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
WholeProgramOptimization="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
|
||||
PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
@ -278,7 +287,7 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalOptions="/MACHINE:I386"
|
||||
AdditionalDependencies="gvmat32.obj inffas32.obj crtdll.lib"
|
||||
AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj crtdll.lib"
|
||||
OutputFile=".\ReleaseDll\zlibwapi.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
@ -318,19 +327,19 @@
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90">
|
||||
<File
|
||||
RelativePath=".\adler32.c">
|
||||
RelativePath="..\..\..\adler32.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\compress.c">
|
||||
RelativePath="..\..\..\compress.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\crc32.c">
|
||||
RelativePath="..\..\..\crc32.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\deflate.c">
|
||||
RelativePath="..\..\..\deflate.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\gvmat32c.c">
|
||||
RelativePath="..\..\masmx86\gvmat32c.c">
|
||||
<FileConfiguration
|
||||
Name="ReleaseWithoutAsm|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
@ -339,34 +348,34 @@
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\gzio.c">
|
||||
RelativePath="..\..\..\gzio.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\infback.c">
|
||||
RelativePath="..\..\..\infback.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inffast.c">
|
||||
RelativePath="..\..\..\inffast.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inflate.c">
|
||||
RelativePath="..\..\..\inflate.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inftrees.c">
|
||||
RelativePath="..\..\..\inftrees.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ioapi.c">
|
||||
RelativePath="..\..\minizip\ioapi.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\iowin32.c">
|
||||
RelativePath="..\..\minizip\iowin32.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\trees.c">
|
||||
RelativePath="..\..\..\trees.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\uncompr.c">
|
||||
RelativePath="..\..\..\uncompr.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\unzip.c">
|
||||
RelativePath="..\..\minizip\unzip.c">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
@ -376,7 +385,7 @@
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zip.c">
|
||||
RelativePath="..\..\minizip\zip.c">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
@ -392,38 +401,38 @@
|
||||
RelativePath=".\zlibvc.def">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zutil.c">
|
||||
RelativePath="..\..\..\zutil.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;fi;fd">
|
||||
<File
|
||||
RelativePath=".\deflate.h">
|
||||
RelativePath="..\..\..\deflate.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\infblock.h">
|
||||
RelativePath="..\..\..\infblock.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\infcodes.h">
|
||||
RelativePath="..\..\..\infcodes.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inffast.h">
|
||||
RelativePath="..\..\..\inffast.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\inftrees.h">
|
||||
RelativePath="..\..\..\inftrees.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\infutil.h">
|
||||
RelativePath="..\..\..\infutil.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zconf.h">
|
||||
RelativePath="..\..\..\zconf.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zlib.h">
|
||||
RelativePath="..\..\..\zlib.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\zutil.h">
|
||||
RelativePath="..\..\..\zutil.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
|
@ -3,12 +3,12 @@
|
||||
# test works out-of-the-box, installs `somewhere' on demand
|
||||
|
||||
# Toolflags:
|
||||
CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah
|
||||
CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah
|
||||
C++flags = -c -depend !Depend -IC: -throwback
|
||||
Linkflags = -aif -c++ -o $@
|
||||
Linkflags = -aif -c++ -o $@
|
||||
ObjAsmflags = -throwback -NoCache -depend !Depend
|
||||
CMHGflags =
|
||||
LibFileflags = -c -l -o $@
|
||||
CMHGflags =
|
||||
LibFileflags = -c -l -o $@
|
||||
Squeezeflags = -o $@
|
||||
|
||||
# change the line below to where _you_ want the library installed.
|
||||
@ -17,10 +17,10 @@ libdest = lib:zlib
|
||||
# Final targets:
|
||||
@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \
|
||||
@.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \
|
||||
@.o.uncompr @.o.zutil
|
||||
@.o.uncompr @.o.zutil
|
||||
LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \
|
||||
@.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \
|
||||
@.o.trees @.o.uncompr @.o.zutil
|
||||
@.o.trees @.o.uncompr @.o.zutil
|
||||
test: @.minigzip @.example @.lib
|
||||
@copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV
|
||||
@echo running tests: hang on.
|
||||
@ -41,9 +41,9 @@ test: @.minigzip @.example @.lib
|
||||
@/@.example @.fred @.fred
|
||||
@echo that will have given lots of hello!'s.
|
||||
|
||||
@.minigzip: @.o.minigzip @.lib C:o.Stubs
|
||||
Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs
|
||||
@.example: @.o.example @.lib C:o.Stubs
|
||||
@.minigzip: @.o.minigzip @.lib C:o.Stubs
|
||||
Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs
|
||||
@.example: @.o.example @.lib C:o.Stubs
|
||||
Link $(Linkflags) @.o.example @.lib C:o.Stubs
|
||||
|
||||
install: @.lib
|
||||
|
@ -1,3 +1,3 @@
|
||||
This directory contains files that have not been updated for zlib 1.2.1
|
||||
This directory contains files that have not been updated for zlib 1.2.x
|
||||
|
||||
(Volunteers are encouraged to help clean this up. Thanks.)
|
||||
|
@ -25,10 +25,10 @@
|
||||
<QPG:Files>
|
||||
<QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
|
||||
<QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
|
||||
<QPG:Add file="../libz.so.1.2.1" install="/opt/lib/" user="root:bin" permission="644"/>
|
||||
<QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.1"/>
|
||||
<QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.1"/>
|
||||
<QPG:Add file="../libz.so.1.2.1" install="/opt/lib/" component="slib"/>
|
||||
<QPG:Add file="../libz.so.1.2.3" install="/opt/lib/" user="root:bin" permission="644"/>
|
||||
<QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.3"/>
|
||||
<QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.3"/>
|
||||
<QPG:Add file="../libz.so.1.2.3" install="/opt/lib/" component="slib"/>
|
||||
</QPG:Files>
|
||||
|
||||
<QPG:PackageFilter>
|
||||
@ -63,7 +63,7 @@
|
||||
</QPM:ProductDescription>
|
||||
|
||||
<QPM:ReleaseDescription>
|
||||
<QPM:ReleaseVersion>1.2.1</QPM:ReleaseVersion>
|
||||
<QPM:ReleaseVersion>1.2.3</QPM:ReleaseVersion>
|
||||
<QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
|
||||
<QPM:ReleaseStability>Stable</QPM:ReleaseStability>
|
||||
<QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
|
||||
@ -105,7 +105,7 @@
|
||||
</QPM:Script>
|
||||
</QPM:ProductInstallationProcedure>
|
||||
</QPM:PackageManifest>
|
||||
|
||||
|
||||
<QPM:Launch>
|
||||
</QPM:Launch>
|
||||
</QPG:PackageFilter>
|
||||
@ -119,7 +119,7 @@
|
||||
</QPM:OrderDependency>
|
||||
</QPM:ProductInstallationProcedure>
|
||||
</QPM:PackageManifest>
|
||||
|
||||
|
||||
<QPM:Launch>
|
||||
</QPM:Launch>
|
||||
</QPG:PackageFilter>
|
||||
@ -133,7 +133,7 @@
|
||||
</QPM:OrderDependency>
|
||||
</QPM:ProductInstallationProcedure>
|
||||
</QPM:PackageManifest>
|
||||
|
||||
|
||||
<QPM:Launch>
|
||||
</QPM:Launch>
|
||||
</QPG:PackageFilter>
|
||||
|
@ -12,7 +12,7 @@ in the zlib distribution, or at the following location:
|
||||
1. What is ZLIB1.DLL, and how can I get it?
|
||||
|
||||
- ZLIB1.DLL is the official build of zlib as a DLL.
|
||||
(Please remark the symbol '1' in the name.)
|
||||
(Please remark the character '1' in the name.)
|
||||
|
||||
Pointers to a precompiled ZLIB1.DLL can be found in the zlib
|
||||
web site at:
|
||||
@ -37,20 +37,19 @@ in the zlib distribution, or at the following location:
|
||||
and build settings. If you do build the DLL yourself, please
|
||||
make sure that it complies with all the above requirements,
|
||||
and it runs with the precompiled test programs, bundled with
|
||||
the original ZLIB1.DLL distribution and available at the zlib
|
||||
web site.
|
||||
the original ZLIB1.DLL distribution.
|
||||
|
||||
If, for any reason, you need to build an incompatible DLL,
|
||||
please use a different name.
|
||||
please use a different file name.
|
||||
|
||||
|
||||
2. Why did you change the name of the DLL to ZLIB1.DLL?
|
||||
What happened to the old ZLIB.DLL?
|
||||
|
||||
- The old ZLIB.DLL, built from zlib-1.1.x and earlier, required
|
||||
compilation settings that were incompatible to those used by a
|
||||
static build. The DLL settings were supposed to be enabled by
|
||||
defining the macro ZLIB_DLL, before including "zlib.h".
|
||||
- The old ZLIB.DLL, built from zlib-1.1.4 or earlier, required
|
||||
compilation settings that were incompatible to those used by
|
||||
a static build. The DLL settings were supposed to be enabled
|
||||
by defining the macro ZLIB_DLL, before including "zlib.h".
|
||||
Incorrect handling of this macro was silently accepted at
|
||||
build time, resulting in two major problems:
|
||||
|
||||
@ -65,8 +64,8 @@ in the zlib distribution, or at the following location:
|
||||
functions. Failure to do so resulted in creating binaries
|
||||
that were unable to run with the official ZLIB.DLL build.
|
||||
|
||||
The only possible solution that we could foresee was to make a
|
||||
binary-incompatible change in the DLL interfacing, in order to
|
||||
The only possible solution that we could foresee was to make
|
||||
a binary-incompatible change in the DLL interface, in order to
|
||||
remove the dependency on the ZLIB_DLL macro, and to release
|
||||
the new DLL under a different name.
|
||||
|
||||
@ -85,17 +84,13 @@ in the zlib distribution, or at the following location:
|
||||
|
||||
- In principle, you can do it by assigning calling convention
|
||||
keywords to the macros ZEXPORT and ZEXPORTVA. In practice,
|
||||
it depends on what you mean by "an old ZLIB.DLL", because
|
||||
the old DLL exists in several mutually-incompatible versions.
|
||||
|
||||
If you have a compiled application that works with a certain
|
||||
ZLIB.DLL without any known security issues, there is hardly
|
||||
a need to rebuild the DLL from new sources only to link it to
|
||||
the old app binary. But if you really want to do it, you have
|
||||
to find out first what kind of calling convention uses your
|
||||
particular ZLIB.DLL build, and to use the same one in the new
|
||||
build. If you don't know what this is all about, you might be
|
||||
better off if you would just forget it.
|
||||
it depends on what you mean by "an old ZLIB.DLL", because the
|
||||
old DLL exists in several mutually-incompatible versions.
|
||||
You have to find out first what kind of calling convention is
|
||||
being used in your particular ZLIB.DLL build, and to use the
|
||||
same one in the new build. If you don't know what this is all
|
||||
about, you might be better off if you would just leave the old
|
||||
DLL intact.
|
||||
|
||||
|
||||
4. Can I compile my application using the new zlib interface, and
|
||||
@ -170,19 +165,19 @@ in the zlib distribution, or at the following location:
|
||||
the K&R-style function prototypes, where the argument types
|
||||
are not specified; but that is another story for another day.
|
||||
|
||||
The fact that remains is that CDECL is the default convention.
|
||||
Even if an explicit convention (such as STDCALL or FASTCALL)
|
||||
is hard-coded into the function prototypes inside C headers,
|
||||
problems may appear. One problem, for example, deals with the
|
||||
necessity to expose the convention in users' callbacks.
|
||||
The remaining fact is that CDECL is the default convention.
|
||||
Even if an explicit convention is hard-coded into the function
|
||||
prototypes inside C headers, problems may appear. The
|
||||
necessity to expose the convention in users' callbacks is one
|
||||
of these problems.
|
||||
|
||||
The calling convention issues are also important when using
|
||||
zlib in other programming languages. Some of them, like Ada
|
||||
(GNAT) and Fortran (GNU G77), have C bindings implemented
|
||||
initially on Unix, and relying on the C calling convention.
|
||||
On the other hand, the pre- .NET versions of Microsoft Visual
|
||||
Basic require STDCALL, while Borland Delphi prefers (although
|
||||
it does not require) FASTCALL.
|
||||
Basic require STDCALL, while Borland Delphi prefers, although
|
||||
it does not require, FASTCALL.
|
||||
|
||||
In fairness to all possible uses of zlib outside the C
|
||||
programming language, we choose the default "C" convention.
|
||||
@ -208,7 +203,14 @@ in the zlib distribution, or at the following location:
|
||||
zlib distribution.
|
||||
|
||||
|
||||
8. If my application uses ZLIB1.DLL, should I link it to
|
||||
8. I need to use zlib in my Microsoft .NET project. What can I
|
||||
do?
|
||||
|
||||
- Henrik Ravn has contributed a .NET wrapper around zlib. Look
|
||||
into contrib/dotzlib/, inside the zlib distribution.
|
||||
|
||||
|
||||
9. If my application uses ZLIB1.DLL, should I link it to
|
||||
MSVCRT.DLL? Why?
|
||||
|
||||
- It is not required, but it is recommended to link your
|
||||
@ -223,8 +225,8 @@ in the zlib distribution, or at the following location:
|
||||
depend on it should also be linked to MSVCRT.DLL.
|
||||
|
||||
|
||||
9. Why are you saying that ZLIB1.DLL and my application must be
|
||||
linked to the same C run-time (CRT) library? I linked my
|
||||
10. Why are you saying that ZLIB1.DLL and my application should
|
||||
be linked to the same C run-time (CRT) library? I linked my
|
||||
application and my DLLs to different C libraries (e.g. my
|
||||
application to a static library, and my DLLs to MSVCRT.DLL),
|
||||
and everything works fine.
|
||||
@ -255,11 +257,11 @@ in the zlib distribution, or at the following location:
|
||||
and DLLs are avoiding the corruption of each of the CRTs'
|
||||
internal states, maybe by careful design, or maybe by fortune.
|
||||
|
||||
Also note that linking ZLIB1.DLL to non-Microsoft CRTs (such
|
||||
as those provided by Borland) raises similar problems.
|
||||
Also note that linking ZLIB1.DLL to non-Microsoft CRTs, such
|
||||
as those provided by Borland, raises similar problems.
|
||||
|
||||
|
||||
10. Why are you linking ZLIB1.DLL to MSVCRT.DLL?
|
||||
11. Why are you linking ZLIB1.DLL to MSVCRT.DLL?
|
||||
|
||||
- MSVCRT.DLL exists on every Windows 95 with a new service pack
|
||||
installed, or with Microsoft Internet Explorer 4 or later, and
|
||||
@ -269,21 +271,14 @@ in the zlib distribution, or at the following location:
|
||||
software provider for free.
|
||||
|
||||
The fact that MSVCRT.DLL does not exist on a virgin Windows 95
|
||||
is not so problematic. The number of Windows 95 installations
|
||||
is rapidly decreasing, Microsoft stopped supporting it a long
|
||||
time ago, and many recent applications from various vendors,
|
||||
including Microsoft, do not even run on it. Furthermore, no
|
||||
serious user should run Windows 95 without a proper update
|
||||
installed.
|
||||
|
||||
There is also the fact that the mainstream C compilers for
|
||||
Windows are Microsoft Visual C++ 6.0, and gcc/MinGW. Both
|
||||
are producing executables that link to MSVCRT.DLL by default,
|
||||
without offering other dynamic CRTs as alternatives easy to
|
||||
select by users.
|
||||
is not so problematic. Windows 95 is scarcely found nowadays,
|
||||
Microsoft ended its support a long time ago, and many recent
|
||||
applications from various vendors, including Microsoft, do not
|
||||
even run on it. Furthermore, no serious user should run
|
||||
Windows 95 without a proper update installed.
|
||||
|
||||
|
||||
11. Why are you not linking ZLIB1.DLL to
|
||||
12. Why are you not linking ZLIB1.DLL to
|
||||
<<my favorite C run-time library>> ?
|
||||
|
||||
- We considered and abandoned the following alternatives:
|
||||
@ -294,27 +289,60 @@ in the zlib distribution, or at the following location:
|
||||
to a static C library, you may as well consider linking zlib
|
||||
in statically, too.
|
||||
|
||||
* Linking ZLIB1.DLL to CRTDLL.DLL looks very appealing,
|
||||
because CRTDLL.DLL is present on every Win32 installation.
|
||||
Unfortunately, it has a series of problems: it raises
|
||||
difficulties when using it with C++ code, it does not work
|
||||
with 64-bit file offsets, (and so on...), and Microsoft
|
||||
discontinued its support a long time ago.
|
||||
* Linking ZLIB1.DLL to CRTDLL.DLL looks appealing, because
|
||||
CRTDLL.DLL is present on every Win32 installation.
|
||||
Unfortunately, it has a series of problems: it does not
|
||||
work properly with Microsoft's C++ libraries, it does not
|
||||
provide support for 64-bit file offsets, (and so on...),
|
||||
and Microsoft discontinued its support a long time ago.
|
||||
|
||||
* Linking ZLIB1.DLL to MSVCR70.DLL, supplied with the
|
||||
Microsoft .NET platform and Visual C++ 7.0 or newer, is not
|
||||
a good option. Although it is available for free download
|
||||
and distribution, its presence is scarce on today's Win32
|
||||
installations. If it will ever become more popular than
|
||||
MSVCRT.DLL and will be pre-installed on the future Win32
|
||||
systems, we will probably think again about it.
|
||||
* Linking ZLIB1.DLL to MSVCR70.DLL or MSVCR71.DLL, supplied
|
||||
with the Microsoft .NET platform, and Visual C++ 7.0/7.1,
|
||||
raises problems related to the status of ZLIB1.DLL as a
|
||||
system component. According to the Microsoft Knowledge Base
|
||||
article KB326922 "INFO: Redistribution of the Shared C
|
||||
Runtime Component in Visual C++ .NET", MSVCR70.DLL and
|
||||
MSVCR71.DLL are not supposed to function as system DLLs,
|
||||
because they may clash with MSVCRT.DLL. Instead, the
|
||||
application's installer is supposed to put these DLLs
|
||||
(if needed) in the application's private directory.
|
||||
If ZLIB1.DLL depends on a non-system runtime, it cannot
|
||||
function as a redistributable system component.
|
||||
|
||||
* Linking ZLIB1.DLL to NTDLL.DLL is not possible.
|
||||
NTDLL.DLL exports only a part of the C library, and only on
|
||||
Windows NT systems.
|
||||
* Linking ZLIB1.DLL to non-Microsoft runtimes, such as
|
||||
Borland's, or Cygwin's, raises problems related to the
|
||||
reliable presence of these runtimes on Win32 systems.
|
||||
It's easier to let the DLL build of zlib up to the people
|
||||
who distribute these runtimes, and who may proceed as
|
||||
explained in the answer to Question 14.
|
||||
|
||||
|
||||
12. I need to link my own DLL build to a CRT different than
|
||||
13. If ZLIB1.DLL cannot be linked to MSVCR70.DLL or MSVCR71.DLL,
|
||||
how can I build/use ZLIB1.DLL in Microsoft Visual C++ 7.0
|
||||
(Visual Studio .NET) or newer?
|
||||
|
||||
- Due to the problems explained in the Microsoft Knowledge Base
|
||||
article KB326922 (see the previous answer), the C runtime that
|
||||
comes with the VC7 environment is no longer considered a
|
||||
system component. That is, it should not be assumed that this
|
||||
runtime exists, or may be installed in a system directory.
|
||||
Since ZLIB1.DLL is supposed to be a system component, it may
|
||||
not depend on a non-system component.
|
||||
|
||||
In order to link ZLIB1.DLL and your application to MSVCRT.DLL
|
||||
in VC7, you need the library of Visual C++ 6.0 or older. If
|
||||
you don't have this library at hand, it's probably best not to
|
||||
use ZLIB1.DLL.
|
||||
|
||||
We are hoping that, in the future, Microsoft will provide a
|
||||
way to build applications linked to a proper system runtime,
|
||||
from the Visual C++ environment. Until then, you have a
|
||||
couple of alternatives, such as linking zlib in statically.
|
||||
If your application requires dynamic linking, you may proceed
|
||||
as explained in the answer to Question 14.
|
||||
|
||||
|
||||
14. I need to link my own DLL build to a CRT different than
|
||||
MSVCRT.DLL. What can I do?
|
||||
|
||||
- Feel free to rebuild the DLL from the zlib sources, and link
|
||||
@ -330,7 +358,7 @@ in the zlib distribution, or at the following location:
|
||||
CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL.
|
||||
|
||||
|
||||
13. May I include additional pieces of code that I find useful,
|
||||
15. May I include additional pieces of code that I find useful,
|
||||
link them in ZLIB1.DLL, and export them?
|
||||
|
||||
- No. A legitimate build of ZLIB1.DLL must not include code
|
||||
@ -338,14 +366,12 @@ in the zlib distribution, or at the following location:
|
||||
But you can make your own private DLL build, under a different
|
||||
file name, as suggested in the previous answer.
|
||||
|
||||
For example, in Borland Delphi and C++ Builder, zlib is a part
|
||||
of the standard VCL library. If an application links to VCL
|
||||
dynamically, the name of the distributable binary (VCLxx.DLL)
|
||||
does not posess any danger of clashing with a legitimate but
|
||||
incompatible ZLIB1.DLL.
|
||||
For example, zlib is a part of the VCL library, distributed
|
||||
with Borland Delphi and C++ Builder. The DLL build of VCL
|
||||
is a redistributable file, named VCLxx.DLL.
|
||||
|
||||
|
||||
14. May I remove some functionality out of ZLIB1.DLL, by enabling
|
||||
16. May I remove some functionality out of ZLIB1.DLL, by enabling
|
||||
macros like NO_GZCOMPRESS or NO_GZIP at compile time?
|
||||
|
||||
- No. A legitimate build of ZLIB1.DLL must provide the complete
|
||||
@ -354,7 +380,7 @@ in the zlib distribution, or at the following location:
|
||||
different file name, as suggested in the previous answer.
|
||||
|
||||
|
||||
15. I made my own ZLIB1.DLL build. Can I test it for compliance?
|
||||
17. I made my own ZLIB1.DLL build. Can I test it for compliance?
|
||||
|
||||
- We prefer that you download the official DLL from the zlib
|
||||
web site. If you need something peculiar from this DLL, you
|
||||
|
@ -5,8 +5,8 @@ VS_VERSION_INFO VERSIONINFO
|
||||
#else
|
||||
VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
|
||||
#endif
|
||||
FILEVERSION 1,2,1,0
|
||||
PRODUCTVERSION 1,2,1,0
|
||||
FILEVERSION 1,2,2,0
|
||||
PRODUCTVERSION 1,2,2,0
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 1
|
||||
@ -23,12 +23,12 @@ BEGIN
|
||||
//language ID = U.S. English, char set = Windows, Multilingual
|
||||
BEGIN
|
||||
VALUE "FileDescription", "zlib data compression library\0"
|
||||
VALUE "FileVersion", "1.2.1\0"
|
||||
VALUE "FileVersion", "1.2.3\0"
|
||||
VALUE "InternalName", "zlib1.dll\0"
|
||||
VALUE "LegalCopyright", "(C) 1995-2003 Jean-loup Gailly & Mark Adler\0"
|
||||
VALUE "LegalCopyright", "(C) 1995-2004 Jean-loup Gailly & Mark Adler\0"
|
||||
VALUE "OriginalFilename", "zlib1.dll\0"
|
||||
VALUE "ProductName", "zlib\0"
|
||||
VALUE "ProductVersion", "1.2.1\0"
|
||||
VALUE "ProductVersion", "1.2.3\0"
|
||||
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
|
||||
END
|
||||
END
|
||||
|
Loading…
x
Reference in New Issue
Block a user