From 79fbcdc939b5d515218187a0d5f2526fb632075a Mon Sep 17 00:00:00 2001 From: Mark Adler Date: Fri, 9 Sep 2011 23:24:02 -0700 Subject: [PATCH] zlib 1.2.2 --- ChangeLog | 9 + FAQ | 2 +- INDEX | 2 +- Makefile | 2 +- Makefile.in | 2 +- README | 4 +- as400/compile.clp | 2 +- as400/readme.txt | 2 +- as400/zlib.inc | 6 +- contrib/README.contrib | 10 +- contrib/ada/readme.txt | 12 +- contrib/ada/zlib-streams.adb | 2 +- contrib/ada/zlib-streams.ads | 2 +- contrib/ada/zlib.gpr | 41 ++- contrib/dotzlib/DotZLib.build | 33 +++ contrib/dotzlib/DotZLib.chm | Bin 0 -> 72728 bytes contrib/dotzlib/DotZLib.sln | 21 ++ contrib/dotzlib/DotZLib/AssemblyInfo.cs | 58 +++++ contrib/dotzlib/DotZLib/ChecksumImpl.cs | 202 +++++++++++++++ contrib/dotzlib/DotZLib/CircularBuffer.cs | 83 ++++++ contrib/dotzlib/DotZLib/CodecBase.cs | 198 ++++++++++++++ contrib/dotzlib/DotZLib/Deflater.cs | 106 ++++++++ contrib/dotzlib/DotZLib/DotZLib.cs | 288 +++++++++++++++++++++ contrib/dotzlib/DotZLib/DotZLib.csproj | 141 ++++++++++ contrib/dotzlib/DotZLib/GZipStream.cs | 301 ++++++++++++++++++++++ contrib/dotzlib/DotZLib/Inflater.cs | 105 ++++++++ contrib/dotzlib/DotZLib/UnitTests.cs | 274 ++++++++++++++++++++ contrib/dotzlib/LICENSE_1_0.txt | 23 ++ contrib/dotzlib/readme.txt | 58 +++++ contrib/gzappend/gzappend.c | 4 +- contrib/infback9/infback9.c | 4 +- contrib/infback9/inftree9.c | 4 +- contrib/minizip/ioapi.c | 4 +- contrib/minizip/miniunz.c | 4 +- contrib/minizip/mztools.c | 30 +-- contrib/minizip/mztools.h | 8 +- contrib/minizip/unzip.c | 10 +- contrib/minizip/zip.c | 6 +- contrib/untgz/untgz.c | 2 +- contrib/vstudio/vc7/zlib.rc | 6 +- crc32.c | 88 +++---- deflate.c | 4 +- gzio.c | 8 +- infback.c | 4 +- inflate.c | 5 +- inftrees.c | 4 +- old/README | 2 +- {contrib => old}/visual-basic.txt | 0 projects/visualc6/zlib.dsp | 136 +++++++--- qnx/package.qpg | 10 +- win32/DLL_FAQ.txt | 12 +- win32/VisualC.txt | 3 + win32/zlib1.rc | 8 +- zlib.3 | 4 +- zlib.h | 24 +- 55 files changed, 2178 insertions(+), 205 deletions(-) create mode 100644 contrib/dotzlib/DotZLib.build create mode 100644 contrib/dotzlib/DotZLib.chm create mode 100644 contrib/dotzlib/DotZLib.sln create mode 100644 contrib/dotzlib/DotZLib/AssemblyInfo.cs create mode 100644 contrib/dotzlib/DotZLib/ChecksumImpl.cs create mode 100644 contrib/dotzlib/DotZLib/CircularBuffer.cs create mode 100644 contrib/dotzlib/DotZLib/CodecBase.cs create mode 100644 contrib/dotzlib/DotZLib/Deflater.cs create mode 100644 contrib/dotzlib/DotZLib/DotZLib.cs create mode 100644 contrib/dotzlib/DotZLib/DotZLib.csproj create mode 100644 contrib/dotzlib/DotZLib/GZipStream.cs create mode 100644 contrib/dotzlib/DotZLib/Inflater.cs create mode 100644 contrib/dotzlib/DotZLib/UnitTests.cs create mode 100644 contrib/dotzlib/LICENSE_1_0.txt create mode 100644 contrib/dotzlib/readme.txt rename {contrib => old}/visual-basic.txt (100%) create mode 100644 win32/VisualC.txt diff --git a/ChangeLog b/ChangeLog index 26e551e..d60b6d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,15 @@ ChangeLog file for zlib +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + Changes in 1.2.1.2 (9 September 2004) - Update INDEX file - Fix trees.c to update strm->data_type (no one ever noticed!) diff --git a/FAQ b/FAQ index 578dbc2..4f61f10 100644 --- a/FAQ +++ b/FAQ @@ -117,7 +117,7 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib generates an error such as: - ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: + ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: symbol __register_frame_info: referenced symbol not found The symbol __register_frame_info is not part of zlib, it is generated by diff --git a/INDEX b/INDEX index 331b56b..0587e59 100644 --- a/INDEX +++ b/INDEX @@ -8,7 +8,7 @@ algorithm.txt description of the (de)compression algorithm configure configure script for Unix zconf.in.h template for zconf.h (used by configure) -amiga/ makefiles for Amiga SAS C +amiga/ makefiles for Amiga SAS C as400/ makefiles for IBM AS/400 msdos/ makefiles for MSDOS old/ makefiles for various architectures and zlib documentation diff --git a/Makefile b/Makefile index 9f04797..a29e9bc 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ CPP=$(CC) -E LIBS=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.1.2 +SHAREDLIBV=libz.so.1.2.2 SHAREDLIBM=libz.so.1 AR=ar rc diff --git a/Makefile.in b/Makefile.in index 9f04797..a29e9bc 100644 --- a/Makefile.in +++ b/Makefile.in @@ -30,7 +30,7 @@ CPP=$(CC) -E LIBS=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.1.2 +SHAREDLIBV=libz.so.1.2.2 SHAREDLIBM=libz.so.1 AR=ar rc diff --git a/README b/README index 48f44e2..df95ae1 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.1.2 is a general purpose data compression library. All the code is +zlib 1.2.2 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) @@ -34,7 +34,7 @@ Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available in http://dogma.net/markn/articles/zlibtool/zlibtool.htm -The changes made in version 1.2.1.2 are documented in the file ChangeLog. +The changes made in version 1.2.2 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory "contrib". diff --git a/as400/compile.clp b/as400/compile.clp index dcd2421..3c47bb4 100644 --- a/as400/compile.clp +++ b/as400/compile.clp @@ -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.2') TGTRLS(V4R4M0) ENDPGM diff --git a/as400/readme.txt b/as400/readme.txt index eef7cb2..27ca676 100644 --- a/as400/readme.txt +++ b/as400/readme.txt @@ -1,4 +1,4 @@ - ZLIB version 1.2.1 for AS400 installation instructions + ZLIB version 1.2.2 for AS400 installation instructions I) From an AS400 *SAVF file: diff --git a/as400/zlib.inc b/as400/zlib.inc index bb24691..e31e1a7 100644 --- a/as400/zlib.inc +++ b/as400/zlib.inc @@ -1,7 +1,7 @@ * ZLIB.INC - Interface to the general purpose compression library * * ILE RPG400 version by Patrick Monnerat, DATASPHERE. - * Version 1.2.1.2 + * Version 1.2.2 * * * WARNING: @@ -20,8 +20,8 @@ * Constants ************************************************************************** * - D ZLIB_VERSION C '1.2.1.2' Header's version - D ZLIB_VERNUM C X'1212' + D ZLIB_VERSION C '1.2.2' Header's version + D ZLIB_VERNUM C X'1220' * D Z_NO_FLUSH C 0 D Z_SYNC_FLUSH C 2 diff --git a/contrib/README.contrib b/contrib/README.contrib index eae15aa..7778980 100644 --- a/contrib/README.contrib +++ b/contrib/README.contrib @@ -19,6 +19,9 @@ blast/ by Mark Adler delphi/ by Cosmin Truta Support for Delphi and C++ Builder +dotzlib/ by Henrik Ravn + Support for Microsoft .Net and Visual C++ .Net + gzappend/ by Mark Adler append to a gzip file -- illustrates the use of Z_BLOCK @@ -60,11 +63,8 @@ puff/ by Mark Adler testzlib/ by Gilles Vollant Example of the use of zlib -untgz/ by "Pedro A. Aranda Guti\irrez" +untgz/ by Pedro A. Aranda Gutierrez A very simple tar.gz file extractor using zlib -visual-basic.txt by Carlos Rios - How to use compress(), uncompress() and the gz* functions from VB - vstudio/ by Gilles Vollant - Building a minizip-enhanced zlib with Visual Studio .NET + Building a minizip-enhanced zlib with Microsoft Visual Studio diff --git a/contrib/ada/readme.txt b/contrib/ada/readme.txt index dec7ef3..ce4d2ca 100644 --- a/contrib/ada/readme.txt +++ b/contrib/ada/readme.txt @@ -1,12 +1,12 @@ - ZLib for Ada thick binding (ZLib.Ada) - Release 1.3 + 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.2: + Here are the main changes since ZLib.Ada 1.2: - Attension: ZLib.Read generic routine have a initialization requirement for Read_Last parameter now. It is a bit incompartible with previous version, @@ -28,7 +28,7 @@ It provides Ada-style access to the ZLib C library. - 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 @@ -41,7 +41,7 @@ Or use the GNAT project file build for GNAT 3.15 or later: gnatmake -Pzlib.gpr -L - 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. @@ -51,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. diff --git a/contrib/ada/zlib-streams.adb b/contrib/ada/zlib-streams.adb index 398664a..b6497ba 100644 --- a/contrib/ada/zlib-streams.adb +++ b/contrib/ada/zlib-streams.adb @@ -222,4 +222,4 @@ package body ZLib.Streams is return Total_Out (Stream.Writer); end Write_Total_Out; -end ZLib.Streams; \ No newline at end of file +end ZLib.Streams; diff --git a/contrib/ada/zlib-streams.ads b/contrib/ada/zlib-streams.ads index 5c68667..f0193c6 100644 --- a/contrib/ada/zlib-streams.ads +++ b/contrib/ada/zlib-streams.ads @@ -111,4 +111,4 @@ private Writer : Filter_Type; end record; -end ZLib.Streams; \ No newline at end of file +end ZLib.Streams; diff --git a/contrib/ada/zlib.gpr b/contrib/ada/zlib.gpr index 88f51cc..296b22a 100644 --- a/contrib/ada/zlib.gpr +++ b/contrib/ada/zlib.gpr @@ -1,21 +1,20 @@ -project Zlib is - - for Languages use ("Ada"); - for Source_Dirs use ("."); - for Object_Dir use "."; - for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo"); - - package Compiler is - for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst"); - end Compiler; - - package Linker is - for Default_Switches ("ada") use ("-lz"); - end Linker; - - package Builder is - for Default_Switches ("ada") use ("-s", "-gnatQ"); - end Builder; - -end Zlib; - +project Zlib is + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Object_Dir use "."; + for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo"); + + package Compiler is + for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst"); + end Compiler; + + package Linker is + for Default_Switches ("ada") use ("-lz"); + end Linker; + + package Builder is + for Default_Switches ("ada") use ("-s", "-gnatQ"); + end Builder; + +end Zlib; diff --git a/contrib/dotzlib/DotZLib.build b/contrib/dotzlib/DotZLib.build new file mode 100644 index 0000000..ed19cc9 --- /dev/null +++ b/contrib/dotzlib/DotZLib.build @@ -0,0 +1,33 @@ + + + A .Net wrapper library around ZLib1.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contrib/dotzlib/DotZLib.chm b/contrib/dotzlib/DotZLib.chm new file mode 100644 index 0000000000000000000000000000000000000000..0bc7df76e407dcc69094483a6e9507240fe257ab GIT binary patch literal 72728 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 literal 0 HcmV?d00001 diff --git a/contrib/dotzlib/DotZLib.sln b/contrib/dotzlib/DotZLib.sln new file mode 100644 index 0000000..ac45ca0 --- /dev/null +++ b/contrib/dotzlib/DotZLib.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotZLib", "DotZLib\DotZLib.csproj", "{BB1EE0B1-1808-46CB-B786-949D91117FC5}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.ActiveCfg = Debug|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.Build.0 = Debug|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.ActiveCfg = Release|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.Build.0 = Release|.NET + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/contrib/dotzlib/DotZLib/AssemblyInfo.cs b/contrib/dotzlib/DotZLib/AssemblyInfo.cs new file mode 100644 index 0000000..6fc0fdc --- /dev/null +++ b/contrib/dotzlib/DotZLib/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("DotZLib")] +[assembly: AssemblyDescription(".Net bindings for ZLib compression dll 1.2.x")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Henrik Ravn")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 by Henrik Ravn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/contrib/dotzlib/DotZLib/ChecksumImpl.cs new file mode 100644 index 0000000..dfe7e90 --- /dev/null +++ b/contrib/dotzlib/DotZLib/ChecksumImpl.cs @@ -0,0 +1,202 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + #region ChecksumGeneratorBase + /// + /// Implements the common functionality needed for all s + /// + /// + public abstract class ChecksumGeneratorBase : ChecksumGenerator + { + /// + /// The value of the current checksum + /// + protected uint _current; + + /// + /// Initializes a new instance of the checksum generator base - the current checksum is + /// set to zero + /// + public ChecksumGeneratorBase() + { + _current = 0; + } + + /// + /// Initializes a new instance of the checksum generator basewith a specified value + /// + /// The value to set the current checksum to + public ChecksumGeneratorBase(uint initialValue) + { + _current = initialValue; + } + + /// + /// Resets the current checksum to zero + /// + public void Reset() { _current = 0; } + + /// + /// Gets the current checksum value + /// + public uint Value { get { return _current; } } + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + /// All the other Update methods are implmeneted in terms of this one. + /// This is therefore the only method a derived class has to implement + public abstract void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with an array of bytes. + /// + /// The data to update the checksum with + public void Update(byte[] data) + { + Update(data, 0, data.Length); + } + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + public void Update(string data) + { + Update(Encoding.UTF8.GetBytes(data)); + } + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + public void Update(string data, Encoding encoding) + { + Update(encoding.GetBytes(data)); + } + + } + #endregion + + #region CRC32 + /// + /// Implements a CRC32 checksum generator + /// + public sealed class CRC32Checksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint crc32(uint crc, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the CRC32 checksum generator + /// + public CRC32Checksum() : base() {} + + /// + /// Initializes a new instance of the CRC32 checksum generator with a specified value + /// + /// The value to set the current checksum to + public CRC32Checksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + + #region Adler + /// + /// Implements a checksum generator that computes the Adler checksum on data + /// + public sealed class AdlerChecksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint adler32(uint adler, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the Adler checksum generator + /// + public AdlerChecksum() : base() {} + + /// + /// Initializes a new instance of the Adler checksum generator with a specified value + /// + /// The value to set the current checksum to + public AdlerChecksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + +} \ No newline at end of file diff --git a/contrib/dotzlib/DotZLib/CircularBuffer.cs b/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 0000000..16997e9 --- /dev/null +++ b/contrib/dotzlib/DotZLib/CircularBuffer.cs @@ -0,0 +1,83 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; + +namespace DotZLib +{ + + /// + /// This class implements a circular buffer + /// + internal class CircularBuffer + { + #region Private data + private int _capacity; + private int _head; + private int _tail; + private int _size; + private byte[] _buffer; + #endregion + + public CircularBuffer(int capacity) + { + Debug.Assert( capacity > 0 ); + _buffer = new byte[capacity]; + _capacity = capacity; + _head = 0; + _tail = 0; + _size = 0; + } + + public int Size { get { return _size; } } + + public int Put(byte[] source, int offset, int count) + { + Debug.Assert( count > 0 ); + int trueCount = Math.Min(count, _capacity - Size); + for (int i = 0; i < trueCount; ++i) + _buffer[(_tail+i) % _capacity] = source[offset+i]; + _tail += trueCount; + _tail %= _capacity; + _size += trueCount; + return trueCount; + } + + public bool Put(byte b) + { + if (Size == _capacity) // no room + return false; + _buffer[_tail++] = b; + _tail %= _capacity; + ++_size; + return true; + } + + public int Get(byte[] destination, int offset, int count) + { + int trueCount = Math.Min(count,Size); + for (int i = 0; i < trueCount; ++i) + destination[offset + i] = _buffer[(_head+i) % _capacity]; + _head += trueCount; + _head %= _capacity; + _size -= trueCount; + return trueCount; + } + + public int Get() + { + if (Size == 0) + return -1; + + int result = (int)_buffer[_head++ % _capacity]; + --_size; + return result; + } + + } +} diff --git a/contrib/dotzlib/DotZLib/CodecBase.cs b/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 0000000..954db7d --- /dev/null +++ b/contrib/dotzlib/DotZLib/CodecBase.cs @@ -0,0 +1,198 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements the common functionality needed for all s + /// + public abstract class CodecBase : Codec, IDisposable + { + + #region Data members + + /// + /// Instance of the internal zlib buffer structure that is + /// passed to all functions in the zlib dll + /// + internal ZStream _ztream = new ZStream(); + + /// + /// True if the object instance has been disposed, false otherwise + /// + protected bool _isDisposed = false; + + /// + /// The size of the internal buffers + /// + protected const int kBufferSize = 16384; + + private byte[] _outBuffer = new byte[kBufferSize]; + private byte[] _inBuffer = new byte[kBufferSize]; + + private GCHandle _hInput; + private GCHandle _hOutput; + + private uint _checksum = 0; + + #endregion + + /// + /// Initializes a new instance of the CodeBase class. + /// + public CodecBase() + { + try + { + _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); + _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); + } + catch (Exception) + { + CleanUp(false); + throw; + } + } + + + #region Codec Members + + /// + /// Occurs when more processed data are available. + /// + public event DataAvailableHandler DataAvailable; + + /// + /// Fires the event + /// + protected void OnDataAvailable() + { + if (_ztream.total_out > 0) + { + if (DataAvailable != null) + DataAvailable( _outBuffer, 0, (int)_ztream.total_out); + resetOutput(); + } + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + public void Add(byte[] data) + { + Add(data,0,data.Length); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + /// This must be implemented by a derived class + public abstract void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + /// This must be implemented by a derived class + public abstract void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + public uint Checksum { get { return _checksum; } } + + #endregion + + #region Destructor & IDisposable stuff + + /// + /// Destroys this instance + /// + ~CodecBase() + { + CleanUp(false); + } + + /// + /// Releases any unmanaged resources and calls the method of the derived class + /// + public void Dispose() + { + CleanUp(true); + } + + /// + /// Performs any codec specific cleanup + /// + /// This must be implemented by a derived class + protected abstract void CleanUp(); + + // performs the release of the handles and calls the dereived CleanUp() + private void CleanUp(bool isDisposing) + { + if (!_isDisposed) + { + CleanUp(); + if (_hInput.IsAllocated) + _hInput.Free(); + if (_hOutput.IsAllocated) + _hOutput.Free(); + + _isDisposed = true; + } + } + + + #endregion + + #region Helper methods + + /// + /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// + /// The byte array that contains the data to copy + /// The index of the first byte to copy + /// The number of bytes to copy from data + protected void copyInput(byte[] data, int startIndex, int count) + { + Array.Copy(data, startIndex, _inBuffer,0, count); + _ztream.next_in = _hInput.AddrOfPinnedObject(); + _ztream.total_in = 0; + _ztream.avail_in = (uint)count; + + } + + /// + /// Resets the internal output buffers to a known state - ready for processing + /// + protected void resetOutput() + { + _ztream.total_out = 0; + _ztream.avail_out = kBufferSize; + _ztream.next_out = _hOutput.AddrOfPinnedObject(); + } + + /// + /// Updates the running checksum property + /// + /// The new checksum value + protected void setChecksum(uint newSum) + { + _checksum = newSum; + } + #endregion + + } +} diff --git a/contrib/dotzlib/DotZLib/Deflater.cs b/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 0000000..d7b8dcc --- /dev/null +++ b/contrib/dotzlib/DotZLib/Deflater.cs @@ -0,0 +1,106 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data compressor, using the deflate algorithm in the ZLib dll + /// + public sealed class Deflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Deflater + /// + /// The compression level to use for this Deflater + public Deflater(CompressLevel level) : base() + { + int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize deflater"); + + resetOutput(); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + while (err >= 0 && _ztream.avail_in > 0) + { + err = deflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = deflate(ref _ztream, (int)FlushTypes.None); + } + inputIndex += (int)_ztream.total_in; + } + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = deflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + deflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib deflate stream + /// + protected override void CleanUp() { deflateEnd(ref _ztream); } + + } +} diff --git a/contrib/dotzlib/DotZLib/DotZLib.cs b/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 0000000..410deb0 --- /dev/null +++ b/contrib/dotzlib/DotZLib/DotZLib.cs @@ -0,0 +1,288 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + + #region Internal types + + /// + /// Defines constants for the various flush types used with zlib + /// + internal enum FlushTypes + { + None, Partial, Sync, Full, Finish, Block + } + + #region ZStream structure + // internal mapping of the zlib zstream structure for marshalling + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + internal struct ZStream + { + public IntPtr next_in; + public uint avail_in; + public uint total_in; + + public IntPtr next_out; + public uint avail_out; + public uint total_out; + + [MarshalAs(UnmanagedType.LPStr)] + string msg; + uint state; + + uint zalloc; + uint zfree; + uint opaque; + + int data_type; + public uint adler; + uint reserved; + } + + #endregion + + #endregion + + #region Public enums + /// + /// Defines constants for the available compression levels in zlib + /// + public enum CompressLevel : int + { + /// + /// The default compression level with a reasonable compromise between compression and speed + /// + Default = -1, + /// + /// No compression at all. The data are passed straight through. + /// + None = 0, + /// + /// The maximum compression rate available. + /// + Best = 9, + /// + /// The fastest available compression level. + /// + Fastest = 1 + } + #endregion + + #region Exception classes + /// + /// The exception that is thrown when an error occurs on the zlib dll + /// + public class ZLibException : ApplicationException + { + /// + /// Initializes a new instance of the class with a specified + /// error message and error code + /// + /// The zlib error code that caused the exception + /// A message that (hopefully) describes the error + public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg)) + { + } + + /// + /// Initializes a new instance of the class with a specified + /// error code + /// + /// The zlib error code that caused the exception + public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode)) + { + } + } + #endregion + + #region Interfaces + + /// + /// Declares methods and properties that enables a running checksum to be calculated + /// + public interface ChecksumGenerator + { + /// + /// Gets the current value of the checksum + /// + uint Value { get; } + + /// + /// Clears the current checksum to 0 + /// + void Reset(); + + /// + /// Updates the current checksum with an array of bytes + /// + /// The data to update the checksum with + void Update(byte[] data); + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + void Update(string data); + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + void Update(string data, Encoding encoding); + } + + + /// + /// Represents the method that will be called from a codec when new data + /// are available. + /// + /// The byte array containing the processed data + /// The index of the first processed byte in data + /// The number of processed bytes available + /// On return from this method, the data may be overwritten, so grab it while you can. + /// You cannot assume that startIndex will be zero. + /// + public delegate void DataAvailableHandler(byte[] data, int startIndex, int count); + + /// + /// Declares methods and events for implementing compressors/decompressors + /// + public interface Codec + { + /// + /// Occurs when more processed data are available. + /// + event DataAvailableHandler DataAvailable; + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data); + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + uint Checksum { get; } + + + } + + #endregion + + #region Classes + /// + /// Encapsulates general information about the ZLib library + /// + public class Info + { + #region DLL imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint zlibCompileFlags(); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern string zlibVersion(); + #endregion + + #region Private stuff + private uint _flags; + + // helper function that unpacks a bitsize mask + private static int bitSize(uint bits) + { + switch (bits) + { + case 0: return 16; + case 1: return 32; + case 2: return 64; + } + return -1; + } + #endregion + + /// + /// Constructs an instance of the Info class. + /// + public Info() + { + _flags = zlibCompileFlags(); + } + + /// + /// True if the library is compiled with debug info + /// + public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } } + + /// + /// True if the library is compiled with assembly optimizations + /// + public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } } + + /// + /// Gets the size of the unsigned int that was compiled into Zlib + /// + public int SizeOfUInt { get { return bitSize(_flags & 3); } } + + /// + /// Gets the size of the unsigned long that was compiled into Zlib + /// + public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } } + + /// + /// Gets the size of the pointers that were compiled into Zlib + /// + public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } } + + /// + /// Gets the size of the z_off_t type that was compiled into Zlib + /// + public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } } + + /// + /// Gets the version of ZLib as a string, e.g. "1.2.1" + /// + public static string Version { get { return zlibVersion(); } } + } + + #endregion + +} diff --git a/contrib/dotzlib/DotZLib/DotZLib.csproj b/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 0000000..71eeb85 --- /dev/null +++ b/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/dotzlib/DotZLib/GZipStream.cs b/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 0000000..f861675 --- /dev/null +++ b/contrib/dotzlib/DotZLib/GZipStream.cs @@ -0,0 +1,301 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements a compressed , in GZip (.gz) format. + /// + public class GZipStream : Stream, IDisposable + { + #region Dll Imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern IntPtr gzopen(string name, string mode); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzclose(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzwrite(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzread(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzgetc(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzputc(IntPtr gzFile, int c); + + #endregion + + #region Private data + private IntPtr _gzFile; + private bool _isDisposed = false; + private bool _isWriting; + #endregion + + #region Constructors + /// + /// Creates a new file as a writeable GZipStream + /// + /// The name of the compressed file to create + /// The compression level to use when adding data + /// If an error occurred in the internal zlib function + public GZipStream(string fileName, CompressLevel level) + { + _isWriting = true; + _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + } + + /// + /// Opens an existing file as a readable GZipStream + /// + /// The name of the file to open + /// If an error occurred in the internal zlib function + public GZipStream(string fileName) + { + _isWriting = false; + _gzFile = gzopen(fileName, "rb"); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + + } + #endregion + + #region Access properties + /// + /// Returns true of this stream can be read from, false otherwise + /// + public override bool CanRead + { + get + { + return !_isWriting; + } + } + + + /// + /// Returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Returns true if this tsream is writeable, false otherwise + /// + public override bool CanWrite + { + get + { + return _isWriting; + } + } + #endregion + + #region Destructor & IDispose stuff + + /// + /// Destroys this instance + /// + ~GZipStream() + { + cleanUp(false); + } + + /// + /// Closes the external file handle + /// + public void Dispose() + { + cleanUp(true); + } + + // Does the actual closing of the file handle. + private void cleanUp(bool isDisposing) + { + if (!_isDisposed) + { + gzclose(_gzFile); + _isDisposed = true; + } + } + #endregion + + #region Basic reading and writing + /// + /// Attempts to read a number of bytes from the stream. + /// + /// The destination data buffer + /// The index of the first destination byte in buffer + /// The number of bytes requested + /// The number of bytes read + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not readable. + /// If this stream has been disposed. + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + int result; + try + { + result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + return result; + } + + /// + /// Attempts to read a single byte from the stream. + /// + /// The byte that was read, or -1 in case of error or End-Of-File + public override int ReadByte() + { + if (!CanRead) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + return gzgetc(_gzFile); + } + + /// + /// Writes a number of bytes to the stream + /// + /// + /// + /// + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void Write(byte[] buffer, int offset, int count) + { + if (!CanWrite) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + } + + /// + /// Writes a single byte to the stream + /// + /// The byte to add to the stream. + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void WriteByte(byte value) + { + if (!CanWrite) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + int result = gzputc(_gzFile, (int)value); + if (result < 0) + throw new IOException(); + } + #endregion + + #region Position & length stuff + /// + /// Not supported. + /// + /// + /// Always thrown + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Not suppported. + /// + /// + /// + /// + /// Always thrown + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Flushes the GZipStream. + /// + /// In this implementation, this method does nothing. This is because excessive + /// flushing may degrade the achievable compression rates. + public override void Flush() + { + // left empty on purpose + } + + /// + /// Gets/sets the current position in the GZipStream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + /// + /// Gets the size of the stream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + #endregion + } +} diff --git a/contrib/dotzlib/DotZLib/Inflater.cs b/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 0000000..4e60cda --- /dev/null +++ b/contrib/dotzlib/DotZLib/Inflater.cs @@ -0,0 +1,105 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data decompressor, using the inflate algorithm in the ZLib dll + /// + public class Inflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int inflateInit_(ref ZStream sz, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Inflater + /// + public Inflater() : base() + { + int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize inflater"); + + resetOutput(); + } + + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + err = inflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = inflate(ref _ztream, (int)FlushTypes.None); + } + + inputIndex += (int)_ztream.total_in; + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = inflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + inflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib inflate stream + /// + protected override void CleanUp() { inflateEnd(ref _ztream); } + + + } +} diff --git a/contrib/dotzlib/DotZLib/UnitTests.cs b/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 0000000..2f374b6 --- /dev/null +++ b/contrib/dotzlib/DotZLib/UnitTests.cs @@ -0,0 +1,274 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Collections; +using System.IO; + +// uncomment the define below to include unit tests +//#define nunit +#if nunit +using NUnit.Framework; + +// Unit tests for the DotZLib class library +// ---------------------------------------- +// +// Use this with NUnit 2 from http://www.nunit.org +// + +namespace DotZLibTests +{ + using DotZLib; + + // helper methods + internal class Utils + { + public static bool byteArrEqual( byte[] lhs, byte[] rhs ) + { + if (lhs.Length != rhs.Length) + return false; + for (int i = lhs.Length-1; i >= 0; --i) + if (lhs[i] != rhs[i]) + return false; + return true; + } + + } + + + [TestFixture] + public class CircBufferTests + { + #region Circular buffer tests + [Test] + public void SinglePutGet() + { + CircularBuffer buf = new CircularBuffer(10); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + + Assert.IsTrue(buf.Put( 1 )); + Assert.AreEqual( 1, buf.Size ); + Assert.AreEqual( 1, buf.Get() ); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + } + + [Test] + public void BlockPutGet() + { + CircularBuffer buf = new CircularBuffer(10); + byte[] arr = {1,2,3,4,5,6,7,8,9,10}; + Assert.AreEqual( 10, buf.Put(arr,0,10) ); + Assert.AreEqual( 10, buf.Size ); + Assert.IsFalse( buf.Put(11) ); + Assert.AreEqual( 1, buf.Get() ); + Assert.IsTrue( buf.Put(11) ); + + byte[] arr2 = (byte[])arr.Clone(); + Assert.AreEqual( 9, buf.Get(arr2,1,9) ); + Assert.IsTrue( Utils.byteArrEqual(arr,arr2) ); + } + + #endregion + } + + [TestFixture] + public class ChecksumTests + { + #region CRC32 Tests + [Test] + public void CRC32_Null() + { + CRC32Checksum crc32 = new CRC32Checksum(); + Assert.AreEqual( 0, crc32.Value ); + + crc32 = new CRC32Checksum(1); + Assert.AreEqual( 1, crc32.Value ); + + crc32 = new CRC32Checksum(556); + Assert.AreEqual( 556, crc32.Value ); + } + + [Test] + public void CRC32_Data() + { + CRC32Checksum crc32 = new CRC32Checksum(); + byte[] data = { 1,2,3,4,5,6,7 }; + crc32.Update(data); + Assert.AreEqual( 0x70e46888, crc32.Value ); + + crc32 = new CRC32Checksum(); + crc32.Update("penguin"); + Assert.AreEqual( 0x0e5c1a120, crc32.Value ); + + crc32 = new CRC32Checksum(1); + crc32.Update("penguin"); + Assert.AreEqual(0x43b6aa94, crc32.Value); + + } + #endregion + + #region Adler tests + + [Test] + public void Adler_Null() + { + AdlerChecksum adler = new AdlerChecksum(); + Assert.AreEqual(0, adler.Value); + + adler = new AdlerChecksum(1); + Assert.AreEqual( 1, adler.Value ); + + adler = new AdlerChecksum(556); + Assert.AreEqual( 556, adler.Value ); + } + + [Test] + public void Adler_Data() + { + AdlerChecksum adler = new AdlerChecksum(1); + byte[] data = { 1,2,3,4,5,6,7 }; + adler.Update(data); + Assert.AreEqual( 0x5b001d, adler.Value ); + + adler = new AdlerChecksum(); + adler.Update("penguin"); + Assert.AreEqual(0x0bcf02f6, adler.Value ); + + adler = new AdlerChecksum(1); + adler.Update("penguin"); + Assert.AreEqual(0x0bd602f7, adler.Value); + + } + #endregion + } + + [TestFixture] + public class InfoTests + { + #region Info tests + [Test] + public void Info_Version() + { + Info info = new Info(); + Assert.AreEqual("1.2.2", Info.Version); + Assert.AreEqual(32, info.SizeOfUInt); + Assert.AreEqual(32, info.SizeOfULong); + Assert.AreEqual(32, info.SizeOfPointer); + Assert.AreEqual(32, info.SizeOfOffset); + } + #endregion + } + + [TestFixture] + public class DeflateInflateTests + { + #region Deflate tests + [Test] + public void Deflate_Init() + { + using (Deflater def = new Deflater(CompressLevel.Default)) + { + } + } + + private ArrayList compressedData = new ArrayList(); + private uint adler1; + + private ArrayList uncompressedData = new ArrayList(); + private uint adler2; + + public void CDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + compressedData.Add(data[i+startIndex]); + } + + [Test] + public void Deflate_Compress() + { + compressedData.Clear(); + + byte[] testData = new byte[35000]; + for (int i = 0; i < testData.Length; ++i) + testData[i] = 5; + + using (Deflater def = new Deflater((CompressLevel)5)) + { + def.DataAvailable += new DataAvailableHandler(CDataAvail); + def.Add(testData); + def.Finish(); + adler1 = def.Checksum; + } + } + #endregion + + #region Inflate tests + [Test] + public void Inflate_Init() + { + using (Inflater inf = new Inflater()) + { + } + } + + private void DDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + uncompressedData.Add(data[i+startIndex]); + } + + [Test] + public void Inflate_Expand() + { + uncompressedData.Clear(); + + using (Inflater inf = new Inflater()) + { + inf.DataAvailable += new DataAvailableHandler(DDataAvail); + inf.Add((byte[])compressedData.ToArray(typeof(byte))); + inf.Finish(); + adler2 = inf.Checksum; + } + Assert.AreEqual( adler1, adler2 ); + } + #endregion + } + + [TestFixture] + public class GZipStreamTests + { + #region GZipStream test + [Test] + public void GZipStream_WriteRead() + { + using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best)) + { + BinaryWriter writer = new BinaryWriter(gzOut); + writer.Write("hi there"); + writer.Write(Math.PI); + writer.Write(42); + } + + using (GZipStream gzIn = new GZipStream("gzstream.gz")) + { + BinaryReader reader = new BinaryReader(gzIn); + string s = reader.ReadString(); + Assert.AreEqual("hi there",s); + double d = reader.ReadDouble(); + Assert.AreEqual(Math.PI, d); + int i = reader.ReadInt32(); + Assert.AreEqual(42,i); + } + + } + #endregion + } +} + +#endif \ No newline at end of file diff --git a/contrib/dotzlib/LICENSE_1_0.txt b/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 0000000..30aac2c --- /dev/null +++ b/contrib/dotzlib/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/contrib/dotzlib/readme.txt b/contrib/dotzlib/readme.txt new file mode 100644 index 0000000..210f4b0 --- /dev/null +++ b/contrib/dotzlib/readme.txt @@ -0,0 +1,58 @@ +This directory contains a .Net wrapper class library for the ZLib1.dll + +The wrapper includes support for inflating/deflating memory buffers, +.Net streaming wrappers for the gz streams part of zlib, and wrappers +for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples. + +Directory structure: +-------------------- + +LICENSE_1_0.txt - License file. +readme.txt - This file. +DotZLib.chm - Class library documentation +DotZLib.build - NAnt build file +DotZLib.sln - Microsoft Visual Studio 2003 solution file + +DotZLib\*.cs - Source files for the class library + +Unit tests: +----------- +The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher. +To include unit tests in the build, define nunit before building. + + +Build instructions: +------------------- + +1. Using Visual Studio.Net 2003: + Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll) + will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on + you are building the release or debug version of the library. Check + DotZLib/UnitTests.cs for instructions on how to include unit tests in the + build. + +2. Using NAnt: + Open a command prompt with access to the build environment and run nant + in the same directory as the DotZLib.build file. + You can define 2 properties on the nant command-line to control the build: + debug={true|false} to toggle between release/debug builds (default=true). + nunit={true|false} to include or esclude unit tests (default=true). + Also the target clean will remove binaries. + Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release + or ./DotZLib/bin/debug, depending on whether you are building the release + or debug version of the library. + + Examples: + nant -D:debug=false -D:nunit=false + will build a release mode version of the library without unit tests. + nant + will build a debug version of the library with unit tests + nant clean + will remove all previously built files. + + +--------------------------------- +Copyright (c) Henrik Ravn 2004 + +Use, modification and distribution are subject to the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/contrib/gzappend/gzappend.c b/contrib/gzappend/gzappend.c index f2e9e4f..e9e878e 100644 --- a/contrib/gzappend/gzappend.c +++ b/contrib/gzappend/gzappend.c @@ -48,10 +48,10 @@ unfriendly behavior that if gzappend fails, the gzip file is corrupted. This program was written to illustrate the use of the new Z_BLOCK option of - zlib 1.2.1's inflate() function. This option returns from inflate() at each + zlib 1.2.x's inflate() function. This option returns from inflate() at each block boundary to facilitate locating and modifying the last block bit at the start of the final deflate block. Also whether using Z_BLOCK or not, - another required feature of zlib 1.2.1 is that inflate() now provides the + another required feature of zlib 1.2.x is that inflate() now provides the number of unusued bits in the last input byte used. gzappend will not work with versions of zlib earlier than 1.2.1. diff --git a/contrib/infback9/infback9.c b/contrib/infback9/infback9.c index 103d901..f5ddde6 100644 --- a/contrib/infback9/infback9.c +++ b/contrib/infback9/infback9.c @@ -430,8 +430,8 @@ void FAR *out_desc; } } - /* handle error breaks in while */ - if (mode == BAD) break; + /* handle error breaks in while */ + if (mode == BAD) break; /* build code tables */ state->next = state->codes; diff --git a/contrib/infback9/inftree9.c b/contrib/infback9/inftree9.c index 5fd5b4a..9b48bc5 100644 --- a/contrib/infback9/inftree9.c +++ b/contrib/infback9/inftree9.c @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate9_copyright[] = - " inflate9 1.2.1.2 Copyright 1995-2004 Mark Adler "; + " inflate9 1.2.2 Copyright 1995-2004 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, 77, 194}; + 133, 133, 133, 133, 144, 199, 198}; 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, diff --git a/contrib/minizip/ioapi.c b/contrib/minizip/ioapi.c index 6ddfd36..c9e69f2 100644 --- a/contrib/minizip/ioapi.c +++ b/contrib/minizip/ioapi.c @@ -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; } diff --git a/contrib/minizip/miniunz.c b/contrib/minizip/miniunz.c index 11b7260..a6b06a2 100644 --- a/contrib/minizip/miniunz.c +++ b/contrib/minizip/miniunz.c @@ -317,7 +317,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); ret = scanf("%1s",answer); - if (ret != 1) + if (ret != 1) { exit(EXIT_FAILURE); } @@ -567,7 +567,7 @@ int main(argc,argv) return do_list(uf); else if (opt_do_extract==1) { - if (opt_extractdir && chdir(dirname)) + if (opt_extractdir && chdir(dirname)) { printf("Error changing into %s, aborting\n", dirname); exit(-1); diff --git a/contrib/minizip/mztools.c b/contrib/minizip/mztools.c index 363ee13..c1266bc 100644 --- a/contrib/minizip/mztools.c +++ b/contrib/minizip/mztools.c @@ -62,7 +62,7 @@ uLong* bytesRecovered; unsigned int fnsize = READ_16(header + 26); /* file name length */ unsigned int extsize = READ_16(header + 28); /* extra field length */ filename[0] = extra[0] = '\0'; - + /* Header */ if (fwrite(header, 1, 30, fpOut) == 30) { offset += 30; @@ -70,7 +70,7 @@ uLong* bytesRecovered; err = Z_ERRNO; break; } - + /* Filename */ if (fnsize > 0) { if (fread(filename, 1, fnsize, fpZip) == fnsize) { @@ -103,7 +103,7 @@ uLong* bytesRecovered; break; } } - + /* Data */ { int dataSize = cpsize; @@ -133,7 +133,7 @@ uLong* bytesRecovered; } } } - + /* Central directory entry */ { char header[46]; @@ -159,7 +159,7 @@ uLong* bytesRecovered; /* Header */ if (fwrite(header, 1, 46, fpOutCD) == 46) { offsetCD += 46; - + /* Filename */ if (fnsize > 0) { if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { @@ -172,7 +172,7 @@ uLong* bytesRecovered; err = Z_STREAM_ERROR; break; } - + /* Extra field */ if (extsize > 0) { if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { @@ -182,7 +182,7 @@ uLong* bytesRecovered; break; } } - + /* Comment field */ if (comsize > 0) { if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { @@ -192,8 +192,8 @@ uLong* bytesRecovered; break; } } - - + + } else { err = Z_ERRNO; break; @@ -225,17 +225,17 @@ uLong* bytesRecovered; WRITE_32(header + 12, offsetCD); /* size of CD */ WRITE_32(header + 16, offset); /* offset to CD */ WRITE_16(header + 20, comsize); /* comment */ - + /* Header */ if (fwrite(header, 1, 22, fpOutCD) == 22) { - + /* Comment field */ if (comsize > 0) { if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { err = Z_ERRNO; } } - + } else { err = Z_ERRNO; } @@ -257,14 +257,14 @@ uLong* bytesRecovered; fclose(fpOutCD); } } - + /* Close */ fclose(fpZip); fclose(fpOut); - + /* Wipe temporary file */ (void)remove(fileOutTmp); - + /* Number of recovered entries */ if (err == Z_OK) { if (nRecovered != NULL) { diff --git a/contrib/minizip/mztools.h b/contrib/minizip/mztools.h index eee78dc..88b3459 100644 --- a/contrib/minizip/mztools.h +++ b/contrib/minizip/mztools.h @@ -17,14 +17,14 @@ extern "C" { #include "unzip.h" -/* Repair a ZIP file (missing central directory) +/* Repair a ZIP file (missing central directory) file: file to recover fileOut: output file after recovery fileOutTmp: temporary file name used for recovery */ -extern int ZEXPORT unzRepair(const char* file, - const char* fileOut, - const char* fileOutTmp, +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, uLong* nRecovered, uLong* bytesRecovered); diff --git a/contrib/minizip/unzip.c b/contrib/minizip/unzip.c index e804a2a..e14de9e 100644 --- a/contrib/minizip/unzip.c +++ b/contrib/minizip/unzip.c @@ -1,5 +1,5 @@ /* unzip.c -- IO for uncompress .zip files using zlib - Version 1.01c, August 23th, 2004 + Version 1.01d, September 22th, 2004 Copyright (C) 1998-2004 Gilles Vollant @@ -1250,10 +1250,12 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - if ((len>pfile_in_zip_read_info->rest_read_compressed) && - (pfile_in_zip_read_info->raw)) + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_compressed; + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; while (pfile_in_zip_read_info->stream.avail_out>0) { diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c index ce1444c..2ccd7fd 100644 --- a/contrib/minizip/zip.c +++ b/contrib/minizip/zip.c @@ -717,9 +717,9 @@ extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, if (comment==NULL) size_comment = 0; else - size_comment = strlen(comment); + size_comment = (uInt)strlen(comment); - size_filename = strlen(filename); + size_filename = (uInt)strlen(filename); if (zipfi == NULL) zi->ci.dosDate = 0; @@ -1126,7 +1126,7 @@ extern int ZEXPORT zipClose (file, global_comment) if (global_comment==NULL) size_global_comment = 0; else - size_global_comment = strlen(global_comment); + size_global_comment = (uInt)strlen(global_comment); centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); diff --git a/contrib/untgz/untgz.c b/contrib/untgz/untgz.c index 3a30768..2c391e5 100644 --- a/contrib/untgz/untgz.c +++ b/contrib/untgz/untgz.c @@ -97,7 +97,7 @@ struct attr_item struct attr_item *next; char *fname; int mode; - time_t time; + time_t time; }; enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; diff --git a/contrib/vstudio/vc7/zlib.rc b/contrib/vstudio/vc7/zlib.rc index 2eb7c6b..3ebe25b 100644 --- a/contrib/vstudio/vc7/zlib.rc +++ b/contrib/vstudio/vc7/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1,2,1,2 - PRODUCTVERSION 1,2,1,2 + FILEVERSION 1,2,2 + PRODUCTVERSION 1,2,2 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.2\0" + VALUE "FileVersion", "1.2.2\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlib.dll\0" VALUE "ProductName", "ZLib.DLL\0" diff --git a/crc32.c b/crc32.c index 0e04880..b39c7e1 100644 --- a/crc32.c +++ b/crc32.c @@ -12,11 +12,11 @@ /* @(#) $Id$ */ /* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection - on the static variables used to control the first-use generation of the crc - tables. Therefore if you #define DYNAMIC_CRC_TABLE, you should first call - get_crc_table() to initialize the tables before allowing more than on thread - to use crc32(). + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). */ #ifdef MAKECRCH @@ -103,51 +103,51 @@ local void make_crc_table() { unsigned long c; int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ + unsigned long poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ + static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } #ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, and - then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } #endif /* BYFOUR */ - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not exactly efficient, but rare) */ - while (crc_table_empty) - ; - } + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ @@ -201,10 +201,10 @@ local void write_table(out, table) const unsigned long FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); + if (crc_table_empty) + make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; + return (const unsigned long FAR *)crc_table; } /* ========================================================================= */ diff --git a/deflate.c b/deflate.c index b402fe5..0fc53bc 100644 --- a/deflate.c +++ b/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2003 Jean-loup Gailly. + * Copyright (C) 1995-2004 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.1.2 Copyright 1995-2004 Jean-loup Gailly "; + " deflate 1.2.2 Copyright 1995-2004 Jean-loup Gailly "; /* 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 diff --git a/gzio.c b/gzio.c index 0ceafff..5e71b0a 100644 --- a/gzio.c +++ b/gzio.c @@ -455,10 +455,10 @@ int ZEXPORT gzread (file, buf, len) s->z_err = Z_ERRNO; break; } - if (feof(s->file)) { /* avoid error for empty file */ - s->z_err = Z_STREAM_END; - break; - } + if (feof(s->file)) { /* avoid error for empty file */ + s->z_err = Z_STREAM_END; + break; + } } s->stream.next_in = s->inbuf; } diff --git a/infback.c b/infback.c index 477b6ea..262f97c 100644 --- a/infback.c +++ b/infback.c @@ -434,8 +434,8 @@ void FAR *out_desc; } } - /* handle error breaks in while */ - if (state->mode == BAD) break; + /* handle error breaks in while */ + if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; diff --git a/inflate.c b/inflate.c index 06ca1de..c6d3826 100644 --- a/inflate.c +++ b/inflate.c @@ -109,6 +109,7 @@ z_streamp strm; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ state->mode = HEAD; state->last = 0; state->havedict = 0; @@ -861,8 +862,8 @@ int flush; } } - /* handle error breaks in while */ - if (state->mode == BAD) break; + /* handle error breaks in while */ + if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; diff --git a/inftrees.c b/inftrees.c index 0ced3ae..8a896b2 100644 --- a/inftrees.c +++ b/inftrees.c @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.1.2 Copyright 1995-2004 Mark Adler "; + " inflate 1.2.2 Copyright 1995-2004 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 @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 194}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 198}; static const unsigned short dbase[32] = { /* Distance codes 0..29 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, 4097, 6145, diff --git a/old/README b/old/README index 06ebe3d..800bf07 100644 --- a/old/README +++ b/old/README @@ -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.) diff --git a/contrib/visual-basic.txt b/old/visual-basic.txt similarity index 100% rename from contrib/visual-basic.txt rename to old/visual-basic.txt diff --git a/projects/visualc6/zlib.dsp b/projects/visualc6/zlib.dsp index a1a401a..8f16513 100644 --- a/projects/visualc6/zlib.dsp +++ b/projects/visualc6/zlib.dsp @@ -418,7 +418,73 @@ SOURCE=..\..\win32\zlib1.rc # Begin Source File SOURCE=..\..\contrib\masmx86\gvmat32.asm + +!IF "$(CFG)" == "zlib - Win32 DLL Release" + # PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Release +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Debug +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Release +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Debug +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ENDIF + # End Source File # Begin Source File @@ -466,11 +532,6 @@ SOURCE=..\..\contrib\masmx86\gvmat32c.c # Begin Source File SOURCE=..\..\contrib\masmx86\inffas32.asm -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=..\..\contrib\masmx86\gvmat32.obj !IF "$(CFG)" == "zlib - Win32 DLL Release" @@ -482,8 +543,28 @@ SOURCE=..\..\contrib\masmx86\gvmat32.obj !ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Release +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + !ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Debug +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + !ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" # PROP Exclude_From_Build 1 @@ -494,39 +575,28 @@ SOURCE=..\..\contrib\masmx86\gvmat32.obj !ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" -!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Release +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 -!ENDIF +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" -# End Source File -# Begin Source File - -SOURCE=..\..\contrib\masmx86\inffas32.obj - -!IF "$(CFG)" == "zlib - Win32 DLL Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Release" - -!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" - -!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" +# End Custom Build !ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Debug +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + !ENDIF # End Source File diff --git a/qnx/package.qpg b/qnx/package.qpg index 9986c6d..bf14280 100644 --- a/qnx/package.qpg +++ b/qnx/package.qpg @@ -25,10 +25,10 @@ - - - - + + + + @@ -63,7 +63,7 @@ - 1.2.1.2 + 1.2.2 Medium Stable diff --git a/win32/DLL_FAQ.txt b/win32/DLL_FAQ.txt index a3ed5dd..1746a95 100644 --- a/win32/DLL_FAQ.txt +++ b/win32/DLL_FAQ.txt @@ -175,7 +175,7 @@ in the zlib distribution, or at the following location: 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 + On the other hand, the pre- .Net versions of Microsoft Visual Basic require STDCALL, while Borland Delphi prefers, although it does not require, FASTCALL. @@ -203,13 +203,11 @@ in the zlib distribution, or at the following location: zlib distribution. - 8. I need a DLL for my Microsoft .NET project. What can I do? + 8. I need to use zlib in my Microsoft .Net project. What can I + do? - - We did not implement a COM wrapper around zlib, so you will - have to develop it yourself, or to get it from somewhere else. - - If you would be so generous as to contribute such a wrapper, - we would like to include it in a future zlib version. + - 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 diff --git a/win32/VisualC.txt b/win32/VisualC.txt new file mode 100644 index 0000000..579a5fc --- /dev/null +++ b/win32/VisualC.txt @@ -0,0 +1,3 @@ + +To build zlib using the Microsoft Visual C++ environment, +use the appropriate project from the projects/ directory. diff --git a/win32/zlib1.rc b/win32/zlib1.rc index 130493a..162ab8f 100644 --- a/win32/zlib1.rc +++ b/win32/zlib1.rc @@ -5,8 +5,8 @@ VS_VERSION_INFO VERSIONINFO #else VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE #endif - FILEVERSION 1,2,1,2 - PRODUCTVERSION 1,2,1,2 + FILEVERSION 1,2,2 + PRODUCTVERSION 1,2,2 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.2\0" + VALUE "FileVersion", "1.2.2\0" VALUE "InternalName", "zlib1.dll\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.2\0" + VALUE "ProductVersion", "1.2.2\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" END END diff --git a/zlib.3 b/zlib.3 index 54655cd..3139e24 100644 --- a/zlib.3 +++ b/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "9 September 2004" +.TH ZLIB 3 "3 October 2004" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -133,7 +133,7 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS -Version 1.2.1.2 +Version 1.2.2 Copyright (C) 1995-2004 Jean-loup Gailly (jloup@gzip.org) and Mark Adler (madler@alumni.caltech.edu). .LP diff --git a/zlib.h b/zlib.h index 0c94166..b4ddd34 100644 --- a/zlib.h +++ b/zlib.h @@ -1,5 +1,5 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.1.2, September 9th, 2004 + version 1.2.2, October 3rd, 2004 Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler @@ -37,8 +37,8 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.1.2" -#define ZLIB_VERNUM 0x1212 +#define ZLIB_VERSION "1.2.2" +#define ZLIB_VERNUM 0x1220 /* The 'zlib' compression library provides in-memory compression and @@ -53,24 +53,22 @@ extern "C" { application must provide more input and/or consume the output (providing more output space) before each call. - The compressed data format used by the in-memory functions is the zlib - format, which is a zlib wrapper documented in RFC 1950, wrapped around a - deflate stream, which is itself documented in RFC 1951. + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + This library can optionally read and write gzip streams in memory as well. + The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. - This library does not provide any functions to write gzip files in memory. - However such functions could be easily written using zlib's deflate function, - the documentation in the gzip RFC, and the examples in gzio.c. - The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. @@ -478,7 +476,8 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but @@ -649,7 +648,8 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). + return a Z_DATA_ERROR. If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative