From 4eded01841c4766bf66dbc5ce9fe85e9bada7d97 Mon Sep 17 00:00:00 2001 From: Dimon4eg Date: Fri, 19 Apr 2019 19:14:03 +0300 Subject: [PATCH] Link zlib statically for windows (#35) * Add zlib 1.2.11 sources * link zlib statically for windows --- CMakeLists.txt | 13 +- .../debug_dynamic/x64/bin/zlibd.dll | Bin 205824 -> 0 bytes .../debug_dynamic/x64/bin/zlibd.pdb | Bin 643072 -> 0 bytes .../debug_dynamic/x64/lib/zlibd.exp | Bin 9446 -> 0 bytes .../debug_dynamic/x64/lib/zlibd.ilk | Bin 345548 -> 0 bytes .../debug_dynamic/x64/lib/zlibd.lib | Bin 16334 -> 0 bytes .../release_dynamic/x64/bin/zlib.dll | Bin 86528 -> 0 bytes .../release_dynamic/x64/lib/zlib.exp | Bin 9447 -> 0 bytes .../release_dynamic/x64/lib/zlib.lib | Bin 16228 -> 0 bytes .../debug_dynamic/x64/bin/zlibd.dll | Bin 205824 -> 0 bytes .../debug_dynamic/x64/bin/zlibd.pdb | Bin 782336 -> 0 bytes .../debug_dynamic/x64/lib/zlibd.exp | Bin 9450 -> 0 bytes .../debug_dynamic/x64/lib/zlibd.ilk | Bin 343008 -> 0 bytes .../debug_dynamic/x64/lib/zlibd.lib | Bin 16334 -> 0 bytes .../include/zlib.h | 1913 --------------- .../release_dynamic/x64/bin/zlib.dll | Bin 86528 -> 0 bytes .../release_dynamic/x64/lib/zlib.exp | Bin 9451 -> 0 bytes .../release_dynamic/x64/lib/zlib.lib | Bin 16228 -> 0 bytes third_party/zlib/.gitignore | 26 + third_party/zlib/CMakeLists.txt | 249 ++ third_party/zlib/ChangeLog | 1515 ++++++++++++ third_party/zlib/FAQ | 368 +++ third_party/zlib/INDEX | 68 + third_party/zlib/Makefile | 5 + third_party/zlib/Makefile.in | 410 ++++ .../{ZLIB-Windows/README.md => zlib/README} | 0 third_party/zlib/adler32.c | 186 ++ third_party/zlib/amiga/Makefile.pup | 69 + third_party/zlib/amiga/Makefile.sas | 68 + third_party/zlib/compress.c | 86 + third_party/zlib/configure | 921 +++++++ third_party/zlib/contrib/README.contrib | 78 + third_party/zlib/contrib/ada/buffer_demo.adb | 106 + third_party/zlib/contrib/ada/mtest.adb | 156 ++ third_party/zlib/contrib/ada/read.adb | 156 ++ third_party/zlib/contrib/ada/readme.txt | 65 + third_party/zlib/contrib/ada/test.adb | 463 ++++ third_party/zlib/contrib/ada/zlib-streams.adb | 225 ++ third_party/zlib/contrib/ada/zlib-streams.ads | 114 + third_party/zlib/contrib/ada/zlib-thin.adb | 141 ++ third_party/zlib/contrib/ada/zlib-thin.ads | 450 ++++ third_party/zlib/contrib/ada/zlib.adb | 701 ++++++ third_party/zlib/contrib/ada/zlib.ads | 328 +++ third_party/zlib/contrib/ada/zlib.gpr | 20 + third_party/zlib/contrib/amd64/amd64-match.S | 452 ++++ third_party/zlib/contrib/asm686/README.686 | 51 + third_party/zlib/contrib/asm686/match.S | 357 +++ third_party/zlib/contrib/blast/Makefile | 8 + third_party/zlib/contrib/blast/README | 4 + third_party/zlib/contrib/blast/blast.c | 466 ++++ third_party/zlib/contrib/blast/blast.h | 83 + third_party/zlib/contrib/blast/test.pk | Bin 0 -> 8 bytes third_party/zlib/contrib/blast/test.txt | 1 + third_party/zlib/contrib/delphi/ZLib.pas | 557 +++++ third_party/zlib/contrib/delphi/ZLibConst.pas | 11 + third_party/zlib/contrib/delphi/readme.txt | 76 + third_party/zlib/contrib/delphi/zlibd32.mak | 99 + .../zlib/contrib/dotzlib/DotZLib.build | 33 + third_party/zlib/contrib/dotzlib/DotZLib.chm | Bin 0 -> 72726 bytes third_party/zlib/contrib/dotzlib/DotZLib.sln | 21 + .../contrib/dotzlib/DotZLib/AssemblyInfo.cs | 58 + .../contrib/dotzlib/DotZLib/ChecksumImpl.cs | 202 ++ .../contrib/dotzlib/DotZLib/CircularBuffer.cs | 83 + .../zlib/contrib/dotzlib/DotZLib/CodecBase.cs | 198 ++ .../zlib/contrib/dotzlib/DotZLib/Deflater.cs | 106 + .../zlib/contrib/dotzlib/DotZLib/DotZLib.cs | 288 +++ .../contrib/dotzlib/DotZLib/DotZLib.csproj | 141 ++ .../contrib/dotzlib/DotZLib/GZipStream.cs | 301 +++ .../zlib/contrib/dotzlib/DotZLib/Inflater.cs | 105 + .../zlib/contrib/dotzlib/DotZLib/UnitTests.cs | 274 +++ .../zlib/contrib/dotzlib/LICENSE_1_0.txt | 23 + third_party/zlib/contrib/dotzlib/readme.txt | 58 + .../zlib/contrib/gcc_gvmat64/gvmat64.S | 574 +++++ third_party/zlib/contrib/infback9/README | 1 + third_party/zlib/contrib/infback9/infback9.c | 615 +++++ third_party/zlib/contrib/infback9/infback9.h | 37 + third_party/zlib/contrib/infback9/inffix9.h | 107 + third_party/zlib/contrib/infback9/inflate9.h | 47 + third_party/zlib/contrib/infback9/inftree9.c | 324 +++ third_party/zlib/contrib/infback9/inftree9.h | 61 + third_party/zlib/contrib/inflate86/inffas86.c | 1157 +++++++++ third_party/zlib/contrib/inflate86/inffast.S | 1368 +++++++++++ third_party/zlib/contrib/iostream/test.cpp | 24 + .../zlib/contrib/iostream/zfstream.cpp | 329 +++ third_party/zlib/contrib/iostream/zfstream.h | 128 + third_party/zlib/contrib/iostream2/zstream.h | 307 +++ .../zlib/contrib/iostream2/zstream_test.cpp | 25 + third_party/zlib/contrib/iostream3/README | 35 + third_party/zlib/contrib/iostream3/TODO | 17 + third_party/zlib/contrib/iostream3/test.cc | 50 + .../zlib/contrib/iostream3/zfstream.cc | 479 ++++ third_party/zlib/contrib/iostream3/zfstream.h | 466 ++++ third_party/zlib/contrib/masmx64/bld_ml64.bat | 2 + third_party/zlib/contrib/masmx64/gvmat64.asm | 553 +++++ third_party/zlib/contrib/masmx64/inffas8664.c | 186 ++ .../zlib/contrib/masmx64/inffasx64.asm | 396 +++ third_party/zlib/contrib/masmx64/readme.txt | 31 + third_party/zlib/contrib/masmx86/bld_ml32.bat | 2 + third_party/zlib/contrib/masmx86/inffas32.asm | 1080 ++++++++ third_party/zlib/contrib/masmx86/match686.asm | 479 ++++ third_party/zlib/contrib/masmx86/readme.txt | 27 + third_party/zlib/contrib/minizip/Makefile | 25 + third_party/zlib/contrib/minizip/Makefile.am | 45 + .../contrib/minizip/MiniZip64_Changes.txt | 6 + .../zlib/contrib/minizip/MiniZip64_info.txt | 74 + third_party/zlib/contrib/minizip/configure.ac | 32 + third_party/zlib/contrib/minizip/crypt.h | 131 + third_party/zlib/contrib/minizip/ioapi.c | 247 ++ third_party/zlib/contrib/minizip/ioapi.h | 208 ++ third_party/zlib/contrib/minizip/iowin32.c | 462 ++++ third_party/zlib/contrib/minizip/iowin32.h | 28 + third_party/zlib/contrib/minizip/make_vms.com | 25 + third_party/zlib/contrib/minizip/miniunz.c | 660 +++++ third_party/zlib/contrib/minizip/miniunzip.1 | 63 + third_party/zlib/contrib/minizip/minizip.1 | 46 + third_party/zlib/contrib/minizip/minizip.c | 520 ++++ .../zlib/contrib/minizip/minizip.pc.in | 12 + third_party/zlib/contrib/minizip/mztools.c | 291 +++ third_party/zlib/contrib/minizip/mztools.h | 37 + third_party/zlib/contrib/minizip/unzip.c | 2125 ++++++++++++++++ third_party/zlib/contrib/minizip/unzip.h | 437 ++++ third_party/zlib/contrib/minizip/zip.c | 2007 +++++++++++++++ third_party/zlib/contrib/minizip/zip.h | 362 +++ third_party/zlib/contrib/pascal/example.pas | 599 +++++ third_party/zlib/contrib/pascal/readme.txt | 76 + third_party/zlib/contrib/pascal/zlibd32.mak | 99 + third_party/zlib/contrib/pascal/zlibpas.pas | 276 +++ third_party/zlib/contrib/puff/Makefile | 42 + third_party/zlib/contrib/puff/README | 63 + third_party/zlib/contrib/puff/puff.c | 840 +++++++ third_party/zlib/contrib/puff/puff.h | 35 + third_party/zlib/contrib/puff/pufftest.c | 165 ++ third_party/zlib/contrib/puff/zeros.raw | Bin 0 -> 2517 bytes third_party/zlib/contrib/testzlib/testzlib.c | 275 +++ .../zlib/contrib/testzlib/testzlib.txt | 10 + third_party/zlib/contrib/untgz/Makefile | 14 + third_party/zlib/contrib/untgz/Makefile.msc | 17 + third_party/zlib/contrib/untgz/untgz.c | 674 +++++ third_party/zlib/contrib/vstudio/readme.txt | 78 + .../zlib/contrib/vstudio/vc10/miniunz.vcxproj | 310 +++ .../vstudio/vc10/miniunz.vcxproj.filters | 22 + .../zlib/contrib/vstudio/vc10/minizip.vcxproj | 307 +++ .../vstudio/vc10/minizip.vcxproj.filters | 22 + .../contrib/vstudio/vc10/testzlib.vcxproj | 420 ++++ .../vstudio/vc10/testzlib.vcxproj.filters | 58 + .../contrib/vstudio/vc10/testzlibdll.vcxproj | 310 +++ .../vstudio/vc10/testzlibdll.vcxproj.filters | 22 + third_party/zlib/contrib/vstudio/vc10/zlib.rc | 32 + .../contrib/vstudio/vc10/zlibstat.vcxproj | 473 ++++ .../vstudio/vc10/zlibstat.vcxproj.filters | 77 + .../zlib/contrib/vstudio/vc10/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc10/zlibvc.sln | 135 + .../zlib/contrib/vstudio/vc10/zlibvc.vcxproj | 657 +++++ .../vstudio/vc10/zlibvc.vcxproj.filters | 118 + .../zlib/contrib/vstudio/vc11/miniunz.vcxproj | 314 +++ .../zlib/contrib/vstudio/vc11/minizip.vcxproj | 311 +++ .../contrib/vstudio/vc11/testzlib.vcxproj | 426 ++++ .../contrib/vstudio/vc11/testzlibdll.vcxproj | 314 +++ third_party/zlib/contrib/vstudio/vc11/zlib.rc | 32 + .../contrib/vstudio/vc11/zlibstat.vcxproj | 464 ++++ .../zlib/contrib/vstudio/vc11/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc11/zlibvc.sln | 117 + .../zlib/contrib/vstudio/vc11/zlibvc.vcxproj | 688 ++++++ .../zlib/contrib/vstudio/vc12/miniunz.vcxproj | 316 +++ .../zlib/contrib/vstudio/vc12/minizip.vcxproj | 313 +++ .../contrib/vstudio/vc12/testzlib.vcxproj | 430 ++++ .../contrib/vstudio/vc12/testzlibdll.vcxproj | 316 +++ third_party/zlib/contrib/vstudio/vc12/zlib.rc | 32 + .../contrib/vstudio/vc12/zlibstat.vcxproj | 467 ++++ .../zlib/contrib/vstudio/vc12/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc12/zlibvc.sln | 119 + .../zlib/contrib/vstudio/vc12/zlibvc.vcxproj | 692 ++++++ .../zlib/contrib/vstudio/vc14/miniunz.vcxproj | 316 +++ .../zlib/contrib/vstudio/vc14/minizip.vcxproj | 313 +++ .../contrib/vstudio/vc14/testzlib.vcxproj | 430 ++++ .../contrib/vstudio/vc14/testzlibdll.vcxproj | 316 +++ third_party/zlib/contrib/vstudio/vc14/zlib.rc | 32 + .../contrib/vstudio/vc14/zlibstat.vcxproj | 467 ++++ .../zlib/contrib/vstudio/vc14/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc14/zlibvc.sln | 119 + .../zlib/contrib/vstudio/vc14/zlibvc.vcxproj | 692 ++++++ .../zlib/contrib/vstudio/vc9/miniunz.vcproj | 565 +++++ .../zlib/contrib/vstudio/vc9/minizip.vcproj | 562 +++++ .../zlib/contrib/vstudio/vc9/testzlib.vcproj | 852 +++++++ .../contrib/vstudio/vc9/testzlibdll.vcproj | 565 +++++ third_party/zlib/contrib/vstudio/vc9/zlib.rc | 32 + .../zlib/contrib/vstudio/vc9/zlibstat.vcproj | 835 +++++++ .../zlib/contrib/vstudio/vc9/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc9/zlibvc.sln | 144 ++ .../zlib/contrib/vstudio/vc9/zlibvc.vcproj | 1156 +++++++++ third_party/zlib/crc32.c | 442 ++++ third_party/zlib/crc32.h | 441 ++++ third_party/zlib/deflate.c | 2163 +++++++++++++++++ third_party/zlib/deflate.h | 349 +++ third_party/zlib/doc/algorithm.txt | 209 ++ third_party/zlib/doc/rfc1950.txt | 619 +++++ third_party/zlib/doc/rfc1951.txt | 955 ++++++++ third_party/zlib/doc/rfc1952.txt | 675 +++++ third_party/zlib/doc/txtvsbin.txt | 107 + third_party/zlib/examples/README.examples | 49 + third_party/zlib/examples/enough.c | 572 +++++ third_party/zlib/examples/fitblk.c | 233 ++ third_party/zlib/examples/gun.c | 702 ++++++ third_party/zlib/examples/gzappend.c | 504 ++++ third_party/zlib/examples/gzjoin.c | 449 ++++ third_party/zlib/examples/gzlog.c | 1059 ++++++++ third_party/zlib/examples/gzlog.h | 91 + third_party/zlib/examples/zlib_how.html | 545 +++++ third_party/zlib/examples/zpipe.c | 205 ++ third_party/zlib/examples/zran.c | 409 ++++ third_party/zlib/gzclose.c | 25 + third_party/zlib/gzguts.h | 218 ++ third_party/zlib/gzlib.c | 637 +++++ third_party/zlib/gzread.c | 654 +++++ third_party/zlib/gzwrite.c | 665 +++++ third_party/zlib/infback.c | 640 +++++ third_party/zlib/inffast.c | 323 +++ third_party/zlib/inffast.h | 11 + third_party/zlib/inffixed.h | 94 + third_party/zlib/inflate.c | 1561 ++++++++++++ third_party/zlib/inflate.h | 125 + third_party/zlib/inftrees.c | 304 +++ third_party/zlib/inftrees.h | 62 + third_party/zlib/make_vms.com | 867 +++++++ third_party/zlib/msdos/Makefile.bor | 115 + third_party/zlib/msdos/Makefile.dj2 | 104 + third_party/zlib/msdos/Makefile.emx | 69 + third_party/zlib/msdos/Makefile.msc | 112 + third_party/zlib/msdos/Makefile.tc | 100 + third_party/zlib/nintendods/Makefile | 126 + third_party/zlib/nintendods/README | 5 + third_party/zlib/old/Makefile.emx | 69 + third_party/zlib/old/Makefile.riscos | 151 ++ third_party/zlib/old/README | 3 + third_party/zlib/old/descrip.mms | 48 + third_party/zlib/old/os2/Makefile.os2 | 136 ++ third_party/zlib/old/os2/zlib.def | 51 + third_party/zlib/old/visual-basic.txt | 160 ++ third_party/zlib/os400/README400 | 48 + third_party/zlib/os400/bndsrc | 119 + third_party/zlib/os400/make.sh | 366 +++ third_party/zlib/os400/zlib.inc | 527 ++++ third_party/zlib/qnx/package.qpg | 141 ++ third_party/zlib/test/example.c | 602 +++++ third_party/zlib/test/infcover.c | 671 +++++ third_party/zlib/test/minigzip.c | 651 +++++ third_party/zlib/treebuild.xml | 116 + third_party/zlib/trees.c | 1203 +++++++++ third_party/zlib/trees.h | 128 + third_party/zlib/uncompr.c | 93 + third_party/zlib/watcom/watcom_f.mak | 43 + third_party/zlib/watcom/watcom_l.mak | 43 + third_party/zlib/win32/DLL_FAQ.txt | 397 +++ third_party/zlib/win32/Makefile.bor | 110 + third_party/zlib/win32/Makefile.gcc | 182 ++ third_party/zlib/win32/Makefile.msc | 163 ++ third_party/zlib/win32/README-WIN32.txt | 103 + third_party/zlib/win32/VisualC.txt | 3 + third_party/zlib/win32/zlib.def | 94 + third_party/zlib/win32/zlib1.rc | 40 + .../include/zconf.h => zlib/zconf.h.cmakein} | 4 +- .../include/zconf.h => zlib/zconf.h.in} | 2 - third_party/zlib/zconf.h.included | 534 ++++ third_party/zlib/zlib.3 | 149 ++ third_party/zlib/zlib.3.pdf | Bin 0 -> 19318 bytes .../include => zlib}/zlib.h | 0 third_party/zlib/zlib.map | 94 + third_party/zlib/zlib.pc.cmakein | 13 + third_party/zlib/zlib.pc.in | 13 + third_party/zlib/zlib2ansi | 152 ++ third_party/zlib/zutil.c | 325 +++ third_party/zlib/zutil.h | 271 +++ 272 files changed, 73130 insertions(+), 1927 deletions(-) delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.dll delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.pdb delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.exp delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.ilk delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.lib delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/bin/zlib.dll delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.exp delete mode 100644 third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.lib delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.dll delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.pdb delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.exp delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.ilk delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.lib delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zlib.h delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/bin/zlib.dll delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.exp delete mode 100644 third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.lib create mode 100644 third_party/zlib/.gitignore create mode 100644 third_party/zlib/CMakeLists.txt create mode 100644 third_party/zlib/ChangeLog create mode 100644 third_party/zlib/FAQ create mode 100644 third_party/zlib/INDEX create mode 100644 third_party/zlib/Makefile create mode 100644 third_party/zlib/Makefile.in rename third_party/{ZLIB-Windows/README.md => zlib/README} (100%) create mode 100644 third_party/zlib/adler32.c create mode 100644 third_party/zlib/amiga/Makefile.pup create mode 100644 third_party/zlib/amiga/Makefile.sas create mode 100644 third_party/zlib/compress.c create mode 100644 third_party/zlib/configure create mode 100644 third_party/zlib/contrib/README.contrib create mode 100644 third_party/zlib/contrib/ada/buffer_demo.adb create mode 100644 third_party/zlib/contrib/ada/mtest.adb create mode 100644 third_party/zlib/contrib/ada/read.adb create mode 100644 third_party/zlib/contrib/ada/readme.txt create mode 100644 third_party/zlib/contrib/ada/test.adb create mode 100644 third_party/zlib/contrib/ada/zlib-streams.adb create mode 100644 third_party/zlib/contrib/ada/zlib-streams.ads create mode 100644 third_party/zlib/contrib/ada/zlib-thin.adb create mode 100644 third_party/zlib/contrib/ada/zlib-thin.ads create mode 100644 third_party/zlib/contrib/ada/zlib.adb create mode 100644 third_party/zlib/contrib/ada/zlib.ads create mode 100644 third_party/zlib/contrib/ada/zlib.gpr create mode 100644 third_party/zlib/contrib/amd64/amd64-match.S create mode 100644 third_party/zlib/contrib/asm686/README.686 create mode 100644 third_party/zlib/contrib/asm686/match.S create mode 100644 third_party/zlib/contrib/blast/Makefile create mode 100644 third_party/zlib/contrib/blast/README create mode 100644 third_party/zlib/contrib/blast/blast.c create mode 100644 third_party/zlib/contrib/blast/blast.h create mode 100644 third_party/zlib/contrib/blast/test.pk create mode 100644 third_party/zlib/contrib/blast/test.txt create mode 100644 third_party/zlib/contrib/delphi/ZLib.pas create mode 100644 third_party/zlib/contrib/delphi/ZLibConst.pas create mode 100644 third_party/zlib/contrib/delphi/readme.txt create mode 100644 third_party/zlib/contrib/delphi/zlibd32.mak create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib.build create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib.chm create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib.sln create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/CodecBase.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/Deflater.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/GZipStream.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/Inflater.cs create mode 100644 third_party/zlib/contrib/dotzlib/DotZLib/UnitTests.cs create mode 100644 third_party/zlib/contrib/dotzlib/LICENSE_1_0.txt create mode 100644 third_party/zlib/contrib/dotzlib/readme.txt create mode 100644 third_party/zlib/contrib/gcc_gvmat64/gvmat64.S create mode 100644 third_party/zlib/contrib/infback9/README create mode 100644 third_party/zlib/contrib/infback9/infback9.c create mode 100644 third_party/zlib/contrib/infback9/infback9.h create mode 100644 third_party/zlib/contrib/infback9/inffix9.h create mode 100644 third_party/zlib/contrib/infback9/inflate9.h create mode 100644 third_party/zlib/contrib/infback9/inftree9.c create mode 100644 third_party/zlib/contrib/infback9/inftree9.h create mode 100644 third_party/zlib/contrib/inflate86/inffas86.c create mode 100644 third_party/zlib/contrib/inflate86/inffast.S create mode 100644 third_party/zlib/contrib/iostream/test.cpp create mode 100644 third_party/zlib/contrib/iostream/zfstream.cpp create mode 100644 third_party/zlib/contrib/iostream/zfstream.h create mode 100644 third_party/zlib/contrib/iostream2/zstream.h create mode 100644 third_party/zlib/contrib/iostream2/zstream_test.cpp create mode 100644 third_party/zlib/contrib/iostream3/README create mode 100644 third_party/zlib/contrib/iostream3/TODO create mode 100644 third_party/zlib/contrib/iostream3/test.cc create mode 100644 third_party/zlib/contrib/iostream3/zfstream.cc create mode 100644 third_party/zlib/contrib/iostream3/zfstream.h create mode 100644 third_party/zlib/contrib/masmx64/bld_ml64.bat create mode 100644 third_party/zlib/contrib/masmx64/gvmat64.asm create mode 100644 third_party/zlib/contrib/masmx64/inffas8664.c create mode 100644 third_party/zlib/contrib/masmx64/inffasx64.asm create mode 100644 third_party/zlib/contrib/masmx64/readme.txt create mode 100644 third_party/zlib/contrib/masmx86/bld_ml32.bat create mode 100644 third_party/zlib/contrib/masmx86/inffas32.asm create mode 100644 third_party/zlib/contrib/masmx86/match686.asm create mode 100644 third_party/zlib/contrib/masmx86/readme.txt create mode 100644 third_party/zlib/contrib/minizip/Makefile create mode 100644 third_party/zlib/contrib/minizip/Makefile.am create mode 100644 third_party/zlib/contrib/minizip/MiniZip64_Changes.txt create mode 100644 third_party/zlib/contrib/minizip/MiniZip64_info.txt create mode 100644 third_party/zlib/contrib/minizip/configure.ac create mode 100644 third_party/zlib/contrib/minizip/crypt.h create mode 100644 third_party/zlib/contrib/minizip/ioapi.c create mode 100644 third_party/zlib/contrib/minizip/ioapi.h create mode 100644 third_party/zlib/contrib/minizip/iowin32.c create mode 100644 third_party/zlib/contrib/minizip/iowin32.h create mode 100644 third_party/zlib/contrib/minizip/make_vms.com create mode 100644 third_party/zlib/contrib/minizip/miniunz.c create mode 100644 third_party/zlib/contrib/minizip/miniunzip.1 create mode 100644 third_party/zlib/contrib/minizip/minizip.1 create mode 100644 third_party/zlib/contrib/minizip/minizip.c create mode 100644 third_party/zlib/contrib/minizip/minizip.pc.in create mode 100644 third_party/zlib/contrib/minizip/mztools.c create mode 100644 third_party/zlib/contrib/minizip/mztools.h create mode 100644 third_party/zlib/contrib/minizip/unzip.c create mode 100644 third_party/zlib/contrib/minizip/unzip.h create mode 100644 third_party/zlib/contrib/minizip/zip.c create mode 100644 third_party/zlib/contrib/minizip/zip.h create mode 100644 third_party/zlib/contrib/pascal/example.pas create mode 100644 third_party/zlib/contrib/pascal/readme.txt create mode 100644 third_party/zlib/contrib/pascal/zlibd32.mak create mode 100644 third_party/zlib/contrib/pascal/zlibpas.pas create mode 100644 third_party/zlib/contrib/puff/Makefile create mode 100644 third_party/zlib/contrib/puff/README create mode 100644 third_party/zlib/contrib/puff/puff.c create mode 100644 third_party/zlib/contrib/puff/puff.h create mode 100644 third_party/zlib/contrib/puff/pufftest.c create mode 100644 third_party/zlib/contrib/puff/zeros.raw create mode 100644 third_party/zlib/contrib/testzlib/testzlib.c create mode 100644 third_party/zlib/contrib/testzlib/testzlib.txt create mode 100644 third_party/zlib/contrib/untgz/Makefile create mode 100644 third_party/zlib/contrib/untgz/Makefile.msc create mode 100644 third_party/zlib/contrib/untgz/untgz.c create mode 100644 third_party/zlib/contrib/vstudio/readme.txt create mode 100644 third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters create mode 100644 third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters create mode 100644 third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters create mode 100644 third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlib.rc create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlibvc.def create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlibvc.sln create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters create mode 100644 third_party/zlib/contrib/vstudio/vc11/miniunz.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc11/minizip.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc11/testzlib.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc11/zlib.rc create mode 100644 third_party/zlib/contrib/vstudio/vc11/zlibstat.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc11/zlibvc.def create mode 100644 third_party/zlib/contrib/vstudio/vc11/zlibvc.sln create mode 100644 third_party/zlib/contrib/vstudio/vc11/zlibvc.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc12/miniunz.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc12/minizip.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc12/testzlib.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc12/zlib.rc create mode 100644 third_party/zlib/contrib/vstudio/vc12/zlibstat.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc12/zlibvc.def create mode 100644 third_party/zlib/contrib/vstudio/vc12/zlibvc.sln create mode 100644 third_party/zlib/contrib/vstudio/vc12/zlibvc.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc14/miniunz.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc14/minizip.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc14/testzlib.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc14/zlib.rc create mode 100644 third_party/zlib/contrib/vstudio/vc14/zlibstat.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc14/zlibvc.def create mode 100644 third_party/zlib/contrib/vstudio/vc14/zlibvc.sln create mode 100644 third_party/zlib/contrib/vstudio/vc14/zlibvc.vcxproj create mode 100644 third_party/zlib/contrib/vstudio/vc9/miniunz.vcproj create mode 100644 third_party/zlib/contrib/vstudio/vc9/minizip.vcproj create mode 100644 third_party/zlib/contrib/vstudio/vc9/testzlib.vcproj create mode 100644 third_party/zlib/contrib/vstudio/vc9/testzlibdll.vcproj create mode 100644 third_party/zlib/contrib/vstudio/vc9/zlib.rc create mode 100644 third_party/zlib/contrib/vstudio/vc9/zlibstat.vcproj create mode 100644 third_party/zlib/contrib/vstudio/vc9/zlibvc.def create mode 100644 third_party/zlib/contrib/vstudio/vc9/zlibvc.sln create mode 100644 third_party/zlib/contrib/vstudio/vc9/zlibvc.vcproj create mode 100644 third_party/zlib/crc32.c create mode 100644 third_party/zlib/crc32.h create mode 100644 third_party/zlib/deflate.c create mode 100644 third_party/zlib/deflate.h create mode 100644 third_party/zlib/doc/algorithm.txt create mode 100644 third_party/zlib/doc/rfc1950.txt create mode 100644 third_party/zlib/doc/rfc1951.txt create mode 100644 third_party/zlib/doc/rfc1952.txt create mode 100644 third_party/zlib/doc/txtvsbin.txt create mode 100644 third_party/zlib/examples/README.examples create mode 100644 third_party/zlib/examples/enough.c create mode 100644 third_party/zlib/examples/fitblk.c create mode 100644 third_party/zlib/examples/gun.c create mode 100644 third_party/zlib/examples/gzappend.c create mode 100644 third_party/zlib/examples/gzjoin.c create mode 100644 third_party/zlib/examples/gzlog.c create mode 100644 third_party/zlib/examples/gzlog.h create mode 100644 third_party/zlib/examples/zlib_how.html create mode 100644 third_party/zlib/examples/zpipe.c create mode 100644 third_party/zlib/examples/zran.c create mode 100644 third_party/zlib/gzclose.c create mode 100644 third_party/zlib/gzguts.h create mode 100644 third_party/zlib/gzlib.c create mode 100644 third_party/zlib/gzread.c create mode 100644 third_party/zlib/gzwrite.c create mode 100644 third_party/zlib/infback.c create mode 100644 third_party/zlib/inffast.c create mode 100644 third_party/zlib/inffast.h create mode 100644 third_party/zlib/inffixed.h create mode 100644 third_party/zlib/inflate.c create mode 100644 third_party/zlib/inflate.h create mode 100644 third_party/zlib/inftrees.c create mode 100644 third_party/zlib/inftrees.h create mode 100644 third_party/zlib/make_vms.com create mode 100644 third_party/zlib/msdos/Makefile.bor create mode 100644 third_party/zlib/msdos/Makefile.dj2 create mode 100644 third_party/zlib/msdos/Makefile.emx create mode 100644 third_party/zlib/msdos/Makefile.msc create mode 100644 third_party/zlib/msdos/Makefile.tc create mode 100644 third_party/zlib/nintendods/Makefile create mode 100644 third_party/zlib/nintendods/README create mode 100644 third_party/zlib/old/Makefile.emx create mode 100644 third_party/zlib/old/Makefile.riscos create mode 100644 third_party/zlib/old/README create mode 100644 third_party/zlib/old/descrip.mms create mode 100644 third_party/zlib/old/os2/Makefile.os2 create mode 100644 third_party/zlib/old/os2/zlib.def create mode 100644 third_party/zlib/old/visual-basic.txt create mode 100644 third_party/zlib/os400/README400 create mode 100644 third_party/zlib/os400/bndsrc create mode 100644 third_party/zlib/os400/make.sh create mode 100644 third_party/zlib/os400/zlib.inc create mode 100644 third_party/zlib/qnx/package.qpg create mode 100644 third_party/zlib/test/example.c create mode 100644 third_party/zlib/test/infcover.c create mode 100644 third_party/zlib/test/minigzip.c create mode 100644 third_party/zlib/treebuild.xml create mode 100644 third_party/zlib/trees.c create mode 100644 third_party/zlib/trees.h create mode 100644 third_party/zlib/uncompr.c create mode 100644 third_party/zlib/watcom/watcom_f.mak create mode 100644 third_party/zlib/watcom/watcom_l.mak create mode 100644 third_party/zlib/win32/DLL_FAQ.txt create mode 100644 third_party/zlib/win32/Makefile.bor create mode 100644 third_party/zlib/win32/Makefile.gcc create mode 100644 third_party/zlib/win32/Makefile.msc create mode 100644 third_party/zlib/win32/README-WIN32.txt create mode 100644 third_party/zlib/win32/VisualC.txt create mode 100644 third_party/zlib/win32/zlib.def create mode 100644 third_party/zlib/win32/zlib1.rc rename third_party/{ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zconf.h => zlib/zconf.h.cmakein} (99%) rename third_party/{ZLIB-Windows/zlib-1.2.11_deploy_v140/include/zconf.h => zlib/zconf.h.in} (99%) create mode 100644 third_party/zlib/zconf.h.included create mode 100644 third_party/zlib/zlib.3 create mode 100644 third_party/zlib/zlib.3.pdf rename third_party/{ZLIB-Windows/zlib-1.2.11_deploy_v140/include => zlib}/zlib.h (100%) create mode 100644 third_party/zlib/zlib.map create mode 100644 third_party/zlib/zlib.pc.cmakein create mode 100644 third_party/zlib/zlib.pc.in create mode 100644 third_party/zlib/zlib2ansi create mode 100644 third_party/zlib/zutil.c create mode 100644 third_party/zlib/zutil.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 558ffe97..92f15bef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,16 +120,9 @@ if(USE_OPEN_SSL) endif() if (WIN32) - get_filename_component(libz_path - ${PROJECT_SOURCE_DIR}/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.lib - ABSOLUTE) - add_library(libz STATIC IMPORTED) - set_target_properties(libz PROPERTIES IMPORTED_LOCATION - ${libz_path}) - - include_directories(${PROJECT_SOURCE_DIR}/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/include) - - target_link_libraries(ixwebsocket libz wsock32 ws2_32) + add_subdirectory(third_party/zlib) + include_directories(third_party/zlib ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib) + target_link_libraries(ixwebsocket zlibstatic wsock32 ws2_32) add_definitions(-D_CRT_SECURE_NO_WARNINGS) else() diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.dll b/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.dll deleted file mode 100644 index ab062bc00cf536fb7461fdf9420f40e82de26d95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205824 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 MRa=z>{)ra&e?~_PRR910 diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.pdb b/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.pdb deleted file mode 100644 index 883acc9991342ae3aa5eeeb84d543f0c340365ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643072 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�Qr`Todfk9kqK}+cqG(!L}IWN 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

cEyJ+t!KonapMv5Z^W%ip9VoS70+ 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 diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.exp b/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.exp deleted file mode 100644 index 4283565608baf9d84924101f9b555f275d83e550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9451 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 z zO0DppS2(@aDOYKA*uwTLx%n0TUFfr~^uAS1=tG6RXNlW}QFtGW8{Rua%e!o)es-zz z8+h^DNIAwOzW7Q9(ceMfCI+5#NdOW=2qn(DcWZS*g4m(Nr7!WVLvJ$le&wMr%OkDT zpYIkuC6?ak!d}JENF6c}^oL9sX9NE;z(QBBdF6`W?4@|RuJNCGfPv}~2QTUy*$c&mkw&TeQ0$myu9){0LV zS^I1)b7+&*8jEexxIRc*m~9~fydk6-ZUte=YNuK*p-_@aNy5ZOI>%v`S#)?SDvWR$ zJu}RK7@G-Wl1^J`o*|VM&_soXdOnQh@Xv?5#?si_gJv5vYDB5=wnnMI)v#LPUyi&> z(g!x4htc9LYr9+q!3DGuubP5&2$IW?7>i_67e=4ALXx|%h3RvFy;>W!Gja$tS~0do zcwFZ-Pc^MQ5r(%Uj)8QW)KeFRn??G;3xZW%iujBx8H zvm`_g0zn_(iL^WEsWa}Y8Ip5dHlWe7Tt2(Zmvl@O3L4e?*&CT`Uq)Wlyw)^zdmY{Q z&$~AsT7xJ9o;UwGrjm)JnU<@zg$MzaziC6tLE1Fb!J+DS3&$Pi_ay%R1^Ur8X&uTz z>ik;d;P2aC6N>+WRF1iW)co~YlpEpg^KZQls+G2EdKip<8#W;bAo}~On=j=ji*pNe z(~HdqM%$W)&tJYM{Xww-ExrpTf~U?kyZ}I4!8L^dI$J*6=HFjkv*wRK(((`_zOS{U zqa7qNclx?=%(yIy$Yfat7m<_c@f_wq$A9u;?T8qq#l>1g7=)*GwcdJTc1I?AG_^a{ zn%(hFb60$C<#)%F?Q;LA-GNBc{&;tMstqZ5cQk(0D_KomfmL7PH0jQ$^h9O)^lhg< zQ9l5|u5I}_i<~G#$M(l3l226nH%Nneq7aeWAIp8O4Jlc!v2$C=ylw+}WANZ=dC(QUB(6?d!6j!}!*&f;GB?w6FAOqnLoX4cQf~rR9?k|tD1xTFf@V;0b z7?PoCE*Z^cV5|d%I(L4;6syu*9vj62DFi&ru1)E)4j^t zZv@UmjAPz?)~-J`j)zr$BX(Bgl&p6+%XO?s>>NG<1o5NmK**{)QnGWO##%IagpwuK zwW)OXX1mJotfzqTs7Em|i|Vdn|LTLFWGwvj+u%{y!F3>7sdOYgt6=N|#$z5M^qdvM z!B&bE+sTi6H1WV4Ow~3rwhK0fI5{^6S82p(HhB~YIqMirw)}2;7HjlG3P*xj2c(sX z#}hd_n^QO@N>=67&sqd!i$}2$RqZIf<>!ojiYH4@OmJ2+QtSjh<&nauuV%DtWL!@N zXcE-cjuf$R&v+!0;&33Z;F9?D@G}F!;+C2T=8T#Qd@y9s%E1+#ihRQW&@D!HBH)PJui|(2|@Yo#fF$ng3&HWj}UW;I|m31IQ zc2bK)uo+hep_Phv(keEcvrGF70<7SqU+Aj!N7i}2)1PvLs<#@E5wt3T{hor8i*6_t z&roCy4jBEC*4C-18X+68-fbxarvqukS?d!0=F3=B?53(>gvbao z2En{gs$G9%mv%e-^_+uP{GSyB{l3%N~LEchBV-j{2OQmaBEdDQY7AfA&rDr+YY4aofh+R z20cn$s}swJob(ut$|Kbx$;6zn$?Y=9352 zU4z|;Wcyz9DE4Ct2cwmW#}Yv~>rv{>DMr@+TnS2D@2w&``g{q_{mWfm@JNlyT}CY2 z#S|KU3Zpxqh8-7~z2OkWeq`gIv{Lb|iy&R{NdD^`1#qLQ7-^L^jQn=_vPW{C1v#LG zJ|C_C$$w?!2H`3dk0!DYMgoj_PEjn{ehDb4Z=`C3

%dT8#&n9#M4$?9@Y?VN*Gm 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. 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/third_party/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/third_party/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs new file mode 100644 index 00000000..b110dae6 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs b/third_party/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 00000000..9c8d6019 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/CodecBase.cs b/third_party/zlib/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 00000000..b0eb78a0 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/Deflater.cs b/third_party/zlib/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 00000000..9039f41f --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.cs b/third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 00000000..90c7c3b3 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj b/third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 00000000..dea7fb16 --- /dev/null +++ b/third_party/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/contrib/dotzlib/DotZLib/GZipStream.cs b/third_party/zlib/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 00000000..f0eada1d --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/Inflater.cs b/third_party/zlib/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 00000000..d295f268 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/third_party/zlib/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 00000000..6d8aebb7 --- /dev/null +++ b/third_party/zlib/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.11", 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 diff --git a/third_party/zlib/contrib/dotzlib/LICENSE_1_0.txt b/third_party/zlib/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 00000000..127a5bc3 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/dotzlib/readme.txt b/third_party/zlib/contrib/dotzlib/readme.txt new file mode 100644 index 00000000..4d8c2dd9 --- /dev/null +++ b/third_party/zlib/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/third_party/zlib/contrib/gcc_gvmat64/gvmat64.S b/third_party/zlib/contrib/gcc_gvmat64/gvmat64.S new file mode 100644 index 00000000..23309fa2 --- /dev/null +++ b/third_party/zlib/contrib/gcc_gvmat64/gvmat64.S @@ -0,0 +1,574 @@ +/* +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); // current match + +; gvmat64.S -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; this file is translation from gvmat64.asm to GCC 4.x (for Linux, Mac XCode) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for zLib, I use option: +; gcc -c -arch x86_64 gvmat64.S + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; // current match / +; +; with XCode for Mac, I had strange error with some jump on intel syntax +; this is why BEFORE_JMP and AFTER_JMP are used + */ + + +#define BEFORE_JMP .att_syntax +#define AFTER_JMP .intel_syntax noprefix + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +.intel_syntax noprefix + +.globl match_init, longest_match +.text +longest_match: + + + +#define LocalVarsSize 96 +/* +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp +*/ + +#define chainlenwmask (rsp + 8 - LocalVarsSize) +#define nicematch (rsp + 16 - LocalVarsSize) + +#define save_rdi (rsp + 24 - LocalVarsSize) +#define save_rsi (rsp + 32 - LocalVarsSize) +#define save_rbx (rsp + 40 - LocalVarsSize) +#define save_rbp (rsp + 48 - LocalVarsSize) +#define save_r12 (rsp + 56 - LocalVarsSize) +#define save_r13 (rsp + 64 - LocalVarsSize) +#define save_r14 (rsp + 72 - LocalVarsSize) +#define save_r15 (rsp + 80 - LocalVarsSize) + + +/* +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure +*/ + +#define MAX_MATCH 258 +#define MIN_MATCH 3 +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) + +/* +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). +*/ + + + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize %u\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask %u\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow %u\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev %u\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen %u\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch %u\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart %u\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart %u\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead %u\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen %u\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen %u\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch %u\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch %u\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} +*/ + +#define dsWSize 68 +#define dsWMask 76 +#define dsWindow 80 +#define dsPrev 96 +#define dsMatchLen 144 +#define dsPrevMatch 148 +#define dsStrStart 156 +#define dsMatchStart 160 +#define dsLookahead 164 +#define dsPrevLen 168 +#define dsMaxChainLen 172 +#define dsGoodMatch 188 +#define dsNiceMatch 192 + +#define window_size [ rcx + dsWSize] +#define WMask [ rcx + dsWMask] +#define window_ad [ rcx + dsWindow] +#define prev_ad [ rcx + dsPrev] +#define strstart [ rcx + dsStrStart] +#define match_start [ rcx + dsMatchStart] +#define Lookahead [ rcx + dsLookahead] //; 0ffffffffh on infozip +#define prev_length [ rcx + dsPrevLen] +#define max_chain_length [ rcx + dsMaxChainLen] +#define good_match [ rcx + dsGoodMatch] +#define nice_match [ rcx + dsNiceMatch] + +/* +; windows: +; parameter 1 in rcx(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + +; +; gcc on macosx-linux: +; see http://www.x86-64.org/documentation/abi-0.99.pdf +; param 1 in rdi, param 2 in rsi +; rbx, rsp, rbp, r12 to r15 must be preserved + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d 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. + +; ms: parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) +; mac: param 1 in rdi, param 2 rsi +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx +*/ + mov [save_rbx],rbx + mov [save_rbp],rbp + + + mov rcx,rdi + + mov r8d,esi + + + mov [save_r12],r12 + mov [save_r13],r13 + mov [save_r14],r14 + mov [save_r15],r15 + + +//;;; uInt wmask = s->w_mask; +//;;; unsigned chain_length = s->max_chain_length; +//;;; if (s->prev_length >= s->good_match) { +//;;; chain_length >>= 2; +//;;; } + + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl 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 + +//;;; on zlib only +//;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + + + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d + + + +//;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +//;;; Determine how many bytes the scan ptr is off from being +//;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +//;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +//;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + + mov eax, window_size + sub eax, MIN_LOOKAHEAD + + + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +//;;; int best_len = s->prev_length; + + +//;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +//;;; register ush scan_start = *(ushf*)scan; +//;;; register ush scan_end = *(ushf*)(scan+best_len-1); +//;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +//;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + + + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + + + + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + jmp LookupLoopIsZero + AFTER_JMP +/* +;;; 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 +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit +*/ +.balign 16 +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP + + +//;;; Store the current value of chainlen. + mov [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). +*/ + lea rsi,[r8+r10] + mov rdx, 0xfffffffffffffef8 //; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0x0108] //;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0x0108] //;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + +/* +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. +*/ + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + BEFORE_JMP + jnz LoopCmps + jmp LenMaximum + AFTER_JMP + +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0x0000FFFF + jnz LenLower + + test eax,0xffffffff + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + BEFORE_JMP + jnz LenLower + AFTER_JMP + +LenLower32: + shr eax,16 + add rdx,2 + +LenLower: + sub al, 1 + adc rdx, 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 rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + BEFORE_JMP + jge LenMaximum + AFTER_JMP +/* +;;; 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. +;/////////////////////////////////// +*/ + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP +/* +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); +*/ +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + BEFORE_JMP + jge LeaveNow + AFTER_JMP + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP + +//;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +//;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +//;;; return s->lookahead; + +LeaveNow: + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d + + + +//;;; Restore the stack and return from whence we came. + + +// mov rsi,[save_rsi] +// mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] + mov r14,[save_r14] + mov r15,[save_r15] + + + ret 0 +//; please don't remove this string ! +//; Your can freely use gvmat64 in any free or commercial app +//; but it is far better don't remove the string in the binary! + // db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 + + +match_init: + ret 0 + + diff --git a/third_party/zlib/contrib/infback9/README b/third_party/zlib/contrib/infback9/README new file mode 100644 index 00000000..e75ed132 --- /dev/null +++ b/third_party/zlib/contrib/infback9/README @@ -0,0 +1 @@ +See infback9.h for what this is and how to use it. diff --git a/third_party/zlib/contrib/infback9/infback9.c b/third_party/zlib/contrib/infback9/infback9.c new file mode 100644 index 00000000..05fb3e33 --- /dev/null +++ b/third_party/zlib/contrib/infback9/infback9.c @@ -0,0 +1,615 @@ +/* infback9.c -- inflate deflate64 data using a call-back interface + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infback9.h" +#include "inftree9.h" +#include "inflate9.h" + +#define WSIZE 65536UL + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + window is a user-supplied window and output buffer that is 64K bytes. + */ +int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) +z_stream FAR *strm; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + state->window = window; + return Z_OK; +} + +/* + Build and output length and distance decoding tables for fixed code + decoding. + */ +#ifdef MAKEFIXED +#include + +void makefixed9(void) +{ + unsigned sym, bits, low, size; + code *next, *lenfix, *distfix; + struct inflate_state state; + code fixed[544]; + + /* literal/length table */ + sym = 0; + while (sym < 144) state.lens[sym++] = 8; + while (sym < 256) state.lens[sym++] = 9; + while (sym < 280) state.lens[sym++] = 7; + while (sym < 288) state.lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work); + + /* distance table */ + sym = 0; + while (sym < 32) state.lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work); + + /* write tables */ + puts(" /* inffix9.h -- table for decoding deflate64 fixed codes"); + puts(" * Generated automatically by makefixed9()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits, + lenfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 5) == 0) printf("\n "); + printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits, + distfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* Macros for inflateBack(): */ + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n <= 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = window; \ + left = WSIZE; \ + wrap = 1; \ + if (out(out_desc, put, (unsigned)left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) +z_stream FAR *strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have; /* available input */ + unsigned long left; /* available output */ + inflate_mode mode; /* current inflate mode */ + int lastblock; /* true if processing last block */ + int wrap; /* true if the window has wrapped */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned extra; /* extra bits needed */ + unsigned long length; /* literal or length of data to copy */ + unsigned long offset; /* distance back to copy string from */ + unsigned long copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +#include "inffix9.h" + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + mode = TYPE; + lastblock = 0; + wrap = 0; + window = state->window; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = window; + left = WSIZE; + lencode = Z_NULL; + distcode = Z_NULL; + + /* Inflate until end of block marked as last */ + for (;;) + switch (mode) { + case TYPE: + /* determine and dispatch block type */ + if (lastblock) { + BYTEBITS(); + mode = DONE; + break; + } + NEEDBITS(3); + lastblock = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + lastblock ? " (last)" : "")); + mode = STORED; + break; + case 1: /* fixed block */ + lencode = lenfix; + lenbits = 9; + distcode = distfix; + distbits = 5; + Tracev((stderr, "inflate: fixed codes block%s\n", + lastblock ? " (last)" : "")); + mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + lastblock ? " (last)" : "")); + mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + mode = BAD; + break; + } + length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %lu\n", + length)); + INITBITS(); + + /* copy stored block from input to output */ + while (length != 0) { + copy = length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); + if (state->nlen > 286) { + strm->msg = (char *)"too many length symbols"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 7; + ret = inflate_table9(CODES, state->lens, 19, &(state->next), + &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftree9.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 9; + ret = inflate_table9(LENS, state->lens, state->nlen, + &(state->next), &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + mode = BAD; + break; + } + distcode = (code const FAR *)(state->next); + distbits = 6; + ret = inflate_table9(DISTS, state->lens + state->nlen, + state->ndist, &(state->next), &(distbits), + state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + mode = LEN; + + case LEN: + /* get a literal, length, or end-of-block code */ + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(length); + left--; + mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + extra = (unsigned)(here.op) & 31; + if (extra != 0) { + NEEDBITS(extra); + length += BITS(extra); + DROPBITS(extra); + } + Tracevv((stderr, "inflate: length %lu\n", length)); + + /* get distance code */ + for (;;) { + here = distcode[BITS(distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + mode = BAD; + break; + } + offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + extra = (unsigned)(here.op) & 15; + if (extra != 0) { + NEEDBITS(extra); + offset += BITS(extra); + DROPBITS(extra); + } + if (offset > WSIZE - (wrap ? 0: left)) { + strm->msg = (char *)"invalid distance too far back"; + mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %lu\n", offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = WSIZE - offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - offset; + copy = left; + } + if (copy > length) copy = length; + length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < WSIZE) { + if (out(out_desc, window, (unsigned)(WSIZE - left))) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBack9End(strm) +z_stream FAR *strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/third_party/zlib/contrib/infback9/infback9.h b/third_party/zlib/contrib/infback9/infback9.h new file mode 100644 index 00000000..1073c0a3 --- /dev/null +++ b/third_party/zlib/contrib/infback9/infback9.h @@ -0,0 +1,37 @@ +/* infback9.h -- header for using inflateBack9 functions + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * This header file and associated patches provide a decoder for PKWare's + * undocumented deflate64 compression method (method 9). Use with infback9.c, + * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported. + * This should be compiled with zlib, since it uses zutil.h and zutil.o. + * This code has not yet been tested on 16-bit architectures. See the + * comments in zlib.h for inflateBack() usage. These functions are used + * identically, except that there is no windowBits parameter, and a 64K + * window must be provided. Also if int's are 16 bits, then a zero for + * the third parameter of the "out" function actually means 65536UL. + * 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)); +ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); +ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define inflateBack9Init(strm, window) \ + inflateBack9Init_((strm), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef __cplusplus +} +#endif diff --git a/third_party/zlib/contrib/infback9/inffix9.h b/third_party/zlib/contrib/infback9/inffix9.h new file mode 100644 index 00000000..ee5671d2 --- /dev/null +++ b/third_party/zlib/contrib/infback9/inffix9.h @@ -0,0 +1,107 @@ + /* inffix9.h -- table for decoding deflate64 fixed codes + * Generated automatically by makefixed9(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112}, + {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160}, + {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88}, + {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208}, + {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136}, + {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227}, + {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232}, + {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124}, + {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184}, + {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82}, + {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196}, + {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130}, + {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148}, + {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106}, + {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244}, + {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118}, + {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172}, + {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94}, + {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220}, + {130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131}, + {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97}, + {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226}, + {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121}, + {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178}, + {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85}, + {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202}, + {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133}, + {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154}, + {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109}, + {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250}, + {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115}, + {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166}, + {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91}, + {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214}, + {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139}, + {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0}, + {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103}, + {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238}, + {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127}, + {0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80}, + {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193}, + {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128}, + {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145}, + {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104}, + {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241}, + {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116}, + {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169}, + {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92}, + {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217}, + {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140}, + {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163}, + {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98}, + {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122}, + {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181}, + {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86}, + {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205}, + {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134}, + {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157}, + {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253}, + {96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113}, + {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163}, + {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89}, + {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211}, + {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137}, + {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3}, + {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101}, + {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235}, + {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125}, + {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187}, + {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83}, + {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199}, + {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151}, + {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107}, + {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247}, + {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119}, + {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175}, + {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95}, + {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223}, + {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143}, + {0,8,79},{0,9,255} + }; + + static const code distfix[32] = { + {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5}, + {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513}, + {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129}, + {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145}, + {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4}, + {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073}, + {134,5,193},{142,5,49153} + }; diff --git a/third_party/zlib/contrib/infback9/inflate9.h b/third_party/zlib/contrib/infback9/inflate9.h new file mode 100644 index 00000000..ee9a7939 --- /dev/null +++ b/third_party/zlib/contrib/infback9/inflate9.h @@ -0,0 +1,47 @@ +/* inflate9.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + TYPE, /* i: waiting for type bits, including last-flag bit */ + STORED, /* i: waiting for stored size (length and complement) */ + TABLE, /* i: waiting for dynamic block table lengths */ + LEN, /* i: waiting for length/lit code */ + DONE, /* finished check, done -- remain here until reset */ + BAD /* got a data error -- remain here until reset */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD mode -- not shown for clarity) + + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or DONE + STORED -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LEN or TYPE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + /* sliding window */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/third_party/zlib/contrib/infback9/inftree9.c b/third_party/zlib/contrib/infback9/inftree9.c new file mode 100644 index 00000000..5f4a7679 --- /dev/null +++ b/third_party/zlib/contrib/infback9/inftree9.c @@ -0,0 +1,324 @@ +/* inftree9.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftree9.h" + +#define MAXBITS 15 + +const char inflate9_copyright[] = + " inflate9 1.2.11 Copyright 1995-2017 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 + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table9(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, + 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, + 131, 163, 195, 227, 3, 0, 0}; + 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, 202}; + 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, + 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153}; + static const unsigned short dext[32] = { /* Distance codes 0..31 extra */ + 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 141, 141, 142, 142}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) return -1; /* no codes! */ + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftree9.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + curr = root; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/third_party/zlib/contrib/infback9/inftree9.h b/third_party/zlib/contrib/infback9/inftree9.h new file mode 100644 index 00000000..5ab21f0c --- /dev/null +++ b/third_party/zlib/contrib/infback9/inftree9.h @@ -0,0 +1,61 @@ +/* inftree9.h -- header to use inftree9.c + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 100eeeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1446, which is the sum of 852 for literal/length codes and 594 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 32 6 15" for distance codes returns 594. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in infback9.c. If the root table size is changed, + then these maximum sizes would be need to be recalculated and updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 594 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table9() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/third_party/zlib/contrib/inflate86/inffas86.c b/third_party/zlib/contrib/inflate86/inffas86.c new file mode 100644 index 00000000..7292f67b --- /dev/null +++ b/third_party/zlib/contrib/inflate86/inffas86.c @@ -0,0 +1,1157 @@ +/* inffas86.c is a hand tuned assembler version of + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } ar; + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) + __asm__ __volatile__ ( +" leaq %0, %%rax\n" +" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ +" movq %%rsp, (%%rax)\n" +" movq %%rax, %%rsp\n" /* make rsp point to &ar */ +" movq 16(%%rsp), %%rsi\n" /* rsi = in */ +" movq 32(%%rsp), %%rdi\n" /* rdi = out */ +" movq 24(%%rsp), %%r9\n" /* r9 = last */ +" movq 48(%%rsp), %%r10\n" /* r10 = end */ +" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ +" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ +" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ +" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ +" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ +" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ + /* r14d = len */ + /* r15d = dist */ +" cld\n" +" cmpq %%rdi, %%r10\n" +" je .L_one_time\n" /* if only one decode left */ +" cmpq %%rsi, %%r9\n" +" je .L_one_time\n" +" jmp .L_do_loop\n" + +".L_one_time:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code_one_time\n" + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ +" jmp .L_get_length_code_one_time\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpq %%rdi, %%r10\n" +" jbe .L_break_loop\n" +" cmpq %%rsi, %%r9\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_length_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" movq %%r12, %%r8\n" /* r8 = lmask */ +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" + +".L_get_length_code_one_time:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%r14d\n" /* len = this */ +" shrl $16, %%r14d\n" /* len = this.val */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" movq %%r13, %%r8\n" /* r8 = dmask */ +" cmpb $32, %%bl\n" +" ja .L_get_distance_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_distance_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%r15d\n" /* dist = this */ +" shrl $16, %%r15d\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ +" movq %%rdi, %%rax\n" +" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ + +" cmpl %%r15d, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%rsi), %%al\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ +" je .L_check_window\n" + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movb -1(%%rdi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +".L_set_two:\n" +" rep stosw\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r14d, %%eax\n" /* eax += len */ +" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r15d, %%eax\n" /* eax += dist */ +" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" /* ecx = nbytes */ +" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ +" negl %%ecx\n" /* nbytes = -nbytes */ + +" cmpl %%r15d, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 96(%%rsp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%r14d\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 96(%%rsp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" movl 92(%%rsp), %%esi\n" /* from = wsize */ +" addq 56(%%rsp), %%rsi\n" /* from += window */ +" addq %%rax, %%rsi\n" /* from += write */ +" subq %%rcx, %%rsi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" movq 56(%%rsp), %%rsi\n" /* rsi = window */ +" addq %%rax, %%rsi\n" +" subq %%rcx, %%rsi\n" /* from += write - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" /* ecx = len */ +" rep movsb\n" + +" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl $4, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 116(%%rsp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movq %%rsi, 16(%%rsp)\n" /* in */ +" movq %%rdi, 32(%%rsp)\n" /* out */ +" movl %%ebx, 88(%%rsp)\n" /* bits */ +" movq %%rdx, 80(%%rsp)\n" /* hold */ +" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ +" movq 8(%%rsp), %%rbp\n" +" movq %%rax, %%rsp\n" + : + : "m" (ar) + : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" + ); +#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" movl %%esp, (%%eax)\n" /* save esp, ebp */ +" movl %%ebp, 4(%%eax)\n" +" movl %%eax, %%esp\n" +" movl 8(%%esp), %%esi\n" /* esi = in */ +" movl 16(%%esp), %%edi\n" /* edi = out */ +" movl 40(%%esp), %%edx\n" /* edx = hold */ +" movl 44(%%esp), %%ebx\n" /* ebx = bits */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpl %%edi, 24(%%esp)\n" /* out < end */ +" jbe .L_break_loop\n" +" cmpl %%esi, 12(%%esp)\n" /* in < last */ +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 64(%%esp)\n" /* save len */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 60(%%esp), %%eax\n" /* eax = dmask */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 20(%%esp)\n" +" je .L_check_window\n" /* out == beg, if outside window */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movb -1(%%edi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +".L_set_two:\n" +" rep stosw\n" +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 64(%%esp), %%eax\n" /* eax += len */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += dist */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 48(%%esp), %%eax\n" /* eax = wsize */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 28(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 52(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 52(%%esp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 48(%%esp), %%esi\n" /* from += wsize */ +" addl %%eax, %%esi\n" /* from += write */ +" subl %%ecx, %%esi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 28(%%esp), %%esi\n" /* from = window */ +" movl 52(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 8(%%esp), %%esi\n" +" movl $4, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 72(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 8(%%esp)\n" /* save in */ +" movl %%edi, 16(%%esp)\n" /* save out */ +" movl %%ebx, 44(%%esp)\n" /* save bits */ +" movl %%edx, 40(%%esp)\n" /* save hold */ +" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ +" movl (%%esp), %%esp\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); +#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) + __asm { + lea eax, ar + mov [eax], esp /* save esp, ebp */ + mov [eax+4], ebp + mov esp, eax + mov esi, [esp+8] /* esi = in */ + mov edi, [esp+16] /* edi = out */ + mov edx, [esp+40] /* edx = hold */ + mov ebx, [esp+44] /* ebx = bits */ + mov ebp, [esp+32] /* ebp = lcode */ + + cld + jmp L_do_loop + +ALIGN 4 +L_while_test: + cmp [esp+24], edi + jbe L_break_loop + cmp [esp+12], esi + jbe L_break_loop + +L_do_loop: + cmp bl, 15 + ja L_get_length_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_length_code: + mov eax, [esp+56] /* eax = lmask */ + and eax, edx /* eax &= hold */ + mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah /* cl = this.bits */ + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base /* if (op != 0) 45.7% */ + + shr eax, 16 /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov ecx, eax /* len = this */ + shr ecx, 16 /* len = this.val */ + mov [esp+64], ecx /* save len */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + and cl, 15 /* op &= 15 */ + jz L_decode_distance /* if (!op) */ + cmp bl, cl + jae L_add_bits_to_len /* if (op <= bits) */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + shr edx, cl + add [esp+64], eax /* len += hold & mask[op] */ + +L_decode_distance: + cmp bl, 15 + ja L_get_distance_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_distance_code: + mov eax, [esp+60] /* eax = dmask */ + mov ecx, [esp+36] /* ecx = dcode */ + and eax, edx /* eax &= hold */ + mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ + +L_dodist: + mov ebp, eax /* dist = this */ + shr ebp, 16 /* dist = this.val */ + mov cl, ah + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + mov cl, al /* cl = this.op */ + + test al, 16 /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 /* op &= 15 */ + jz L_check_dist_one + cmp bl, cl + jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax /* (1 << op) - 1 */ + and eax, edx /* eax &= hold */ + shr edx, cl + add ebp, eax /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov [esp+8], esi /* save in so from can use it's reg */ + mov eax, edi + sub eax, [esp+20] /* nbytes = out - beg */ + + cmp eax, ebp + jb L_clip_window /* if (dist > nbytes) 4.2% */ + + mov ecx, [esp+64] /* ecx = len */ + mov esi, edi + sub esi, ebp /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two + + rep movsw + mov al, [esi] + mov [edi], al + inc edi + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_copy_two: + rep movsw + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp ebp, 1 /* if dist 1, is a memset */ + jne L_check_window + cmp [esp+20], edi + je L_check_window /* out == beg, if outside window */ + + mov ecx, [esp+64] /* ecx = len */ + mov al, [edi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [edi], al /* memset out with from[-1] */ + inc edi + +L_set_two: + rep stosw + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, [esp+64] /* eax += len */ + mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, ebp /* eax += dist */ + mov ecx, [esp+36] /* ecx = dcode */ + mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax + mov eax, [esp+48] /* eax = wsize */ + neg ecx /* nbytes = -nbytes */ + mov esi, [esp+28] /* from = window */ + + cmp eax, ebp + jb L_invalid_distance_too_far /* if (dist > wsize) */ + + add ecx, ebp /* nbytes = dist - nbytes */ + cmp dword ptr [esp+52], 0 + jne L_wrap_around_window /* if (write != 0) */ + + sub eax, ecx + add esi, eax /* from += wsize - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [esp+52] /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window /* if (write >= nbytes) */ + + add esi, [esp+48] /* from += wsize */ + add esi, eax /* from += write */ + sub esi, ecx /* from -= nbytes */ + sub ecx, eax /* nbytes -= write */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, [esp+28] /* from = window */ + mov ecx, [esp+52] /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + add esi, eax + sub esi, ecx /* from += write - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_do_copy: + mov ecx, eax + rep movsb + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [esp+72], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [esp+72], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [esp+72], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov esi, [esp+4] + mov dword ptr [esp+72], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [esp+72], 0 + +L_break_loop_with_status: +/* put in, out, bits, and hold back into ar and pop esp */ + mov [esp+8], esi /* save in */ + mov [esp+16], edi /* save out */ + mov [esp+44], ebx /* save bits */ + mov [esp+40], edx /* save hold */ + mov ebp, [esp+4] /* restore esp, ebp */ + mov esp, [esp] + } +#else +#error "x86 architecture not defined" +#endif + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + diff --git a/third_party/zlib/contrib/inflate86/inffast.S b/third_party/zlib/contrib/inflate86/inffast.S new file mode 100644 index 00000000..2245a290 --- /dev/null +++ b/third_party/zlib/contrib/inflate86/inffast.S @@ -0,0 +1,1368 @@ +/* + * inffast.S is a hand tuned assembler version of: + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * This version (Jan-23-2003) of inflate_fast was coded and tested under + * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that + * machine, I found that gzip style archives decompressed about 20% faster than + * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will + * depend on how large of a buffer is used for z_stream.next_in & next_out + * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in + * stream processing I/O and crc32/addler32. In my case, this routine used + * 70% of the cpu time and crc32 used 20%. + * + * I am confident that this version will work in the general case, but I have + * not tested a wide variety of datasets or a wide variety of platforms. + * + * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. + * It should be a runtime flag instead of compile time flag... + * + * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. + * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code + * is compiled. Without either option, runtime detection is enabled. Runtime + * detection should work on all modern cpus and the recomended algorithm (flip + * ID bit on eflags and then use the cpuid instruction) is used in many + * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 + * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o + * inffast.obj generates a COFF object which can then be linked with MSVC++ + * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. + * + * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and + * slower than compiler generated code). Adjusted cpuid check to use the MMX + * code only for Pentiums < P4 until I have more data on the P4. Speed + * improvment is only about 15% on the Athlon when compared with code generated + * with MSVC++. Not sure yet, but I think the P4 will also be slower using the + * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and + * have less latency than MMX ops. Added code to buffer the last 11 bytes of + * the input stream since the MMX code grabs bits in chunks of 32, which + * differs from the inffast.c algorithm. I don't think there would have been + * read overruns where a page boundary was crossed (a segfault), but there + * could have been overruns when next_in ends on unaligned memory (unintialized + * memory read). + * + * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C + * version of the non-MMX code so that it doesn't depend on zstrm and zstate + * structure offsets which are hard coded in this file. This was last tested + * with zlib-1.2.0 which is currently in beta testing, newer versions of this + * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and + * http://www.charm.net/~christop/zlib/ + */ + + +/* + * if you have underscore linking problems (_inflate_fast undefined), try + * using -DGAS_COFF + */ +#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) + +#if defined( WIN32 ) || defined( __CYGWIN__ ) +#define GAS_COFF /* windows object format */ +#else +#define GAS_ELF +#endif + +#endif /* ! GAS_COFF && ! GAS_ELF */ + + +#if defined( GAS_COFF ) + +/* coff externals have underscores */ +#define inflate_fast _inflate_fast +#define inflate_fast_use_mmx _inflate_fast_use_mmx + +#endif /* GAS_COFF */ + + +.file "inffast.S" + +.globl inflate_fast + +.text +.align 4,0 +.L_invalid_literal_length_code_msg: +.string "invalid literal/length code" + +.align 4,0 +.L_invalid_distance_code_msg: +.string "invalid distance code" + +.align 4,0 +.L_invalid_distance_too_far_msg: +.string "invalid distance too far back" + +#if ! defined( NO_MMX ) +.align 4,0 +.L_mask: /* mask[N] = ( 1 << N ) - 1 */ +.long 0 +.long 1 +.long 3 +.long 7 +.long 15 +.long 31 +.long 63 +.long 127 +.long 255 +.long 511 +.long 1023 +.long 2047 +.long 4095 +.long 8191 +.long 16383 +.long 32767 +.long 65535 +.long 131071 +.long 262143 +.long 524287 +.long 1048575 +.long 2097151 +.long 4194303 +.long 8388607 +.long 16777215 +.long 33554431 +.long 67108863 +.long 134217727 +.long 268435455 +.long 536870911 +.long 1073741823 +.long 2147483647 +.long 4294967295 +#endif /* NO_MMX */ + +.text + +/* + * struct z_stream offsets, in zlib.h + */ +#define next_in_strm 0 /* strm->next_in */ +#define avail_in_strm 4 /* strm->avail_in */ +#define next_out_strm 12 /* strm->next_out */ +#define avail_out_strm 16 /* strm->avail_out */ +#define msg_strm 24 /* strm->msg */ +#define state_strm 28 /* strm->state */ + +/* + * struct inflate_state offsets, in inflate.h + */ +#define mode_state 0 /* state->mode */ +#define wsize_state 32 /* state->wsize */ +#define write_state 40 /* state->write */ +#define window_state 44 /* state->window */ +#define hold_state 48 /* state->hold */ +#define bits_state 52 /* state->bits */ +#define lencode_state 68 /* state->lencode */ +#define distcode_state 72 /* state->distcode */ +#define lenbits_state 76 /* state->lenbits */ +#define distbits_state 80 /* state->distbits */ + +/* + * inflate_fast's activation record + */ +#define local_var_size 64 /* how much local space for vars */ +#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ +#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ + +/* + * offsets for local vars on stack + */ +#define out 60 /* unsigned char* */ +#define window 56 /* unsigned char* */ +#define wsize 52 /* unsigned int */ +#define write 48 /* unsigned int */ +#define in 44 /* unsigned char* */ +#define beg 40 /* unsigned char* */ +#define buf 28 /* char[ 12 ] */ +#define len 24 /* unsigned int */ +#define last 20 /* unsigned char* */ +#define end 16 /* unsigned char* */ +#define dcode 12 /* code* */ +#define lcode 8 /* code* */ +#define dmask 4 /* unsigned int */ +#define lmask 0 /* unsigned int */ + +/* + * typedef enum inflate_mode consts, in inflate.h + */ +#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ +#define INFLATE_MODE_BAD 26 + + +#if ! defined( USE_MMX ) && ! defined( NO_MMX ) + +#define RUN_TIME_MMX + +#define CHECK_MMX 1 +#define DO_USE_MMX 2 +#define DONT_USE_MMX 3 + +.globl inflate_fast_use_mmx + +.data + +.align 4,0 +inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ +.long CHECK_MMX + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast_use_mmx,@object +.size inflate_fast_use_mmx,4 +#endif + +#endif /* RUN_TIME_MMX */ + +#if defined( GAS_COFF ) +/* coff info: scl 2 = extern, type 32 = function */ +.def inflate_fast; .scl 2; .type 32; .endef +#endif + +.text + +.align 32,0x90 +inflate_fast: + pushl %edi + pushl %esi + pushl %ebp + pushl %ebx + pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ + subl $local_var_size, %esp + cld + +#define strm_r %esi +#define state_r %edi + + movl strm_sp(%esp), strm_r + movl state_strm(strm_r), state_r + + /* in = strm->next_in; + * out = strm->next_out; + * last = in + strm->avail_in - 11; + * beg = out - (start - strm->avail_out); + * end = out + (strm->avail_out - 257); + */ + movl avail_in_strm(strm_r), %edx + movl next_in_strm(strm_r), %eax + + addl %eax, %edx /* avail_in += next_in */ + subl $11, %edx /* avail_in -= 11 */ + + movl %eax, in(%esp) + movl %edx, last(%esp) + + movl start_sp(%esp), %ebp + movl avail_out_strm(strm_r), %ecx + movl next_out_strm(strm_r), %ebx + + subl %ecx, %ebp /* start -= avail_out */ + negl %ebp /* start = -start */ + addl %ebx, %ebp /* start += next_out */ + + subl $257, %ecx /* avail_out -= 257 */ + addl %ebx, %ecx /* avail_out += out */ + + movl %ebx, out(%esp) + movl %ebp, beg(%esp) + movl %ecx, end(%esp) + + /* wsize = state->wsize; + * write = state->write; + * window = state->window; + * hold = state->hold; + * bits = state->bits; + * lcode = state->lencode; + * dcode = state->distcode; + * lmask = ( 1 << state->lenbits ) - 1; + * dmask = ( 1 << state->distbits ) - 1; + */ + + movl lencode_state(state_r), %eax + movl distcode_state(state_r), %ecx + + movl %eax, lcode(%esp) + movl %ecx, dcode(%esp) + + movl $1, %eax + movl lenbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, lmask(%esp) + + movl $1, %eax + movl distbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, dmask(%esp) + + movl wsize_state(state_r), %eax + movl write_state(state_r), %ecx + movl window_state(state_r), %edx + + movl %eax, wsize(%esp) + movl %ecx, write(%esp) + movl %edx, window(%esp) + + movl hold_state(state_r), %ebp + movl bits_state(state_r), %ebx + +#undef strm_r +#undef state_r + +#define in_r %esi +#define from_r %esi +#define out_r %edi + + movl in(%esp), in_r + movl last(%esp), %ecx + cmpl in_r, %ecx + ja .L_align_long /* if in < last */ + + addl $11, %ecx /* ecx = &in[ avail_in ] */ + subl in_r, %ecx /* ecx = avail_in */ + movl $12, %eax + subl %ecx, %eax /* eax = 12 - avail_in */ + leal buf(%esp), %edi + rep movsb /* memcpy( buf, in, avail_in ) */ + movl %eax, %ecx + xorl %eax, %eax + rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ + leal buf(%esp), in_r /* in = buf */ + movl in_r, last(%esp) /* last = in, do just one iteration */ + jmp .L_is_aligned + + /* align in_r on long boundary */ +.L_align_long: + testl $3, in_r + jz .L_is_aligned + xorl %eax, %eax + movb (in_r), %al + incl in_r + movl %ebx, %ecx + addl $8, %ebx + shll %cl, %eax + orl %eax, %ebp + jmp .L_align_long + +.L_is_aligned: + movl out(%esp), out_r + +#if defined( NO_MMX ) + jmp .L_do_loop +#endif + +#if defined( USE_MMX ) + jmp .L_init_mmx +#endif + +/*** Runtime MMX check ***/ + +#if defined( RUN_TIME_MMX ) +.L_check_mmx: + cmpl $DO_USE_MMX, inflate_fast_use_mmx + je .L_init_mmx + ja .L_do_loop /* > 2 */ + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushf + movl (%esp), %eax /* copy eflags to eax */ + xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) + * to see if cpu supports cpuid... + * ID bit method not supported by NexGen but + * bios may load a cpuid instruction and + * cpuid may be disabled on Cyrix 5-6x86 */ + popf + pushf + popl %edx /* copy new eflags to edx */ + xorl %eax, %edx /* test if ID bit is flipped */ + jz .L_dont_use_mmx /* not flipped if zero */ + xorl %eax, %eax + cpuid + cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ + jne .L_dont_use_mmx + cmpl $0x6c65746e, %ecx + jne .L_dont_use_mmx + cmpl $0x49656e69, %edx + jne .L_dont_use_mmx + movl $1, %eax + cpuid /* get cpu features */ + shrl $8, %eax + andl $15, %eax + cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ + jne .L_dont_use_mmx + testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ + jnz .L_use_mmx + jmp .L_dont_use_mmx +.L_use_mmx: + movl $DO_USE_MMX, inflate_fast_use_mmx + jmp .L_check_mmx_pop +.L_dont_use_mmx: + movl $DONT_USE_MMX, inflate_fast_use_mmx +.L_check_mmx_pop: + popl %edx + popl %ecx + popl %ebx + popl %eax + jmp .L_check_mmx +#endif + + +/*** Non-MMX code ***/ + +#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) + +#define hold_r %ebp +#define bits_r %bl +#define bitslong_r %ebx + +.align 32,0x90 +.L_while_test: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * do { + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = lcode[hold & lmask] + */ + cmpb $15, bits_r + ja .L_get_length_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_length_code: + movl lmask(%esp), %edx /* edx = lmask */ + movl lcode(%esp), %ecx /* ecx = lcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * dolen: + * bits -= this.bits; + * hold >>= this.bits + */ + movb %ah, %cl /* cl = this.bits */ + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* check if op is a literal + * if (op == 0) { + * PUP(out) = this.val; + * } + */ + testb %al, %al + jnz .L_test_for_length_base /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test + +.L_test_for_length_base: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len + * + * else if (op & 16) { + * len = this.val + * op &= 15 + * if (op) { + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * len += hold & mask[op]; + * bits -= op; + * hold >>= op; + * } + */ +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + movb %al, %cl + + testb $16, %al + jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + andb $15, %cl /* op &= 15 */ + jz .L_save_len /* if (!op) */ + cmpb %cl, bits_r + jae .L_add_bits_to_len /* if (op <= bits) */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_len: + movl $1, %eax + shll %cl, %eax + decl %eax + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, len_r /* len += hold & mask[op] */ + +.L_save_len: + movl len_r, len(%esp) /* save len */ +#undef len_r + +.L_decode_distance: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = dcode[hold & dmask]; + * dodist: + * bits -= this.bits; + * hold >>= this.bits; + * op = this.op; + */ + + cmpb $15, bits_r + ja .L_get_distance_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_distance_code: + movl dmask(%esp), %edx /* edx = dmask */ + movl dcode(%esp), %ecx /* ecx = dcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ + +#define dist_r %edx +.L_dodist: + movl %eax, dist_r /* dist = this */ + shrl $16, dist_r /* dist = this.val */ + movb %ah, %cl + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* if (op & 16) { + * dist = this.val + * op &= 15 + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * dist += hold & mask[op]; + * bits -= op; + * hold >>= op; + */ + movb %al, %cl /* cl = this.op */ + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist + andb $15, %cl /* op &= 15 */ + jz .L_check_dist_one + cmpb %cl, bits_r + jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_dist: + movl $1, %eax + shll %cl, %eax + decl %eax /* (1 << op) - 1 */ + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ + jmp .L_check_window + +.L_check_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * nbytes = out - beg; + * if (dist <= nbytes) { + * from = out - dist; + * do { + * PUP(out) = PUP(from); + * } while (--len > 0) { + * } + */ + + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window /* if (dist > nbytes) 4.2% */ + + movl len(%esp), %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +.align 16,0x90 +.L_check_dist_one: + cmpl $1, dist_r + jne .L_check_window + cmpl out_r, beg(%esp) + je .L_check_window + + decl out_r + movl len(%esp), %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + jmp .L_while_test + +.align 16,0x90 +.L_test_for_second_level_length: + /* else if ((op & 64) == 0) { + * this = lcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl lcode(%esp), %edx /* edx = lcode */ + movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ + jmp .L_dolen + +.align 16,0x90 +.L_test_for_second_level_dist: + /* else if ((op & 64) == 0) { + * this = dcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl dcode(%esp), %edx /* edx = dcode */ + movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ + jmp .L_dodist + +.align 16,0x90 +.L_clip_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * else { + * if (dist > wsize) { + * invalid distance + * } + * from = window; + * nbytes = dist - nbytes; + * if (write == 0) { + * from += wsize - nbytes; + */ +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = len + * + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define len_r %eax + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_wrap_around_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else if (write < nbytes) { + * from += wsize + write - nbytes; + * nbytes -= write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = window; + * nbytes = write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while(--nbytes); + * from = out - dist; + * } + * } + * } + */ +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_contiguous_in_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else { + * from += write - nbytes; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1: + /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out + * %eax = len + * + * while (len > 0) { + * PUP(out) = PUP(from); + * len--; + * } + * } + * } while (in < last && out < end); + */ +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +#undef len_r +#undef dist_r + +#endif /* NO_MMX || RUN_TIME_MMX */ + + +/*** MMX code ***/ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +.align 32,0x90 +.L_init_mmx: + emms + +#undef bits_r +#undef bitslong_r +#define bitslong_r %ebp +#define hold_mm %mm0 + movd %ebp, hold_mm + movl %ebx, bitslong_r + +#define used_mm %mm1 +#define dmask2_mm %mm2 +#define lmask2_mm %mm3 +#define lmask_mm %mm4 +#define dmask_mm %mm5 +#define tmp_mm %mm6 + + movd lmask(%esp), lmask_mm + movq lmask_mm, lmask2_mm + movd dmask(%esp), dmask_mm + movq dmask_mm, dmask2_mm + pxor used_mm, used_mm + movl lcode(%esp), %ebx /* ebx = lcode */ + jmp .L_do_loop_mmx + +.align 32,0x90 +.L_while_test_mmx: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_length_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_length_code_mmx: + pand hold_mm, lmask_mm + movd lmask_mm, %eax + movq lmask2_mm, lmask_mm + movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen_mmx: + movzbl %ah, %ecx /* ecx = this.bits */ + movd %ecx, used_mm + subl %ecx, bitslong_r /* bits -= this.bits */ + + testb %al, %al + jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test_mmx + +.L_test_for_length_base_mmx: +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + + testb $16, %al + jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ + andl $15, %eax /* op &= 15 */ + jz .L_decode_distance_mmx /* if (!op) */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm + movd hold_mm, %ecx + subl %eax, bitslong_r + andl .L_mask(,%eax,4), %ecx + addl %ecx, len_r /* len += hold & mask[op] */ + +.L_decode_distance_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_dist_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_dist_code_mmx: + movl dcode(%esp), %ebx /* ebx = dcode */ + pand hold_mm, dmask_mm + movd dmask_mm, %eax + movq dmask2_mm, dmask_mm + movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ + +.L_dodist_mmx: +#define dist_r %ebx + movzbl %ah, %ecx /* ecx = this.bits */ + movl %eax, dist_r + shrl $16, dist_r /* dist = this.val */ + subl %ecx, bitslong_r /* bits -= this.bits */ + movd %ecx, used_mm + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist_mmx + andl $15, %eax /* op &= 15 */ + jz .L_check_dist_one_mmx + +.L_add_bits_to_dist_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm /* save bit length of current op */ + movd hold_mm, %ecx /* get the next bits on input stream */ + subl %eax, bitslong_r /* bits -= op bits */ + andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ + addl %ecx, dist_r /* dist += hold & mask[op] */ + +.L_check_window_mmx: + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ + + movl len_r, %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_check_dist_one_mmx: + cmpl $1, dist_r + jne .L_check_window_mmx + cmpl out_r, beg(%esp) + je .L_check_window_mmx + + decl out_r + movl len_r, %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_test_for_second_level_length_mmx: + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + addl len_r, %ecx + movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dolen_mmx + +.align 16,0x90 +.L_test_for_second_level_dist_mmx: + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + movl dcode(%esp), %eax /* ecx = dcode */ + addl dist_r, %ecx + movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dodist_mmx + +.align 16,0x90 +.L_clip_window_mmx: +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window_mmx /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_wrap_around_window_mmx: +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_contiguous_in_window_mmx: +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1_mmx: +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +#undef hold_r +#undef bitslong_r + +#endif /* USE_MMX || RUN_TIME_MMX */ + + +/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ + +.L_invalid_distance_code: + /* else { + * strm->msg = "invalid distance code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_distance_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_test_for_end_of_block: + /* else if (op & 32) { + * state->mode = TYPE; + * break; + * } + */ + testb $32, %al + jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ + + movl $0, %ecx + movl $INFLATE_MODE_TYPE, %edx + jmp .L_update_stream_state + +.L_invalid_literal_length_code: + /* else { + * strm->msg = "invalid literal/length code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_literal_length_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_invalid_distance_too_far: + /* strm->msg = "invalid distance too far back"; + * state->mode = BAD; + */ + movl in(%esp), in_r /* from_r has in's reg, put in back */ + movl $.L_invalid_distance_too_far_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_update_stream_state: + /* set strm->msg = %ecx, strm->state->mode = %edx */ + movl strm_sp(%esp), %eax + testl %ecx, %ecx /* if (msg != NULL) */ + jz .L_skip_msg + movl %ecx, msg_strm(%eax) /* strm->msg = msg */ +.L_skip_msg: + movl state_strm(%eax), %eax /* state = strm->state */ + movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ + jmp .L_break_loop + +.align 32,0x90 +.L_break_loop: + +/* + * Regs: + * + * bits = %ebp when mmx, and in %ebx when non-mmx + * hold = %hold_mm when mmx, and in %ebp when non-mmx + * in = %esi + * out = %edi + */ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_next_in + +#endif /* RUN_TIME_MMX */ + + movl %ebp, %ebx + +.L_update_next_in: + +#endif + +#define strm_r %eax +#define state_r %edx + + /* len = bits >> 3; + * in -= len; + * bits -= len << 3; + * hold &= (1U << bits) - 1; + * state->hold = hold; + * state->bits = bits; + * strm->next_in = in; + * strm->next_out = out; + */ + movl strm_sp(%esp), strm_r + movl %ebx, %ecx + movl state_strm(strm_r), state_r + shrl $3, %ecx + subl %ecx, in_r + shll $3, %ecx + subl %ecx, %ebx + movl out_r, next_out_strm(strm_r) + movl %ebx, bits_state(state_r) + movl %ebx, %ecx + + leal buf(%esp), %ebx + cmpl %ebx, last(%esp) + jne .L_buf_not_used /* if buf != last */ + + subl %ebx, in_r /* in -= buf */ + movl next_in_strm(strm_r), %ebx + movl %ebx, last(%esp) /* last = strm->next_in */ + addl %ebx, in_r /* in += strm->next_in */ + movl avail_in_strm(strm_r), %ebx + subl $11, %ebx + addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ + +.L_buf_not_used: + movl in_r, next_in_strm(strm_r) + + movl $1, %ebx + shll %cl, %ebx + decl %ebx + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_hold + +#endif /* RUN_TIME_MMX */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ebp + + emms + +.L_update_hold: + +#endif /* USE_MMX || RUN_TIME_MMX */ + + andl %ebx, %ebp + movl %ebp, hold_state(state_r) + +#define last_r %ebx + + /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ + movl last(%esp), last_r + cmpl in_r, last_r + jbe .L_last_is_smaller /* if (in >= last) */ + + subl in_r, last_r /* last -= in */ + addl $11, last_r /* last += 11 */ + movl last_r, avail_in_strm(strm_r) + jmp .L_fixup_out +.L_last_is_smaller: + subl last_r, in_r /* in -= last */ + negl in_r /* in = -in */ + addl $11, in_r /* in += 11 */ + movl in_r, avail_in_strm(strm_r) + +#undef last_r +#define end_r %ebx + +.L_fixup_out: + /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ + movl end(%esp), end_r + cmpl out_r, end_r + jbe .L_end_is_smaller /* if (out >= end) */ + + subl out_r, end_r /* end -= out */ + addl $257, end_r /* end += 257 */ + movl end_r, avail_out_strm(strm_r) + jmp .L_done +.L_end_is_smaller: + subl end_r, out_r /* out -= end */ + negl out_r /* out = -out */ + addl $257, out_r /* out += 257 */ + movl out_r, avail_out_strm(strm_r) + +#undef end_r +#undef strm_r +#undef state_r + +.L_done: + addl $local_var_size, %esp + popf + popl %ebx + popl %ebp + popl %esi + popl %edi + ret + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast,@function +.size inflate_fast,.-inflate_fast +#endif diff --git a/third_party/zlib/contrib/iostream/test.cpp b/third_party/zlib/contrib/iostream/test.cpp new file mode 100644 index 00000000..7d265b3b --- /dev/null +++ b/third_party/zlib/contrib/iostream/test.cpp @@ -0,0 +1,24 @@ + +#include "zfstream.h" + +int main() { + + // Construct a stream object with this filebuffer. Anything sent + // to this stream will go to standard out. + gzofstream os( 1, ios::out ); + + // This text is getting compressed and sent to stdout. + // To prove this, run 'test | zcat'. + os << "Hello, Mommy" << endl; + + os << setcompressionlevel( Z_NO_COMPRESSION ); + os << "hello, hello, hi, ho!" << endl; + + setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) + << "I'm compressing again" << endl; + + os.close(); + + return 0; + +} diff --git a/third_party/zlib/contrib/iostream/zfstream.cpp b/third_party/zlib/contrib/iostream/zfstream.cpp new file mode 100644 index 00000000..d0cd85fa --- /dev/null +++ b/third_party/zlib/contrib/iostream/zfstream.cpp @@ -0,0 +1,329 @@ + +#include "zfstream.h" + +gzfilebuf::gzfilebuf() : + file(NULL), + mode(0), + own_file_descriptor(0) +{ } + +gzfilebuf::~gzfilebuf() { + + sync(); + if ( own_file_descriptor ) + close(); + +} + +gzfilebuf *gzfilebuf::open( const char *name, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzopen(name, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 1; + + return this; + +} + +gzfilebuf *gzfilebuf::attach( int file_descriptor, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 0; + + return this; + +} + +gzfilebuf *gzfilebuf::close() { + + if ( is_open() ) { + + sync(); + gzclose( file ); + file = NULL; + + } + + return this; + +} + +int gzfilebuf::setcompressionlevel( int comp_level ) { + + return gzsetparams(file, comp_level, -2); + +} + +int gzfilebuf::setcompressionstrategy( int comp_strategy ) { + + return gzsetparams(file, -2, comp_strategy); + +} + + +streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { + + return streampos(EOF); + +} + +int gzfilebuf::underflow() { + + // If the file hasn't been opened for reading, error. + if ( !is_open() || !(mode & ios::in) ) + return EOF; + + // if a buffer doesn't exists, allocate one. + if ( !base() ) { + + if ( (allocate()) == EOF ) + return EOF; + setp(0,0); + + } else { + + if ( in_avail() ) + return (unsigned char) *gptr(); + + if ( out_waiting() ) { + if ( flushbuf() == EOF ) + return EOF; + } + + } + + // Attempt to fill the buffer. + + int result = fillbuf(); + if ( result == EOF ) { + // disable get area + setg(0,0,0); + return EOF; + } + + return (unsigned char) *gptr(); + +} + +int gzfilebuf::overflow( int c ) { + + if ( !is_open() || !(mode & ios::out) ) + return EOF; + + if ( !base() ) { + if ( allocate() == EOF ) + return EOF; + setg(0,0,0); + } else { + if (in_avail()) { + return EOF; + } + if (out_waiting()) { + if (flushbuf() == EOF) + return EOF; + } + } + + int bl = blen(); + setp( base(), base() + bl); + + if ( c != EOF ) { + + *pptr() = c; + pbump(1); + + } + + return 0; + +} + +int gzfilebuf::sync() { + + if ( !is_open() ) + return EOF; + + if ( out_waiting() ) + return flushbuf(); + + return 0; + +} + +int gzfilebuf::flushbuf() { + + int n; + char *q; + + q = pbase(); + n = pptr() - q; + + if ( gzwrite( file, q, n) < n ) + return EOF; + + setp(0,0); + + return 0; + +} + +int gzfilebuf::fillbuf() { + + int required; + char *p; + + p = base(); + + required = blen(); + + int t = gzread( file, p, required ); + + if ( t <= 0) return EOF; + + setg( base(), base(), base()+t); + + return t; + +} + +gzfilestream_common::gzfilestream_common() : + ios( gzfilestream_common::rdbuf() ) +{ } + +gzfilestream_common::~gzfilestream_common() +{ } + +void gzfilestream_common::attach( int fd, int io_mode ) { + + if ( !buffer.attach( fd, io_mode) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::open( const char *name, int io_mode ) { + + if ( !buffer.open( name, io_mode ) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::close() { + + if ( !buffer.close() ) + clear( ios::failbit | ios::badbit ); + +} + +gzfilebuf *gzfilestream_common::rdbuf() +{ + return &buffer; +} + +gzifstream::gzifstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzifstream::gzifstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzifstream::gzifstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzifstream::~gzifstream() { } + +gzofstream::gzofstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzofstream::gzofstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzofstream::gzofstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzofstream::~gzofstream() { } diff --git a/third_party/zlib/contrib/iostream/zfstream.h b/third_party/zlib/contrib/iostream/zfstream.h new file mode 100644 index 00000000..ed79098a --- /dev/null +++ b/third_party/zlib/contrib/iostream/zfstream.h @@ -0,0 +1,128 @@ + +#ifndef zfstream_h +#define zfstream_h + +#include +#include "zlib.h" + +class gzfilebuf : public streambuf { + +public: + + gzfilebuf( ); + virtual ~gzfilebuf(); + + gzfilebuf *open( const char *name, int io_mode ); + gzfilebuf *attach( int file_descriptor, int io_mode ); + gzfilebuf *close(); + + int setcompressionlevel( int comp_level ); + int setcompressionstrategy( int comp_strategy ); + + inline int is_open() const { return (file !=NULL); } + + virtual streampos seekoff( streamoff, ios::seek_dir, int ); + + virtual int sync(); + +protected: + + virtual int underflow(); + virtual int overflow( int = EOF ); + +private: + + gzFile file; + short mode; + short own_file_descriptor; + + int flushbuf(); + int fillbuf(); + +}; + +class gzfilestream_common : virtual public ios { + + friend class gzifstream; + friend class gzofstream; + friend gzofstream &setcompressionlevel( gzofstream &, int ); + friend gzofstream &setcompressionstrategy( gzofstream &, int ); + +public: + virtual ~gzfilestream_common(); + + void attach( int fd, int io_mode ); + void open( const char *name, int io_mode ); + void close(); + +protected: + gzfilestream_common(); + +private: + gzfilebuf *rdbuf(); + + gzfilebuf buffer; + +}; + +class gzifstream : public gzfilestream_common, public istream { + +public: + + gzifstream(); + gzifstream( const char *name, int io_mode = ios::in ); + gzifstream( int fd, int io_mode = ios::in ); + + virtual ~gzifstream(); + +}; + +class gzofstream : public gzfilestream_common, public ostream { + +public: + + gzofstream(); + gzofstream( const char *name, int io_mode = ios::out ); + gzofstream( int fd, int io_mode = ios::out ); + + virtual ~gzofstream(); + +}; + +template class gzomanip { + friend gzofstream &operator<<(gzofstream &, const gzomanip &); +public: + gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } +private: + gzofstream &(*func)(gzofstream &, T); + T val; +}; + +template gzofstream &operator<<(gzofstream &s, const gzomanip &m) +{ + return (*m.func)(s, m.val); +} + +inline gzofstream &setcompressionlevel( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionlevel(l); + return s; +} + +inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionstrategy(l); + return s; +} + +inline gzomanip setcompressionlevel(int l) +{ + return gzomanip(&setcompressionlevel,l); +} + +inline gzomanip setcompressionstrategy(int l) +{ + return gzomanip(&setcompressionstrategy,l); +} + +#endif diff --git a/third_party/zlib/contrib/iostream2/zstream.h b/third_party/zlib/contrib/iostream2/zstream.h new file mode 100644 index 00000000..43d2332b --- /dev/null +++ b/third_party/zlib/contrib/iostream2/zstream.h @@ -0,0 +1,307 @@ +/* + * + * Copyright (c) 1997 + * Christian Michelsen Research AS + * Advanced Computing + * Fantoftvegen 38, 5036 BERGEN, Norway + * http://www.cmr.no + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Christian Michelsen Research AS makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef ZSTREAM__H +#define ZSTREAM__H + +/* + * zstream.h - C++ interface to the 'zlib' general purpose compression library + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(_WIN32) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +class zstringlen { +public: + zstringlen(class izstream&); + zstringlen(class ozstream&, const char*); + size_t value() const { return val.word; } +private: + struct Val { unsigned char byte; size_t word; } val; +}; + +// ----------------------------- izstream ----------------------------- + +class izstream +{ + public: + izstream() : m_fp(0) {} + izstream(FILE* fp) : m_fp(0) { open(fp); } + izstream(const char* name) : m_fp(0) { open(name); } + ~izstream() { close(); } + + /* Opens a gzip (.gz) file for reading. + * open() can be used to read a file which is not in gzip format; + * in this case read() will directly read from the file without + * decompression. errno can be checked to distinguish two error + * cases (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name) { + if (m_fp) close(); + m_fp = ::gzopen(name, "rb"); + } + + void open(FILE* fp) { + SET_BINARY_MODE(fp); + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), "rb"); + } + + /* Flushes all pending input if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + int r = ::gzclose(m_fp); + m_fp = 0; return r; + } + + /* Binary read the given number of bytes from the compressed file. + */ + int read(void* buf, size_t len) { + return ::gzread(m_fp, buf, len); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + private: + gzFile m_fp; +}; + +/* + * Binary read the given (array of) object(s) from the compressed file. + * If the input file was not in gzip format, read() copies the objects number + * of bytes into the buffer. + * returns the number of uncompressed bytes actually read + * (0 for end of file, -1 for error). + */ +template +inline int read(izstream& zs, T* x, Items items) { + return ::gzread(zs.fp(), x, items*sizeof(T)); +} + +/* + * Binary input with the '>' operator. + */ +template +inline izstream& operator>(izstream& zs, T& x) { + ::gzread(zs.fp(), &x, sizeof(T)); + return zs; +} + + +inline zstringlen::zstringlen(izstream& zs) { + zs > val.byte; + if (val.byte == 255) zs > val.word; + else val.word = val.byte; +} + +/* + * Read length of string + the string with the '>' operator. + */ +inline izstream& operator>(izstream& zs, char* x) { + zstringlen len(zs); + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return zs; +} + +inline char* read_string(izstream& zs) { + zstringlen len(zs); + char* x = new char[len.value()+1]; + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return x; +} + +// ----------------------------- ozstream ----------------------------- + +class ozstream +{ + public: + ozstream() : m_fp(0), m_os(0) { + } + ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(fp, level); + } + ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(name, level); + } + ~ozstream() { + close(); + } + + /* Opens a gzip (.gz) file for writing. + * The compression level parameter should be in 0..9 + * errno can be checked to distinguish two error cases + * (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzopen(name, mode); + } + + /* open from a FILE pointer. + */ + void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { + SET_BINARY_MODE(fp); + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), mode); + } + + /* Flushes all pending output if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + if (m_os) { + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = 0; + } + int r = ::gzclose(m_fp); m_fp = 0; return r; + } + + /* Binary write the given number of bytes into the compressed file. + */ + int write(const void* buf, size_t len) { + return ::gzwrite(m_fp, (voidp) buf, len); + } + + /* Flushes all pending output into the compressed file. The parameter + * _flush is as in the deflate() function. The return value is the zlib + * error number (see function gzerror below). flush() returns Z_OK if + * the flush_ parameter is Z_FINISH and all output could be flushed. + * flush() should be called only when strictly necessary because it can + * degrade compression. + */ + int flush(int _flush) { + os_flush(); + return ::gzflush(m_fp, _flush); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + ostream& os() { + if (m_os == 0) m_os = new ostrstream; + return *m_os; + } + + void os_flush() { + if (m_os && m_os->pcount()>0) { + ostrstream* oss = new ostrstream; + oss->fill(m_os->fill()); + oss->flags(m_os->flags()); + oss->precision(m_os->precision()); + oss->width(m_os->width()); + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = oss; + } + } + + private: + gzFile m_fp; + ostrstream* m_os; +}; + +/* + * Binary write the given (array of) object(s) into the compressed file. + * returns the number of uncompressed bytes actually written + * (0 in case of error). + */ +template +inline int write(ozstream& zs, const T* x, Items items) { + return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); +} + +/* + * Binary output with the '<' operator. + */ +template +inline ozstream& operator<(ozstream& zs, const T& x) { + ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); + return zs; +} + +inline zstringlen::zstringlen(ozstream& zs, const char* x) { + val.byte = 255; val.word = ::strlen(x); + if (val.word < 255) zs < (val.byte = val.word); + else zs < val; +} + +/* + * Write length of string + the string with the '<' operator. + */ +inline ozstream& operator<(ozstream& zs, const char* x) { + zstringlen len(zs, x); + ::gzwrite(zs.fp(), (voidp) x, len.value()); + return zs; +} + +#ifdef _MSC_VER +inline ozstream& operator<(ozstream& zs, char* const& x) { + return zs < (const char*) x; +} +#endif + +/* + * Ascii write with the << operator; + */ +template +inline ostream& operator<<(ozstream& zs, const T& x) { + zs.os_flush(); + return zs.os() << x; +} + +#endif diff --git a/third_party/zlib/contrib/iostream2/zstream_test.cpp b/third_party/zlib/contrib/iostream2/zstream_test.cpp new file mode 100644 index 00000000..6273f62d --- /dev/null +++ b/third_party/zlib/contrib/iostream2/zstream_test.cpp @@ -0,0 +1,25 @@ +#include "zstream.h" +#include +#include +#include + +void main() { + char h[256] = "Hello"; + char* g = "Goodbye"; + ozstream out("temp.gz"); + out < "This works well" < h < g; + out.close(); + + izstream in("temp.gz"); // read it back + char *x = read_string(in), *y = new char[256], z[256]; + in > y > z; + in.close(); + cout << x << endl << y << endl << z << endl; + + out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results + out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; + out << z << endl << y << endl << x << endl; + out << 1.1234567890123456789 << endl; + + delete[] x; delete[] y; +} diff --git a/third_party/zlib/contrib/iostream3/README b/third_party/zlib/contrib/iostream3/README new file mode 100644 index 00000000..f7b319ab --- /dev/null +++ b/third_party/zlib/contrib/iostream3/README @@ -0,0 +1,35 @@ +These classes provide a C++ stream interface to the zlib library. It allows you +to do things like: + + gzofstream outf("blah.gz"); + outf << "These go into the gzip file " << 123 << endl; + +It does this by deriving a specialized stream buffer for gzipped files, which is +the way Stroustrup would have done it. :-> + +The gzifstream and gzofstream classes were originally written by Kevin Ruland +and made available in the zlib contrib/iostream directory. The older version still +compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of +this version. + +The new classes are as standard-compliant as possible, closely following the +approach of the standard library's fstream classes. It compiles under gcc versions +3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard +library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs +from the previous one in the following respects: +- added showmanyc +- added setbuf, with support for unbuffered output via setbuf(0,0) +- a few bug fixes of stream behavior +- gzipped output file opened with default compression level instead of maximum level +- setcompressionlevel()/strategy() members replaced by single setcompression() + +The code is provided "as is", with the permission to use, copy, modify, distribute +and sell it for any purpose without fee. + +Ludwig Schwardt + + +DSP Lab +Electrical & Electronic Engineering Department +University of Stellenbosch +South Africa diff --git a/third_party/zlib/contrib/iostream3/TODO b/third_party/zlib/contrib/iostream3/TODO new file mode 100644 index 00000000..7032f97b --- /dev/null +++ b/third_party/zlib/contrib/iostream3/TODO @@ -0,0 +1,17 @@ +Possible upgrades to gzfilebuf: + +- The ability to do putback (e.g. putbackfail) + +- The ability to seek (zlib supports this, but could be slow/tricky) + +- Simultaneous read/write access (does it make sense?) + +- Support for ios_base::ate open mode + +- Locale support? + +- Check public interface to see which calls give problems + (due to dependence on library internals) + +- Override operator<<(ostream&, gzfilebuf*) to allow direct copying + of stream buffer to stream ( i.e. os << is.rdbuf(); ) diff --git a/third_party/zlib/contrib/iostream3/test.cc b/third_party/zlib/contrib/iostream3/test.cc new file mode 100644 index 00000000..94235334 --- /dev/null +++ b/third_party/zlib/contrib/iostream3/test.cc @@ -0,0 +1,50 @@ +/* + * Test program for gzifstream and gzofstream + * + * by Ludwig Schwardt + * original version by Kevin Ruland + */ + +#include "zfstream.h" +#include // for cout + +int main() { + + gzofstream outf; + gzifstream inf; + char buf[80]; + + outf.open("test1.txt.gz"); + outf << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + + std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; + inf.open("test1.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + outf.rdbuf()->pubsetbuf(0,0); + outf.open("test2.txt.gz"); + outf << setcompression(Z_NO_COMPRESSION) + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form"; + + std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n"; + inf.rdbuf()->pubsetbuf(0,0); + inf.open("test2.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + return 0; + +} diff --git a/third_party/zlib/contrib/iostream3/zfstream.cc b/third_party/zlib/contrib/iostream3/zfstream.cc new file mode 100644 index 00000000..94eb9334 --- /dev/null +++ b/third_party/zlib/contrib/iostream3/zfstream.cc @@ -0,0 +1,479 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#include "zfstream.h" +#include // for strcpy, strcat, strlen (mode strings) +#include // for BUFSIZ + +// Internal buffer sizes (default and "unbuffered" versions) +#define BIGBUFSIZE BUFSIZ +#define SMALLBUFSIZE 1 + +/*****************************************************************************/ + +// Default constructor +gzfilebuf::gzfilebuf() +: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), + buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) +{ + // No buffers to start with + this->disable_buffer(); +} + +// Destructor +gzfilebuf::~gzfilebuf() +{ + // Sync output buffer and close only if responsible for file + // (i.e. attached streams should be left open at this stage) + this->sync(); + if (own_fd) + this->close(); + // Make sure internal buffer is deallocated + this->disable_buffer(); +} + +// Set compression level and strategy +int +gzfilebuf::setcompression(int comp_level, + int comp_strategy) +{ + return gzsetparams(file, comp_level, comp_strategy); +} + +// Open gzipped file +gzfilebuf* +gzfilebuf::open(const char *name, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to open file + if ((file = gzopen(name, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = true; + return this; +} + +// Attach to gzipped file +gzfilebuf* +gzfilebuf::attach(int fd, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzdopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to attach to file + if ((file = gzdopen(fd, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = false; + return this; +} + +// Close gzipped file +gzfilebuf* +gzfilebuf::close() +{ + // Fail immediately if no file is open + if (!this->is_open()) + return NULL; + // Assume success + gzfilebuf* retval = this; + // Attempt to sync and close gzipped file + if (this->sync() == -1) + retval = NULL; + if (gzclose(file) < 0) + retval = NULL; + // File is now gone anyway (postcondition [27.8.1.3.8]) + file = NULL; + own_fd = false; + // Destroy internal buffer if it exists + this->disable_buffer(); + return retval; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Convert int open mode to mode string +bool +gzfilebuf::open_mode(std::ios_base::openmode mode, + char* c_mode) const +{ + bool testb = mode & std::ios_base::binary; + bool testi = mode & std::ios_base::in; + bool testo = mode & std::ios_base::out; + bool testt = mode & std::ios_base::trunc; + bool testa = mode & std::ios_base::app; + + // Check for valid flag combinations - see [27.8.1.3.2] (Table 92) + // Original zfstream hardcoded the compression level to maximum here... + // Double the time for less than 1% size improvement seems + // excessive though - keeping it at the default level + // To change back, just append "9" to the next three mode strings + if (!testi && testo && !testt && !testa) + strcpy(c_mode, "w"); + if (!testi && testo && !testt && testa) + strcpy(c_mode, "a"); + if (!testi && testo && testt && !testa) + strcpy(c_mode, "w"); + if (testi && !testo && !testt && !testa) + strcpy(c_mode, "r"); + // No read/write mode yet +// if (testi && testo && !testt && !testa) +// strcpy(c_mode, "r+"); +// if (testi && testo && testt && !testa) +// strcpy(c_mode, "w+"); + + // Mode string should be empty for invalid combination of flags + if (strlen(c_mode) == 0) + return false; + if (testb) + strcat(c_mode, "b"); + return true; +} + +// Determine number of characters in internal get buffer +std::streamsize +gzfilebuf::showmanyc() +{ + // Calls to underflow will fail if file not opened for reading + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return -1; + // Make sure get area is in use + if (this->gptr() && (this->gptr() < this->egptr())) + return std::streamsize(this->egptr() - this->gptr()); + else + return 0; +} + +// Fill get area from gzipped file +gzfilebuf::int_type +gzfilebuf::underflow() +{ + // If something is left in the get area by chance, return it + // (this shouldn't normally happen, as underflow is only supposed + // to be called when gptr >= egptr, but it serves as error check) + if (this->gptr() && (this->gptr() < this->egptr())) + return traits_type::to_int_type(*(this->gptr())); + + // If the file hasn't been opened for reading, produce error + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return traits_type::eof(); + + // Attempt to fill internal buffer from gzipped file + // (buffer must be guaranteed to exist...) + int bytes_read = gzread(file, buffer, buffer_size); + // Indicates error or EOF + if (bytes_read <= 0) + { + // Reset get area + this->setg(buffer, buffer, buffer); + return traits_type::eof(); + } + // Make all bytes read from file available as get area + this->setg(buffer, buffer, buffer + bytes_read); + + // Return next character in get area + return traits_type::to_int_type(*(this->gptr())); +} + +// Write put area to gzipped file +gzfilebuf::int_type +gzfilebuf::overflow(int_type c) +{ + // Determine whether put area is in use + if (this->pbase()) + { + // Double-check pointer range + if (this->pptr() > this->epptr() || this->pptr() < this->pbase()) + return traits_type::eof(); + // Add extra character to buffer if not EOF + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *(this->pptr()) = traits_type::to_char_type(c); + this->pbump(1); + } + // Number of characters to write to file + int bytes_to_write = this->pptr() - this->pbase(); + // Overflow doesn't fail if nothing is to be written + if (bytes_to_write > 0) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // If gzipped file won't accept all bytes written to it, fail + if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) + return traits_type::eof(); + // Reset next pointer to point to pbase on success + this->pbump(-bytes_to_write); + } + } + // Write extra character to file if not EOF + else if (!traits_type::eq_int_type(c, traits_type::eof())) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // Impromptu char buffer (allows "unbuffered" output) + char_type last_char = traits_type::to_char_type(c); + // If gzipped file won't accept this character, fail + if (gzwrite(file, &last_char, 1) != 1) + return traits_type::eof(); + } + + // If you got here, you have succeeded (even if c was EOF) + // The return value should therefore be non-EOF + if (traits_type::eq_int_type(c, traits_type::eof())) + return traits_type::not_eof(c); + else + return c; +} + +// Assign new buffer +std::streambuf* +gzfilebuf::setbuf(char_type* p, + std::streamsize n) +{ + // First make sure stuff is sync'ed, for safety + if (this->sync() == -1) + return NULL; + // If buffering is turned off on purpose via setbuf(0,0), still allocate one... + // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at + // least a buffer of size 1 (very inefficient though, therefore make it bigger?) + // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems) + if (!p || !n) + { + // Replace existing buffer (if any) with small internal buffer + this->disable_buffer(); + buffer = NULL; + buffer_size = 0; + own_buffer = true; + this->enable_buffer(); + } + else + { + // Replace existing buffer (if any) with external buffer + this->disable_buffer(); + buffer = p; + buffer_size = n; + own_buffer = false; + this->enable_buffer(); + } + return this; +} + +// Write put area to gzipped file (i.e. ensures that put area is empty) +int +gzfilebuf::sync() +{ + return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Allocate internal buffer +void +gzfilebuf::enable_buffer() +{ + // If internal buffer required, allocate one + if (own_buffer && !buffer) + { + // Check for buffered vs. "unbuffered" + if (buffer_size > 0) + { + // Allocate internal buffer + buffer = new char_type[buffer_size]; + // Get area starts empty and will be expanded by underflow as need arises + this->setg(buffer, buffer, buffer); + // Setup entire internal buffer as put area. + // The one-past-end pointer actually points to the last element of the buffer, + // so that overflow(c) can safely add the extra character c to the sequence. + // These pointers remain in place for the duration of the buffer + this->setp(buffer, buffer + buffer_size - 1); + } + else + { + // Even in "unbuffered" case, (small?) get buffer is still required + buffer_size = SMALLBUFSIZE; + buffer = new char_type[buffer_size]; + this->setg(buffer, buffer, buffer); + // "Unbuffered" means no put buffer + this->setp(0, 0); + } + } + else + { + // If buffer already allocated, reset buffer pointers just to make sure no + // stale chars are lying around + this->setg(buffer, buffer, buffer); + this->setp(buffer, buffer + buffer_size - 1); + } +} + +// Destroy internal buffer +void +gzfilebuf::disable_buffer() +{ + // If internal buffer exists, deallocate it + if (own_buffer && buffer) + { + // Preserve unbuffered status by zeroing size + if (!this->pbase()) + buffer_size = 0; + delete[] buffer; + buffer = NULL; + this->setg(0, 0, 0); + this->setp(0, 0); + } + else + { + // Reset buffer pointers to initial state if external buffer exists + this->setg(buffer, buffer, buffer); + if (buffer) + this->setp(buffer, buffer + buffer_size - 1); + else + this->setp(0, 0); + } +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzifstream::gzifstream() +: std::istream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzifstream::gzifstream(const char* name, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzifstream::gzifstream(int fd, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzifstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzifstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzifstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzofstream::gzofstream() +: std::ostream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzofstream::gzofstream(const char* name, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzofstream::gzofstream(int fd, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzofstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzofstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzofstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} diff --git a/third_party/zlib/contrib/iostream3/zfstream.h b/third_party/zlib/contrib/iostream3/zfstream.h new file mode 100644 index 00000000..8574479a --- /dev/null +++ b/third_party/zlib/contrib/iostream3/zfstream.h @@ -0,0 +1,466 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#ifndef ZFSTREAM_H +#define ZFSTREAM_H + +#include // not iostream, since we don't need cin/cout +#include +#include "zlib.h" + +/*****************************************************************************/ + +/** + * @brief Gzipped file stream buffer class. + * + * This class implements basic_filebuf for gzipped files. It doesn't yet support + * seeking (allowed by zlib but slow/limited), putback and read/write access + * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard + * file streambuf. +*/ +class gzfilebuf : public std::streambuf +{ +public: + // Default constructor. + gzfilebuf(); + + // Destructor. + virtual + ~gzfilebuf(); + + /** + * @brief Set compression level and strategy on the fly. + * @param comp_level Compression level (see zlib.h for allowed values) + * @param comp_strategy Compression strategy (see zlib.h for allowed values) + * @return Z_OK on success, Z_STREAM_ERROR otherwise. + * + * Unfortunately, these parameters cannot be modified separately, as the + * previous zfstream version assumed. Since the strategy is seldom changed, + * it can default and setcompression(level) then becomes like the old + * setcompressionlevel(level). + */ + int + setcompression(int comp_level, + int comp_strategy = Z_DEFAULT_STRATEGY); + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() const { return (file != NULL); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + open(const char* name, + std::ios_base::openmode mode); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + attach(int fd, + std::ios_base::openmode mode); + + /** + * @brief Close gzipped file. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + close(); + +protected: + /** + * @brief Convert ios open mode int to mode string used by zlib. + * @return True if valid mode flag combination. + */ + bool + open_mode(std::ios_base::openmode mode, + char* c_mode) const; + + /** + * @brief Number of characters available in stream buffer. + * @return Number of characters. + * + * This indicates number of characters in get area of stream buffer. + * These characters can be read without accessing the gzipped file. + */ + virtual std::streamsize + showmanyc(); + + /** + * @brief Fill get area from gzipped file. + * @return First character in get area on success, EOF on error. + * + * This actually reads characters from gzipped file to stream + * buffer. Always buffered. + */ + virtual int_type + underflow(); + + /** + * @brief Write put area to gzipped file. + * @param c Extra character to add to buffer contents. + * @return Non-EOF on success, EOF on error. + * + * This actually writes characters in stream buffer to + * gzipped file. With unbuffered output this is done one + * character at a time. + */ + virtual int_type + overflow(int_type c = traits_type::eof()); + + /** + * @brief Installs external stream buffer. + * @param p Pointer to char buffer. + * @param n Size of external buffer. + * @return @c this on success, NULL on failure. + * + * Call setbuf(0,0) to enable unbuffered output. + */ + virtual std::streambuf* + setbuf(char_type* p, + std::streamsize n); + + /** + * @brief Flush stream buffer to file. + * @return 0 on success, -1 on error. + * + * This calls underflow(EOF) to do the job. + */ + virtual int + sync(); + +// +// Some future enhancements +// +// virtual int_type uflow(); +// virtual int_type pbackfail(int_type c = traits_type::eof()); +// virtual pos_type +// seekoff(off_type off, +// std::ios_base::seekdir way, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); +// virtual pos_type +// seekpos(pos_type sp, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); + +private: + /** + * @brief Allocate internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that a proper internal buffer exists if it is required. If the + * buffer already exists or is external, the buffer pointers will be + * reset to their original state. + */ + void + enable_buffer(); + + /** + * @brief Destroy internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that the internal buffer is deallocated if it exists. In any + * case, it will also reset the buffer pointers. + */ + void + disable_buffer(); + + /** + * Underlying file pointer. + */ + gzFile file; + + /** + * Mode in which file was opened. + */ + std::ios_base::openmode io_mode; + + /** + * @brief True if this object owns file descriptor. + * + * This makes the class responsible for closing the file + * upon destruction. + */ + bool own_fd; + + /** + * @brief Stream buffer. + * + * For simplicity this remains allocated on the free store for the + * entire life span of the gzfilebuf object, unless replaced by setbuf. + */ + char_type* buffer; + + /** + * @brief Stream buffer size. + * + * Defaults to system default buffer size (typically 8192 bytes). + * Modified by setbuf. + */ + std::streamsize buffer_size; + + /** + * @brief True if this object owns stream buffer. + * + * This makes the class responsible for deleting the buffer + * upon destruction. + */ + bool own_buffer; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file input stream class. + * + * This class implements ifstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzifstream : public std::istream +{ +public: + // Default constructor + gzifstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ifstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream class. + * + * This class implements ofstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzofstream : public std::ostream +{ +public: + // Default constructor + gzofstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ofstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream manipulator class. + * + * This class defines a two-argument manipulator for gzofstream. It is used + * as base for the setcompression(int,int) manipulator. +*/ +template + class gzomanip2 + { + public: + // Allows insertor to peek at internals + template + friend gzofstream& + operator<<(gzofstream&, + const gzomanip2&); + + // Constructor + gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), + T1 v1, + T2 v2); + private: + // Underlying manipulator function + gzofstream& + (*func)(gzofstream&, T1, T2); + + // Arguments for manipulator function + T1 val1; + T2 val2; + }; + +/*****************************************************************************/ + +// Manipulator function thunks through to stream buffer +inline gzofstream& +setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) +{ + (gzs.rdbuf())->setcompression(l, s); + return gzs; +} + +// Manipulator constructor stores arguments +template + inline + gzomanip2::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), + T1 v1, + T2 v2) + : func(f), val1(v1), val2(v2) + { } + +// Insertor applies underlying manipulator function to stream +template + inline gzofstream& + operator<<(gzofstream& s, const gzomanip2& m) + { return (*m.func)(s, m.val1, m.val2); } + +// Insert this onto stream to simplify setting of compression level +inline gzomanip2 +setcompression(int l, int s = Z_DEFAULT_STRATEGY) +{ return gzomanip2(&setcompression, l, s); } + +#endif // ZFSTREAM_H diff --git a/third_party/zlib/contrib/masmx64/bld_ml64.bat b/third_party/zlib/contrib/masmx64/bld_ml64.bat new file mode 100644 index 00000000..f74bcef5 --- /dev/null +++ b/third_party/zlib/contrib/masmx64/bld_ml64.bat @@ -0,0 +1,2 @@ +ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/third_party/zlib/contrib/masmx64/gvmat64.asm b/third_party/zlib/contrib/masmx64/gvmat64.asm new file mode 100644 index 00000000..c1817f1b --- /dev/null +++ b/third_party/zlib/contrib/masmx64/gvmat64.asm @@ -0,0 +1,553 @@ +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); /* current match */ + +; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for infozip Zip, I use option: +; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm +; +; to compile this file for zLib, I use option: +; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm +; Be carrefull to adapt zlib1222add below to your version of zLib +; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change +; value of zlib1222add later) +; +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ +.code +longest_match PROC + + +;LocalVarsSize equ 88 + LocalVarsSize equ 72 + +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp + + chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len + ; low word: s->wmask +;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 +;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 +;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w +;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx +;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 +;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d +;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 +IFDEF INFOZIP +ELSE + nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size +ENDIF + +save_rdi equ rsp + 24 - LocalVarsSize +save_rsi equ rsp + 32 - LocalVarsSize +save_rbx equ rsp + 40 - LocalVarsSize +save_rbp equ rsp + 48 - LocalVarsSize +save_r12 equ rsp + 56 - LocalVarsSize +save_r13 equ rsp + 64 - LocalVarsSize +;save_r14 equ rsp + 72 - LocalVarsSize +;save_r15 equ rsp + 80 - LocalVarsSize + + +; summary of register usage +; scanend ebx +; scanendw bx +; chainlenwmask edx +; curmatch rsi +; curmatchd esi +; windowbestlen r8 +; scanalign r9 +; scanalignd r9d +; window r10 +; bestlen r11 +; bestlend r11d +; scanstart r12d +; scanstartw r12w +; scan r13 +; nicematch r14d +; limit r15 +; limitd r15d +; prev rcx + +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure + + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + +IFDEF INFOZIP + +_DATA SEGMENT +COMM window_size:DWORD +; WMask ; 7fff +COMM window:BYTE:010040H +COMM prev:WORD:08000H +; MatchLen : unused +; PrevMatch : unused +COMM strstart:DWORD +COMM match_start:DWORD +; Lookahead : ignore +COMM prev_length:DWORD ; PrevLen +COMM max_chain_length:DWORD +COMM good_match:DWORD +COMM nice_match:DWORD +prev_ad equ OFFSET prev +window_ad equ OFFSET window +nicematch equ nice_match +_DATA ENDS +WMask equ 07fffh + +ELSE + + IFNDEF zlib1222add + zlib1222add equ 8 + ENDIF +dsWSize equ 56+zlib1222add+(zlib1222add/2) +dsWMask equ 64+zlib1222add+(zlib1222add/2) +dsWindow equ 72+zlib1222add +dsPrev equ 88+zlib1222add +dsMatchLen equ 128+zlib1222add +dsPrevMatch equ 132+zlib1222add +dsStrStart equ 140+zlib1222add +dsMatchStart equ 144+zlib1222add +dsLookahead equ 148+zlib1222add +dsPrevLen equ 152+zlib1222add +dsMaxChainLen equ 156+zlib1222add +dsGoodMatch equ 172+zlib1222add +dsNiceMatch equ 176+zlib1222add + +window_size equ [ rcx + dsWSize] +WMask equ [ rcx + dsWMask] +window_ad equ [ rcx + dsWindow] +prev_ad equ [ rcx + dsPrev] +strstart equ [ rcx + dsStrStart] +match_start equ [ rcx + dsMatchStart] +Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip +prev_length equ [ rcx + dsPrevLen] +max_chain_length equ [ rcx + dsMaxChainLen] +good_match equ [ rcx + dsGoodMatch] +nice_match equ [ rcx + dsNiceMatch] +ENDIF + +; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + + + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d 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. + +; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) + +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx + + mov [save_rdi],rdi + mov [save_rsi],rsi + mov [save_rbx],rbx + mov [save_rbp],rbp +IFDEF INFOZIP + mov r8d,ecx +ELSE + mov r8d,edx +ENDIF + mov [save_r12],r12 + mov [save_r13],r13 +; mov [save_r14],r14 +; mov [save_r15],r15 + + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl 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 + +;;; on zlib only +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + +IFDEF INFOZIP + mov [chainlenwmask], ebx +; on infozip nice_match = [nice_match] +ELSE + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d +ENDIF + +;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; +IFDEF INFOZIP + mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) +ELSE + mov eax, window_size + sub eax, MIN_LOOKAHEAD +ENDIF + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +;;; int best_len = s->prev_length; + + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 + jmp LookupLoopIsZero + + +;;; 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 +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + jnz LookupLoop1 + + +;;; Store the current value of chainlen. + mov [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). + + lea rsi,[r8+r10] + mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + jnz short LoopCmps + jmp short LenMaximum +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0000FFFFh + jnz LenLower + + test eax,0ffffffffh + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + jnz LenLower + +LenLower32: + shr eax,16 + add rdx,2 +LenLower: sub al, 1 + adc rdx, 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 rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// + + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + jge LeaveNow + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: +IFDEF INFOZIP + mov eax,r11d +ELSE + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d +ENDIF + +;;; Restore the stack and return from whence we came. + + + mov rsi,[save_rsi] + mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] +; mov r14,[save_r14] +; mov r15,[save_r15] + + + ret 0 +; please don't remove this string ! +; Your can freely use gvmat64 in any free or commercial app +; but it is far better don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 +longest_match ENDP + +match_init PROC + ret 0 +match_init ENDP + + +END diff --git a/third_party/zlib/contrib/masmx64/inffas8664.c b/third_party/zlib/contrib/masmx64/inffas8664.c new file mode 100644 index 00000000..aa861a33 --- /dev/null +++ b/third_party/zlib/contrib/masmx64/inffas8664.c @@ -0,0 +1,186 @@ +/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding + * version for AMD64 on Windows using Microsoft C compiler + * + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant + * + * inffas8664.c call function inffas8664fnc in inffasx64.asm + * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + * + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ + + + + typedef struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } type_ar; +#ifdef ASMINF + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + type_ar ar; + void inffas8664fnc(struct inffast_ar * par); + + + +#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + inffas8664fnc(&ar); + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = (unsigned long)ar.hold; + state->bits = ar.bits; + return; +} + +#endif diff --git a/third_party/zlib/contrib/masmx64/inffasx64.asm b/third_party/zlib/contrib/masmx64/inffasx64.asm new file mode 100644 index 00000000..41ec8239 --- /dev/null +++ b/third_party/zlib/contrib/masmx64/inffasx64.asm @@ -0,0 +1,396 @@ +; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding +; version for AMD64 on Windows using Microsoft C compiler +; +; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c +; inffasx64.asm is called by inffas8664.c, which contain more info. + + +; to compile this file, I use option +; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; + +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +.code +inffas8664fnc PROC + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + + mov [rsp-8],rsi + mov [rsp-16],rdi + mov [rsp-24],r12 + mov [rsp-32],r13 + mov [rsp-40],r14 + mov [rsp-48],r15 + mov [rsp-56],rbx + + mov rax,rcx + + mov [rax+8], rbp ; /* save regs rbp and rsp */ + mov [rax], rsp + + mov rsp, rax ; /* make rsp point to &ar */ + + mov rsi, [rsp+16] ; /* rsi = in */ + mov rdi, [rsp+32] ; /* rdi = out */ + mov r9, [rsp+24] ; /* r9 = last */ + mov r10, [rsp+48] ; /* r10 = end */ + mov rbp, [rsp+64] ; /* rbp = lcode */ + mov r11, [rsp+72] ; /* r11 = dcode */ + mov rdx, [rsp+80] ; /* rdx = hold */ + mov ebx, [rsp+88] ; /* ebx = bits */ + mov r12d, [rsp+100] ; /* r12d = lmask */ + mov r13d, [rsp+104] ; /* r13d = dmask */ + ; /* r14d = len */ + ; /* r15d = dist */ + + + cld + cmp r10, rdi + je L_one_time ; /* if only one decode left */ + cmp r9, rsi + + jne L_do_loop + + +L_one_time: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code_one_time + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + jmp L_get_length_code_one_time + +ALIGN 4 +L_while_test: + cmp r10, rdi + jbe L_break_loop + cmp r9, rsi + jbe L_break_loop + +L_do_loop: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_length_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + mov r8, r12 ; /* r8 = lmask */ + shr eax, 16 ; /* output this.val char */ + stosb + +L_get_length_code_one_time: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + shr eax, 16 ; /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov r14d, eax ; /* len = this */ + shr r14d, 16 ; /* len = this.val */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ + and cl, 15 ; /* op &= 15 */ + jz L_decode_distance ; /* if (!op) */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r14d, eax ; /* len += hold & mask[op] */ + +L_decode_distance: + mov r8, r13 ; /* r8 = dmask */ + cmp bl, 32 + ja L_get_distance_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_distance_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ + +L_dodist: + mov r15d, eax ; /* dist = this */ + shr r15d, 16 ; /* dist = this.val */ + mov cl, ah + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + mov cl, al ; /* cl = this.op */ + + test al, 16 ; /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 ; /* op &= 15 */ + jz L_check_dist_one + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax ; /* (1 << op) - 1 */ + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov r8, rsi ; /* save in so from can use it's reg */ + mov rax, rdi + sub rax, [rsp+40] ; /* nbytes = out - beg */ + + cmp eax, r15d + jb L_clip_window ; /* if (dist > nbytes) 4.2% */ + + mov ecx, r14d ; /* ecx = len */ + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two ; /* if len % 2 == 0 */ + + rep movsw + mov al, [rsi] + mov [rdi], al + inc rdi + + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +L_copy_two: + rep movsw + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp r15d, 1 ; /* if dist 1, is a memset */ + jne L_check_window + cmp [rsp+40], rdi ; /* if out == beg, outside window */ + je L_check_window + + mov ecx, r14d ; /* ecx = len */ + mov al, [rdi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [rdi], al + inc rdi + +L_set_two: + rep stosw + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r14d ; /* eax += len */ + mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r15d ; /* eax += dist */ + mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax ; /* ecx = nbytes */ + mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ + neg ecx ; /* nbytes = -nbytes */ + + cmp eax, r15d + jb L_invalid_distance_too_far ; /* if (dist > wsize) */ + + add ecx, r15d ; /* nbytes = dist - nbytes */ + cmp dword ptr [rsp+96], 0 + jne L_wrap_around_window ; /* if (write != 0) */ + + mov rsi, [rsp+56] ; /* from = window */ + sub eax, ecx ; /* eax -= nbytes */ + add rsi, rax ; /* from += wsize - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp r14d, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* eax -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = &out[ -dist ] */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [rsp+96] ; /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window ; /* if (write >= nbytes) */ + + mov esi, [rsp+92] ; /* from = wsize */ + add rsi, [rsp+56] ; /* from += window */ + add rsi, rax ; /* from += write */ + sub rsi, rcx ; /* from -= nbytes */ + sub ecx, eax ; /* nbytes -= write */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, [rsp+56] ; /* from = window */ + mov ecx, [rsp+96] ; /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + mov rsi, [rsp+56] ; /* rsi = window */ + add rsi, rax + sub rsi, rcx ; /* from += write - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy ; /* if (nbytes >= len) */ + +ALIGN 4 +L_do_copy: + mov ecx, eax ; /* ecx = len */ + rep movsb + + mov rsi, r8 ; /* move in back to %esi, toss from */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [rsp+116], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [rsp+116], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [rsp+116], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov dword ptr [rsp+116], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [rsp+116], 0 + +L_break_loop_with_status: +; /* put in, out, bits, and hold back into ar and pop esp */ + mov [rsp+16], rsi ; /* in */ + mov [rsp+32], rdi ; /* out */ + mov [rsp+88], ebx ; /* bits */ + mov [rsp+80], rdx ; /* hold */ + + mov rax, [rsp] ; /* restore rbp and rsp */ + mov rbp, [rsp+8] + mov rsp, rax + + + + mov rsi,[rsp-8] + mov rdi,[rsp-16] + mov r12,[rsp-24] + mov r13,[rsp-32] + mov r14,[rsp-40] + mov r15,[rsp-48] + mov rbx,[rsp-56] + + ret 0 +; : +; : "m" (ar) +; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", +; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +; ); + +inffas8664fnc ENDP +;_TEXT ENDS +END diff --git a/third_party/zlib/contrib/masmx64/readme.txt b/third_party/zlib/contrib/masmx64/readme.txt new file mode 100644 index 00000000..652571c7 --- /dev/null +++ b/third_party/zlib/contrib/masmx64/readme.txt @@ -0,0 +1,31 @@ +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), +for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. + +gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits + assembly optimized version from Jean-loup Gailly original longest_match function + +inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing + original function from Mark Adler + +Use instructions +---------------- +Assemble the .asm files using MASM and put the object files into the zlib source +directory. You can also get object files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, +and inffasx64.obj and gvmat64.obj as object to link. + + +Build instructions +------------------ +run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) + +ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK + +You can get Windows 2003 server DDK with ml64 and cl for AMD64 from + http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/third_party/zlib/contrib/masmx86/bld_ml32.bat b/third_party/zlib/contrib/masmx86/bld_ml32.bat new file mode 100644 index 00000000..fcf5755e --- /dev/null +++ b/third_party/zlib/contrib/masmx86/bld_ml32.bat @@ -0,0 +1,2 @@ +ml /coff /Zi /c /Flmatch686.lst match686.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/third_party/zlib/contrib/masmx86/inffas32.asm b/third_party/zlib/contrib/masmx86/inffas32.asm new file mode 100644 index 00000000..cb37a81e --- /dev/null +++ b/third_party/zlib/contrib/masmx86/inffas32.asm @@ -0,0 +1,1080 @@ +;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding +; * +; * inffas32.asm is derivated from inffas86.c, with translation of assembly code +; * +; * Copyright (C) 1995-2003 Mark Adler +; * For conditions of distribution and use, see copyright notice in zlib.h +; * +; * Copyright (C) 2003 Chris Anderson +; * Please use the copyright conditions above. +; * +; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from +; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at +; * the moment. I have successfully compiled and tested this code with gcc2.96, +; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S +; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX +; * enabled. I will attempt to merge the MMX code into this version. Newer +; * versions of this and inffast.S can be found at +; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ +; * +; * 2005 : modification by Gilles Vollant +; */ +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; +; compile with command line option +; ml /coff /Zi /c /Flinffas32.lst inffas32.asm + +; if you define NO_GZIP (see inflate.h), compile with +; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm + + +; zlib122sup is 0 fort zlib 1.2.2.1 and lower +; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head +; in inflate_state in inflate.h) +zlib1222sup equ 8 + + +IFDEF GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 +ELSE + IFNDEF NO_GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 + ELSE + INFLATE_MODE_TYPE equ 3 + INFLATE_MODE_BAD equ 17 + ENDIF +ENDIF + + +; 75 "inffast.S" +;FILE "inffast.S" + +;;;GLOBAL _inflate_fast + +;;;SECTION .text + + + + .586p + .mmx + + name inflate_fast_x86 + .MODEL FLAT + +_DATA segment +inflate_fast_use_mmx: + dd 1 + + +_TEXT segment + + + +ALIGN 4 + db 'Fast decoding Code from Chris Anderson' + db 0 + +ALIGN 4 +invalid_literal_length_code_msg: + db 'invalid literal/length code' + db 0 + +ALIGN 4 +invalid_distance_code_msg: + db 'invalid distance code' + db 0 + +ALIGN 4 +invalid_distance_too_far_msg: + db 'invalid distance too far back' + db 0 + + +ALIGN 4 +inflate_fast_mask: +dd 0 +dd 1 +dd 3 +dd 7 +dd 15 +dd 31 +dd 63 +dd 127 +dd 255 +dd 511 +dd 1023 +dd 2047 +dd 4095 +dd 8191 +dd 16383 +dd 32767 +dd 65535 +dd 131071 +dd 262143 +dd 524287 +dd 1048575 +dd 2097151 +dd 4194303 +dd 8388607 +dd 16777215 +dd 33554431 +dd 67108863 +dd 134217727 +dd 268435455 +dd 536870911 +dd 1073741823 +dd 2147483647 +dd 4294967295 + + +mode_state equ 0 ;/* state->mode */ +wsize_state equ (32+zlib1222sup) ;/* state->wsize */ +write_state equ (36+4+zlib1222sup) ;/* state->write */ +window_state equ (40+4+zlib1222sup) ;/* state->window */ +hold_state equ (44+4+zlib1222sup) ;/* state->hold */ +bits_state equ (48+4+zlib1222sup) ;/* state->bits */ +lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ +distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ +lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ +distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ + + +;;SECTION .text +; 205 "inffast.S" +;GLOBAL inflate_fast_use_mmx + +;SECTION .data + + +; GLOBAL inflate_fast_use_mmx:object +;.size inflate_fast_use_mmx, 4 +; 226 "inffast.S" +;SECTION .text + +ALIGN 4 +_inflate_fast proc near +.FPO (16, 4, 0, 0, 1, 0) + push edi + push esi + push ebp + push ebx + pushfd + sub esp,64 + cld + + + + + mov esi, [esp+88] + mov edi, [esi+28] + + + + + + + + mov edx, [esi+4] + mov eax, [esi+0] + + add edx,eax + sub edx,11 + + mov [esp+44],eax + mov [esp+20],edx + + mov ebp, [esp+92] + mov ecx, [esi+16] + mov ebx, [esi+12] + + sub ebp,ecx + neg ebp + add ebp,ebx + + sub ecx,257 + add ecx,ebx + + mov [esp+60],ebx + mov [esp+40],ebp + mov [esp+16],ecx +; 285 "inffast.S" + mov eax, [edi+lencode_state] + mov ecx, [edi+distcode_state] + + mov [esp+8],eax + mov [esp+12],ecx + + mov eax,1 + mov ecx, [edi+lenbits_state] + shl eax,cl + dec eax + mov [esp+0],eax + + mov eax,1 + mov ecx, [edi+distbits_state] + shl eax,cl + dec eax + mov [esp+4],eax + + mov eax, [edi+wsize_state] + mov ecx, [edi+write_state] + mov edx, [edi+window_state] + + mov [esp+52],eax + mov [esp+48],ecx + mov [esp+56],edx + + mov ebp, [edi+hold_state] + mov ebx, [edi+bits_state] +; 321 "inffast.S" + mov esi, [esp+44] + mov ecx, [esp+20] + cmp ecx,esi + ja L_align_long + + add ecx,11 + sub ecx,esi + mov eax,12 + sub eax,ecx + lea edi, [esp+28] + rep movsb + mov ecx,eax + xor eax,eax + rep stosb + lea esi, [esp+28] + mov [esp+20],esi + jmp L_is_aligned + + +L_align_long: + test esi,3 + jz L_is_aligned + xor eax,eax + mov al, [esi] + inc esi + mov ecx,ebx + add ebx,8 + shl eax,cl + or ebp,eax + jmp L_align_long + +L_is_aligned: + mov edi, [esp+60] +; 366 "inffast.S" +L_check_mmx: + cmp dword ptr [inflate_fast_use_mmx],2 + je L_init_mmx + ja L_do_loop + + push eax + push ebx + push ecx + push edx + pushfd + mov eax, [esp] + xor dword ptr [esp],0200000h + + + + + popfd + pushfd + pop edx + xor edx,eax + jz L_dont_use_mmx + xor eax,eax + cpuid + cmp ebx,0756e6547h + jne L_dont_use_mmx + cmp ecx,06c65746eh + jne L_dont_use_mmx + cmp edx,049656e69h + jne L_dont_use_mmx + mov eax,1 + cpuid + shr eax,8 + and eax,15 + cmp eax,6 + jne L_dont_use_mmx + test edx,0800000h + jnz L_use_mmx + jmp L_dont_use_mmx +L_use_mmx: + mov dword ptr [inflate_fast_use_mmx],2 + jmp L_check_mmx_pop +L_dont_use_mmx: + mov dword ptr [inflate_fast_use_mmx],3 +L_check_mmx_pop: + pop edx + pop ecx + pop ebx + pop eax + jmp L_check_mmx +; 426 "inffast.S" +ALIGN 4 +L_do_loop: +; 437 "inffast.S" + cmp bl,15 + ja L_get_length_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_length_code: + mov edx, [esp+0] + mov ecx, [esp+8] + and edx,ebp + mov eax, [ecx+edx*4] + +L_dolen: + + + + + + + mov cl,ah + sub bl,ah + shr ebp,cl + + + + + + + test al,al + jnz L_test_for_length_base + + shr eax,16 + stosb + +L_while_test: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop + jmp L_break_loop + +L_test_for_length_base: +; 502 "inffast.S" + mov edx,eax + shr edx,16 + mov cl,al + + test al,16 + jz L_test_for_second_level_length + and cl,15 + jz L_save_len + cmp bl,cl + jae L_add_bits_to_len + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_len: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + +L_save_len: + mov [esp+24],edx + + +L_decode_distance: +; 549 "inffast.S" + cmp bl,15 + ja L_get_distance_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_distance_code: + mov edx, [esp+4] + mov ecx, [esp+12] + and edx,ebp + mov eax, [ecx+edx*4] + + +L_dodist: + mov edx,eax + shr edx,16 + mov cl,ah + sub bl,ah + shr ebp,cl +; 584 "inffast.S" + mov cl,al + + test al,16 + jz L_test_for_second_level_dist + and cl,15 + jz L_check_dist_one + cmp bl,cl + jae L_add_bits_to_dist + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_dist: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + jmp L_check_window + +L_check_window: +; 625 "inffast.S" + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,edx + jb L_clip_window + + mov ecx, [esp+24] + mov esi,edi + sub esi,edx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp edx,1 + jne L_check_window + cmp [esp+40],edi + je L_check_window + + dec edi + mov ecx, [esp+24] + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + + + + + test al,64 + jnz L_test_for_end_of_block + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + + + + + test al,64 + jnz L_invalid_distance_code + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+12] + mov eax, [edx+eax*4] + jmp L_dodist + +ALIGN 4 +L_clip_window: +; 721 "inffast.S" + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,edx + jb L_invalid_distance_too_far + + add ecx,edx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window + + sub eax,ecx + add esi,eax +; 749 "inffast.S" + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_wrap_around_window: +; 793 "inffast.S" + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_contiguous_in_window: +; 836 "inffast.S" + add esi,eax + sub esi,ecx + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + +L_do_copy1: +; 862 "inffast.S" + mov ecx,eax + rep movsb + + mov esi, [esp+44] + jmp L_while_test +; 878 "inffast.S" +ALIGN 4 +L_init_mmx: + emms + + + + + + movd mm0,ebp + mov ebp,ebx +; 896 "inffast.S" + movd mm4,dword ptr [esp+0] + movq mm3,mm4 + movd mm5,dword ptr [esp+4] + movq mm2,mm5 + pxor mm1,mm1 + mov ebx, [esp+8] + jmp L_do_loop_mmx + +ALIGN 4 +L_do_loop_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_length_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_length_code_mmx: + pand mm4,mm0 + movd eax,mm4 + movq mm4,mm3 + mov eax, [ebx+eax*4] + +L_dolen_mmx: + movzx ecx,ah + movd mm1,ecx + sub ebp,ecx + + test al,al + jnz L_test_for_length_base_mmx + + shr eax,16 + stosb + +L_while_test_mmx: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop_mmx + jmp L_break_loop + +L_test_for_length_base_mmx: + + mov edx,eax + shr edx,16 + + test al,16 + jz L_test_for_second_level_length_mmx + and eax,15 + jz L_decode_distance_mmx + + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add edx,ecx + +L_decode_distance_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_dist_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_dist_code_mmx: + mov ebx, [esp+12] + pand mm5,mm0 + movd eax,mm5 + movq mm5,mm2 + mov eax, [ebx+eax*4] + +L_dodist_mmx: + + movzx ecx,ah + mov ebx,eax + shr ebx,16 + sub ebp,ecx + movd mm1,ecx + + test al,16 + jz L_test_for_second_level_dist_mmx + and eax,15 + jz L_check_dist_one_mmx + +L_add_bits_to_dist_mmx: + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add ebx,ecx + +L_check_window_mmx: + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,ebx + jb L_clip_window_mmx + + mov ecx,edx + mov esi,edi + sub esi,ebx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_check_dist_one_mmx: + cmp ebx,1 + jne L_check_window_mmx + cmp [esp+40],edi + je L_check_window_mmx + + dec edi + mov ecx,edx + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_test_for_second_level_length_mmx: + test al,64 + jnz L_test_for_end_of_block + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + add ecx,edx + mov eax, [ebx+ecx*4] + jmp L_dolen_mmx + +ALIGN 4 +L_test_for_second_level_dist_mmx: + test al,64 + jnz L_invalid_distance_code + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + mov eax, [esp+12] + add ecx,ebx + mov eax, [eax+ecx*4] + jmp L_dodist_mmx + +ALIGN 4 +L_clip_window_mmx: + + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,ebx + jb L_invalid_distance_too_far + + add ecx,ebx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window_mmx + + sub eax,ecx + add esi,eax + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_wrap_around_window_mmx: + + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window_mmx + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_contiguous_in_window_mmx: + + add esi,eax + sub esi,ecx + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + +L_do_copy1_mmx: + + + mov ecx,edx + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx +; 1174 "inffast.S" +L_invalid_distance_code: + + + + + + mov ecx, invalid_distance_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_test_for_end_of_block: + + + + + + test al,32 + jz L_invalid_literal_length_code + + mov ecx,0 + mov edx,INFLATE_MODE_TYPE + jmp L_update_stream_state + +L_invalid_literal_length_code: + + + + + + mov ecx, invalid_literal_length_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_invalid_distance_too_far: + + + + mov esi, [esp+44] + mov ecx, invalid_distance_too_far_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_update_stream_state: + + mov eax, [esp+88] + test ecx,ecx + jz L_skip_msg + mov [eax+24],ecx +L_skip_msg: + mov eax, [eax+28] + mov [eax+mode_state],edx + jmp L_break_loop + +ALIGN 4 +L_break_loop: +; 1243 "inffast.S" + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_next_in + + + + mov ebx,ebp + +L_update_next_in: +; 1266 "inffast.S" + mov eax, [esp+88] + mov ecx,ebx + mov edx, [eax+28] + shr ecx,3 + sub esi,ecx + shl ecx,3 + sub ebx,ecx + mov [eax+12],edi + mov [edx+bits_state],ebx + mov ecx,ebx + + lea ebx, [esp+28] + cmp [esp+20],ebx + jne L_buf_not_used + + sub esi,ebx + mov ebx, [eax+0] + mov [esp+20],ebx + add esi,ebx + mov ebx, [eax+4] + sub ebx,11 + add [esp+20],ebx + +L_buf_not_used: + mov [eax+0],esi + + mov ebx,1 + shl ebx,cl + dec ebx + + + + + + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_hold + + + + psrlq mm0,mm1 + movd ebp,mm0 + + emms + +L_update_hold: + + + + and ebp,ebx + mov [edx+hold_state],ebp + + + + + mov ebx, [esp+20] + cmp ebx,esi + jbe L_last_is_smaller + + sub ebx,esi + add ebx,11 + mov [eax+4],ebx + jmp L_fixup_out +L_last_is_smaller: + sub esi,ebx + neg esi + add esi,11 + mov [eax+4],esi + + + + +L_fixup_out: + + mov ebx, [esp+16] + cmp ebx,edi + jbe L_end_is_smaller + + sub ebx,edi + add ebx,257 + mov [eax+16],ebx + jmp L_done +L_end_is_smaller: + sub edi,ebx + neg edi + add edi,257 + mov [eax+16],edi + + + + + +L_done: + add esp,64 + popfd + pop ebx + pop ebp + pop esi + pop edi + ret +_inflate_fast endp + +_TEXT ends +end diff --git a/third_party/zlib/contrib/masmx86/match686.asm b/third_party/zlib/contrib/masmx86/match686.asm new file mode 100644 index 00000000..69e0eed0 --- /dev/null +++ b/third_party/zlib/contrib/masmx86/match686.asm @@ -0,0 +1,479 @@ +; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; File written by Gilles Vollant, by converting match686.S from Brian Raiter +; for MASM. This is as assembly version of longest_match +; from Jean-loup Gailly in deflate.c +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is distributed in +; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 +; +; this file contain two implementation of longest_match +; +; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro +; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom) +; +; for using an assembly version of longest_match, you need define ASMV in project +; +; compile the asm file running +; ml /coff /Zi /c /Flmatch686.lst match686.asm +; and do not include match686.obj in your project +; +; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for +; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor +; with autoselect (with cpu detection code) +; if you want support the old pentium optimization, you can still use these version +; +; this file is not optimized for old pentium, but it compatible with all x86 32 bits +; processor (starting 80386) +; +; +; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ + + NbStack equ 76 + cur_match equ dword ptr[esp+NbStack-0] + str_s equ dword ptr[esp+NbStack-4] +; 5 dword on top (ret,ebp,esi,edi,ebx) + adrret equ dword ptr[esp+NbStack-8] + pushebp equ dword ptr[esp+NbStack-12] + pushedi equ dword ptr[esp+NbStack-16] + pushesi equ dword ptr[esp+NbStack-20] + pushebx equ dword ptr[esp+NbStack-24] + + chain_length equ dword ptr [esp+NbStack-28] + limit equ dword ptr [esp+NbStack-32] + best_len equ dword ptr [esp+NbStack-36] + window equ dword ptr [esp+NbStack-40] + prev equ dword ptr [esp+NbStack-44] + scan_start equ word ptr [esp+NbStack-48] + wmask equ dword ptr [esp+NbStack-52] + match_start_ptr equ dword ptr [esp+NbStack-56] + nice_match equ dword ptr [esp+NbStack-60] + scan equ dword ptr [esp+NbStack-64] + + windowlen equ dword ptr [esp+NbStack-68] + match_start equ dword ptr [esp+NbStack-72] + strend equ dword ptr [esp+NbStack-76] + NbStackAdd equ (NbStack-24) + + .386p + + name gvmatch + .MODEL FLAT + + + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + zlib1222add equ 8 + +; Note : these value are good with a 8 bytes boundary pack structure + dep_chain_length equ 74h+zlib1222add + dep_window equ 30h+zlib1222add + dep_strstart equ 64h+zlib1222add + dep_prev_length equ 70h+zlib1222add + dep_nice_match equ 88h+zlib1222add + dep_w_size equ 24h+zlib1222add + dep_prev equ 38h+zlib1222add + dep_w_mask equ 2ch+zlib1222add + dep_good_match equ 84h+zlib1222add + dep_match_start equ 68h+zlib1222add + dep_lookahead equ 6ch+zlib1222add + + +_TEXT segment + +IFDEF NOUNDERLINE + public longest_match + public match_init +ELSE + public _longest_match + public _match_init +ENDIF + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + + +MAX_MATCH equ 258 +MIN_MATCH equ 3 +MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) + + +;;; stack frame offsets + +chainlenwmask equ esp + 0 ; high word: current chain len + ; low word: s->wmask +window equ esp + 4 ; local copy of s->window +windowbestlen equ esp + 8 ; s->window + bestlen +scanstart equ esp + 16 ; first two bytes of string +scanend equ esp + 12 ; last two bytes of string +scanalign equ esp + 20 ; dword-misalignment of string +nicematch equ esp + 24 ; a good enough match size +bestlen equ esp + 28 ; size of best match so far +scan equ esp + 32 ; ptr to string wanting match + +LocalVarsSize equ 36 +; saved ebx byte esp + 36 +; saved edi byte esp + 40 +; saved esi byte esp + 44 +; saved ebp byte esp + 48 +; return address byte esp + 52 +deflatestate equ esp + 56 ; the function arguments +curmatch equ esp + 60 + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +dsWSize equ 36+zlib1222add +dsWMask equ 44+zlib1222add +dsWindow equ 48+zlib1222add +dsPrev equ 56+zlib1222add +dsMatchLen equ 88+zlib1222add +dsPrevMatch equ 92+zlib1222add +dsStrStart equ 100+zlib1222add +dsMatchStart equ 104+zlib1222add +dsLookahead equ 108+zlib1222add +dsPrevLen equ 112+zlib1222add +dsMaxChainLen equ 116+zlib1222add +dsGoodMatch equ 132+zlib1222add +dsNiceMatch equ 136+zlib1222add + + +;;; match686.asm -- Pentium-Pro-optimized version of longest_match() +;;; Written for zlib 1.1.2 +;;; Copyright (C) 1998 Brian Raiter +;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html +;;; +;; +;; This software is provided 'as-is', without any express or implied +;; warranty. In no event will the authors be held liable for any damages +;; arising from the use of this software. +;; +;; Permission is granted to anyone to use this software for any purpose, +;; including commercial applications, and to alter it and redistribute it +;; freely, subject to the following restrictions: +;; +;; 1. The origin of this software must not be misrepresented; you must not +;; claim that you wrote the original software. If you use this software +;; in a product, an acknowledgment in the product documentation would be +;; appreciated but is not required. +;; 2. Altered source versions must be plainly marked as such, and must not be +;; misrepresented as being the original software +;; 3. This notice may not be removed or altered from any source distribution. +;; + +;GLOBAL _longest_match, _match_init + + +;SECTION .text + +;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) + +;_longest_match: + IFDEF NOUNDERLINE + longest_match proc near + ELSE + _longest_match proc near + ENDIF +.FPO (9, 4, 0, 0, 1, 0) + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + push ebp + push edi + push esi + push ebx + sub esp, LocalVarsSize + +;;; 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, [deflatestate] + mov ecx, [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 + dsPrevLen] + mov ebx, [edx + dsGoodMatch] + cmp eax, ebx + mov eax, [edx + dsWMask] + mov ebx, [edx + dsMaxChainLen] + jl 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 [chainlenwmask], ebx + +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx + dsNiceMatch] + mov ebx, [edx + dsLookahead] + cmp ebx, eax + jl LookaheadLess + mov ebx, eax +LookaheadLess: mov [nicematch], ebx + +;;; register Bytef *scan = s->window + s->strstart; + + mov esi, [edx + dsWindow] + mov [window], esi + mov ebp, [edx + dsStrStart] + lea edi, [esi + ebp] + mov [scan], edi + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov eax, edi + neg eax + and eax, 3 + mov [scanalign], eax + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov eax, [edx + dsWSize] + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg LimitPositive + xor ebp, ebp +LimitPositive: + +;;; int best_len = s->prev_length; + + mov eax, [edx + dsPrevLen] + mov [bestlen], eax + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + add esi, eax + mov [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 [scanstart], ebx + movzx ebx, word ptr [edi + eax - 1] + mov [scanend], ebx + mov edi, [edx + dsPrev] + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + jmp short LoopEntry + +align 4 + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; ecx = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and ecx, edx + movzx ecx, word ptr [edi + ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow +LoopEntry: movzx eax, word ptr [esi + ecx - 1] + cmp eax, ebx + jnz LookupLoop + mov eax, [window] + movzx eax, word ptr [eax + ecx] + cmp eax, [scanstart] + jnz LookupLoop + +;;; Store the current value of chainlen. + + mov [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, [window] + mov edi, [scan] + add esi, ecx + mov eax, [scanalign] + mov edx, 0fffffef8h; -(MAX_MATCH_8) + lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] + lea esi, [esi + eax + 0108h] ;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, [esi + edx] + xor eax, [edi + edx] + jnz LeaveLoopCmps + mov eax, [esi + edx + 4] + xor eax, [edi + edx + 4] + jnz LeaveLoopCmps4 + add edx, 8 + jnz LoopCmps + jmp short LenMaximum +LeaveLoopCmps4: add edx, 4 +LeaveLoopCmps: test eax, 0000FFFFh + jnz 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, [scan] + sub eax, edi + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. + + mov edx, [deflatestate] + mov ebx, [bestlen] + cmp eax, ebx + jg LongerMatch + mov esi, [windowbestlen] + mov edi, [edx + dsPrev] + mov ebx, [scanend] + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: mov ebx, [nicematch] + mov [bestlen], eax + mov [edx + dsMatchStart], ecx + cmp eax, ebx + jge LeaveNow + mov esi, [window] + add esi, eax + mov [windowbestlen], esi + movzx ebx, word ptr [edi + eax - 1] + mov edi, [edx + dsPrev] + mov [scanend], ebx + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: mov edx, [deflatestate] + mov dword ptr [bestlen], MAX_MATCH + mov [edx + dsMatchStart], ecx + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: + mov edx, [deflatestate] + mov ebx, [bestlen] + mov eax, [edx + dsLookahead] + cmp ebx, eax + jg LookaheadRet + mov eax, ebx +LookaheadRet: + +;;; Restore the stack and return from whence we came. + + add esp, LocalVarsSize + pop ebx + pop esi + pop edi + pop ebp + + ret +; please don't remove this string ! +; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah + + + IFDEF NOUNDERLINE + longest_match endp + ELSE + _longest_match endp + ENDIF + + IFDEF NOUNDERLINE + match_init proc near + ret + match_init endp + ELSE + _match_init proc near + ret + _match_init endp + ENDIF + + +_TEXT ends +end diff --git a/third_party/zlib/contrib/masmx86/readme.txt b/third_party/zlib/contrib/masmx86/readme.txt new file mode 100644 index 00000000..3f888867 --- /dev/null +++ b/third_party/zlib/contrib/masmx86/readme.txt @@ -0,0 +1,27 @@ + +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(). + + +Use instructions +---------------- +Assemble using MASM, and copy the object files into the zlib source +directory, then run the appropriate makefile, as suggested below. You can +donwload MASM from here: + + http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 + +You can also get objects files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +Build instructions +------------------ +* With Microsoft C and MASM: +nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" + +* With Borland C and TASM: +make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj" + diff --git a/third_party/zlib/contrib/minizip/Makefile b/third_party/zlib/contrib/minizip/Makefile new file mode 100644 index 00000000..84eaad20 --- /dev/null +++ b/third_party/zlib/contrib/minizip/Makefile @@ -0,0 +1,25 @@ +CC=cc +CFLAGS=-O -I../.. + +UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a +ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a + +.c.o: + $(CC) -c $(CFLAGS) $*.c + +all: miniunz minizip + +miniunz: $(UNZ_OBJS) + $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) + +minizip: $(ZIP_OBJS) + $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) + +test: miniunz minizip + ./minizip test readme.txt + ./miniunz -l test.zip + mv readme.txt readme.old + ./miniunz test.zip + +clean: + /bin/rm -f *.o *~ minizip miniunz diff --git a/third_party/zlib/contrib/minizip/Makefile.am b/third_party/zlib/contrib/minizip/Makefile.am new file mode 100644 index 00000000..d343011e --- /dev/null +++ b/third_party/zlib/contrib/minizip/Makefile.am @@ -0,0 +1,45 @@ +lib_LTLIBRARIES = libminizip.la + +if COND_DEMOS +bin_PROGRAMS = miniunzip minizip +endif + +zlib_top_srcdir = $(top_srcdir)/../.. +zlib_top_builddir = $(top_builddir)/../.. + +AM_CPPFLAGS = -I$(zlib_top_srcdir) +AM_LDFLAGS = -L$(zlib_top_builddir) + +if WIN32 +iowin32_src = iowin32.c +iowin32_h = iowin32.h +endif + +libminizip_la_SOURCES = \ + ioapi.c \ + mztools.c \ + unzip.c \ + zip.c \ + ${iowin32_src} + +libminizip_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 -lz + +minizip_includedir = $(includedir)/minizip +minizip_include_HEADERS = \ + crypt.h \ + ioapi.h \ + mztools.h \ + unzip.h \ + zip.h \ + ${iowin32_h} + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = minizip.pc + +EXTRA_PROGRAMS = miniunzip minizip + +miniunzip_SOURCES = miniunz.c +miniunzip_LDADD = libminizip.la + +minizip_SOURCES = minizip.c +minizip_LDADD = libminizip.la -lz diff --git a/third_party/zlib/contrib/minizip/MiniZip64_Changes.txt b/third_party/zlib/contrib/minizip/MiniZip64_Changes.txt new file mode 100644 index 00000000..13a1bd91 --- /dev/null +++ b/third_party/zlib/contrib/minizip/MiniZip64_Changes.txt @@ -0,0 +1,6 @@ + +MiniZip 1.1 was derrived from MiniZip at version 1.01f + +Change in 1.0 (Okt 2009) + - **TODO - Add history** + diff --git a/third_party/zlib/contrib/minizip/MiniZip64_info.txt b/third_party/zlib/contrib/minizip/MiniZip64_info.txt new file mode 100644 index 00000000..57d71524 --- /dev/null +++ b/third_party/zlib/contrib/minizip/MiniZip64_info.txt @@ -0,0 +1,74 @@ +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/third_party/zlib/contrib/minizip/configure.ac b/third_party/zlib/contrib/minizip/configure.ac new file mode 100644 index 00000000..5b119709 --- /dev/null +++ b/third_party/zlib/contrib/minizip/configure.ac @@ -0,0 +1,32 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com]) +AC_CONFIG_SRCDIR([minizip.c]) +AM_INIT_AUTOMAKE([foreign]) +LT_INIT + +AC_MSG_CHECKING([whether to build example programs]) +AC_ARG_ENABLE([demos], AC_HELP_STRING([--enable-demos], [build example programs])) +AM_CONDITIONAL([COND_DEMOS], [test "$enable_demos" = yes]) +if test "$enable_demos" = yes +then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +case "${host}" in + *-mingw* | mingw*) + WIN32="yes" + ;; + *) + ;; +esac +AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"]) + + +AC_SUBST([HAVE_UNISTD_H], [0]) +AC_CHECK_HEADER([unistd.h], [HAVE_UNISTD_H=1], []) +AC_CONFIG_FILES([Makefile minizip.pc]) +AC_OUTPUT diff --git a/third_party/zlib/contrib/minizip/crypt.h b/third_party/zlib/contrib/minizip/crypt.h new file mode 100644 index 00000000..1e9e8200 --- /dev/null +++ b/third_party/zlib/contrib/minizip/crypt.h @@ -0,0 +1,131 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const z_crc_t* pcrc_32_tab, + unsigned long crcForCrypting) +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/third_party/zlib/contrib/minizip/ioapi.c b/third_party/zlib/contrib/minizip/ioapi.c new file mode 100644 index 00000000..7f5c191b --- /dev/null +++ b/third_party/zlib/contrib/minizip/ioapi.c @@ -0,0 +1,247 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) || defined(IOAPI_NO_64) +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == MAXU32) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = FOPEN_FUNC((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = FTELLO_FUNC((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/third_party/zlib/contrib/minizip/ioapi.h b/third_party/zlib/contrib/minizip/ioapi.h new file mode 100644 index 00000000..8dcbdb06 --- /dev/null +++ b/third_party/zlib/contrib/minizip/ioapi.h @@ -0,0 +1,208 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif + +#endif + +#include +#include +#include "zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef __FreeBSD__ +#define fopen64 fopen +#define ftello64 ftello +#define fseeko64 fseeko +#endif +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#define MAXU32 0xffffffff + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/third_party/zlib/contrib/minizip/iowin32.c b/third_party/zlib/contrib/minizip/iowin32.c new file mode 100644 index 00000000..274f39eb --- /dev/null +++ b/third_party/zlib/contrib/minizip/iowin32.c @@ -0,0 +1,462 @@ +/* iowin32.c -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + +#include "zlib.h" +#include "ioapi.h" +#include "iowin32.h" + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (0xFFFFFFFF) +#endif + +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + + +// see Include/shared/winapifamily.h in the Windows Kit +#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) +#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) +#define IOWIN32_USING_WINRT_API 1 +#endif +#endif + +voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); +uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); +long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); +int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); + +typedef struct +{ + HANDLE hf; + int error; +} WIN32FILE_IOWIN; + + +static void win32_translate_open_mode(int mode, + DWORD* lpdwDesiredAccess, + DWORD* lpdwCreationDisposition, + DWORD* lpdwShareMode, + DWORD* lpdwFlagsAndAttributes) +{ + *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; + + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + { + *lpdwDesiredAccess = GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + *lpdwShareMode = FILE_SHARE_READ; + } + else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + } + else if (mode & ZLIB_FILEFUNC_MODE_CREATE) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = CREATE_ALWAYS; + } +} + +static voidpf win32_build_iowin(HANDLE hFile) +{ + voidpf ret=NULL; + + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) + { + WIN32FILE_IOWIN w32fiow; + w32fiow.hf = hFile; + w32fiow.error = 0; + ret = malloc(sizeof(WIN32FILE_IOWIN)); + + if (ret==NULL) + CloseHandle(hFile); + else + *((WIN32FILE_IOWIN*)ret) = w32fiow; + } + return ret; +} + +voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!ReadFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + + +uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!WriteFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + +static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) +{ +#ifdef IOWIN32_USING_WINRT_API + return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); +#else + LONG lHigh = pos.HighPart; + DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod); + BOOL fOk = TRUE; + if (dwNewPos == 0xFFFFFFFF) + if (GetLastError() != NO_ERROR) + fOk = FALSE; + if ((newPos != NULL) && (fOk)) + { + newPos->LowPart = dwNewPos; + newPos->HighPart = lHigh; + } + return fOk; +#endif +} + +long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) +{ + long ret=-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=(long)pos.LowPart; + } + return ret; +} + +ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret= (ZPOS64_T)-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = (ZPOS64_T)-1; + } + else + ret=pos.QuadPart; + } + return ret; +} + + +long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + + long ret=-1; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + long ret=-1; + + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) +{ + int ret=-1; + + if (stream!=NULL) + { + HANDLE hFile; + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + CloseHandle(hFile); + ret=0; + } + free(stream); + } + return ret; +} + +int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) +{ + int ret=-1; + if (stream!=NULL) + { + ret = ((WIN32FILE_IOWIN*)stream) -> error; + } + return ret; +} + +void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen_file = win32_open_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell_file = win32_tell_file_func; + pzlib_filefunc_def->zseek_file = win32_seek_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/third_party/zlib/contrib/minizip/iowin32.h b/third_party/zlib/contrib/minizip/iowin32.h new file mode 100644 index 00000000..0ca0969a --- /dev/null +++ b/third_party/zlib/contrib/minizip/iowin32.h @@ -0,0 +1,28 @@ +/* iowin32.h -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); + +#ifdef __cplusplus +} +#endif diff --git a/third_party/zlib/contrib/minizip/make_vms.com b/third_party/zlib/contrib/minizip/make_vms.com new file mode 100644 index 00000000..9ac13a98 --- /dev/null +++ b/third_party/zlib/contrib/minizip/make_vms.com @@ -0,0 +1,25 @@ +$ if f$search("ioapi.h_orig") .eqs. "" then copy ioapi.h ioapi.h_orig +$ open/write zdef vmsdefs.h +$ copy sys$input: zdef +$ deck +#define unix +#define fill_zlib_filefunc64_32_def_from_filefunc32 fillzffunc64from +#define Write_Zip64EndOfCentralDirectoryLocator Write_Zip64EoDLocator +#define Write_Zip64EndOfCentralDirectoryRecord Write_Zip64EoDRecord +#define Write_EndOfCentralDirectoryRecord Write_EoDRecord +$ eod +$ close zdef +$ copy vmsdefs.h,ioapi.h_orig ioapi.h +$ cc/include=[--]/prefix=all ioapi.c +$ cc/include=[--]/prefix=all miniunz.c +$ cc/include=[--]/prefix=all unzip.c +$ cc/include=[--]/prefix=all minizip.c +$ cc/include=[--]/prefix=all zip.c +$ link miniunz,unzip,ioapi,[--]libz.olb/lib +$ link minizip,zip,ioapi,[--]libz.olb/lib +$ mcr []minizip test minizip_info.txt +$ mcr []miniunz -l test.zip +$ rename minizip_info.txt; minizip_info.txt_old +$ mcr []miniunz test.zip +$ delete test.zip;* +$exit diff --git a/third_party/zlib/contrib/minizip/miniunz.c b/third_party/zlib/contrib/minizip/miniunz.c new file mode 100644 index 00000000..3d65401b --- /dev/null +++ b/third_party/zlib/contrib/minizip/miniunz.c @@ -0,0 +1,660 @@ +/* + miniunz.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +#endif + + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +#ifdef _WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef _WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +#ifdef unix || __APPLE__ + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef _WIN32 + ret = _mkdir(dirname); +#elif unix + ret = mkdir (dirname,0775); +#elif __APPLE__ + ret = mkdir (dirname,0775); +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + if (buffer==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + +void Display64BitsSize(ZPOS64_T n, int size_char) +{ + /* to avoid compatibility problem , we do here the conversion */ + char number[21]; + int offset=19; + int pos_string = 19; + number[20]=0; + for (;;) { + number[offset]=(char)((n%10)+'0'); + if (number[offset] != '0') + pos_string=offset; + n/=10; + if (offset==0) + break; + offset--; + } + { + int size_display_string = 19-pos_string; + while (size_char > size_display_string) + { + size_char--; + printf(" "); + } + } + + printf("%s",&number[pos_string]); +} + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info64 gi; + int err; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i0) + ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + if (file_info.compression_method==Z_BZIP2ED) + { + string_method="BZip2 "; + } + else + string_method="Unkn. "; + + Display64BitsSize(file_info.uncompressed_size,7); + printf(" %6s%c",string_method,charCrypt); + Display64BitsSize(file_info.compressed_size,7); + printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=FOPEN_FUNC(write_filename,"wb"); + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=FOPEN_FUNC(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info64 gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +miniunzip - uncompress and examine ZIP archives +.SH SYNOPSIS +.B miniunzip +.RI [ -exvlo ] +zipfile [ files_to_extract ] [-d tempdir] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the extraction of compressed file +archives in the ZIP format used by the MS-DOS utility PKZIP. It was +written as a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR unzip (1) +program. +.SH OPTIONS +A number of options are supported. With the exception of +.BI \-d\ tempdir +these must be supplied before any +other arguments and are: +.TP +.BI \-l\ ,\ \-\-v +List the files in the archive without extracting them. +.TP +.B \-o +Overwrite files without prompting for confirmation. +.TP +.B \-x +Extract files (default). +.PP +The +.I zipfile +argument is the name of the archive to process. The next argument can be used +to specify a single file to extract from the archive. + +Lastly, the following option can be specified at the end of the command-line: +.TP +.BI \-d\ tempdir +Extract the archive in the directory +.I tempdir +rather than the current directory. +.SH SEE ALSO +.BR minizip (1), +.BR zlib (3), +.BR unzip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . The -d tempdir option +was added by Dirk Eddelbuettel . diff --git a/third_party/zlib/contrib/minizip/minizip.1 b/third_party/zlib/contrib/minizip/minizip.1 new file mode 100644 index 00000000..1154484c --- /dev/null +++ b/third_party/zlib/contrib/minizip/minizip.1 @@ -0,0 +1,46 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH minizip 1 "May 2, 2001" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +minizip - create ZIP archives +.SH SYNOPSIS +.B minizip +.RI [ -o ] +zipfile [ " files" ... ] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the creation of compressed file archives +in the ZIP format used by the MS-DOS utility PKZIP. It was written as +a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR zip (1) +program. +.SH OPTIONS +The first argument supplied is the name of the ZIP archive to create or +.RI -o +in which case it is ignored and the second argument treated as the +name of the ZIP file. If the ZIP file already exists it will be +overwritten. +.PP +Subsequent arguments specify a list of files to place in the ZIP +archive. If none are specified then an empty archive will be created. +.SH SEE ALSO +.BR miniunzip (1), +.BR zlib (3), +.BR zip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . + diff --git a/third_party/zlib/contrib/minizip/minizip.c b/third_party/zlib/contrib/minizip/minizip.c new file mode 100644 index 00000000..4288962e --- /dev/null +++ b/third_party/zlib/contrib/minizip/minizip.c @@ -0,0 +1,520 @@ +/* + minizip.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +# include +# include +#endif + +#include "zip.h" + +#ifdef _WIN32 + #define USEWIN32IOAPI + #include "iowin32.h" +#endif + + + +#define WRITEBUFFERSIZE (16384) +#define MAXFILENAME (256) + +#ifdef _WIN32 +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret = 0; + { + FILETIME ftLocal; + HANDLE hFind; + WIN32_FIND_DATAA ff32; + + hFind = FindFirstFileA(f,&ff32); + if (hFind != INVALID_HANDLE_VALUE) + { + FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); + FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); + FindClose(hFind); + ret = 1; + } + } + return ret; +} +#else +#ifdef unix || __APPLE__ +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret=0; + struct stat s; /* results of stat() */ + struct tm* filedate; + time_t tm_t=0; + + if (strcmp(f,"-")!=0) + { + char name[MAXFILENAME+1]; + int len = strlen(f); + if (len > MAXFILENAME) + len = MAXFILENAME; + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + + if (name[len - 1] == '/') + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (stat(name,&s)==0) + { + tm_t = s.st_mtime; + ret = 1; + } + } + filedate = localtime(&tm_t); + + tmzip->tm_sec = filedate->tm_sec; + tmzip->tm_min = filedate->tm_min; + tmzip->tm_hour = filedate->tm_hour; + tmzip->tm_mday = filedate->tm_mday; + tmzip->tm_mon = filedate->tm_mon ; + tmzip->tm_year = filedate->tm_year; + + return ret; +} +#else +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + return 0; +} +#endif +#endif + + + + +int check_exist_file(filename) + const char* filename; +{ + FILE* ftestexist; + int ret = 1; + ftestexist = FOPEN_FUNC(filename,"rb"); + if (ftestexist==NULL) + ret = 0; + else + fclose(ftestexist); + return ret; +} + +void do_banner() +{ + printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); + printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); +} + +void do_help() +{ + printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ + " -o Overwrite existing file.zip\n" \ + " -a Append to existing file.zip\n" \ + " -0 Store only\n" \ + " -1 Compress faster\n" \ + " -9 Compress better\n\n" \ + " -j exclude path. store only the file name.\n\n"); +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); + + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %lx\n", filenameinzip, calculate_crc); + return err; +} + +int isLargeFile(const char* filename) +{ + int largeFile = 0; + ZPOS64_T pos = 0; + FILE* pFile = FOPEN_FUNC(filename, "rb"); + + if(pFile != NULL) + { + int n = FSEEKO_FUNC(pFile, 0, SEEK_END); + pos = FTELLO_FUNC(pFile); + + printf("File : %s is %lld bytes\n", filename, pos); + + if(pos >= 0xffffffff) + largeFile = 1; + + fclose(pFile); + } + + return largeFile; +} + +int main(argc,argv) + int argc; + char *argv[]; +{ + int i; + int opt_overwrite=0; + int opt_compress_level=Z_DEFAULT_COMPRESSION; + int opt_exclude_path=0; + int zipfilenamearg = 0; + char filename_try[MAXFILENAME+16]; + int zipok; + int err=0; + int size_buf=0; + void* buf=NULL; + const char* password=NULL; + + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i='0') && (c<='9')) + opt_compress_level = c-'0'; + if ((c=='j') || (c=='J')) + opt_exclude_path = 1; + + if (((c=='p') || (c=='P')) && (i+1='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + if (rep=='N') + zipok = 0; + if (rep=='A') + opt_overwrite = 2; + } + } + + if (zipok==1) + { + zipFile zf; + int errclose; +# ifdef USEWIN32IOAPI + zlib_filefunc64_def ffunc; + fill_win32_filefunc64A(&ffunc); + zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); +# else + zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); +# endif + + if (zf == NULL) + { + printf("error opening %s\n",filename_try); + err= ZIP_ERRNO; + } + else + printf("creating %s\n",filename_try); + + for (i=zipfilenamearg+1;(i='0') || (argv[i][1]<='9'))) && + (strlen(argv[i]) == 2))) + { + FILE * fin; + int size_read; + const char* filenameinzip = argv[i]; + const char *savefilenameinzip; + zip_fileinfo zi; + unsigned long crcFile=0; + int zip64 = 0; + + zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = + zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; + zi.dosDate = 0; + zi.internal_fa = 0; + zi.external_fa = 0; + filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); + +/* + err = zipOpenNewFileInZip(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL / * comment * /, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + zip64 = isLargeFile(filenameinzip); + + /* The path name saved, should not include a leading slash. */ + /*if it did, windows/xp and dynazip couldn't read the zip file. */ + savefilenameinzip = filenameinzip; + while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) + { + savefilenameinzip++; + } + + /*should the zip file contain any path at all?*/ + if( opt_exclude_path ) + { + const char *tmpptr; + const char *lastslash = 0; + for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) + { + if( *tmpptr == '\\' || *tmpptr == '/') + { + lastslash = tmpptr; + } + } + if( lastslash != NULL ) + { + savefilenameinzip = lastslash+1; // base filename follows last slash. + } + } + + /**/ + err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, + NULL,0,NULL,0,NULL /* comment*/, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level,0, + /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + password,crcFile, zip64); + + if (err != ZIP_OK) + printf("error in opening %s in zipfile\n",filenameinzip); + else + { + fin = FOPEN_FUNC(filenameinzip,"rb"); + if (fin==NULL) + { + err=ZIP_ERRNO; + printf("error in opening %s for reading\n",filenameinzip); + } + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + { + err = zipWriteInFileInZip (zf,buf,size_read); + if (err<0) + { + printf("error in writing %s in the zipfile\n", + filenameinzip); + } + + } + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + if (err<0) + err=ZIP_ERRNO; + else + { + err = zipCloseFileInZip(zf); + if (err!=ZIP_OK) + printf("error in closing %s in the zipfile\n", + filenameinzip); + } + } + } + errclose = zipClose(zf,NULL); + if (errclose != ZIP_OK) + printf("error in closing %s\n",filename_try); + } + else + { + do_help(); + } + + free(buf); + return 0; +} diff --git a/third_party/zlib/contrib/minizip/minizip.pc.in b/third_party/zlib/contrib/minizip/minizip.pc.in new file mode 100644 index 00000000..69b5b7fd --- /dev/null +++ b/third_party/zlib/contrib/minizip/minizip.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/minizip + +Name: minizip +Description: Minizip zip file manipulation library +Requires: +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lminizip +Libs.private: -lz +Cflags: -I${includedir} diff --git a/third_party/zlib/contrib/minizip/mztools.c b/third_party/zlib/contrib/minizip/mztools.c new file mode 100644 index 00000000..96891c2e --- /dev/null +++ b/third_party/zlib/contrib/minizip/mztools.c @@ -0,0 +1,291 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) + +extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) +const char* file; +const char* fileOut; +const char* fileOutTmp; +uLong* nRecovered; +uLong* bytesRecovered; +{ + int err = Z_OK; + FILE* fpZip = fopen(file, "rb"); + FILE* fpOut = fopen(fileOut, "wb"); + FILE* fpOutCD = fopen(fileOutTmp, "wb"); + if (fpZip != NULL && fpOut != NULL) { + int entries = 0; + uLong totalBytes = 0; + char header[30]; + char filename[1024]; + char extra[1024]; + int offset = 0; + int offsetCD = 0; + while ( fread(header, 1, 30, fpZip) == 30 ) { + int currentOffset = offset; + + /* File entry */ + if (READ_32(header) == 0x04034b50) { + unsigned int version = READ_16(header + 4); + unsigned int gpflag = READ_16(header + 6); + unsigned int method = READ_16(header + 8); + unsigned int filetime = READ_16(header + 10); + unsigned int filedate = READ_16(header + 12); + unsigned int crc = READ_32(header + 14); /* crc */ + unsigned int cpsize = READ_32(header + 18); /* compressed size */ + unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ + 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; + } else { + err = Z_ERRNO; + break; + } + + /* Filename */ + if (fnsize > 0) { + if (fnsize < sizeof(filename)) { + if (fread(filename, 1, fnsize, fpZip) == fnsize) { + if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { + offset += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (extsize < sizeof(extra)) { + if (fread(extra, 1, extsize, fpZip) == extsize) { + if (fwrite(extra, 1, extsize, fpOut) == extsize) { + offset += extsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } + + /* Data */ + { + int dataSize = cpsize; + if (dataSize == 0) { + dataSize = uncpsize; + } + if (dataSize > 0) { + char* data = malloc(dataSize); + if (data != NULL) { + if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { + if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { + offset += dataSize; + totalBytes += dataSize; + } else { + err = Z_ERRNO; + } + } else { + err = Z_ERRNO; + } + free(data); + if (err != Z_OK) { + break; + } + } else { + err = Z_MEM_ERROR; + break; + } + } + } + + /* Central directory entry */ + { + char header[46]; + char* comment = ""; + int comsize = (int) strlen(comment); + WRITE_32(header, 0x02014b50); + WRITE_16(header + 4, version); + WRITE_16(header + 6, version); + WRITE_16(header + 8, gpflag); + WRITE_16(header + 10, method); + WRITE_16(header + 12, filetime); + WRITE_16(header + 14, filedate); + WRITE_32(header + 16, crc); + WRITE_32(header + 20, cpsize); + WRITE_32(header + 24, uncpsize); + WRITE_16(header + 28, fnsize); + WRITE_16(header + 30, extsize); + WRITE_16(header + 32, comsize); + WRITE_16(header + 34, 0); /* disk # */ + WRITE_16(header + 36, 0); /* int attrb */ + WRITE_32(header + 38, 0); /* ext attrb */ + WRITE_32(header + 42, currentOffset); + /* Header */ + if (fwrite(header, 1, 46, fpOutCD) == 46) { + offsetCD += 46; + + /* Filename */ + if (fnsize > 0) { + if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { + offsetCD += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { + offsetCD += extsize; + } else { + err = Z_ERRNO; + break; + } + } + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { + offsetCD += comsize; + } else { + err = Z_ERRNO; + break; + } + } + + + } else { + err = Z_ERRNO; + break; + } + } + + /* Success */ + entries++; + + } else { + break; + } + } + + /* Final central directory */ + { + int entriesZip = entries; + char header[22]; + char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; + int comsize = (int) strlen(comment); + if (entriesZip > 0xffff) { + entriesZip = 0xffff; + } + WRITE_32(header, 0x06054b50); + WRITE_16(header + 4, 0); /* disk # */ + WRITE_16(header + 6, 0); /* disk # */ + WRITE_16(header + 8, entriesZip); /* hack */ + WRITE_16(header + 10, entriesZip); /* hack */ + 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; + } + } + + /* Final merge (file + central directory) */ + fclose(fpOutCD); + if (err == Z_OK) { + fpOutCD = fopen(fileOutTmp, "rb"); + if (fpOutCD != NULL) { + int nRead; + char buffer[8192]; + while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { + if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { + err = Z_ERRNO; + break; + } + } + fclose(fpOutCD); + } + } + + /* Close */ + fclose(fpZip); + fclose(fpOut); + + /* Wipe temporary file */ + (void)remove(fileOutTmp); + + /* Number of recovered entries */ + if (err == Z_OK) { + if (nRecovered != NULL) { + *nRecovered = entries; + } + if (bytesRecovered != NULL) { + *bytesRecovered = totalBytes; + } + } + } else { + err = Z_STREAM_ERROR; + } + return err; +} diff --git a/third_party/zlib/contrib/minizip/mztools.h b/third_party/zlib/contrib/minizip/mztools.h new file mode 100644 index 00000000..a49a426e --- /dev/null +++ b/third_party/zlib/contrib/minizip/mztools.h @@ -0,0 +1,37 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* 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, + uLong* nRecovered, + uLong* bytesRecovered); + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/third_party/zlib/contrib/minizip/unzip.c b/third_party/zlib/contrib/minizip/unzip.c new file mode 100644 index 00000000..bcfb9416 --- /dev/null +++ b/third_party/zlib/contrib/minizip/unzip.c @@ -0,0 +1,2125 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + +*/ + + +#include +#include +#include + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been successfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if ((err==UNZ_OK) && (pfile_info != NULL)) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + 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->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+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} diff --git a/third_party/zlib/contrib/minizip/unzip.h b/third_party/zlib/contrib/minizip/unzip.h new file mode 100644 index 00000000..2104e391 --- /dev/null +++ b/third_party/zlib/contrib/minizip/unzip.h @@ -0,0 +1,437 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzCloseCurrentFile before call unzClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/third_party/zlib/contrib/minizip/zip.c b/third_party/zlib/contrib/minizip/zip.c new file mode 100644 index 00000000..44e88a9c --- /dev/null +++ b/third_party/zlib/contrib/minizip/zip.c @@ -0,0 +1,2007 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + Oct-2009 - Mathias Svensson - Remove old C style function prototypes + Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives + Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. + Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data + It is used when recreting zip archive with RAW when deleting items from a zip. + ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. + Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (64*1024) //(16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + + +// NOT sure that this work on ALL platform +#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) +#define ZIP64ENDHEADERMAGIC (0x6064b50) +#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignment */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + ZPOS64_T pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralExtra; + uLong size_centralheader; /* size of the central header for cur file */ + uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; + int zip64; /* Add ZIP64 extened information in the extra field */ + ZPOS64_T pos_zip64extrainfo; + ZPOS64_T totalCompressedData; + ZPOS64_T totalUncompressedData; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile64_info; + +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile64_info ci; /* info on the file curretly writing */ + + ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ + ZPOS64_T add_position_when_writing_offset; + ZPOS64_T number_entry; + +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif + +} zip64_internal; + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(linkedlist_datablock_internal* ldi) +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(linkedlist_data* ll) +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(linkedlist_data* ll) +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) +*/ + +local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); +local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) +{ + unsigned char buf[8]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) +{ + uLong year = (uLong)ptm->tm_year; + if (year>=1980) + year-=1980; + else if (year>=80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); + +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); + + +local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) +{ + ZPOS64_T x; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<24; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<32; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<40; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<48; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<56; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* +Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before +the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + { + // Signature "0x07064b50" Zip64 end of central directory locater + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + } + + if (uPosFound!=0) + break; + } + + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK) + return 0; + + /* total number of disks */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto Zip64 end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' + return 0; + + return relativeOffset; +} + +int LoadCentralDirectoryRecord(zip64_internal* pziinit) +{ + int err=ZIP_OK; + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory */ + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry; + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong VersionMadeBy; + uLong VersionNeeded; + uLong size_comment; + + int hasZIP64Record = 0; + + // check first if we find a ZIP64 record + central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); + if(central_pos > 0) + { + hasZIP64Record = 1; + } + else if(central_pos == 0) + { + central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); + } + +/* disable to allow appending to empty ZIP archive + if (central_pos==0) + err=ZIP_ERRNO; +*/ + + if(hasZIP64Record) + { + ZPOS64_T sizeEndOfCentralDirectory; + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* size of zip64 end of central directory record */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version made by */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version needed to extract */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + // TODO.. + // read the comment from the standard central header. + size_comment = 0; + } + else + { + // Read End of central Directory info + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + number_entry = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry = uL; + + /* total number of entries in the central dir */ + number_entry_CD = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry_CD = uL; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + size_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + size_central_dir = uL; + + /* offset of start of central directory with respect to the starting disk number */ + offset_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + offset_central_dir = uL; + + + /* zipfile global comment length */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + } + + if ((central_posz_filefunc, pziinit->filestream); + return ZIP_ERRNO; + } + + if (size_comment>0) + { + pziinit->globalcomment = (char*)ALLOC(size_comment+1); + if (pziinit->globalcomment) + { + size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); + pziinit->globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); + pziinit->add_position_when_writing_offset = byte_before_the_zipfile; + + { + ZPOS64_T size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + ZPOS64_T read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + + if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); + + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + pziinit->begin_pos = byte_before_the_zipfile; + pziinit->number_entry = number_entry_CD; + + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + return err; +} + + +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + + +/************************************************************/ +extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) +{ + zip64_internal ziinit; + zip64_internal* zi; + int err=ZIP_OK; + + ziinit.z_filefunc.zseek32_file = NULL; + ziinit.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + else + ziinit.z_filefunc = *pzlib_filefunc64_32_def; + + ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + + if (append == APPEND_STATUS_CREATEAFTER) + ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + + ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writing_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + + zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); + if (zi==NULL) + { + ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + // Read and Cache Central Directory Records + err = LoadCentralDirectoryRecord(&ziinit); + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + +extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + + + +extern zipFile ZEXPORT zipOpen (const char* pathname, int append) +{ + return zipOpen3((const void*)pathname,append,NULL,NULL); +} + +extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) +{ + return zipOpen3(pathname,append,NULL,NULL); +} + +int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +{ + /* write the local header */ + int err; + uInt size_filename = (uInt)strlen(filename); + uInt size_extrafield = size_extrafield_local; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); + + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + } + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if(zi->ci.zip64) + { + size_extrafield += 20; + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); + + if ((err==ZIP_OK) && (size_filename > 0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + } + + if ((err==ZIP_OK) && (size_extrafield_local > 0)) + { + if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) + err = ZIP_ERRNO; + } + + + if ((err==ZIP_OK) && (zi->ci.zip64)) + { + // write the Zip64 extended info + short HeaderID = 1; + short DataSize = 16; + ZPOS64_T CompressedSize = 0; + ZPOS64_T UncompressedSize = 0; + + // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) + zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); + } + + return err; +} + +/* + NOTE. + When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped + before calling this function it can be done with zipRemoveExtraInfoBlock + + It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize + unnecessary allocations. + */ +extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) +{ + zip64_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + (crcForCrypting); + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + +#ifdef HAVE_BZIP2 + if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED)) + return ZIP_PARAMERROR; +#else + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; +#endif + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else + zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); + } + + zi->ci.flag = flagBase; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if (level==2) + zi->ci.flag |= 4; + if (level==1) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); + + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; + zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data + + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); + + zi->ci.size_centralExtra = size_extrafield_global; + zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + if(zi->ci.pos_local_header >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + zi->ci.zip64 = zip64; + zi->ci.totalCompressedData = 0; + zi->ci.totalUncompressedData = 0; + zi->ci.pos_zip64extrainfo = 0; + + err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); + +#ifdef HAVE_BZIP2 + zi->ci.bstream.avail_in = (uInt)0; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + zi->ci.bstream.total_in_hi32 = 0; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_out_hi32 = 0; + zi->ci.bstream.total_out_lo32 = 0; +#endif + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + zi->ci.stream.data_type = Z_BINARY; + +#ifdef HAVE_BZIP2 + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) +#else + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) +#endif + { + if(zi->ci.method == Z_DEFLATED) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = Z_DEFLATED; + } + else if(zi->ci.method == Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + // Init BZip stuff here + zi->ci.bstream.bzalloc = 0; + zi->ci.bstream.bzfree = 0; + zi->ci.bstream.opaque = (voidpf)0; + + err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); + if(err == BZ_OK) + zi->ci.stream_initialised = Z_BZIP2ED; +#endif + } + + } + +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +local int zip64FlushWriteBuffer(zip64_internal* zi) +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); +#endif + } + + if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + + zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED) + { + zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_in_hi32 = 0; + } + else +#endif + { + zi->ci.totalUncompressedData += zi->ci.stream.total_in; + zi->ci.stream.total_in = 0; + } + + + zi->ci.pos_in_buffered_data = 0; + + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) +{ + zip64_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len); + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) + { + zi->ci.bstream.next_in = (void*)buf; + zi->ci.bstream.avail_in = len; + err = BZ_RUN_OK; + + while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0)) + { + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + + + if(err != BZ_RUN_OK) + break; + + if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; +// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; + } + } + + if(err == BZ_RUN_OK) + err = ZIP_OK; + } + else +#endif + { + zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.avail_in = len; + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + if(uTotalOutBefore > zi->ci.stream.total_out) + { + int bBreak = 0; + bBreak++; + } + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + + for (i = 0; i < copy_this; i++) + *(((char*)zi->ci.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + }// while(...) + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) +{ + return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); +} + +extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) +{ + zip64_internal* zi; + ZPOS64_T compressed_size; + uLong invalidValue = 0xffffffff; + short datasize = 0; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + } + else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { +#ifdef HAVE_BZIP2 + err = BZ_FINISH_OK; + while (err==BZ_FINISH_OK) + { + uLong uTotalOutBefore; + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.bstream.total_out_lo32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); + if(err == BZ_STREAM_END) + err = Z_STREAM_END; + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); + } + + if(err == BZ_FINISH_OK) + err = ZIP_OK; +#endif + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + { + if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + } + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + int tmp_err = deflateEnd(&zi->ci.stream); + if (err == ZIP_OK) + err = tmp_err; + zi->ci.stream_initialised = 0; + } +#ifdef HAVE_BZIP2 + else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); + if (err==ZIP_OK) + err = tmperr; + zi->ci.stream_initialised = 0; + } +#endif + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = zi->ci.totalUncompressedData; + } + compressed_size = zi->ci.totalCompressedData; + +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + // update Current Item crc and sizes, + if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) + { + /*version Made by*/ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); + /*version needed*/ + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); + + } + + zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + + + if(compressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ + + /// set internal file attributes field + if (zi->ci.stream.data_type == Z_ASCII) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + + if(uncompressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ + + // Add ZIP64 extra info field for uncompressed size + if(uncompressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for compressed size + if(compressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for relative offset to local file header of current file + if(zi->ci.pos_local_header >= 0xffffffff) + datasize += 8; + + if(datasize > 0) + { + char* p = NULL; + + if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) + { + // we can not write more data to the buffer that we have room for. + return ZIP_BADZIPFILE; + } + + p = zi->ci.central_header + zi->ci.size_centralheader; + + // Add Extra Information Header for 'ZIP64 information' + zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID + p += 2; + zip64local_putValue_inmemory(p, datasize, 2); // DataSize + p += 2; + + if(uncompressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, uncompressed_size, 8); + p += 8; + } + + if(compressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, compressed_size, 8); + p += 8; + } + + if(zi->ci.pos_local_header >= 0xffffffff) + { + zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); + p += 8; + } + + // Update how much extra free space we got in the memory buffer + // and increase the centralheader size so the new ZIP64 fields are included + // ( 4 below is the size of HeaderID and DataSize field ) + zi->ci.size_centralExtraFree -= datasize + 4; + zi->ci.size_centralheader += datasize + 4; + + // Update the extra info size field + zi->ci.size_centralExtra += datasize + 4; + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); + } + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); + + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + // Update the LocalFileHeader with the new values. + + ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff ) + { + if(zi->ci.pos_zip64extrainfo > 0) + { + // Update the size in the ZIP64 extended field. + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); + } + else + err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal + } + else + { + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + } + + if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (zipFile file) +{ + return zipCloseFileInZipRaw (file,0,0); +} + +int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +{ + int err = ZIP_OK; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); + + /*num disks*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + /*relative offset*/ + if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); + + /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); + + return err; +} + +int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + uLong Zip64DataSize = 44; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? + + if (err==ZIP_OK) /* version made by */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* version needed */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); + } + return err; +} +int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + /*signature*/ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + { + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + } + + if (err==ZIP_OK) /* total number of entries in the central dir */ + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff) + { + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); + } + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4); + } + + return err; +} + +int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +{ + int err = ZIP_OK; + uInt size_global_comment = 0; + + if(global_comment != NULL) + size_global_comment = (uInt)strlen(global_comment); + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if (err == ZIP_OK && size_global_comment > 0) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + } + return err; +} + +extern int ZEXPORT zipClose (zipFile file, const char* global_comment) +{ + zip64_internal* zi; + int err = 0; + uLong size_centraldir = 0; + ZPOS64_T centraldir_pos_inzip; + ZPOS64_T pos; + + if (file == NULL) + return ZIP_PARAMERROR; + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + + centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) + err = ZIP_ERRNO; + } + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_linkedlist(&(zi->central_dir)); + + pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + { + ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); + Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); + } + + if (err==ZIP_OK) + err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + if(err == ZIP_OK) + err = Write_GlobalComment(zi, global_comment); + + if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} + +extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) +{ + char* p = pData; + int size = 0; + char* pNewHeader; + char* pTmp; + short header; + short dataSize; + + int retVal = ZIP_OK; + + if(pData == NULL || *dataLen < 4) + return ZIP_PARAMERROR; + + pNewHeader = (char*)ALLOC(*dataLen); + pTmp = pNewHeader; + + while(p < (pData + *dataLen)) + { + header = *(short*)p; + dataSize = *(((short*)p)+1); + + if( header == sHeader ) // Header found. + { + p += dataSize + 4; // skip it. do not copy to temp buffer + } + else + { + // Extra Info block should not be removed, So copy it to the temp buffer. + memcpy(pTmp, p, dataSize + 4); + p += dataSize + 4; + size += dataSize + 4; + } + + } + + if(size < *dataLen) + { + // clean old extra info block. + memset(pData,0, *dataLen); + + // copy the new extra info block over the old + if(size > 0) + memcpy(pData, pNewHeader, size); + + // set the new extra info size + *dataLen = size; + + retVal = ZIP_OK; + } + else + retVal = ZIP_ERRNO; + + TRYFREE(pNewHeader); + + return retVal; +} diff --git a/third_party/zlib/contrib/minizip/zip.h b/third_party/zlib/contrib/minizip/zip.h new file mode 100644 index 00000000..8aaebb62 --- /dev/null +++ b/third_party/zlib/contrib/minizip/zip.h @@ -0,0 +1,362 @@ +/* zip.h -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------- + + Changes + + See header of zip.h + +*/ + +#ifndef _zip12_H +#define _zip12_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#define HAVE_BZIP2 + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); + +extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64)); + +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + zip64 is set to 1 if a zip64 extended information block should be added to the local file header. + this MUST be '1' if the uncompressed size is >= 0xffffffff. + +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + + +extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64)); +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting)); + +extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64 + )); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCrypting : crc of file to compress (needed for crypting) + */ + +extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase + )); + + +extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64 + )); +/* + Same than zipOpenNewFileInZip4, except + versionMadeBy : value for Version made by field + flag : value for flag field (compression level info will be added) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + +extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32)); + +/* + Close the current file in the zipfile, for file opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + + +extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +/* + zipRemoveExtraInfoBlock - Added by Mathias Svensson + + Remove extra information block from a extra information data for the local file header or central directory header + + It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. + + 0x0001 is the signature header for the ZIP64 extra information blocks + + usage. + Remove ZIP64 Extra information from a central director extra field data + zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); + + Remove ZIP64 Extra information from a Local File Header extra field data + zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip64_H */ diff --git a/third_party/zlib/contrib/pascal/example.pas b/third_party/zlib/contrib/pascal/example.pas new file mode 100644 index 00000000..5518b36a --- /dev/null +++ b/third_party/zlib/contrib/pascal/example.pas @@ -0,0 +1,599 @@ +(* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Pascal translation + * Copyright (C) 1998 by Jacques Nomssi Nzali. + * For conditions of distribution and use, see copyright notice in readme.txt + * + * Adaptation to the zlibpas interface + * Copyright (C) 2003 by Cosmin Truta. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +program example; + +{$DEFINE TEST_COMPRESS} +{DO NOT $DEFINE TEST_GZIO} +{$DEFINE TEST_DEFLATE} +{$DEFINE TEST_INFLATE} +{$DEFINE TEST_FLUSH} +{$DEFINE TEST_SYNC} +{$DEFINE TEST_DICT} + +uses SysUtils, zlibpas; + +const TESTFILE = 'foo.gz'; + +(* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + *) +const hello: PChar = 'hello, hello!'; + +const dictionary: PChar = 'hello'; + +var dictId: LongInt; (* Adler32 value of the dictionary *) + +procedure CHECK_ERR(err: Integer; msg: String); +begin + if err <> Z_OK then + begin + WriteLn(msg, ' error: ', err); + Halt(1); + end; +end; + +procedure EXIT_ERR(const msg: String); +begin + WriteLn('Error: ', msg); + Halt(1); +end; + +(* =========================================================================== + * Test compress and uncompress + *) +{$IFDEF TEST_COMPRESS} +procedure test_compress(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + err := compress(compr, comprLen, hello, len); + CHECK_ERR(err, 'compress'); + + StrCopy(PChar(uncompr), 'garbage'); + + err := uncompress(uncompr, uncomprLen, compr, comprLen); + CHECK_ERR(err, 'uncompress'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad uncompress') + else + WriteLn('uncompress(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test read/write of .gz files + *) +{$IFDEF TEST_GZIO} +procedure test_gzio(const fname: PChar; (* compressed file name *) + uncompr: Pointer; + uncomprLen: LongInt); +var err: Integer; + len: Integer; + zfile: gzFile; + pos: LongInt; +begin + len := StrLen(hello)+1; + + zfile := gzopen(fname, 'wb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + gzputc(zfile, 'h'); + if gzputs(zfile, 'ello') <> 4 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$IFDEF GZ_FORMAT_STRING} + if gzprintf(zfile, ', %s!', 'hello') <> 8 then + begin + WriteLn('gzprintf err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ELSE} + if gzputs(zfile, ', hello!') <> 8 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ENDIF} + gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *) + gzclose(zfile); + + zfile := gzopen(fname, 'rb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + + StrCopy(PChar(uncompr), 'garbage'); + + if gzread(zfile, uncompr, uncomprLen) <> len then + begin + WriteLn('gzread err: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello) <> 0 then + begin + WriteLn('bad gzread: ', PChar(uncompr)); + Halt(1); + end + else + WriteLn('gzread(): ', PChar(uncompr)); + + pos := gzseek(zfile, -8, SEEK_CUR); + if (pos <> 6) or (gztell(zfile) <> pos) then + begin + WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile)); + Halt(1); + end; + + if gzgetc(zfile) <> ' ' then + begin + WriteLn('gzgetc error'); + Halt(1); + end; + + if gzungetc(' ', zfile) <> ' ' then + begin + WriteLn('gzungetc error'); + Halt(1); + end; + + gzgets(zfile, PChar(uncompr), uncomprLen); + uncomprLen := StrLen(PChar(uncompr)); + if uncomprLen <> 7 then (* " hello!" *) + begin + WriteLn('gzgets err after gzseek: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello + 6) <> 0 then + begin + WriteLn('bad gzgets after gzseek'); + Halt(1); + end + else + WriteLn('gzgets() after gzseek: ', PChar(uncompr)); + + gzclose(zfile); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with small buffers + *) +{$IFDEF TEST_DEFLATE} +procedure test_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + + while (c_stream.total_in <> len) and + (c_stream.total_out < comprLen) do + begin + c_stream.avail_out := 1; { force small buffers } + c_stream.avail_in := 1; + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + end; + + (* Finish the stream, still forcing small buffers: *) + while TRUE do + begin + c_stream.avail_out := 1; + err := deflate(c_stream, Z_FINISH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'deflate'); + end; + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with small buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_inflate(compr: Pointer; comprLen : LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 0; + d_stream.next_out := uncompr; + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while (d_stream.total_out < uncomprLen) and + (d_stream.total_in < comprLen) do + begin + d_stream.avail_out := 1; (* force small buffers *) + d_stream.avail_in := 1; + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate') + else + WriteLn('inflate(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with large buffers and dynamic change of compression level + *) +{$IFDEF TEST_DEFLATE} +procedure test_large_deflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_SPEED); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + (* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + *) + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + if c_stream.avail_in <> 0 then + EXIT_ERR('deflate not greedy'); + + (* Feed in already compressed data and switch to no compression: *) + deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in := compr; + c_stream.avail_in := Integer(comprLen div 2); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + (* Switch back to compressing mode: *) + deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with large buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_large_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while TRUE do + begin + d_stream.next_out := uncompr; (* discard the output *) + d_stream.avail_out := Integer(uncomprLen); + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'large inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then + begin + WriteLn('bad large inflate: ', d_stream.total_out); + Halt(1); + end + else + WriteLn('large_inflate(): OK'); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with full flush + *) +{$IFDEF TEST_FLUSH} +procedure test_flush(compr: Pointer; var comprLen : LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: Integer; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + c_stream.avail_in := 3; + c_stream.avail_out := Integer(comprLen); + err := deflate(c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, 'deflate'); + + Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *) + c_stream.avail_in := len - 3; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + CHECK_ERR(err, 'deflate'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); + + comprLen := c_stream.total_out; +end; +{$ENDIF} + +(* =========================================================================== + * Test inflateSync() + *) +{$IFDEF TEST_SYNC} +procedure test_sync(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 2; (* just read the zlib header *) + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + inflate(d_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'inflate'); + + d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *) + err := inflateSync(d_stream); (* but skip the damaged part *) + CHECK_ERR(err, 'inflateSync'); + + err := inflate(d_stream, Z_FINISH); + if err <> Z_DATA_ERROR then + EXIT_ERR('inflate should report DATA_ERROR'); + (* Because of incorrect adler32 *) + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + WriteLn('after inflateSync(): hel', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary)); + CHECK_ERR(err, 'deflateSetDictionary'); + + dictId := c_stream.adler; + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + c_stream.next_in := hello; + c_stream.avail_in := StrLen(hello)+1; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with a preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + while TRUE do + begin + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + if err = Z_NEED_DICT then + begin + if d_stream.adler <> dictId then + EXIT_ERR('unexpected dictionary'); + err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary)); + end; + CHECK_ERR(err, 'inflate with dict'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate with dict') + else + WriteLn('inflate with dictionary: ', PChar(uncompr)); +end; +{$ENDIF} + +var compr, uncompr: Pointer; + comprLen, uncomprLen: LongInt; + +begin + if zlibVersion^ <> ZLIB_VERSION[1] then + EXIT_ERR('Incompatible zlib version'); + + WriteLn('zlib version: ', zlibVersion); + WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags])); + + comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *) + uncomprLen := comprLen; + GetMem(compr, comprLen); + GetMem(uncompr, uncomprLen); + if (compr = NIL) or (uncompr = NIL) then + EXIT_ERR('Out of memory'); + (* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + *) + FillChar(compr^, comprLen, 0); + FillChar(uncompr^, uncomprLen, 0); + + {$IFDEF TEST_COMPRESS} + WriteLn('** Testing compress'); + test_compress(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_GZIO} + WriteLn('** Testing gzio'); + if ParamCount >= 1 then + test_gzio(ParamStr(1), uncompr, uncomprLen) + else + test_gzio(TESTFILE, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with small buffers'); + test_deflate(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with small buffers'); + test_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with large buffers'); + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with large buffers'); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_FLUSH} + WriteLn('** Testing deflate with full flush'); + test_flush(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_SYNC} + WriteLn('** Testing inflateSync'); + test_sync(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + comprLen := uncomprLen; + + {$IFDEF TEST_DICT} + WriteLn('** Testing deflate and inflate with preset dictionary'); + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + FreeMem(compr, comprLen); + FreeMem(uncompr, uncomprLen); +end. diff --git a/third_party/zlib/contrib/pascal/readme.txt b/third_party/zlib/contrib/pascal/readme.txt new file mode 100644 index 00000000..60e87c8a --- /dev/null +++ b/third_party/zlib/contrib/pascal/readme.txt @@ -0,0 +1,76 @@ + +This directory contains a Pascal (Delphi, Kylix) interface to the +zlib data compression library. + + +Directory listing +================= + +zlibd32.mak makefile for Borland C++ +example.pas usage example of zlib +zlibpas.pas the Pascal interface to zlib +readme.txt this file + + +Compatibility notes +=================== + +- Although the name "zlib" would have been more normal for the + zlibpas unit, this name is already taken by Borland's ZLib unit. + This is somehow unfortunate, because that unit is not a genuine + interface to the full-fledged zlib functionality, but a suite of + class wrappers around zlib streams. Other essential features, + such as checksums, are missing. + It would have been more appropriate for that unit to have a name + like "ZStreams", or something similar. + +- The C and zlib-supplied types int, uInt, long, uLong, etc. are + translated directly into Pascal types of similar sizes (Integer, + LongInt, etc.), to avoid namespace pollution. In particular, + there is no conversion of unsigned int into a Pascal unsigned + integer. The Word type is non-portable and has the same size + (16 bits) both in a 16-bit and in a 32-bit environment, unlike + Integer. Even if there is a 32-bit Cardinal type, there is no + real need for unsigned int in zlib under a 32-bit environment. + +- Except for the callbacks, the zlib function interfaces are + assuming the calling convention normally used in Pascal + (__pascal for DOS and Windows16, __fastcall for Windows32). + Since the cdecl keyword is used, the old Turbo Pascal does + not work with this interface. + +- The gz* function interfaces are not translated, to avoid + interfacing problems with the C runtime library. Besides, + gzprintf(gzFile file, const char *format, ...) + cannot be translated into Pascal. + + +Legal issues +============ + +The zlibpas interface is: + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler. + Copyright (C) 1998 by Bob Dellaca. + Copyright (C) 2003 by Cosmin Truta. + +The example program is: + Copyright (C) 1995-2003 by Jean-loup Gailly. + Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali. + Copyright (C) 2003 by Cosmin Truta. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + diff --git a/third_party/zlib/contrib/pascal/zlibd32.mak b/third_party/zlib/contrib/pascal/zlibd32.mak new file mode 100644 index 00000000..9bb00b7c --- /dev/null +++ b/third_party/zlib/contrib/pascal/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/third_party/zlib/contrib/pascal/zlibpas.pas b/third_party/zlib/contrib/pascal/zlibpas.pas new file mode 100644 index 00000000..a0dff11b --- /dev/null +++ b/third_party/zlib/contrib/pascal/zlibpas.pas @@ -0,0 +1,276 @@ +(* zlibpas -- Pascal interface to the zlib data compression library + * + * Copyright (C) 2003 Cosmin Truta. + * Derived from original sources by Bob Dellaca. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +unit zlibpas; + +interface + +const + ZLIB_VERSION = '1.2.11'; + ZLIB_VERNUM = $12a0; + +type + alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; + cdecl; + free_func = procedure(opaque, address: Pointer); + cdecl; + + in_func = function(opaque: Pointer; var buf: PByte): Integer; + cdecl; + out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer; + cdecl; + + z_streamp = ^z_stream; + z_stream = packed record + next_in: PChar; (* next input byte *) + avail_in: Integer; (* number of bytes available at next_in *) + total_in: LongInt; (* total nb of input bytes read so far *) + + next_out: PChar; (* next output byte should be put there *) + avail_out: Integer; (* remaining free space at next_out *) + total_out: LongInt; (* total nb of bytes output so far *) + + msg: PChar; (* last error message, NULL if no error *) + state: Pointer; (* not visible by applications *) + + zalloc: alloc_func; (* used to allocate the internal state *) + zfree: free_func; (* used to free the internal state *) + opaque: Pointer; (* private data object passed to zalloc and zfree *) + + data_type: Integer; (* best guess about the data type: ascii or binary *) + adler: LongInt; (* adler32 value of the uncompressed data *) + reserved: LongInt; (* reserved for future use *) + end; + + gz_headerp = ^gz_header; + gz_header = packed record + text: Integer; (* true if compressed data believed to be text *) + time: LongInt; (* modification time *) + xflags: Integer; (* extra flags (not used when writing a gzip file) *) + os: Integer; (* operating system *) + extra: PChar; (* pointer to extra field or Z_NULL if none *) + extra_len: Integer; (* extra field length (valid if extra != Z_NULL) *) + extra_max: Integer; (* space at extra (only when reading header) *) + name: PChar; (* pointer to zero-terminated file name or Z_NULL *) + name_max: Integer; (* space at name (only when reading header) *) + comment: PChar; (* pointer to zero-terminated comment or Z_NULL *) + comm_max: Integer; (* space at comment (only when reading header) *) + hcrc: Integer; (* true if there was or will be a header crc *) + done: Integer; (* true when done reading gzip header *) + end; + +(* constants *) +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + Z_BLOCK = 5; + Z_TREES = 6; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = -1; + Z_STREAM_ERROR = -2; + Z_DATA_ERROR = -3; + Z_MEM_ERROR = -4; + Z_BUF_ERROR = -5; + Z_VERSION_ERROR = -6; + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = -1; + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_FIXED = 4; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_TEXT = 1; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + +(* basic functions *) +function zlibVersion: PChar; +function deflateInit(var strm: z_stream; level: Integer): Integer; +function deflate(var strm: z_stream; flush: Integer): Integer; +function deflateEnd(var strm: z_stream): Integer; +function inflateInit(var strm: z_stream): Integer; +function inflate(var strm: z_stream; flush: Integer): Integer; +function inflateEnd(var strm: z_stream): Integer; + +(* advanced functions *) +function deflateInit2(var strm: z_stream; level, method, windowBits, + memLevel, strategy: Integer): Integer; +function deflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function deflateCopy(var dest, source: z_stream): Integer; +function deflateReset(var strm: z_stream): Integer; +function deflateParams(var strm: z_stream; level, strategy: Integer): Integer; +function deflateTune(var strm: z_stream; good_length, max_lazy, nice_length, max_chain: Integer): Integer; +function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt; +function deflatePending(var strm: z_stream; var pending: Integer; var bits: Integer): Integer; +function deflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function deflateSetHeader(var strm: z_stream; head: gz_header): Integer; +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +function inflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function inflateSync(var strm: z_stream): Integer; +function inflateCopy(var dest, source: z_stream): Integer; +function inflateReset(var strm: z_stream): Integer; +function inflateReset2(var strm: z_stream; windowBits: Integer): Integer; +function inflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function inflateMark(var strm: z_stream): LongInt; +function inflateGetHeader(var strm: z_stream; var head: gz_header): Integer; +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer; + out_fn: out_func; out_desc: Pointer): Integer; +function inflateBackEnd(var strm: z_stream): Integer; +function zlibCompileFlags: LongInt; + +(* utility functions *) +function compress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; +function compress2(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt; + level: Integer): Integer; +function compressBound(sourceLen: LongInt): LongInt; +function uncompress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; + +(* checksum functions *) +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; +function adler32_combine(adler1, adler2, len2: LongInt): LongInt; +function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt; +function crc32_combine(crc1, crc2, len2: LongInt): LongInt; + +(* various hacks, don't look :) *) +function deflateInit_(var strm: z_stream; level: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit_(var strm: z_stream; const version: PChar; + stream_size: Integer): Integer; +function deflateInit2_(var strm: z_stream; + level, method, windowBits, memLevel, strategy: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit2_(var strm: z_stream; windowBits: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateBackInit_(var strm: z_stream; + windowBits: Integer; window: PChar; + const version: PChar; stream_size: Integer): Integer; + + +implementation + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +function adler32; external; +function adler32_combine; external; +function compress; external; +function compress2; external; +function compressBound; external; +function crc32; external; +function crc32_combine; external; +function deflate; external; +function deflateBound; external; +function deflateCopy; external; +function deflateEnd; external; +function deflateInit_; external; +function deflateInit2_; external; +function deflateParams; external; +function deflatePending; external; +function deflatePrime; external; +function deflateReset; external; +function deflateSetDictionary; external; +function deflateSetHeader; external; +function deflateTune; external; +function inflate; external; +function inflateBack; external; +function inflateBackEnd; external; +function inflateBackInit_; external; +function inflateCopy; external; +function inflateEnd; external; +function inflateGetHeader; external; +function inflateInit_; external; +function inflateInit2_; external; +function inflateMark; external; +function inflatePrime; external; +function inflateReset; external; +function inflateReset2; external; +function inflateSetDictionary; external; +function inflateSync; external; +function uncompress; external; +function zlibCompileFlags; external; +function zlibVersion; external; + +function deflateInit(var strm: z_stream; level: Integer): Integer; +begin + Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream)); +end; + +function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel, + strategy: Integer): Integer; +begin + Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit(var strm: z_stream): Integer; +begin + Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +begin + Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +begin + Result := inflateBackInit_(strm, windowBits, window, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + GetMem(Result, Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + +end. diff --git a/third_party/zlib/contrib/puff/Makefile b/third_party/zlib/contrib/puff/Makefile new file mode 100644 index 00000000..0e2594c8 --- /dev/null +++ b/third_party/zlib/contrib/puff/Makefile @@ -0,0 +1,42 @@ +CFLAGS=-O + +puff: puff.o pufftest.o + +puff.o: puff.h + +pufftest.o: puff.h + +test: puff + puff zeros.raw + +puft: puff.c puff.h pufftest.o + cc -fprofile-arcs -ftest-coverage -o puft puff.c pufftest.o + +# puff full coverage test (should say 100%) +cov: puft + @rm -f *.gcov *.gcda + @puft -w zeros.raw 2>&1 | cat > /dev/null + @echo '04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '00 00 00 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 254 + @echo '00 01 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '01 01 00 fe ff 0a' | xxd -r -p | puft -f 2>&1 | cat > /dev/null + @echo '02 7e ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '02' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '04 80 49 92 24 49 92 24 71 ff ff 93 11 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 249 + @echo '04 c0 81 08 00 00 00 00 20 7f eb 0b 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '0b 00 00' | xxd -r -p | puft -f 2>&1 | cat > /dev/null + @echo '1a 07' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '0c c0 81 00 00 00 00 00 90 ff 6b 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 245 + @puft -f zeros.raw 2>&1 | cat > /dev/null + @echo 'fc 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 253 + @echo '04 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 252 + @echo '04 00 24 49' | xxd -r -p | puft 2> /dev/null || test $$? -eq 251 + @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 84' | xxd -r -p | puft 2> /dev/null || test $$? -eq 248 + @echo '04 00 24 e9 ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 250 + @echo '04 00 24 e9 ff 6d' | xxd -r -p | puft 2> /dev/null || test $$? -eq 247 + @gcov -n puff.c + +clean: + rm -f puff puft *.o *.gc* diff --git a/third_party/zlib/contrib/puff/README b/third_party/zlib/contrib/puff/README new file mode 100644 index 00000000..bbc4cb59 --- /dev/null +++ b/third_party/zlib/contrib/puff/README @@ -0,0 +1,63 @@ +Puff -- A Simple Inflate +3 Mar 2003 +Mark Adler +madler@alumni.caltech.edu + +What this is -- + +puff.c provides the routine puff() to decompress the deflate data format. It +does so more slowly than zlib, but the code is about one-fifth the size of the +inflate code in zlib, and written to be very easy to read. + +Why I wrote this -- + +puff.c was written to document the deflate format unambiguously, by virtue of +being working C code. It is meant to supplement RFC 1951, which formally +describes the deflate format. I have received many questions on details of the +deflate format, and I hope that reading this code will answer those questions. +puff.c is heavily commented with details of the deflate format, especially +those little nooks and cranies of the format that might not be obvious from a +specification. + +puff.c may also be useful in applications where code size or memory usage is a +very limited resource, and speed is not as important. + +How to use it -- + +Well, most likely you should just be reading puff.c and using zlib for actual +applications, but if you must ... + +Include puff.h in your code, which provides this prototype: + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ + +Then you can call puff() to decompress a deflate stream that is in memory in +its entirety at source, to a sufficiently sized block of memory for the +decompressed data at dest. puff() is the only external symbol in puff.c The +only C library functions that puff.c needs are setjmp() and longjmp(), which +are used to simplify error checking in the code to improve readabilty. puff.c +does no memory allocation, and uses less than 2K bytes off of the stack. + +If destlen is not enough space for the uncompressed data, then inflate will +return an error without writing more than destlen bytes. Note that this means +that in order to decompress the deflate data successfully, you need to know +the size of the uncompressed data ahead of time. + +If needed, puff() can determine the size of the uncompressed data with no +output space. This is done by passing dest equal to (unsigned char *)0. Then +the initial value of *destlen is ignored and *destlen is set to the length of +the uncompressed data. So if the size of the uncompressed data is not known, +then two passes of puff() can be used--first to determine the size, and second +to do the actual inflation after allocating the appropriate memory. Not +pretty, but it works. (This is one of the reasons you should be using zlib.) + +The deflate format is self-terminating. If the deflate stream does not end +in *sourcelen bytes, puff() will return an error without reading at or past +endsource. + +On return, *sourcelen is updated to the amount of input data consumed, and +*destlen is updated to the size of the uncompressed data. See the comments +in puff.c for the possible return codes for puff(). diff --git a/third_party/zlib/contrib/puff/puff.c b/third_party/zlib/contrib/puff/puff.c new file mode 100644 index 00000000..c6c90d71 --- /dev/null +++ b/third_party/zlib/contrib/puff/puff.c @@ -0,0 +1,840 @@ +/* + * puff.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + * + * 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 + * side benefit, this code might actually be useful when small code is more + * important than speed, such as bootstrap applications. For typical deflate + * data, zlib's inflate() is about four times as fast as puff(). zlib's + * inflate compiles to around 20K on my machine, whereas puff.c compiles to + * around 4K on my machine (a PowerPC using GNU cc). If the faster decode() + * function here is used, then puff() is only twice as slow as zlib's + * inflate(). + * + * All dynamically allocated memory comes from the stack. The stack required + * is less than 2K bytes. This code is compatible with 16-bit int's and + * assumes that long's are at least 32 bits. puff.c uses the short data type, + * assumed to be 16 bits, for arrays in order to conserve memory. The code + * works whether integers are stored big endian or little endian. + * + * In the comments below are "Format notes" that describe the inflate process + * and document some of the less obvious aspects of the format. This source + * code is meant to supplement RFC 1951, which formally describes the deflate + * format: + * + * http://www.zlib.org/rfc-deflate.html + */ + +/* + * Change history: + * + * 1.0 10 Feb 2002 - First version + * 1.1 17 Feb 2002 - Clarifications of some comments and notes + * - Update puff() dest and source pointers on negative + * errors to facilitate debugging deflators + * - Remove longest from struct huffman -- not needed + * - Simplify offs[] index in construct() + * - Add input size and checking, using longjmp() to + * maintain easy readability + * - Use short data type for large arrays + * - Use pointers instead of long to specify source and + * destination sizes to avoid arbitrary 4 GB limits + * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), + * but leave simple version for readabilty + * - Make sure invalid distances detected if pointers + * are 16 bits + * - Fix fixed codes table error + * - Provide a scanning mode for determining size of + * uncompressed data + * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Gailly] + * - Add a puff.h file for the interface + * - Add braces in puff() for else do [Gailly] + * - Use indexes instead of pointers for readability + * 1.4 31 Mar 2002 - Simplify construct() code set check + * - Fix some comments + * - Add FIXLCODES #define + * 1.5 6 Apr 2002 - Minor comment fixes + * 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 + * 1.9 21 Feb 2008 - Fix bug on 16-bit integer architectures [Pohland] + * - Catch missing end-of-block symbol error + * 2.0 25 Jul 2008 - Add #define to permit distance too far back + * - Add option in TEST code for puff to write the data + * - Add option in TEST code to skip input bytes + * - Allow TEST code to read from piped stdin + * 2.1 4 Apr 2010 - Avoid variable initialization for happier compilers + * - Avoid unsigned comparisons for even happier compilers + * 2.2 25 Apr 2010 - Fix bug in variable initializations [Oberhumer] + * - Add const where appropriate [Oberhumer] + * - Split if's and ?'s for coverage testing + * - Break out test code to separate file + * - Move NIL to puff.h + * - Allow incomplete code only if single code length is 1 + * - Add full code coverage test to Makefile + * 2.3 21 Jan 2013 - Check for invalid code length codes in dynamic blocks + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "puff.h" /* prototype for puff() */ + +#define local static /* for local function definitions */ + +/* + * Maximums for allocations and loops. It is not useful to change these -- + * they are fixed by the deflate format. + */ +#define MAXBITS 15 /* maximum bits in a code */ +#define MAXLCODES 286 /* maximum number of literal/length codes */ +#define MAXDCODES 30 /* maximum number of distance codes */ +#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */ +#define FIXLCODES 288 /* number of fixed literal/length codes */ + +/* input and output state */ +struct state { + /* output state */ + unsigned char *out; /* output buffer */ + unsigned long outlen; /* available space at out */ + unsigned long outcnt; /* bytes written to out so far */ + + /* input state */ + const unsigned char *in; /* input buffer */ + unsigned long inlen; /* available input at in */ + unsigned long incnt; /* bytes read so far */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + long val; /* bit accumulator (can use up to 20 bits) */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */ + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = (int)(val >> need); + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return (int)(val & ((1L << need) - 1)); +} + +/* + * Process a stored block. + * + * Format notes: + * + * - After the two-bit stored block type (00), the stored block length and + * stored bytes are byte-aligned for fast copying. Therefore any leftover + * bits in the byte that has the last bit of the type, as many as seven, are + * discarded. The value of the discarded bits are not defined and should not + * be checked against any expectation. + * + * - The second inverted copy of the stored block length does not have to be + * checked, but it's probably a good idea to do so anyway. + * + * - A stored block can have zero length. This is sometimes used to byte-align + * subsets of the compressed data for random access or partial recovery. + */ +local int stored(struct state *s) +{ + unsigned len; /* length of stored block */ + + /* discard leftover bits from current byte (assumes s->bitcnt < 8) */ + s->bitbuf = 0; + s->bitcnt = 0; + + /* get length and check against its one's complement */ + if (s->incnt + 4 > s->inlen) + return 2; /* not enough input */ + len = s->in[s->incnt++]; + len |= s->in[s->incnt++] << 8; + if (s->in[s->incnt++] != (~len & 0xff) || + s->in[s->incnt++] != ((~len >> 8) & 0xff)) + return -2; /* didn't match complement! */ + + /* copy len bytes from in to out */ + if (s->incnt + len > s->inlen) + return 2; /* not enough input */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; /* not enough output space */ + while (len--) + s->out[s->outcnt++] = s->in[s->incnt++]; + } + else { /* just scanning */ + s->outcnt += len; + s->incnt += len; + } + + /* done with a valid stored block */ + return 0; +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -10 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. A table-based decoding + * scheme (as used in zlib) does not need to do this reversal. + * + * - The first code for the shortest length is all zeros. Subsequent codes of + * the same length are simply integer increments of the previous code. When + * moving up a length, a zero bit is appended to the code. For a complete + * code, the last code of the longest length will be all ones. + * + * - Incomplete codes are handled by this decoder, since they are permitted + * in the deflate format. See the format notes for fixed() and dynamic(). + */ +#ifdef SLOW +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + + code = first = index = 0; + for (len = 1; len <= MAXBITS; len++) { + code |= bits(s, 1); /* get next bit */ + count = h->count[len]; + if (code - count < first) /* if length len, return symbol */ + return h->symbol[index + (code - first)]; + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + } + return -10; /* ran out of codes */ +} + +/* + * A faster version of decode() for real applications of this code. It's not + * as readable, but it makes puff() twice as fast. And it only makes the code + * a few percent larger. + */ +#else /* !SLOW */ +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= bitbuf & 1; + bitbuf >>= 1; + count = *next++; + if (code - count < first) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) + break; + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + bitbuf = s->in[s->incnt++]; + if (left > 8) + left = 8; + } + return -10; /* ran out of codes */ +} +#endif /* SLOW */ + +/* + * Given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + * + * Not used by decode(), but used for error checking, h->count[0] is the number + * of the n symbols not in the code. So n - h->count[0] is the number of + * codes. This is useful for checking for incomplete codes that have more than + * one symbol, which is an error in a dynamic block. + * + * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS + * This is assured by the construction of the length arrays in dynamic() and + * fixed() and is not verified by construct(). + * + * Format notes: + * + * - Permitted and expected examples of incomplete codes are one of the fixed + * codes and any code with a single symbol which in deflate is coded as one + * bit instead of zero bits. See the format notes for fixed() and dynamic(). + * + * - Within a given code length, the symbols are kept in ascending order for + * the code bits definition. + */ +local int construct(struct huffman *h, const short *length, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) + return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode literal/length and distance codes until an end-of-block code. + * + * Format notes: + * + * - Compressed data that is after the block type if fixed or after the code + * description if dynamic is a combination of literals and length/distance + * pairs terminated by and end-of-block code. Literals are simply Huffman + * coded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - Literals, lengths, and the end-of-block code are combined into a single + * code of up to 286 symbols. They are 256 literals (0..255), 29 length + * symbols (257..285), and the end-of-block symbol (256). + * + * - There are 256 possible lengths (3..258), and so 29 symbols are not enough + * to represent all of those. Lengths 3..10 and 258 are in fact represented + * by just a length symbol. Lengths 11..257 are represented as a symbol and + * some number of extra bits that are added as an integer to the base length + * of the length symbol. The number of extra bits is determined by the base + * length symbol. These are in the static arrays below, lens[] for the base + * lengths and lext[] for the corresponding number of extra bits. + * + * - The reason that 258 gets its own symbol is that the longest length is used + * often in highly redundant files. Note that 258 can also be coded as the + * base value 227 plus the maximum extra value of 31. While a good deflate + * should never do this, it is not an error, and should be decoded properly. + * + * - If a length is decoded, including its extra bits if any, then it is + * followed a distance code. There are up to 30 distance symbols. Again + * there are many more possible distances (1..32768), so extra bits are added + * to a base value represented by the symbol. The distances 1..4 get their + * own symbol, but the rest require extra bits. The base distances and + * corresponding number of extra bits are below in the static arrays dist[] + * and dext[]. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 258 + * simply copies the last byte 258 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. You should not use memcpy() since its behavior is not + * defined for overlapped arrays. You should not use memmove() or bcopy() + * since though their behavior -is- defined for overlapping arrays, it is + * defined to do the wrong thing in this case. + */ +local int codes(struct state *s, + const struct huffman *lencode, + const struct huffman *distcode) +{ + int symbol; /* decoded symbol */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + static const short lens[29] = { /* Size base for length codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; + static const short lext[29] = { /* Extra bits for length codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; + static const short dists[30] = { /* Offset base for distance codes 0..29 */ + 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, + 8193, 12289, 16385, 24577}; + static const short dext[30] = { /* Extra bits for distance codes 0..29 */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + + /* decode literals and length/distance pairs */ + do { + symbol = decode(s, lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 256) { /* literal: symbol is the byte */ + /* write out the literal */ + if (s->out != NIL) { + if (s->outcnt == s->outlen) + return 1; + s->out[s->outcnt] = symbol; + } + s->outcnt++; + } + else if (symbol > 256) { /* length */ + /* get and compute length */ + symbol -= 257; + if (symbol >= 29) + return -10; /* invalid fixed code */ + len = lens[symbol] + bits(s, lext[symbol]); + + /* get and check distance */ + symbol = decode(s, distcode); + if (symbol < 0) + return symbol; /* invalid symbol */ + dist = dists[symbol] + bits(s, dext[symbol]); +#ifndef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (dist > s->outcnt) + return -11; /* distance too far back */ +#endif + + /* copy length bytes from distance bytes back */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; + while (len--) { + s->out[s->outcnt] = +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + dist > s->outcnt ? + 0 : +#endif + s->out[s->outcnt - dist]; + s->outcnt++; + } + } + else + s->outcnt += len; + } + } while (symbol != 256); /* end of block symbol */ + + /* done with a valid fixed or dynamic block */ + return 0; +} + +/* + * Process a fixed codes block. + * + * Format notes: + * + * - This block type can be useful for compressing small amounts of data for + * which the size of the code descriptions in a dynamic block exceeds the + * benefit of custom codes for that block. For fixed codes, no bits are + * spent on code descriptions. Instead the code lengths for literal/length + * codes and distance codes are fixed. The specific lengths for each symbol + * can be seen in the "for" loops below. + * + * - The literal/length code is complete, but has two symbols that are invalid + * and should result in an error if received. This cannot be implemented + * simply as an incomplete code since those two symbols are in the "middle" + * of the code. They are eight bits long and the longest literal/length\ + * code is nine bits. Therefore the code must be constructed with those + * symbols, and the invalid symbols must be detected after decoding. + * + * - The fixed distance codes also have two invalid symbols that should result + * in an error if received. Since all of the distance codes are the same + * length, this can be implemented as an incomplete code. Then the invalid + * codes are detected while decoding. + */ +local int fixed(struct state *s) +{ + static int virgin = 1; + static short lencnt[MAXBITS+1], lensym[FIXLCODES]; + static short distcnt[MAXBITS+1], distsym[MAXDCODES]; + static struct huffman lencode, distcode; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + int symbol; + short lengths[FIXLCODES]; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* literal/length table */ + for (symbol = 0; symbol < 144; symbol++) + lengths[symbol] = 8; + for (; symbol < 256; symbol++) + lengths[symbol] = 9; + for (; symbol < 280; symbol++) + lengths[symbol] = 7; + for (; symbol < FIXLCODES; symbol++) + lengths[symbol] = 8; + construct(&lencode, lengths, FIXLCODES); + + /* distance table */ + for (symbol = 0; symbol < MAXDCODES; symbol++) + lengths[symbol] = 5; + construct(&distcode, lengths, MAXDCODES); + + /* do this just once */ + virgin = 0; + } + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Process a dynamic codes block. + * + * Format notes: + * + * - A dynamic block starts with a description of the literal/length and + * distance codes for that block. New dynamic blocks allow the compressor to + * rapidly adapt to changing data with new codes optimized for that data. + * + * - The codes used by the deflate format are "canonical", which means that + * the actual bits of the codes are generated in an unambiguous way simply + * from the number of bits in each code. Therefore the code descriptions + * are simply a list of code lengths for each symbol. + * + * - The code lengths are stored in order for the symbols, so lengths are + * provided for each of the literal/length symbols, and for each of the + * distance symbols. + * + * - If a symbol is not used in the block, this is represented by a zero as + * as the code length. This does not mean a zero-length code, but rather + * that no code should be created for this symbol. There is no way in the + * deflate format to represent a zero-length code. + * + * - The maximum number of bits in a code is 15, so the possible lengths for + * any code are 1..15. + * + * - The fact that a length of zero is not permitted for a code has an + * interesting consequence. Normally if only one symbol is used for a given + * code, then in fact that code could be represented with zero bits. However + * in deflate, that code has to be at least one bit. So for example, if + * only a single distance base symbol appears in a block, then it will be + * represented by a single code of length one, in particular one 0 bit. This + * is an incomplete code, since if a 1 bit is received, it has no meaning, + * and should result in an error. So incomplete distance codes of one symbol + * should be permitted, and the receipt of invalid codes should be handled. + * + * - It is also possible to have a single literal/length code, but that code + * must be the end-of-block code, since every dynamic block has one. This + * is not the most efficient way to create an empty block (an empty fixed + * 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 + * that length, and the symbols 16, 17, and 18 are run-length instructions. + * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 + * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols + * are common, hence the special coding for zero lengths. + * + * - The symbols for 0..18 are Huffman coded, and so that code must be + * described first. This is simply a sequence of up to 19 three-bit values + * representing no code (0) or the code length for that symbol (1..7). + * + * - A dynamic block starts with three fixed-size counts from which is computed + * the number of literal/length code lengths, the number of distance code + * lengths, and the number of code length code lengths (ok, you come up with + * a better name!) in the code descriptions. For the literal/length and + * distance codes, lengths after those provided are considered zero, i.e. no + * code. The code length code lengths are received in a permuted order (see + * the order[] array below) to make a short code length code length list more + * likely. As it turns out, very short and very long codes are less likely + * to be seen in a dynamic code description, hence what may appear initially + * to be a peculiar ordering. + * + * - Given the number of literal/length code lengths (nlen) and distance code + * lengths (ndist), then they are treated as one long list of nlen + ndist + * code lengths. Therefore run-length coding can and often does cross the + * boundary between the two sets of lengths. + * + * - So to summarize, the code description at the start of a dynamic block is + * three counts for the number of code lengths for the literal/length codes, + * the distance codes, and the code length codes. This is followed by the + * code length code lengths, three bits each. This is used to construct the + * code length code which is used to read the remainder of the lengths. Then + * the literal/length code lengths and distance lengths are read as a single + * set of lengths using the code length codes. Codes are constructed from + * the resulting two sets of lengths, and then finally you can start + * decoding actual compressed data in the block. + * + * - For reference, a "typical" size for the code description in a dynamic + * block is around 80 bytes. + */ +local int dynamic(struct state *s) +{ + int nlen, ndist, ncode; /* number of lengths in descriptor */ + int index; /* index of lengths[] */ + int err; /* construct() return value */ + short lengths[MAXCODES]; /* descriptor code lengths */ + short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */ + short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */ + struct huffman lencode, distcode; /* length and distance codes */ + static const short order[19] = /* permutation of code length codes */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* get number of lengths in each table, check lengths */ + nlen = bits(s, 5) + 257; + ndist = bits(s, 5) + 1; + ncode = bits(s, 4) + 4; + if (nlen > MAXLCODES || ndist > MAXDCODES) + return -3; /* bad counts */ + + /* read code length code lengths (really), missing lengths are zero */ + for (index = 0; index < ncode; index++) + lengths[order[index]] = bits(s, 3); + for (; index < 19; index++) + lengths[order[index]] = 0; + + /* build huffman table for code lengths codes (use lencode temporarily) */ + err = construct(&lencode, lengths, 19); + if (err != 0) /* require complete code set here */ + return -4; + + /* read length/literal and distance code length tables */ + index = 0; + while (index < nlen + ndist) { + int symbol; /* decoded value */ + int len; /* last length to repeat */ + + symbol = decode(s, &lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 16) /* length in 0..15 */ + lengths[index++] = symbol; + else { /* repeat instruction */ + len = 0; /* assume repeating zeros */ + if (symbol == 16) { /* repeat last length 3..6 times */ + if (index == 0) + return -5; /* no last length! */ + len = lengths[index - 1]; /* last length */ + symbol = 3 + bits(s, 2); + } + else if (symbol == 17) /* repeat zero 3..10 times */ + symbol = 3 + bits(s, 3); + else /* == 18, repeat zero 11..138 times */ + symbol = 11 + bits(s, 7); + if (index + symbol > nlen + ndist) + return -6; /* too many lengths! */ + while (symbol--) /* repeat last or zero symbol times */ + lengths[index++] = len; + } + } + + /* check for end-of-block code -- there better be one! */ + if (lengths[256] == 0) + return -9; + + /* build huffman table for literal/length codes */ + err = construct(&lencode, lengths, nlen); + if (err && (err < 0 || nlen != lencode.count[0] + lencode.count[1])) + return -7; /* incomplete code ok only for single length 1 code */ + + /* build huffman table for distance codes */ + err = construct(&distcode, lengths + nlen, ndist); + if (err && (err < 0 || ndist != distcode.count[0] + distcode.count[1])) + return -8; /* incomplete code ok only for single length 1 code */ + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Inflate source to dest. On return, destlen and sourcelen are updated to the + * size of the uncompressed data and the size of the deflate data respectively. + * On success, the return value of puff() is zero. If there is an error in the + * source data, i.e. it is not in the deflate format, then a negative value is + * returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. In that case, destlen and + * sourcelen are not updated to facilitate retrying from the beginning with the + * provision of more input data or more output space. In the case of invalid + * inflate data (a negative error), the dest and source pointers are updated to + * facilitate the debugging of deflators. + * + * puff() also has a mode to determine the size of the uncompressed output with + * no output written. For this dest must be (unsigned char *)0. In this case, + * the input value of *destlen is ignored, and on return *destlen is set to the + * size of the uncompressed output. + * + * The return codes are: + * + * 2: available inflate data did not terminate + * 1: output space exhausted before completing inflate + * 0: successful inflate + * -1: invalid block type (type == 3) + * -2: stored block length did not match one's complement + * -3: dynamic block code description: too many length or distance codes + * -4: dynamic block code description: code lengths codes incomplete + * -5: dynamic block code description: repeat lengths with no first length + * -6: dynamic block code description: repeat more than specified lengths + * -7: dynamic block code description: invalid literal/length code lengths + * -8: dynamic block code description: invalid distance code lengths + * -9: dynamic block code description: missing end-of-block code + * -10: invalid literal/length or distance code in fixed or dynamic block + * -11: distance is too far back in fixed or dynamic block + * + * Format notes: + * + * - Three bits are read for each block to determine the kind of block and + * whether or not it is the last block. Then the block is decoded and the + * process repeated if it was not the last block. + * + * - The leftover bits in the last byte of the deflate data after the last + * block (if it was a fixed or dynamic block) are undefined and have no + * expected values to check. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen) /* amount of input available */ +{ + struct state s; /* input/output state */ + int last, type; /* block information */ + int err; /* return value */ + + /* initialize output state */ + s.out = dest; + s.outlen = *destlen; /* ignored if dest is NIL */ + s.outcnt = 0; + + /* initialize input state */ + s.in = source; + s.inlen = *sourcelen; + s.incnt = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp() */ + err = 2; /* then skip do-loop, return error */ + else { + /* process blocks until last block or error */ + do { + last = bits(&s, 1); /* one if last block */ + type = bits(&s, 2); /* block type 0..3 */ + err = type == 0 ? + stored(&s) : + (type == 1 ? + fixed(&s) : + (type == 2 ? + dynamic(&s) : + -1)); /* type == 3, invalid */ + if (err != 0) + break; /* return with error */ + } while (!last); + } + + /* update the lengths and return */ + if (err <= 0) { + *destlen = s.outcnt; + *sourcelen = s.incnt; + } + return err; +} diff --git a/third_party/zlib/contrib/puff/puff.h b/third_party/zlib/contrib/puff/puff.h new file mode 100644 index 00000000..e23a2454 --- /dev/null +++ b/third_party/zlib/contrib/puff/puff.h @@ -0,0 +1,35 @@ +/* puff.h + Copyright (C) 2002-2013 Mark Adler, all rights reserved + version 2.3, 21 Jan 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * See puff.c for purpose and usage. + */ +#ifndef NIL +# define NIL ((unsigned char *)0) /* for no output option */ +#endif + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ diff --git a/third_party/zlib/contrib/puff/pufftest.c b/third_party/zlib/contrib/puff/pufftest.c new file mode 100644 index 00000000..77648148 --- /dev/null +++ b/third_party/zlib/contrib/puff/pufftest.c @@ -0,0 +1,165 @@ +/* + * pufftest.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + */ + +/* Example of how to use puff(). + + Usage: puff [-w] [-f] [-nnn] file + ... | puff [-w] [-f] [-nnn] + + where file is the input file with deflate data, nnn is the number of bytes + of input to skip before inflating (e.g. to skip a zlib or gzip header), and + -w is used to write the decompressed data to stdout. -f is for coverage + testing, and causes pufftest to fail with not enough output space (-f does + a write like -w, so -w is not required). */ + +#include +#include +#include "puff.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define local static + +/* Return size times approximately the cube root of 2, keeping the result as 1, + 3, or 5 times a power of 2 -- the result is always > size, until the result + is the maximum value of an unsigned long, where it remains. This is useful + to keep reallocations less than ~33% over the actual data. */ +local size_t bythirds(size_t size) +{ + int n; + size_t m; + + m = size; + for (n = 0; m; n++) + m >>= 1; + if (n < 3) + return size + 1; + n -= 3; + m = size >> n; + m += m == 6 ? 2 : 1; + m <<= n; + return m > size ? m : (size_t)(-1); +} + +/* Read the input file *name, or stdin if name is NULL, into allocated memory. + Reallocate to larger buffers until the entire file is read in. Return a + pointer to the allocated data, or NULL if there was a memory allocation + failure. *len is the number of bytes of data read from the input file (even + if load() returns NULL). If the input file was empty or could not be opened + or read, *len is zero. */ +local void *load(const char *name, size_t *len) +{ + size_t size; + void *buf, *swap; + FILE *in; + + *len = 0; + buf = malloc(size = 4096); + if (buf == NULL) + return NULL; + in = name == NULL ? stdin : fopen(name, "rb"); + if (in != NULL) { + for (;;) { + *len += fread((char *)buf + *len, 1, size - *len, in); + if (*len < size) break; + size = bythirds(size); + if (size == *len || (swap = realloc(buf, size)) == NULL) { + free(buf); + buf = NULL; + break; + } + buf = swap; + } + fclose(in); + } + return buf; +} + +int main(int argc, char **argv) +{ + int ret, put = 0, fail = 0; + unsigned skip = 0; + char *arg, *name = NULL; + unsigned char *source = NULL, *dest; + size_t len = 0; + unsigned long sourcelen, destlen; + + /* process arguments */ + while (arg = *++argv, --argc) + if (arg[0] == '-') { + if (arg[1] == 'w' && arg[2] == 0) + put = 1; + else if (arg[1] == 'f' && arg[2] == 0) + fail = 1, put = 1; + else if (arg[1] >= '0' && arg[1] <= '9') + skip = (unsigned)atoi(arg + 1); + else { + fprintf(stderr, "invalid option %s\n", arg); + return 3; + } + } + else if (name != NULL) { + fprintf(stderr, "only one file name allowed\n"); + return 3; + } + else + name = arg; + source = load(name, &len); + if (source == NULL) { + fprintf(stderr, "memory allocation failure\n"); + return 4; + } + if (len == 0) { + fprintf(stderr, "could not read %s, or it was empty\n", + name == NULL ? "" : name); + free(source); + return 3; + } + if (skip >= len) { + fprintf(stderr, "skip request of %d leaves no input\n", skip); + free(source); + return 3; + } + + /* test inflate data with offset skip */ + len -= skip; + sourcelen = (unsigned long)len; + ret = puff(NIL, &destlen, source + skip, &sourcelen); + if (ret) + fprintf(stderr, "puff() failed with return code %d\n", ret); + else { + fprintf(stderr, "puff() succeeded uncompressing %lu bytes\n", destlen); + if (sourcelen < len) fprintf(stderr, "%lu compressed bytes unused\n", + len - sourcelen); + } + + /* if requested, inflate again and write decompressd data to stdout */ + if (put && ret == 0) { + if (fail) + destlen >>= 1; + dest = malloc(destlen); + if (dest == NULL) { + fprintf(stderr, "memory allocation failure\n"); + free(source); + return 4; + } + puff(dest, &destlen, source + skip, &sourcelen); + SET_BINARY_MODE(stdout); + fwrite(dest, 1, destlen, stdout); + free(dest); + } + + /* clean up */ + free(source); + return ret; +} diff --git a/third_party/zlib/contrib/puff/zeros.raw b/third_party/zlib/contrib/puff/zeros.raw new file mode 100644 index 0000000000000000000000000000000000000000..0a90e76b300205a44a0ecbf613e64aaaef2e51e7 GIT binary patch literal 2517 zcmYdFkYHV$AkxzmXu#!mP=i#?5{3o^3jqcYc(h*%Opg+yAut*OqaiT#LSPd+y9&tF zP5<`ixi4UXdB8xJfs^6ee;AkH?VUytyFsD;HLIJ(gg5bUnNh}Q2#kinXb22!2pr%5 E0JRq+;s5{u literal 0 HcmV?d00001 diff --git a/third_party/zlib/contrib/testzlib/testzlib.c b/third_party/zlib/contrib/testzlib/testzlib.c new file mode 100644 index 00000000..8626c92a --- /dev/null +++ b/third_party/zlib/contrib/testzlib/testzlib.c @@ -0,0 +1,275 @@ +#include +#include +#include + +#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,unsigned char** pFilePtr) +{ + FILE* stream; + unsigned char* 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 [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; +} diff --git a/third_party/zlib/contrib/testzlib/testzlib.txt b/third_party/zlib/contrib/testzlib/testzlib.txt new file mode 100644 index 00000000..e508bb22 --- /dev/null +++ b/third_party/zlib/contrib/testzlib/testzlib.txt @@ -0,0 +1,10 @@ +To build testzLib with Visual Studio 2005: + +copy to a directory file from : +- root of zLib tree +- contrib/testzlib +- contrib/masmx86 +- contrib/masmx64 +- contrib/vstudio/vc7 + +and open testzlib8.sln \ No newline at end of file diff --git a/third_party/zlib/contrib/untgz/Makefile b/third_party/zlib/contrib/untgz/Makefile new file mode 100644 index 00000000..b54266fb --- /dev/null +++ b/third_party/zlib/contrib/untgz/Makefile @@ -0,0 +1,14 @@ +CC=cc +CFLAGS=-g + +untgz: untgz.o ../../libz.a + $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz + +untgz.o: untgz.c ../../zlib.h + $(CC) $(CFLAGS) -c -I../.. untgz.c + +../../libz.a: + cd ../..; ./configure; make + +clean: + rm -f untgz untgz.o *~ diff --git a/third_party/zlib/contrib/untgz/Makefile.msc b/third_party/zlib/contrib/untgz/Makefile.msc new file mode 100644 index 00000000..77b86022 --- /dev/null +++ b/third_party/zlib/contrib/untgz/Makefile.msc @@ -0,0 +1,17 @@ +CC=cl +CFLAGS=-MD + +untgz.exe: untgz.obj ..\..\zlib.lib + $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib + +untgz.obj: untgz.c ..\..\zlib.h + $(CC) $(CFLAGS) -c -I..\.. untgz.c + +..\..\zlib.lib: + cd ..\.. + $(MAKE) -f win32\makefile.msc + cd contrib\untgz + +clean: + -del untgz.obj + -del untgz.exe diff --git a/third_party/zlib/contrib/untgz/untgz.c b/third_party/zlib/contrib/untgz/untgz.c new file mode 100644 index 00000000..2c391e59 --- /dev/null +++ b/third_party/zlib/contrib/untgz/untgz.c @@ -0,0 +1,674 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +#include +#include +#include +#include +#include + +#include "zlib.h" + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + +int tar (gzFile in,int action,int arg,int argc,char **argv) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + case DIRTYPE: + if (action == TGZ_LIST) + printf(" %s %s\n",strtime(&tartime),fname); + if (action == TGZ_EXTRACT) + { + makedir(fname); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (matchname(arg,argc,argv,fname)) + { + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory */ + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname); + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + +int main(int argc,char **argv) +{ + int action = TGZ_EXTRACT; + int arg = 1; + char *TGZfile; + gzFile *f; + + prog = strrchr(argv[0],'\\'); + if (prog == NULL) + { + prog = strrchr(argv[0],'/'); + if (prog == NULL) + { + prog = strrchr(argv[0],':'); + if (prog == NULL) + prog = argv[0]; + else + prog++; + } + else + prog++; + } + else + prog++; + + if (argc == 1) + help(0); + + if (strcmp(argv[arg],"-l") == 0) + { + action = TGZ_LIST; + if (argc == ++arg) + help(0); + } + else if (strcmp(argv[arg],"-h") == 0) + { + help(0); + } + + if ((TGZfile = TGZfname(argv[arg])) == NULL) + TGZnotfound(argv[arg]); + + ++arg; + if ((action == TGZ_LIST) && (arg != argc)) + help(1); + +/* + * Process the TGZ file + */ + switch(action) + { + case TGZ_LIST: + case TGZ_EXTRACT: + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + exit(tar(f, action, arg, argc, argv)); + break; + + default: + error("Unknown option"); + exit(1); + } + + return 0; +} diff --git a/third_party/zlib/contrib/vstudio/readme.txt b/third_party/zlib/contrib/vstudio/readme.txt new file mode 100644 index 00000000..48cccc0d --- /dev/null +++ b/third_party/zlib/contrib/vstudio/readme.txt @@ -0,0 +1,78 @@ +Building instructions for the DLL versions of Zlib 1.2.11 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 9.0/10.0. + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + + + + + +Build instructions for Visual Studio 2008 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Compile assembly code (with Visual Studio Command Prompt) by running: + bld_ml64.bat (in contrib\masmx64) + bld_ml32.bat (in contrib\masmx86) +- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 +- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" + +Build instructions for Visual Studio 2010 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010 + +Build instructions for Visual Studio 2012 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012 + +Build instructions for Visual Studio 2013 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013 + +Build instructions for Visual Studio 2015 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015 + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com + +Visual Studio 2013 and 2015 Projects from Sean Hunt +seandhunt_7@yahoo.com diff --git a/third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj b/third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj new file mode 100644 index 00000000..1b362421 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters b/third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters new file mode 100644 index 00000000..0bd12210 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {048af943-022b-4db6-beeb-a54c34774ee2} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c1d600d2-888f-4aea-b73e-8b0dd9befa0c} + h;hpp;hxx;hm;inl;inc + + + {0844199a-966b-4f19-81db-1e0125e141b9} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj b/third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj new file mode 100644 index 00000000..ccd3651d --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj @@ -0,0 +1,307 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters b/third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters new file mode 100644 index 00000000..7076d76f --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {c0419b40-bf50-40da-b153-ff74215b79de} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {bb87b070-735b-478e-92ce-7383abb2f36c} + h;hpp;hxx;hm;inl;inc + + + {f46ab6a6-548f-43cb-ae96-681abb5bd5db} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj b/third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj new file mode 100644 index 00000000..476b8ea4 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj @@ -0,0 +1,420 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + + + Application + true + + + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + EditAndContinue + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters b/third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters new file mode 100644 index 00000000..32764910 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {c1f6a2e3-5da5-4955-8653-310d3efe05a9} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c2aaffdc-2c95-4d6f-8466-4bec5890af2c} + h;hpp;hxx;hm;inl;inc + + + {c274fe07-05f2-461c-964b-f6341e4e7eb5} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj b/third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj new file mode 100644 index 00000000..8e38876f --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters new file mode 100644 index 00000000..ab87f09f --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {fa61a89f-93fc-4c89-b29e-36224b7592f4} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {d4b85da0-2ba2-4934-b57f-e2584e3848ee} + h;hpp;hxx;hm;inl;inc + + + {e573e075-00bd-4a7d-bd67-a8cc9bfc5aca} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/zlib.rc b/third_party/zlib/contrib/vstudio/vc10/zlib.rc new file mode 100644 index 00000000..c4e4b016 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj b/third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj new file mode 100644 index 00000000..45389a35 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj @@ -0,0 +1,473 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters new file mode 100644 index 00000000..0c8b2501 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters @@ -0,0 +1,77 @@ + + + + + {174213f6-7f66-4ae8-a3a8-a1e0a1e6ffdd} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/zlibvc.def b/third_party/zlib/contrib/vstudio/vc10/zlibvc.def new file mode 100644 index 00000000..f876c3bc --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/third_party/zlib/contrib/vstudio/vc10/zlibvc.sln b/third_party/zlib/contrib/vstudio/vc10/zlibvc.sln new file mode 100644 index 00000000..649f40c7 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlibvc.sln @@ -0,0 +1,135 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj b/third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj new file mode 100644 index 00000000..7d7c49a6 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj @@ -0,0 +1,657 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapid + zlibwapi + zlibwapi + zlibwapid + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + true + .\zlibvc.def + true + true + Windows + false + + + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + true + false + .\zlibvc.def + true + Windows + false + + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + true + false + .\zlibvc.def + true + Windows + false + + + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + true + .\zlibvc.def + true + true + Windows + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + true + false + .\zlibvc.def + true + Windows + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + true + false + .\zlibvc.def + true + Windows + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters new file mode 100644 index 00000000..22786824 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters @@ -0,0 +1,118 @@ + + + + + {07934a85-8b61-443d-a0ee-b2eedb74f3cd} + cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90 + + + {1d99675b-433d-4a21-9e50-ed4ab8b19762} + h;hpp;hxx;hm;inl;fi;fd + + + {431c0958-fa71-44d0-9084-2d19d100c0cc} + ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc11/miniunz.vcxproj b/third_party/zlib/contrib/vstudio/vc11/miniunz.vcxproj new file mode 100644 index 00000000..99be63d6 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/miniunz.vcxproj @@ -0,0 +1,314 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc11/minizip.vcxproj b/third_party/zlib/contrib/vstudio/vc11/minizip.vcxproj new file mode 100644 index 00000000..d6e98f4d --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/minizip.vcxproj @@ -0,0 +1,311 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc11/testzlib.vcxproj b/third_party/zlib/contrib/vstudio/vc11/testzlib.vcxproj new file mode 100644 index 00000000..0115dd17 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/testzlib.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + v110 + + + Application + true + v110 + + + Application + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj b/third_party/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj new file mode 100644 index 00000000..9d36336e --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj @@ -0,0 +1,314 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc11/zlib.rc b/third_party/zlib/contrib/vstudio/vc11/zlib.rc new file mode 100644 index 00000000..c4e4b016 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/third_party/zlib/contrib/vstudio/vc11/zlibstat.vcxproj b/third_party/zlib/contrib/vstudio/vc11/zlibstat.vcxproj new file mode 100644 index 00000000..64b4d869 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/zlibstat.vcxproj @@ -0,0 +1,464 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + Unicode + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc11/zlibvc.def b/third_party/zlib/contrib/vstudio/vc11/zlibvc.def new file mode 100644 index 00000000..f876c3bc --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/third_party/zlib/contrib/vstudio/vc11/zlibvc.sln b/third_party/zlib/contrib/vstudio/vc11/zlibvc.sln new file mode 100644 index 00000000..b7e38126 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/zlibvc.sln @@ -0,0 +1,117 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/third_party/zlib/contrib/vstudio/vc11/zlibvc.vcxproj b/third_party/zlib/contrib/vstudio/vc11/zlibvc.vcxproj new file mode 100644 index 00000000..c4cffccf --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc11/zlibvc.vcxproj @@ -0,0 +1,688 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + v110 + Unicode + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc12/miniunz.vcxproj b/third_party/zlib/contrib/vstudio/vc12/miniunz.vcxproj new file mode 100644 index 00000000..d88ac7fc --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/miniunz.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc12/minizip.vcxproj b/third_party/zlib/contrib/vstudio/vc12/minizip.vcxproj new file mode 100644 index 00000000..f1f239c9 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/minizip.vcxproj @@ -0,0 +1,313 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc12/testzlib.vcxproj b/third_party/zlib/contrib/vstudio/vc12/testzlib.vcxproj new file mode 100644 index 00000000..64b2cbe3 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/testzlib.vcxproj @@ -0,0 +1,430 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + v120 + + + Application + true + v120 + + + Application + true + v120 + + + Application + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj b/third_party/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj new file mode 100644 index 00000000..c66573a8 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc12/zlib.rc b/third_party/zlib/contrib/vstudio/vc12/zlib.rc new file mode 100644 index 00000000..c4e4b016 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/third_party/zlib/contrib/vstudio/vc12/zlibstat.vcxproj b/third_party/zlib/contrib/vstudio/vc12/zlibstat.vcxproj new file mode 100644 index 00000000..3fdee7c5 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/zlibstat.vcxproj @@ -0,0 +1,467 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc12/zlibvc.def b/third_party/zlib/contrib/vstudio/vc12/zlibvc.def new file mode 100644 index 00000000..f876c3bc --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/third_party/zlib/contrib/vstudio/vc12/zlibvc.sln b/third_party/zlib/contrib/vstudio/vc12/zlibvc.sln new file mode 100644 index 00000000..dcda2298 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/zlibvc.sln @@ -0,0 +1,119 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/third_party/zlib/contrib/vstudio/vc12/zlibvc.vcxproj b/third_party/zlib/contrib/vstudio/vc12/zlibvc.vcxproj new file mode 100644 index 00000000..ab2b6c36 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc12/zlibvc.vcxproj @@ -0,0 +1,692 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + Unicode + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc14/miniunz.vcxproj b/third_party/zlib/contrib/vstudio/vc14/miniunz.vcxproj new file mode 100644 index 00000000..9b5c0758 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/miniunz.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc14/minizip.vcxproj b/third_party/zlib/contrib/vstudio/vc14/minizip.vcxproj new file mode 100644 index 00000000..968a410a --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/minizip.vcxproj @@ -0,0 +1,313 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc14/testzlib.vcxproj b/third_party/zlib/contrib/vstudio/vc14/testzlib.vcxproj new file mode 100644 index 00000000..2c371252 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/testzlib.vcxproj @@ -0,0 +1,430 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v140 + + + Application + MultiByte + true + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + true + v140 + + + Application + MultiByte + true + v140 + + + Application + MultiByte + v140 + + + Application + true + v140 + + + Application + true + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj b/third_party/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj new file mode 100644 index 00000000..d87474de --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc14/zlib.rc b/third_party/zlib/contrib/vstudio/vc14/zlib.rc new file mode 100644 index 00000000..c4e4b016 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/third_party/zlib/contrib/vstudio/vc14/zlibstat.vcxproj b/third_party/zlib/contrib/vstudio/vc14/zlibstat.vcxproj new file mode 100644 index 00000000..3e4b9863 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/zlibstat.vcxproj @@ -0,0 +1,467 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc14/zlibvc.def b/third_party/zlib/contrib/vstudio/vc14/zlibvc.def new file mode 100644 index 00000000..f876c3bc --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/third_party/zlib/contrib/vstudio/vc14/zlibvc.sln b/third_party/zlib/contrib/vstudio/vc14/zlibvc.sln new file mode 100644 index 00000000..6f4a1076 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/zlibvc.sln @@ -0,0 +1,119 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/third_party/zlib/contrib/vstudio/vc14/zlibvc.vcxproj b/third_party/zlib/contrib/vstudio/vc14/zlibvc.vcxproj new file mode 100644 index 00000000..f8f673cb --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc14/zlibvc.vcxproj @@ -0,0 +1,692 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + Unicode + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/zlib/contrib/vstudio/vc9/miniunz.vcproj b/third_party/zlib/contrib/vstudio/vc9/miniunz.vcproj new file mode 100644 index 00000000..038a9e5f --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/miniunz.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/contrib/vstudio/vc9/minizip.vcproj b/third_party/zlib/contrib/vstudio/vc9/minizip.vcproj new file mode 100644 index 00000000..ad402399 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/minizip.vcproj @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/contrib/vstudio/vc9/testzlib.vcproj b/third_party/zlib/contrib/vstudio/vc9/testzlib.vcproj new file mode 100644 index 00000000..c9f19d24 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/testzlib.vcproj @@ -0,0 +1,852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/contrib/vstudio/vc9/testzlibdll.vcproj b/third_party/zlib/contrib/vstudio/vc9/testzlibdll.vcproj new file mode 100644 index 00000000..d7530fd7 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/testzlibdll.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/contrib/vstudio/vc9/zlib.rc b/third_party/zlib/contrib/vstudio/vc9/zlib.rc new file mode 100644 index 00000000..c4e4b016 --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/third_party/zlib/contrib/vstudio/vc9/zlibstat.vcproj b/third_party/zlib/contrib/vstudio/vc9/zlibstat.vcproj new file mode 100644 index 00000000..d4ffb46b --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/zlibstat.vcproj @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/contrib/vstudio/vc9/zlibvc.def b/third_party/zlib/contrib/vstudio/vc9/zlibvc.def new file mode 100644 index 00000000..f876c3bc --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/third_party/zlib/contrib/vstudio/vc9/zlibvc.sln b/third_party/zlib/contrib/vstudio/vc9/zlibvc.sln new file mode 100644 index 00000000..75c64c3f --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/zlibvc.sln @@ -0,0 +1,144 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/third_party/zlib/contrib/vstudio/vc9/zlibvc.vcproj b/third_party/zlib/contrib/vstudio/vc9/zlibvc.vcproj new file mode 100644 index 00000000..95bb241f --- /dev/null +++ b/third_party/zlib/contrib/vstudio/vc9/zlibvc.vcproj @@ -0,0 +1,1156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/crc32.c b/third_party/zlib/crc32.c new file mode 100644 index 00000000..9580440c --- /dev/null +++ b/third_party/zlib/crc32.c @@ -0,0 +1,442 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $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 + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, z_size_t)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, z_size_t)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t 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 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; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)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] = ZSWAP32(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] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + 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 */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + +#ifdef BYFOUR + +/* + This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit + integer pointer type. This violates the strict aliasing rule, where a + compiler can assume, for optimization purposes, that two pointers to + fundamentally different types won't ever point to the same memory. This can + manifest as a problem only if one of the pointers is written to. This code + only reads from those pointers. So long as this code remains isolated in + this compilation unit, there won't be a problem. For this reason, this code + should not be copied and pasted into a compilation unit in which other code + writes to the buffer that is passed to these routines. + */ + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *buf4++; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/third_party/zlib/crc32.h b/third_party/zlib/crc32.h new file mode 100644 index 00000000..9e0c7781 --- /dev/null +++ b/third_party/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c new file mode 100644 index 00000000..1ec76144 --- /dev/null +++ b/third_party/zlib/deflate.c @@ -0,0 +1,2163 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and 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 + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local int deflateStateCheck OF((z_streamp strm)); +local void slide_hash OF((deflate_state *s)); +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV +# pragma message("Assembler code may have bugs -- use at your own risk") + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef ZLIB_DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local void slide_hash(s) + deflate_state *s; +{ + unsigned n, m; + Posf *p; + uInt wsize = s->w_size; + + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + } while (--n); + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif +} + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + s->status = INIT_STATE; /* to pass state test in deflateReset() */ + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = (uInt)windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = (uInt)memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +local int deflateStateCheck (strm) + z_streamp strm; +{ + deflate_state *s; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + s = strm->state; + if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && +#ifdef GZIP + s->status != GZIP_STATE && +#endif + s->status != EXTRA_STATE && + s->status != NAME_STATE && + s->status != COMMENT_STATE && + s->status != HCRC_STATE && + s->status != BUSY_STATE && + s->status != FINISH_STATE)) + return 1; + return 0; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (deflateStateCheck(strm) || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) + z_streamp strm; + Bytef *dictionary; + uInt *dictLength; +{ + deflate_state *s; + uInt len; + + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + len = s->strstart + s->lookahead; + if (len > s->w_size) + len = s->w_size; + if (dictionary != Z_NULL && len) + zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); + if (dictLength != Z_NULL) + *dictLength = len; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = +#ifdef GZIP + s->wrap == 2 ? GZIP_STATE : +#endif + s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (deflateStateCheck(strm) || strm->state->wrap != 2) + return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + s->high_water) { + /* Flush the last buffer: */ + int err = deflate(strm, Z_BLOCK); + if (err == Z_STREAM_ERROR) + return err; + if (strm->avail_out == 0) + return Z_BUF_ERROR; + } + if (s->level != level) { + if (s->level == 0 && s->matches != 0) { + if (s->matches == 1) + slide_hash(s); + else + CLEAR_HASH(s); + s->matches = 0; + } + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = (uInt)good_length; + s->max_lazy_match = (uInt)max_lazy; + s->nice_match = nice_length; + s->max_chain_length = (uInt)max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (deflateStateCheck(strm)) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; +#ifdef GZIP + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + Bytef *str; + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; +#endif + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* =========================================================================== + * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. + */ +#define HCRC_UPDATE(beg) \ + do { \ + if (s->gzhead->hcrc && s->pending > (beg)) \ + strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ + s->pending - (beg)); \ + } while (0) + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->avail_in != 0 && strm->next_in == Z_NULL) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + old_flush = s->last_flush; + s->last_flush = flush; + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Write the header */ + if (s->status == INIT_STATE) { + /* zlib header */ + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#ifdef GZIP + if (s->status == GZIP_STATE) { + /* gzip header */ + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; + while (s->pending + left > s->pending_buf_size) { + uInt copy = s->pending_buf_size - s->pending; + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, copy); + s->pending = s->pending_buf_size; + HCRC_UPDATE(beg); + s->gzindex += copy; + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + left -= copy; + } + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, left); + s->pending += left; + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + } + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) { + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + } + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#endif + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->level == 0 ? deflate_stored(s, flush) : + s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + + status = strm->state->status; + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (deflateStateCheck(source) || dest == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(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 = (int)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 = (int)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. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#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 */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* 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"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* 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 += 2; + 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); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef ZLIB_DEBUG + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* ZLIB_DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* Maximum stored block length in deflate format (not including header). */ +#define MAX_STORED 65535 + +/* Minimum of a and b. */ +#define MIN(a, b) ((a) > (b) ? (b) : (a)) + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. + */ + unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); + + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + unsigned len, left, have, last = 0; + unsigned used = s->strm->avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. + */ + len = MAX_STORED; /* maximum deflate stored block length */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + if (s->strm->avail_out < have) /* need room for header */ + break; + /* maximum stored block length that will fit in avail_out: */ + have = s->strm->avail_out - have; + left = s->strstart - s->block_start; /* bytes left in window */ + if (len > (ulg)left + s->strm->avail_in) + len = left + s->strm->avail_in; /* limit len to the input */ + if (len > have) + len = have; /* limit len to the output */ + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len == 0 && flush != Z_FINISH) || + flush == Z_NO_FLUSH || + len != left + s->strm->avail_in)) + break; + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; + _tr_stored_block(s, (char *)0, 0L, last); + + /* Replace the lengths in the dummy stored block with len. */ + s->pending_buf[s->pending - 4] = len; + s->pending_buf[s->pending - 3] = len >> 8; + s->pending_buf[s->pending - 2] = ~len; + s->pending_buf[s->pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s->strm); + +#ifdef ZLIB_DEBUG + /* Update debugging counts for the data about to be copied. */ + s->compressed_len += len << 3; + s->bits_sent += len << 3; +#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) + left = len; + zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s->strm->next_out += left; + s->strm->avail_out -= left; + s->strm->total_out += left; + s->block_start += left; + len -= left; + } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s->strm, s->strm->next_out, len); + s->strm->next_out += len; + s->strm->avail_out -= len; + s->strm->total_out += len; + } + } while (last == 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s->strm->avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s->w_size) { /* supplant the previous history */ + s->matches = 2; /* clear hash */ + zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s->strstart = s->w_size; + } + else { + if (s->window_size - s->strstart <= used) { + /* Slide the window down. */ + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + } + zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s->strstart += used; + } + s->block_start = s->strstart; + s->insert += MIN(used, s->w_size - s->insert); + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* If the last block was written to next_out, then done. */ + if (last) + return finish_done; + + /* If flushing and all input has been consumed, then done. */ + if (flush != Z_NO_FLUSH && flush != Z_FINISH && + s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + return block_done; + + /* Fill the window with any remaining input. */ + have = s->window_size - s->strstart - 1; + if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + /* Slide the window down. */ + s->block_start -= s->w_size; + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + have += s->w_size; /* more space now */ + } + if (have > s->strm->avail_in) + have = s->strm->avail_in; + if (have) { + read_buf(s->strm, s->window + s->strstart, have); + s->strstart += have; + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = MIN(s->pending_buf_size - have, MAX_STORED); + min_block = MIN(have, s->w_size); + left = s->strstart - s->block_start; + if (left >= min_block || + ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && + s->strm->avail_in == 0 && left <= have)) { + len = MIN(left, have); + last = flush == Z_FINISH && s->strm->avail_in == 0 && + len == left ? 1 : 0; + _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); + s->block_start += len; + flush_pending(s->strm); + } + + /* We've done all we can with the available input and output. */ + return last ? finish_started : need_more; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (uInt)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/third_party/zlib/deflate.h b/third_party/zlib/deflate.h new file mode 100644 index 00000000..23ecdd31 --- /dev/null +++ b/third_party/zlib/deflate.h @@ -0,0 +1,349 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + ulg pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + ulg gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef ZLIB_DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef ZLIB_DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/third_party/zlib/doc/algorithm.txt b/third_party/zlib/doc/algorithm.txt new file mode 100644 index 00000000..c97f4950 --- /dev/null +++ b/third_party/zlib/doc/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend too much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://tools.ietf.org/html/rfc1951 diff --git a/third_party/zlib/doc/rfc1950.txt b/third_party/zlib/doc/rfc1950.txt new file mode 100644 index 00000000..ce6428a0 --- /dev/null +++ b/third_party/zlib/doc/rfc1950.txt @@ -0,0 +1,619 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1950 Aladdin Enterprises +Category: Informational J-L. Gailly + Info-ZIP + May 1996 + + + ZLIB Compressed Data Format Specification version 3.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format. The + data can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a priori + bounded amount of intermediate storage. The format presently uses + the DEFLATE compression method but can be easily extended to use + other compression methods. It can be implemented readily in a manner + not covered by patents. This specification also defines the ADLER-32 + checksum (an extension and improvement of the Fletcher checksum), + used for detection of data corruption, and provides an algorithm for + computing it. + + + + +Deutsch & Gailly Informational [Page 1] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 3 + 2.1. Overall conventions ....................................... 3 + 2.2. Data format ............................................... 4 + 2.3. Compliance ................................................ 7 + 3. References ..................................................... 7 + 4. Source code .................................................... 8 + 5. Security Considerations ........................................ 8 + 6. Acknowledgements ............................................... 8 + 7. Authors' Addresses ............................................. 8 + 8. Appendix: Rationale ............................................ 9 + 9. Appendix: Sample code ..........................................10 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence can + be used in data communications or similar structures such as + Unix filters; + + * Can use a number of different compression methods; + + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely. + + The data format defined by this specification does not attempt to + allow random access to compressed data. + + + + + + + +Deutsch & Gailly Informational [Page 2] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into zlib format and/or decompress data from zlib + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compressed data format that can be + used for in-memory compression of a sequence of arbitrary bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below, for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + Version 3.1 was the first public release of this specification. + In version 3.2, some terminology was changed and the Adler-32 + sample code was rewritten for clarity. In version 3.3, the + support for a preset dictionary was introduced, and the + specification was converted to RFC style. + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + + + +Deutsch & Gailly Informational [Page 3] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the MOST-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00000010|00001000| + +--------+--------+ + ^ ^ + | | + | + less significant byte = 8 + + more significant byte = 2 x 256 + + 2.2. Data format + + A zlib stream has the following structure: + + 0 1 + +---+---+ + |CMF|FLG| (more-->) + +---+---+ + + + + + + + + +Deutsch & Gailly Informational [Page 4] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + (if FLG.FDICT set) + + 0 1 2 3 + +---+---+---+---+ + | DICTID | (more-->) + +---+---+---+---+ + + +=====================+---+---+---+---+ + |...compressed data...| ADLER32 | + +=====================+---+---+---+---+ + + Any data which may appear after ADLER32 are not part of the zlib + stream. + + CMF (Compression Method and flags) + This byte is divided into a 4-bit compression method and a 4- + bit information field depending on the compression method. + + bits 0 to 3 CM Compression method + bits 4 to 7 CINFO Compression info + + CM (Compression method) + This identifies the compression method used in the file. CM = 8 + denotes the "deflate" compression method with a window size up + to 32K. This is the method used by gzip and PNG (see + references [1] and [2] in Chapter 3, below, for the reference + documents). CM = 15 is reserved. It might be used in a future + version of this specification to indicate the presence of an + extra field before the compressed data. + + CINFO (Compression info) + For CM = 8, CINFO is the base-2 logarithm of the LZ77 window + size, minus eight (CINFO=7 indicates a 32K window size). Values + of CINFO above 7 are not allowed in this version of the + specification. CINFO is not defined in this specification for + CM not equal to 8. + + FLG (FLaGs) + This flag byte is divided as follows: + + bits 0 to 4 FCHECK (check bits for CMF and FLG) + bit 5 FDICT (preset dictionary) + bits 6 to 7 FLEVEL (compression level) + + The FCHECK value must be such that CMF and FLG, when viewed as + a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), + is a multiple of 31. + + + + +Deutsch & Gailly Informational [Page 5] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + FDICT (Preset dictionary) + If FDICT is set, a DICT dictionary identifier is present + immediately after the FLG byte. The dictionary is a sequence of + bytes which are initially fed to the compressor without + producing any compressed output. DICT is the Adler-32 checksum + of this sequence of bytes (see the definition of ADLER32 + below). The decompressor can use this identifier to determine + which dictionary has been used by the compressor. + + FLEVEL (Compression level) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + 0 - compressor used fastest algorithm + 1 - compressor used fast algorithm + 2 - compressor used default algorithm + 3 - compressor used maximum compression, slowest algorithm + + The information in FLEVEL is not needed for decompression; it + is there to indicate if recompression might be worthwhile. + + compressed data + For compression method 8, the compressed data is stored in the + deflate compressed data format as described in the document + "DEFLATE Compressed Data Format Specification" by L. Peter + Deutsch. (See reference [3] in Chapter 3, below) + + Other compressed data formats are not specified in this version + of the zlib specification. + + ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. See references [4] and [5] in Chapter 3, below) + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order. + + + + + + + + +Deutsch & Gailly Informational [Page 6] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 2.3. Compliance + + A compliant compressor must produce streams with correct CMF, FLG + and ADLER32, but need not support preset dictionaries. When the + zlib data format is used as part of another standard data format, + the compressor may use only preset dictionaries that are specified + by this other data format. If this other format does not use the + preset dictionary feature, the compressor must not set the FDICT + flag. + + A compliant decompressor must check CMF, FLG, and ADLER32, and + provide an error indication if any of these have incorrect values. + A compliant decompressor must give an error indication if CM is + not one of the values defined in this specification (only the + value 8 is permitted in this version), since another value could + indicate the presence of new features that would cause subsequent + data to be interpreted incorrectly. A compliant decompressor must + give an error indication if FDICT is set and DICTID is not the + identifier of a known preset dictionary. A decompressor may + ignore FLEVEL and still be compliant. When the zlib data format + is being used as a part of another standard format, a compliant + decompressor must support all the preset dictionaries specified by + the other format. When the other format does not use the preset + dictionary feature, a compliant decompressor must reject any + stream in which the FDICT flag is set. + +3. References + + [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [2] Thomas Boutell, "PNG (Portable Network Graphics) specification", + available in ftp://ftp.uu.net/graphics/png/documents/ + + [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Fletcher, J. G., "An Arithmetic Checksum for Serial + Transmissions," IEEE Transactions on Communications, Vol. COM-30, + No. 1, January 1982, pp. 247-252. + + [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms," + November, 1993, pp. 144, 145. (Available from + gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073. + + + + + + + +Deutsch & Gailly Informational [Page 7] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +4. Source code + + Source code for a C language implementation of a "zlib" compliant + library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +5. Security Considerations + + A decoder that fails to check the ADLER32 checksum value may be + subject to undetected data corruption. + +6. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly and Mark Adler designed the zlib format and wrote + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +7. Authors' Addresses + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + + Jean-Loup Gailly + + EMail: + + Questions about the technical content of this specification can be + sent by email to + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + +Deutsch & Gailly Informational [Page 8] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +8. Appendix: Rationale + + 8.1. Preset dictionaries + + A preset dictionary is specially useful to compress short input + sequences. The compressor can take advantage of the dictionary + context to encode the input in a more compact manner. The + decompressor can be initialized with the appropriate context by + virtually decompressing a compressed version of the dictionary + without producing any output. However for certain compression + algorithms such as the deflate algorithm this operation can be + achieved without actually performing any decompression. + + The compressor and the decompressor must use exactly the same + dictionary. The dictionary may be fixed or may be chosen among a + certain number of predefined dictionaries, according to the kind + of input data. The decompressor can determine which dictionary has + been chosen by the compressor by checking the dictionary + identifier. This document does not specify the contents of + predefined dictionaries, since the optimal dictionaries are + application specific. Standard data formats using this feature of + the zlib specification must precisely define the allowed + dictionaries. + + 8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 <-> + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.) + + + + + + + + +Deutsch & Gailly Informational [Page 9] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +9. Appendix: Sample code + + The following C code computes the Adler-32 checksum of a data buffer. + It is written for clarity, not for speed. The sample code is in the + ANSI C programming language. Non C users may find it easier to read + with these hints: + + & Bitwise AND operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero bit(s) + at the left. + << Bitwise left shift operator. Left shift inserts zero + bit(s) at the right. + ++ "n++" increments the variable n. + % modulo operator: a % b is the remainder of a divided by b. + + #define BASE 65521 /* largest prime smaller than 65536 */ + + /* + Update a running Adler-32 checksum with the bytes buf[0..len-1] + and return the updated checksum. The Adler-32 checksum should be + initialized to 1. + + Usage example: + + unsigned long adler = 1L; + + while (read_buffer(buffer, length) != EOF) { + adler = update_adler32(adler, buffer, length); + } + if (adler != original_adler) error(); + */ + unsigned long update_adler32(unsigned long adler, + unsigned char *buf, int len) + { + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int n; + + for (n = 0; n < len; n++) { + s1 = (s1 + buf[n]) % BASE; + s2 = (s2 + s1) % BASE; + } + return (s2 << 16) + s1; + } + + /* Return the adler32 of the bytes buf[0..len-1] */ + + + + +Deutsch & Gailly Informational [Page 10] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + unsigned long adler32(unsigned char *buf, int len) + { + return update_adler32(1L, buf, len); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch & Gailly Informational [Page 11] + diff --git a/third_party/zlib/doc/rfc1951.txt b/third_party/zlib/doc/rfc1951.txt new file mode 100644 index 00000000..403c8c72 --- /dev/null +++ b/third_party/zlib/doc/rfc1951.txt @@ -0,0 +1,955 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1951 Aladdin Enterprises +Category: Informational May 1996 + + + DEFLATE Compressed Data Format Specification version 1.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that + compresses data using a combination of the LZ77 algorithm and Huffman + coding, with efficiency comparable to the best currently available + general-purpose compression methods. The data can be produced or + consumed, even for an arbitrarily long sequentially presented input + data stream, using only an a priori bounded amount of intermediate + storage. The format can be implemented readily in a manner not + covered by patents. + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 4 + 2. Compressed representation overview ............................. 4 + 3. Detailed specification ......................................... 5 + 3.1. Overall conventions ....................................... 5 + 3.1.1. Packing into bytes .................................. 5 + 3.2. Compressed block format ................................... 6 + 3.2.1. Synopsis of prefix and Huffman coding ............... 6 + 3.2.2. Use of Huffman coding in the "deflate" format ....... 7 + 3.2.3. Details of block format ............................. 9 + 3.2.4. Non-compressed blocks (BTYPE=00) ................... 11 + 3.2.5. Compressed blocks (length and distance codes) ...... 11 + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12 + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13 + 3.3. Compliance ............................................... 14 + 4. Compression algorithm details ................................. 14 + 5. References .................................................... 16 + 6. Security Considerations ....................................... 16 + 7. Source code ................................................... 16 + 8. Acknowledgements .............................................. 16 + 9. Author's Address .............................................. 17 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence + can be used in data communications or similar structures + such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + + + +Deutsch Informational [Page 2] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + The data format defined by this specification does not attempt to: + + * Allow random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well + as the best currently available specialized algorithms. + + A simple counting argument shows that no lossless compression + algorithm can compress every possible input data set. For the + format defined here, the worst case expansion is 5 bytes per 32K- + byte block, i.e., a size increase of 0.015% for large data sets. + English text usually compresses by a factor of 2.5 to 3; + executable files usually compress somewhat less; graphical data + such as raster images may compress much more. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into "deflate" format and/or decompress data from + "deflate" format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. Familiarity with the technique of Huffman coding + is helpful but not required. + + 1.3. Scope + + The specification specifies a method for representing a sequence + of bytes as a (usually shorter) sequence of bits, and a method for + packing the latter bit sequence into bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + Byte: 8 bits stored or transmitted as a unit (same as an octet). + For this specification, a byte is exactly 8 bits, even on machines + + + +Deutsch Informational [Page 3] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + which store a character on a number of bits different from eight. + See below, for the numbering of bits within a byte. + + String: a sequence of arbitrary bytes. + + 1.6. Changes from previous versions + + There have been no technical changes to the deflate format since + version 1.1 of this specification. In version 1.2, some + terminology was changed. Version 1.3 is a conversion of the + specification to RFC style. + +2. Compressed representation overview + + A compressed data set consists of a series of blocks, corresponding + to successive blocks of input data. The block sizes are arbitrary, + except that non-compressible blocks are limited to 65,535 bytes. + + Each block is compressed using a combination of the LZ77 algorithm + and Huffman coding. The Huffman trees for each block are independent + of those for previous or subsequent blocks; the LZ77 algorithm may + use a reference to a duplicated string occurring in a previous block, + up to 32K input bytes before. + + Each block consists of two parts: a pair of Huffman code trees that + describe the representation of the compressed data part, and a + compressed data part. (The Huffman trees themselves are compressed + using Huffman encoding.) The compressed data consists of a series of + elements of two types: literal bytes (of strings that have not been + detected as duplicated within the previous 32K input bytes), and + pointers to duplicated strings, where a pointer is represented as a + pair . The representation used in the + "deflate" format limits distances to 32K bytes and lengths to 258 + bytes, but does not limit the size of a block, except for + uncompressible blocks, which are limited as noted above. + + Each type of value (literals, distances, and lengths) in the + compressed data is represented using a Huffman code, using one code + tree for literals and lengths and a separate code tree for distances. + The code trees for each block appear in a compact form just before + the compressed data for that block. + + + + + + + + + + +Deutsch Informational [Page 4] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +3. Detailed specification + + 3.1. Overall conventions In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + 3.1.1. Packing into bytes + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, + since the final data format described here is byte- rather than + + + +Deutsch Informational [Page 5] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + bit-oriented. However, we describe the compressed block format + in below, as a sequence of data elements of various bit + lengths, not a sequence of bytes. We must therefore specify + how to pack these data elements into bytes to form the final + compressed byte sequence: + + * Data elements are packed into bytes in order of + increasing bit number within the byte, i.e., starting + with the least-significant bit of the byte. + * Data elements other than Huffman codes are packed + starting with the least-significant bit of the data + element. + * Huffman codes are packed starting with the most- + significant bit of the code. + + In other words, if one were to print out the compressed data as + a sequence of bytes, starting with the first byte at the + *right* margin and proceeding to the *left*, with the most- + significant bit of each byte on the left as usual, one would be + able to parse the result from right to left, with fixed-width + elements in the correct MSB-to-LSB order and Huffman codes in + bit-reversed order (i.e., with the first bit of the code in the + relative LSB position). + + 3.2. Compressed block format + + 3.2.1. Synopsis of prefix and Huffman coding + + Prefix coding represents symbols from an a priori known + alphabet by bit sequences (codes), one code for each symbol, in + a manner such that different symbols may be represented by bit + sequences of different lengths, but a parser can always parse + an encoded string unambiguously symbol-by-symbol. + + We define a prefix code in terms of a binary tree in which the + two edges descending from each non-leaf node are labeled 0 and + 1 and in which the leaf nodes correspond one-for-one with (are + labeled with) the symbols of the alphabet; then the code for a + symbol is the sequence of 0's and 1's on the edges leading from + the root to the leaf labeled with that symbol. For example: + + + + + + + + + + + +Deutsch Informational [Page 6] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + /\ Symbol Code + 0 1 ------ ---- + / \ A 00 + /\ B B 1 + 0 1 C 011 + / \ D 010 + A /\ + 0 1 + / \ + D C + + A parser can decode the next symbol from an encoded input + stream by walking down the tree from the root, at each step + choosing the edge corresponding to the next input bit. + + Given an alphabet with known symbol frequencies, the Huffman + algorithm allows the construction of an optimal prefix code + (one which represents strings with those symbol frequencies + using the fewest bits of any possible prefix codes for that + alphabet). Such a code is called a Huffman code. (See + reference [1] in Chapter 5, references for additional + information on Huffman codes.) + + Note that in the "deflate" format, the Huffman codes for the + various alphabets must not exceed certain maximum code lengths. + This constraint complicates the algorithm for computing code + lengths from symbol frequencies. Again, see Chapter 5, + references for details. + + 3.2.2. Use of Huffman coding in the "deflate" format + + The Huffman codes used for each alphabet in the "deflate" + format have two additional rules: + + * All codes of a given bit length have lexicographically + consecutive values, in the same order as the symbols + they represent; + + * Shorter codes lexicographically precede longer codes. + + + + + + + + + + + + +Deutsch Informational [Page 7] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + We could recode the example above to follow this rule as + follows, assuming that the order of the alphabet is ABCD: + + Symbol Code + ------ ---- + A 10 + B 0 + C 110 + D 111 + + I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are + lexicographically consecutive. + + Given this rule, we can define the Huffman code for an alphabet + just by giving the bit lengths of the codes for each symbol of + the alphabet in order; this is sufficient to determine the + actual codes. In our example, the code is completely defined + by the sequence of bit lengths (2, 1, 3, 3). The following + algorithm generates the codes as integers, intended to be read + from most- to least-significant bit. The code lengths are + initially in tree[I].Len; the codes are produced in + tree[I].Code. + + 1) Count the number of codes for each code length. Let + bl_count[N] be the number of codes of length N, N >= 1. + + 2) Find the numerical value of the smallest code for each + code length: + + code = 0; + bl_count[0] = 0; + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code; + } + + 3) Assign numerical values to all codes, using consecutive + values for all codes of the same length with the base + values determined at step 2. Codes that are never used + (which have a bit length of zero) must not be assigned a + value. + + for (n = 0; n <= max_code; n++) { + len = tree[n].Len; + if (len != 0) { + tree[n].Code = next_code[len]; + next_code[len]++; + } + + + +Deutsch Informational [Page 8] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + } + + Example: + + Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3, + 3, 2, 4, 4). After step 1, we have: + + N bl_count[N] + - ----------- + 2 1 + 3 5 + 4 2 + + Step 2 computes the following next_code values: + + N next_code[N] + - ------------ + 1 0 + 2 0 + 3 2 + 4 14 + + Step 3 produces the following code values: + + Symbol Length Code + ------ ------ ---- + A 3 010 + B 3 011 + C 3 100 + D 3 101 + E 3 110 + F 2 00 + G 4 1110 + H 4 1111 + + 3.2.3. Details of block format + + Each block of compressed data begins with 3 header bits + containing the following data: + + first bit BFINAL + next 2 bits BTYPE + + Note that the header bits do not necessarily begin on a byte + boundary, since a block does not necessarily occupy an integral + number of bytes. + + + + + +Deutsch Informational [Page 9] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + BFINAL is set if and only if this is the last block of the data + set. + + BTYPE specifies how the data are compressed, as follows: + + 00 - no compression + 01 - compressed with fixed Huffman codes + 10 - compressed with dynamic Huffman codes + 11 - reserved (error) + + The only difference between the two compressed cases is how the + Huffman codes for the literal/length and distance alphabets are + defined. + + In all cases, the decoding algorithm for the actual data is as + follows: + + do + read block header from input stream. + if stored with no compression + skip any remaining bits in current partially + processed byte + read LEN and NLEN (see next section) + copy LEN bytes of data to output + otherwise + if compressed with dynamic Huffman codes + read representation of code trees (see + subsection below) + loop (until end of block code recognized) + decode literal/length value from input stream + if value < 256 + copy value (literal byte) to output stream + otherwise + if value = end of block (256) + break from loop + otherwise (value = 257..285) + decode distance from input stream + + move backwards distance bytes in the output + stream, and copy length bytes from this + position to the output stream. + end loop + while not last block + + Note that a duplicated string reference may refer to a string + in a previous block; i.e., the backward distance may cross one + or more block boundaries. However a distance cannot refer past + the beginning of the output stream. (An application using a + + + +Deutsch Informational [Page 10] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + preset dictionary might discard part of the output stream; a + distance can refer to that part of the output stream anyway) + Note also that the referenced string may overlap the current + position; for example, if the last 2 bytes decoded have values + X and Y, a string reference with + adds X,Y,X,Y,X to the output stream. + + We now specify each compression method in turn. + + 3.2.4. Non-compressed blocks (BTYPE=00) + + Any bits of input up to the next byte boundary are ignored. + The rest of the block consists of the following information: + + 0 1 2 3 4... + +---+---+---+---+================================+ + | LEN | NLEN |... LEN bytes of literal data...| + +---+---+---+---+================================+ + + LEN is the number of data bytes in the block. NLEN is the + one's complement of LEN. + + 3.2.5. Compressed blocks (length and distance codes) + + As noted above, encoded data blocks in the "deflate" format + consist of sequences of symbols drawn from three conceptually + distinct alphabets: either literal bytes, from the alphabet of + byte values (0..255), or pairs, + where the length is drawn from (3..258) and the distance is + drawn from (1..32,768). In fact, the literal and length + alphabets are merged into a single alphabet (0..285), where + values 0..255 represent literal bytes, the value 256 indicates + end-of-block, and values 257..285 represent length codes + (possibly in conjunction with extra bits following the symbol + code) as follows: + + + + + + + + + + + + + + + + +Deutsch Informational [Page 11] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + Extra Extra Extra + Code Bits Length(s) Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- + 257 0 3 267 1 15,16 277 4 67-82 + 258 0 4 268 1 17,18 278 4 83-98 + 259 0 5 269 2 19-22 279 4 99-114 + 260 0 6 270 2 23-26 280 4 115-130 + 261 0 7 271 2 27-30 281 5 131-162 + 262 0 8 272 2 31-34 282 5 163-194 + 263 0 9 273 3 35-42 283 5 195-226 + 264 0 10 274 3 43-50 284 5 227-257 + 265 1 11,12 275 3 51-58 285 0 258 + 266 1 13,14 276 3 59-66 + + The extra bits should be interpreted as a machine integer + stored with the most-significant bit first, e.g., bits 1110 + represent the value 14. + + Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- + 0 0 1 10 4 33-48 20 9 1025-1536 + 1 0 2 11 4 49-64 21 9 1537-2048 + 2 0 3 12 5 65-96 22 10 2049-3072 + 3 0 4 13 5 97-128 23 10 3073-4096 + 4 1 5,6 14 6 129-192 24 11 4097-6144 + 5 1 7,8 15 6 193-256 25 11 6145-8192 + 6 2 9-12 16 7 257-384 26 12 8193-12288 + 7 2 13-16 17 7 385-512 27 12 12289-16384 + 8 3 17-24 18 8 513-768 28 13 16385-24576 + 9 3 25-32 19 8 769-1024 29 13 24577-32768 + + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) + + The Huffman codes for the two alphabets are fixed, and are not + represented explicitly in the data. The Huffman code lengths + for the literal/length alphabet are: + + Lit Value Bits Codes + --------- ---- ----- + 0 - 143 8 00110000 through + 10111111 + 144 - 255 9 110010000 through + 111111111 + 256 - 279 7 0000000 through + 0010111 + 280 - 287 8 11000000 through + 11000111 + + + +Deutsch Informational [Page 12] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + The code lengths are sufficient to generate the actual codes, + as described above; we show the codes in the table for added + clarity. Literal/length values 286-287 will never actually + occur in the compressed data, but participate in the code + construction. + + Distance codes 0-31 are represented by (fixed-length) 5-bit + codes, with possible additional bits as shown in the table + shown in Paragraph 3.2.5, above. Note that distance codes 30- + 31 will never actually occur in the compressed data. + + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) + + The Huffman codes for the two alphabets appear in the block + immediately after the header bits and before the actual + compressed data, first the literal/length code and then the + distance code. Each code is defined by a sequence of code + lengths, as discussed in Paragraph 3.2.2, above. For even + greater compactness, the code length sequences themselves are + compressed using a Huffman code. The alphabet for code lengths + is as follows: + + 0 - 15: Represent code lengths of 0 - 15 + 16: Copy the previous code length 3 - 6 times. + The next 2 bits indicate repeat length + (0 = 3, ... , 3 = 6) + Example: Codes 8, 16 (+2 bits 11), + 16 (+2 bits 10) will expand to + 12 code lengths of 8 (1 + 6 + 5) + 17: Repeat a code length of 0 for 3 - 10 times. + (3 bits of length) + 18: Repeat a code length of 0 for 11 - 138 times + (7 bits of length) + + A code length of 0 indicates that the corresponding symbol in + the literal/length or distance alphabet will not occur in the + block, and should not participate in the Huffman code + construction algorithm given earlier. If only one distance + code is used, it is encoded using one bit, not zero bits; in + this case there is a single code length of one, with one unused + code. One distance code of zero bits means that there are no + distance codes used at all (the data is all literals). + + We can now define the format of the block: + + 5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286) + 5 Bits: HDIST, # of Distance codes - 1 (1 - 32) + 4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19) + + + +Deutsch Informational [Page 13] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + (HCLEN + 4) x 3 bits: code lengths for the code length + alphabet given just above, in the order: 16, 17, 18, + 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + + These code lengths are interpreted as 3-bit integers + (0-7); as above, a code length of 0 means the + corresponding symbol (literal/length or distance code + length) is not used. + + HLIT + 257 code lengths for the literal/length alphabet, + encoded using the code length Huffman code + + HDIST + 1 code lengths for the distance alphabet, + encoded using the code length Huffman code + + The actual compressed data of the block, + encoded using the literal/length and distance Huffman + codes + + The literal/length symbol 256 (end of data), + encoded using the literal/length Huffman code + + The code length repeat codes can cross from HLIT + 257 to the + HDIST + 1 code lengths. In other words, all code lengths form + a single sequence of HLIT + HDIST + 258 values. + + 3.3. Compliance + + A compressor may limit further the ranges of values specified in + the previous section and still be compliant; for example, it may + limit the range of backward pointers to some value smaller than + 32K. Similarly, a compressor may limit the size of blocks so that + a compressible block fits in memory. + + A compliant decompressor must accept the full range of possible + values defined in the previous section, and must accept blocks of + arbitrary size. + +4. Compression algorithm details + + While it is the intent of this document to define the "deflate" + compressed data format without reference to any particular + compression algorithm, the format is related to the compressed + formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below); + since many variations of LZ77 are patented, it is strongly + recommended that the implementor of a compressor follow the general + algorithm presented here, which is known not to be patented per se. + The material in this section is not part of the definition of the + + + +Deutsch Informational [Page 14] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + specification per se, and a compressor need not follow it in order to + be compliant. + + The compressor terminates a block when it determines that starting a + new block with fresh trees would be useful, or when the block size + fills up the compressor's block buffer. + + The compressor uses a chained hash table to find duplicated strings, + using a hash function that operates on 3-byte sequences. At any + given point during compression, let XYZ be the next 3 input bytes to + be examined (not necessarily all different, of course). First, the + compressor examines the hash chain for XYZ. If the chain is empty, + the compressor simply writes out X as a literal byte and advances one + byte in the input. If the hash chain is not empty, indicating that + the sequence XYZ (or, if we are unlucky, some other 3 bytes with the + same hash function value) has occurred recently, the compressor + compares all strings on the XYZ hash chain with the actual input data + sequence starting at the current point, and selects the longest + match. + + The compressor searches the hash chains starting with the most recent + strings, to favor small distances and thus take advantage of the + Huffman encoding. The hash chains are singly linked. There are no + deletions from the hash chains; the algorithm simply discards matches + that are too old. To avoid a worst-case situation, very long hash + chains are arbitrarily truncated at a certain length, determined by a + run-time parameter. + + To improve overall compression, the compressor optionally defers the + selection of matches ("lazy matching"): after a match of length N has + been found, the compressor searches for a longer match starting at + the next input byte. If it finds a longer match, it truncates the + previous match to a length of one (thus producing a single literal + byte) and then emits the longer match. Otherwise, it emits the + original match, and, as described above, advances N bytes before + continuing. + + Run-time parameters also control this "lazy match" procedure. If + compression ratio is most important, the compressor attempts a + complete second search regardless of the length of the first match. + In the normal case, if the current match is "long enough", the + compressor reduces the search for a longer match, thus speeding up + the process. If speed is most important, the compressor inserts new + strings in the hash table only when no match was found, or when the + match is not "too long". This degrades the compression ratio but + saves time since there are both fewer insertions and fewer searches. + + + + + +Deutsch Informational [Page 15] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +5. References + + [1] Huffman, D. A., "A Method for the Construction of Minimum + Redundancy Codes", Proceedings of the Institute of Radio + Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101. + + [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data + Compression", IEEE Transactions on Information Theory, Vol. 23, + No. 3, pp. 337-343. + + [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources, + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources, + available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/ + + [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix + encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169. + + [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes," + Comm. ACM, 33,4, April 1990, pp. 449-459. + +6. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data. See + reference [3], for example. + +7. Source code + + Source code for a C language implementation of a "deflate" compliant + compressor and decompressor is available within the zlib package at + ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +8. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Phil Katz designed the deflate format. Jean-Loup Gailly and Mark + Adler wrote the related software described in this specification. + Glenn Randers-Pehrson converted this document to RFC and HTML format. + + + +Deutsch Informational [Page 16] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +9. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch Informational [Page 17] + diff --git a/third_party/zlib/doc/rfc1952.txt b/third_party/zlib/doc/rfc1952.txt new file mode 100644 index 00000000..a8e51b45 --- /dev/null +++ b/third_party/zlib/doc/rfc1952.txt @@ -0,0 +1,675 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1952 Aladdin Enterprises +Category: Informational May 1996 + + + GZIP file format specification version 4.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that is + compatible with the widely used GZIP utility. The format includes a + cyclic redundancy check value for detecting data corruption. The + format presently uses the DEFLATE method of compression but can be + easily extended to use other compression methods. The format can be + implemented readily in a manner not covered by patents. + + + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1952 GZIP File Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................. 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 4 + 2.1. Overall conventions ....................................... 4 + 2.2. File format ............................................... 5 + 2.3. Member format ............................................. 5 + 2.3.1. Member header and trailer ........................... 6 + 2.3.1.1. Extra field ................................... 8 + 2.3.1.2. Compliance .................................... 9 + 3. References .................................................. 9 + 4. Security Considerations .................................... 10 + 5. Acknowledgements ........................................... 10 + 6. Author's Address ........................................... 10 + 7. Appendix: Jean-Loup Gailly's gzip utility .................. 11 + 8. Appendix: Sample CRC Code .................................. 11 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can compress or decompress a data stream (as opposed to a + randomly accessible file) to produce another data stream, + using only an a priori bounded amount of intermediate + storage, and hence can be used in data communications or + similar structures such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + + + +Deutsch Informational [Page 2] + +RFC 1952 GZIP File Format Specification May 1996 + + + The data format defined by this specification does not attempt to: + + * Provide random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well as + the best currently available specialized algorithms. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into gzip format and/or decompress data from gzip + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compression method and a file format + (the latter assuming only that a file can store a sequence of + arbitrary bytes). It does not specify any particular interface to + a file system or anything about character sets or encodings + (except for file names and comments, which are optional). + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any file that conforms to all the + specifications presented here; a compliant compressor must produce + files that conform to all the specifications presented here. The + material in the appendices is not part of the specification per se + and is not relevant to compliance. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + There have been no technical changes to the gzip format since + version 4.1 of this specification. In version 4.2, some + terminology was changed, and the sample CRC code was rewritten for + clarity and to eliminate the requirement for the caller to do pre- + and post-conditioning. Version 4.3 is a conversion of the + specification to RFC style. + + + +Deutsch Informational [Page 3] + +RFC 1952 GZIP File Format Specification May 1996 + + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, since + the data format described here is byte- rather than bit-oriented. + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + + +Deutsch Informational [Page 4] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.2. File format + + A gzip file consists of a series of "members" (compressed data + sets). The format of each member is specified in the following + section. The members simply appear one after another in the file, + with no additional information before, between, or after them. + + 2.3. Member format + + Each member has the following structure: + + +---+---+---+---+---+---+---+---+---+---+ + |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->) + +---+---+---+---+---+---+---+---+---+---+ + + (if FLG.FEXTRA set) + + +---+---+=================================+ + | XLEN |...XLEN bytes of "extra field"...| (more-->) + +---+---+=================================+ + + (if FLG.FNAME set) + + +=========================================+ + |...original file name, zero-terminated...| (more-->) + +=========================================+ + + (if FLG.FCOMMENT set) + + +===================================+ + |...file comment, zero-terminated...| (more-->) + +===================================+ + + (if FLG.FHCRC set) + + +---+---+ + | CRC16 | + +---+---+ + + +=======================+ + |...compressed blocks...| (more-->) + +=======================+ + + 0 1 2 3 4 5 6 7 + +---+---+---+---+---+---+---+---+ + | CRC32 | ISIZE | + +---+---+---+---+---+---+---+---+ + + + + +Deutsch Informational [Page 5] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.3.1. Member header and trailer + + ID1 (IDentification 1) + ID2 (IDentification 2) + These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 + (0x8b, \213), to identify the file as being in gzip format. + + CM (Compression Method) + This identifies the compression method used in the file. CM + = 0-7 are reserved. CM = 8 denotes the "deflate" + compression method, which is the one customarily used by + gzip and which is documented elsewhere. + + FLG (FLaGs) + This flag byte is divided into individual bits as follows: + + bit 0 FTEXT + bit 1 FHCRC + bit 2 FEXTRA + bit 3 FNAME + bit 4 FCOMMENT + bit 5 reserved + bit 6 reserved + bit 7 reserved + + If FTEXT is set, the file is probably ASCII text. This is + an optional indication, which the compressor may set by + checking a small amount of the input data to see whether any + non-ASCII characters are present. In case of doubt, FTEXT + is cleared, indicating binary data. For systems which have + different file formats for ascii text and binary data, the + decompressor can use FTEXT to choose the appropriate format. + We deliberately do not specify the algorithm used to set + this bit, since a compressor always has the option of + leaving it cleared and a decompressor always has the option + of ignoring it and letting some other program handle issues + of data conversion. + + If FHCRC is set, a CRC16 for the gzip header is present, + immediately before the compressed data. The CRC16 consists + of the two least significant bytes of the CRC32 for all + bytes of the gzip header up to and not including the CRC16. + [The FHCRC bit was never set by versions of gzip up to + 1.2.4, even though it was documented with a different + meaning in gzip 1.2.4.] + + If FEXTRA is set, optional extra fields are present, as + described in a following section. + + + +Deutsch Informational [Page 6] + +RFC 1952 GZIP File Format Specification May 1996 + + + If FNAME is set, an original file name is present, + terminated by a zero byte. The name must consist of ISO + 8859-1 (LATIN-1) characters; on operating systems using + EBCDIC or any other character set for file names, the name + must be translated to the ISO LATIN-1 character set. This + is the original name of the file being compressed, with any + directory components removed, and, if the file being + compressed is on a file system with case insensitive names, + forced to lower case. There is no original file name if the + data was compressed from a source other than a named file; + for example, if the source was stdin on a Unix system, there + is no file name. + + If FCOMMENT is set, a zero-terminated file comment is + present. This comment is not interpreted; it is only + intended for human consumption. The comment must consist of + ISO 8859-1 (LATIN-1) characters. Line breaks should be + denoted by a single line feed character (10 decimal). + + Reserved FLG bits must be zero. + + MTIME (Modification TIME) + This gives the most recent modification time of the original + file being compressed. The time is in Unix format, i.e., + seconds since 00:00:00 GMT, Jan. 1, 1970. (Note that this + may cause problems for MS-DOS and other systems that use + local rather than Universal time.) If the compressed data + did not come from a file, MTIME is set to the time at which + compression started. MTIME = 0 means no time stamp is + available. + + XFL (eXtra FLags) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + XFL = 2 - compressor used maximum compression, + slowest algorithm + XFL = 4 - compressor used fastest algorithm + + OS (Operating System) + This identifies the type of file system on which compression + took place. This may be useful in determining end-of-line + convention for text files. The currently defined values are + as follows: + + + + + + +Deutsch Informational [Page 7] + +RFC 1952 GZIP File Format Specification May 1996 + + + 0 - FAT filesystem (MS-DOS, OS/2, NT/Win32) + 1 - Amiga + 2 - VMS (or OpenVMS) + 3 - Unix + 4 - VM/CMS + 5 - Atari TOS + 6 - HPFS filesystem (OS/2, NT) + 7 - Macintosh + 8 - Z-System + 9 - CP/M + 10 - TOPS-20 + 11 - NTFS filesystem (NT) + 12 - QDOS + 13 - Acorn RISCOS + 255 - unknown + + XLEN (eXtra LENgth) + If FLG.FEXTRA is set, this gives the length of the optional + extra field. See below for details. + + CRC32 (CRC-32) + This contains a Cyclic Redundancy Check value of the + uncompressed data computed according to CRC-32 algorithm + used in the ISO 3309 standard and in section 8.1.1.6.2 of + ITU-T recommendation V.42. (See http://www.iso.ch for + ordering ISO documents. See gopher://info.itu.ch for an + online version of ITU-T V.42.) + + ISIZE (Input SIZE) + This contains the size of the original (uncompressed) input + data modulo 2^32. + + 2.3.1.1. Extra field + + If the FLG.FEXTRA bit is set, an "extra field" is present in + the header, with total length XLEN bytes. It consists of a + series of subfields, each of the form: + + +---+---+---+---+==================================+ + |SI1|SI2| LEN |... LEN bytes of subfield data ...| + +---+---+---+---+==================================+ + + SI1 and SI2 provide a subfield ID, typically two ASCII letters + with some mnemonic value. Jean-Loup Gailly + is maintaining a registry of subfield + IDs; please send him any subfield ID you wish to use. Subfield + IDs with SI2 = 0 are reserved for future use. The following + IDs are currently defined: + + + +Deutsch Informational [Page 8] + +RFC 1952 GZIP File Format Specification May 1996 + + + SI1 SI2 Data + ---------- ---------- ---- + 0x41 ('A') 0x70 ('P') Apollo file type information + + LEN gives the length of the subfield data, excluding the 4 + initial bytes. + + 2.3.1.2. Compliance + + A compliant compressor must produce files with correct ID1, + ID2, CM, CRC32, and ISIZE, but may set all the other fields in + the fixed-length part of the header to default values (255 for + OS, 0 for all others). The compressor must set all reserved + bits to zero. + + A compliant decompressor must check ID1, ID2, and CM, and + provide an error indication if any of these have incorrect + values. It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC + at least so it can skip over the optional fields if they are + present. It need not examine any other part of the header or + trailer; in particular, a decompressor may ignore FTEXT and OS + and always produce binary output, and still be compliant. A + compliant decompressor must give an error indication if any + reserved bit is non-zero, since such a bit could indicate the + presence of a new field that would cause subsequent data to be + interpreted incorrectly. + +3. References + + [1] "Information Processing - 8-bit single-byte coded graphic + character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987). + The ISO 8859-1 (Latin-1) character set is a superset of 7-bit + ASCII. Files defining this character set are available as + iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/ + + [2] ISO 3309 + + [3] ITU-T recommendation V.42 + + [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in + ftp://prep.ai.mit.edu/pub/gnu/ + + [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table + Look-Up", Communications of the ACM, 31(8), pp.1008-1013. + + + + +Deutsch Informational [Page 9] + +RFC 1952 GZIP File Format Specification May 1996 + + + [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal, + pp.118-133. + + [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt, + describing the CRC concept. + +4. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data, such as by + setting and checking the CRC-32 check value. + +5. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler, + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +6. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + +Deutsch Informational [Page 10] + +RFC 1952 GZIP File Format Specification May 1996 + + +7. Appendix: Jean-Loup Gailly's gzip utility + + The most widely used implementation of gzip compression, and the + original documentation on which this specification is based, were + created by Jean-Loup Gailly . Since this + implementation is a de facto standard, we mention some more of its + features here. Again, the material in this section is not part of + the specification per se, and implementations need not follow it to + be compliant. + + When compressing or decompressing a file, gzip preserves the + protection, ownership, and modification time attributes on the local + file system, since there is no provision for representing protection + attributes in the gzip file format itself. Since the file format + includes a modification time, the gzip decompressor provides a + command line switch that assigns the modification time from the file, + rather than the local modification time of the compressed input, to + the decompressed output. + +8. Appendix: Sample CRC Code + + The following sample code represents a practical implementation of + the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42 + for a formal specification.) + + The sample code is in the ANSI C programming language. Non C users + may find it easier to read with these hints: + + & Bitwise AND operator. + ^ Bitwise exclusive-OR operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero + bit(s) at the left. + ! Logical NOT operator. + ++ "n++" increments the variable n. + 0xNNN 0x introduces a hexadecimal (base 16) constant. + Suffix L indicates a long value (at least 32 bits). + + /* Table of CRCs of all 8-bit messages. */ + unsigned long crc_table[256]; + + /* Flag: has the table been computed? Initially false. */ + int crc_table_computed = 0; + + /* Make the table for a fast CRC. */ + void make_crc_table(void) + { + unsigned long c; + + + +Deutsch Informational [Page 11] + +RFC 1952 GZIP File Format Specification May 1996 + + + int n, k; + for (n = 0; n < 256; n++) { + c = (unsigned long) n; + for (k = 0; k < 8; k++) { + if (c & 1) { + c = 0xedb88320L ^ (c >> 1); + } else { + c = c >> 1; + } + } + crc_table[n] = c; + } + crc_table_computed = 1; + } + + /* + Update a running crc with the bytes buf[0..len-1] and return + the updated crc. The crc should be initialized to zero. Pre- and + post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the caller. Usage example: + + unsigned long crc = 0L; + + while (read_buffer(buffer, length) != EOF) { + crc = update_crc(crc, buffer, length); + } + if (crc != original_crc) error(); + */ + unsigned long update_crc(unsigned long crc, + unsigned char *buf, int len) + { + unsigned long c = crc ^ 0xffffffffL; + int n; + + if (!crc_table_computed) + make_crc_table(); + for (n = 0; n < len; n++) { + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c ^ 0xffffffffL; + } + + /* Return the CRC of the bytes buf[0..len-1]. */ + unsigned long crc(unsigned char *buf, int len) + { + return update_crc(0L, buf, len); + } + + + + +Deutsch Informational [Page 12] + diff --git a/third_party/zlib/doc/txtvsbin.txt b/third_party/zlib/doc/txtvsbin.txt new file mode 100644 index 00000000..3d0f0634 --- /dev/null +++ b/third_party/zlib/doc/txtvsbin.txt @@ -0,0 +1,107 @@ +A Fast Method for Identifying Plain Text Files +============================================== + + +Introduction +------------ + +Given a file coming from an unknown source, it is sometimes desirable +to find out whether the format of that file is plain text. Although +this may appear like a simple task, a fully accurate detection of the +file type requires heavy-duty semantic analysis on the file contents. +It is, however, possible to obtain satisfactory results by employing +various heuristics. + +Previous versions of PKZip and other zip-compatible compression tools +were using a crude detection scheme: if more than 80% (4/5) of the bytes +found in a certain buffer are within the range [7..127], the file is +labeled as plain text, otherwise it is labeled as binary. A prominent +limitation of this scheme is the restriction to Latin-based alphabets. +Other alphabets, like Greek, Cyrillic or Asian, make extensive use of +the bytes within the range [128..255], and texts using these alphabets +are most often misidentified by this scheme; in other words, the rate +of false negatives is sometimes too high, which means that the recall +is low. Another weakness of this scheme is a reduced precision, due to +the false positives that may occur when binary files containing large +amounts of textual characters are misidentified as plain text. + +In this article we propose a new, simple detection scheme that features +a much increased precision and a near-100% recall. This scheme is +designed to work on ASCII, Unicode and other ASCII-derived alphabets, +and it handles single-byte encodings (ISO-8859, MacRoman, KOI8, etc.) +and variable-sized encodings (ISO-2022, UTF-8, etc.). Wider encodings +(UCS-2/UTF-16 and UCS-4/UTF-32) are not handled, however. + + +The Algorithm +------------- + +The algorithm works by dividing the set of bytecodes [0..255] into three +categories: +- The white list of textual bytecodes: + 9 (TAB), 10 (LF), 13 (CR), 32 (SPACE) to 255. +- The gray list of tolerated bytecodes: + 7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB), 27 (ESC). +- The black list of undesired, non-textual bytecodes: + 0 (NUL) to 6, 14 to 31. + +If a file contains at least one byte that belongs to the white list and +no byte that belongs to the black list, then the file is categorized as +plain text; otherwise, it is categorized as binary. (The boundary case, +when the file is empty, automatically falls into the latter category.) + + +Rationale +--------- + +The idea behind this algorithm relies on two observations. + +The first observation is that, although the full range of 7-bit codes +[0..127] is properly specified by the ASCII standard, most control +characters in the range [0..31] are not used in practice. The only +widely-used, almost universally-portable control codes are 9 (TAB), +10 (LF) and 13 (CR). There are a few more control codes that are +recognized on a reduced range of platforms and text viewers/editors: +7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB) and 27 (ESC); but these +codes are rarely (if ever) used alone, without being accompanied by +some printable text. Even the newer, portable text formats such as +XML avoid using control characters outside the list mentioned here. + +The second observation is that most of the binary files tend to contain +control characters, especially 0 (NUL). Even though the older text +detection schemes observe the presence of non-ASCII codes from the range +[128..255], the precision rarely has to suffer if this upper range is +labeled as textual, because the files that are genuinely binary tend to +contain both control characters and codes from the upper range. On the +other hand, the upper range needs to be labeled as textual, because it +is used by virtually all ASCII extensions. In particular, this range is +used for encoding non-Latin scripts. + +Since there is no counting involved, other than simply observing the +presence or the absence of some byte values, the algorithm produces +consistent results, regardless what alphabet encoding is being used. +(If counting were involved, it could be possible to obtain different +results on a text encoded, say, using ISO-8859-16 versus UTF-8.) + +There is an extra category of plain text files that are "polluted" with +one or more black-listed codes, either by mistake or by peculiar design +considerations. In such cases, a scheme that tolerates a small fraction +of black-listed codes would provide an increased recall (i.e. more true +positives). This, however, incurs a reduced precision overall, since +false positives are more likely to appear in binary files that contain +large chunks of textual data. Furthermore, "polluted" plain text should +be regarded as binary by general-purpose text detection schemes, because +general-purpose text processing algorithms might not be applicable. +Under this premise, it is safe to say that our detection method provides +a near-100% recall. + +Experiments have been run on many files coming from various platforms +and applications. We tried plain text files, system logs, source code, +formatted office documents, compiled object code, etc. The results +confirm the optimistic assumptions about the capabilities of this +algorithm. + + +-- +Cosmin Truta +Last updated: 2006-May-28 diff --git a/third_party/zlib/examples/README.examples b/third_party/zlib/examples/README.examples new file mode 100644 index 00000000..56a31714 --- /dev/null +++ b/third_party/zlib/examples/README.examples @@ -0,0 +1,49 @@ +This directory contains examples of the use of zlib and other relevant +programs and documentation. + +enough.c + calculation and justification of ENOUGH parameter in inftrees.h + - calculates the maximum table space used in inflate tree + construction over all possible Huffman codes + +fitblk.c + compress just enough input to nearly fill a requested output size + - zlib isn't designed to do this, but fitblk does it anyway + +gun.c + uncompress a gzip file + - illustrates the use of inflateBack() for high speed file-to-file + decompression using call-back functions + - is approximately twice as fast as gzip -d + - also provides Unix uncompress functionality, again twice as fast + +gzappend.c + append to a gzip file + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of deflatePrime() to start at any bit + +gzjoin.c + join gzip files without recalculating the crc or recompressing + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of crc32_combine() + +gzlog.c +gzlog.h + efficiently and robustly maintain a message log file in gzip format + - illustrates use of raw deflate, Z_PARTIAL_FLUSH, deflatePrime(), + and deflateSetDictionary() + - illustrates use of a gzip header extra field + +zlib_how.html + painfully comprehensive description of zpipe.c (see below) + - describes in excruciating detail the use of deflate() and inflate() + +zpipe.c + reads and writes zlib streams from stdin to stdout + - illustrates the proper use of deflate() and inflate() + - deeply commented in zlib_how.html (see above) + +zran.c + index a zlib or gzip stream and randomly access it + - illustrates the use of Z_BLOCK, inflatePrime(), and + inflateSetDictionary() to provide random access diff --git a/third_party/zlib/examples/enough.c b/third_party/zlib/examples/enough.c new file mode 100644 index 00000000..b9911443 --- /dev/null +++ b/third_party/zlib/examples/enough.c @@ -0,0 +1,572 @@ +/* enough.c -- determine the maximum size of inflate's Huffman code tables over + * all possible valid and complete Huffman codes, subject to a length limit. + * Copyright (C) 2007, 2008, 2012 Mark Adler + * Version 1.4 18 August 2012 Mark Adler + */ + +/* Version history: + 1.0 3 Jan 2007 First version (derived from codecount.c version 1.4) + 1.1 4 Jan 2007 Use faster incremental table usage computation + Prune examine() search on previously visited states + 1.2 5 Jan 2007 Comments clean up + As inflate does, decrease root for short codes + Refuse cases where inflate would increase root + 1.3 17 Feb 2008 Add argument for initial root table size + Fix bug for initial root table size == max - 1 + Use a macro to compute the history index + 1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!) + Clean up comparisons of different types + Clean up code indentation + */ + +/* + Examine all possible Huffman codes for a given number of symbols and a + maximum code length in bits to determine the maximum table size for zilb's + inflate. Only complete Huffman codes are counted. + + Two codes are considered distinct if the vectors of the number of codes per + length are not identical. So permutations of the symbol assignments result + in the same code for the counting, as do permutations of the assignments of + the bit values to the codes (i.e. only canonical codes are counted). + + We build a code from shorter to longer lengths, determining how many symbols + are coded at each length. At each step, we have how many symbols remain to + be coded, what the last code length used was, and how many bit patterns of + that length remain unused. Then we add one to the code length and double the + number of unused patterns to graduate to the next code length. We then + assign all portions of the remaining symbols to that code length that + preserve the properties of a correct and eventually complete code. Those + properties are: we cannot use more bit patterns than are available; and when + all the symbols are used, there are exactly zero possible bit patterns + remaining. + + The inflate Huffman decoding algorithm uses two-level lookup tables for + speed. There is a single first-level table to decode codes up to root bits + in length (root == 9 in the current inflate implementation). The table + has 1 << root entries and is indexed by the next root bits of input. Codes + shorter than root bits have replicated table entries, so that the correct + entry is pointed to regardless of the bits that follow the short code. If + the code is longer than root bits, then the table entry points to a second- + level table. The size of that table is determined by the longest code with + that root-bit prefix. If that longest code has length len, then the table + has size 1 << (len - root), to index the remaining bits in that set of + codes. Each subsequent root-bit prefix then has its own sub-table. The + total number of table entries required by the code is calculated + incrementally as the number of codes at each bit length is populated. When + all of the codes are shorter than root bits, then root is reduced to the + longest code length, resulting in a single, smaller, one-level table. + + The inflate algorithm also provides for small values of root (relative to + the log2 of the number of symbols), where the shortest code has more bits + than root. In that case, root is increased to the length of the shortest + code. This program, by design, does not handle that case, so it is verified + that the number of symbols is less than 2^(root + 1). + + In order to speed up the examination (by about ten orders of magnitude for + the default arguments), the intermediate states in the build-up of a code + are remembered and previously visited branches are pruned. The memory + required for this will increase rapidly with the total number of symbols and + the maximum code length in bits. However this is a very small price to pay + for the vast speedup. + + First, all of the possible Huffman codes are counted, and reachable + intermediate states are noted by a non-zero count in a saved-results array. + Second, the intermediate states that lead to (root + 1) bit or longer codes + are used to look at all sub-codes from those junctures for their inflate + memory usage. (The amount of memory used is not affected by the number of + codes of root bits or less in length.) Third, the visited states in the + construction of those sub-codes and the associated calculation of the table + size is recalled in order to avoid recalculating from the same juncture. + Beginning the code examination at (root + 1) bit codes, which is enabled by + identifying the reachable nodes, accounts for about six of the orders of + magnitude of improvement for the default arguments. About another four + orders of magnitude come from not revisiting previous states. Out of + approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes + need to be examined to cover all of the possible table memory usage cases + for the default arguments of 286 symbols limited to 15-bit codes. + + Note that an unsigned long long type is used for counting. It is quite easy + to exceed the capacity of an eight-byte integer with a large number of + symbols and a large maximum code length, so multiple-precision arithmetic + would need to replace the unsigned long long arithmetic in that case. This + program will abort if an overflow occurs. The big_t type identifies where + the counting takes place. + + An unsigned long long type is also used for calculating the number of + possible codes remaining at the maximum length. This limits the maximum + code length to the number of bits in a long long minus the number of bits + needed to represent the symbols in a flat code. The code_t type identifies + where the bit pattern counting takes place. + */ + +#include +#include +#include +#include + +#define local static + +/* special data types */ +typedef unsigned long long big_t; /* type for code counting */ +typedef unsigned long long code_t; /* type for bit pattern counting */ +struct tab { /* type for been here check */ + size_t len; /* length of bit vector in char's */ + char *vec; /* allocated bit vector */ +}; + +/* The array for saving results, num[], is indexed with this triplet: + + syms: number of symbols remaining to code + left: number of available bit patterns at length len + len: number of bits in the codes currently being assigned + + Those indices are constrained thusly when saving results: + + syms: 3..totsym (totsym == total symbols to code) + left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) + len: 1..max - 1 (max == maximum code length in bits) + + syms == 2 is not saved since that immediately leads to a single code. left + must be even, since it represents the number of available bit patterns at + the current length, which is double the number at the previous length. + left ends at syms-1 since left == syms immediately results in a single code. + (left > sym is not allowed since that would result in an incomplete code.) + len is less than max, since the code completes immediately when len == max. + + The offset into the array is calculated for the three indices with the + first one (syms) being outermost, and the last one (len) being innermost. + We build the array with length max-1 lists for the len index, with syms-3 + of those for each symbol. There are totsym-2 of those, with each one + varying in length as a function of sym. See the calculation of index in + count() for the index, and the calculation of size in main() for the size + of the array. + + For the deflate example of 286 symbols limited to 15-bit codes, the array + has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than + half of the space allocated for saved results is actually used -- not all + possible triplets are reached in the generation of valid Huffman codes. + */ + +/* The array for tracking visited states, done[], is itself indexed identically + to the num[] array as described above for the (syms, left, len) triplet. + Each element in the array is further indexed by the (mem, rem) doublet, + where mem is the amount of inflate table space used so far, and rem is the + remaining unused entries in the current inflate sub-table. Each indexed + element is simply one bit indicating whether the state has been visited or + not. Since the ranges for mem and rem are not known a priori, each bit + vector is of a variable size, and grows as needed to accommodate the visited + states. mem and rem are used to calculate a single index in a triangular + array. Since the range of mem is expected in the default case to be about + ten times larger than the range of rem, the array is skewed to reduce the + memory usage, with eight times the range for mem than for rem. See the + calculations for offset and bit in beenhere() for the details. + + For the deflate example of 286 symbols limited to 15-bit codes, the bit + vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[] + array itself. + */ + +/* Globals to avoid propagating constants or constant pointers recursively */ +local int max; /* maximum allowed bit length for the codes */ +local int root; /* size of base code table in bits */ +local int large; /* largest code table so far */ +local size_t size; /* number of elements in num and done */ +local int *code; /* number of symbols assigned to each bit length */ +local big_t *num; /* saved results array for code counting */ +local struct tab *done; /* states already evaluated array */ + +/* Index function for num[] and done[] */ +#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1) + +/* Free allocated space. Uses globals code, num, and done. */ +local void cleanup(void) +{ + size_t n; + + if (done != NULL) { + for (n = 0; n < size; n++) + if (done[n].len) + free(done[n].vec); + free(done); + } + if (num != NULL) + free(num); + if (code != NULL) + free(code); +} + +/* Return the number of possible Huffman codes using bit patterns of lengths + len through max inclusive, coding syms symbols, with left bit patterns of + length len unused -- return -1 if there is an overflow in the counting. + Keep a record of previous results in num to prevent repeating the same + calculation. Uses the globals max and num. */ +local big_t count(int syms, int len, int left) +{ + big_t sum; /* number of possible codes from this juncture */ + big_t got; /* value returned from count() */ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + size_t index; /* index of this case in *num */ + + /* see if only one possible code */ + if (syms == left) + return 1; + + /* note and verify the expected state */ + assert(syms > left && left > 0 && len < max); + + /* see if we've done this one already */ + index = INDEX(syms, left, len); + got = num[index]; + if (got) + return got; /* we have -- return the saved result */ + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* count all possible codes from this juncture and add them up */ + sum = 0; + for (use = least; use <= most; use++) { + got = count(syms - use, len + 1, (left - use) << 1); + sum += got; + if (got == (big_t)0 - 1 || sum < got) /* overflow */ + return (big_t)0 - 1; + } + + /* verify that all recursive calls are productive */ + assert(sum != 0); + + /* save the result and return it */ + num[index] = sum; + return sum; +} + +/* Return true if we've been here before, set to true if not. Set a bit in a + bit vector to indicate visiting this state. Each (syms,len,left) state + has a variable size bit vector indexed by (mem,rem). The bit vector is + lengthened if needed to allow setting the (mem,rem) bit. */ +local int beenhere(int syms, int len, int left, int mem, int rem) +{ + size_t index; /* index for this state's bit vector */ + size_t offset; /* offset in this state's bit vector */ + int bit; /* mask for this state's bit */ + size_t length; /* length of the bit vector in bytes */ + char *vector; /* new or enlarged bit vector */ + + /* point to vector for (syms,left,len), bit in vector for (mem,rem) */ + index = INDEX(syms, left, len); + mem -= 1 << root; + offset = (mem >> 3) + rem; + offset = ((offset * (offset + 1)) >> 1) + rem; + bit = 1 << (mem & 7); + + /* see if we've been here */ + length = done[index].len; + if (offset < length && (done[index].vec[offset] & bit) != 0) + return 1; /* done this! */ + + /* we haven't been here before -- set the bit to show we have now */ + + /* see if we need to lengthen the vector in order to set the bit */ + if (length <= offset) { + /* if we have one already, enlarge it, zero out the appended space */ + if (length) { + do { + length <<= 1; + } while (length <= offset); + vector = realloc(done[index].vec, length); + if (vector != NULL) + memset(vector + done[index].len, 0, length - done[index].len); + } + + /* otherwise we need to make a new vector and zero it out */ + else { + length = 1 << (len - root); + while (length <= offset) + length <<= 1; + vector = calloc(length, sizeof(char)); + } + + /* in either case, bail if we can't get the memory */ + if (vector == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + exit(1); + } + + /* install the new vector */ + done[index].len = length; + done[index].vec = vector; + } + + /* set the bit */ + done[index].vec[offset] |= bit; + return 0; +} + +/* Examine all possible codes from the given node (syms, len, left). Compute + the amount of memory required to build inflate's decoding tables, where the + number of code structures used so far is mem, and the number remaining in + the current sub-table is rem. Uses the globals max, code, root, large, and + done. */ +local void examine(int syms, int len, int left, int mem, int rem) +{ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + + /* see if we have a complete code */ + if (syms == left) { + /* set the last code entry */ + code[len] = left; + + /* complete computation of memory used by this code */ + while (rem < left) { + left -= rem; + rem = 1 << (len - root); + mem += rem; + } + assert(rem == left); + + /* if this is a new maximum, show the entries used and the sub-code */ + if (mem > large) { + large = mem; + printf("max %d: ", mem); + for (use = root + 1; use <= max; use++) + if (code[use]) + printf("%d[%d] ", code[use], use); + putchar('\n'); + fflush(stdout); + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; + return; + } + + /* prune the tree if we can */ + if (beenhere(syms, len, left, mem, rem)) + return; + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* occupy least table spaces, creating new sub-tables as needed */ + use = least; + while (rem < use) { + use -= rem; + rem = 1 << (len - root); + mem += rem; + } + rem -= use; + + /* examine codes from here, updating table space as we go */ + for (use = least; use <= most; use++) { + code[len] = use; + examine(syms - use, len + 1, (left - use) << 1, + mem + (rem ? 1 << (len - root) : 0), rem << 1); + if (rem == 0) { + rem = 1 << (len - root); + mem += rem; + } + rem--; + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; +} + +/* Look at all sub-codes starting with root + 1 bits. Look at only the valid + intermediate code states (syms, left, len). For each completed code, + calculate the amount of memory required by inflate to build the decoding + tables. Find the maximum amount of memory required and show the code that + requires that maximum. Uses the globals max, root, and num. */ +local void enough(int syms) +{ + int n; /* number of remaing symbols for this node */ + int left; /* number of unused bit patterns at this length */ + size_t index; /* index of this case in *num */ + + /* clear code */ + for (n = 0; n <= max; n++) + code[n] = 0; + + /* look at all (root + 1) bit and longer codes */ + large = 1 << root; /* base table */ + if (root < max) /* otherwise, there's only a base table */ + for (n = 3; n <= syms; n++) + for (left = 2; left < n; left += 2) + { + /* look at all reachable (root + 1) bit nodes, and the + resulting codes (complete at root + 2 or more) */ + index = INDEX(n, left, root + 1); + if (root + 1 < max && num[index]) /* reachable node */ + examine(n, root + 1, left, 1 << root, 0); + + /* also look at root bit codes with completions at root + 1 + bits (not saved in num, since complete), just in case */ + if (num[index - 1] && n <= left << 1) + examine((n - left) << 1, root + 1, (n - left) << 1, + 1 << root, 0); + } + + /* done */ + printf("done: maximum of %d table entries\n", large); +} + +/* + Examine and show the total number of possible Huffman codes for a given + maximum number of symbols, initial root table size, and maximum code length + in bits -- those are the command arguments in that order. The default + values are 286, 9, and 15 respectively, for the deflate literal/length code. + The possible codes are counted for each number of coded symbols from two to + the maximum. The counts for each of those and the total number of codes are + shown. The maximum number of inflate table entires is then calculated + across all possible codes. Each new maximum number of table entries and the + associated sub-code (starting at root + 1 == 10 bits) is shown. + + To count and examine Huffman codes that are not length-limited, provide a + maximum length equal to the number of symbols minus one. + + For the deflate literal/length code, use "enough". For the deflate distance + code, use "enough 30 6". + + This uses the %llu printf format to print big_t numbers, which assumes that + big_t is an unsigned long long. If the big_t type is changed (for example + to a multiple precision type), the method of printing will also need to be + updated. + */ +int main(int argc, char **argv) +{ + int syms; /* total number of symbols to code */ + int n; /* number of symbols to code for this run */ + big_t got; /* return value of count() */ + big_t sum; /* accumulated number of codes over n */ + code_t word; /* for counting bits in code_t */ + + /* set up globals for cleanup() */ + code = NULL; + num = NULL; + done = NULL; + + /* get arguments -- default to the deflate literal/length code */ + syms = 286; + root = 9; + max = 15; + if (argc > 1) { + syms = atoi(argv[1]); + if (argc > 2) { + root = atoi(argv[2]); + if (argc > 3) + max = atoi(argv[3]); + } + } + if (argc > 4 || syms < 2 || root < 1 || max < 1) { + fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", + stderr); + return 1; + } + + /* if not restricting the code length, the longest is syms - 1 */ + if (max > syms - 1) + max = syms - 1; + + /* determine the number of bits in a code_t */ + for (n = 0, word = 1; word; n++, word <<= 1) + ; + + /* make sure that the calculation of most will not overflow */ + if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) { + fputs("abort: code length too long for internal types\n", stderr); + return 1; + } + + /* reject impossible code requests */ + if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) { + fprintf(stderr, "%d symbols cannot be coded in %d bits\n", + syms, max); + return 1; + } + + /* allocate code vector */ + code = calloc(max + 1, sizeof(int)); + if (code == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + return 1; + } + + /* determine size of saved results array, checking for overflows, + allocate and clear the array (set all to zero with calloc()) */ + if (syms == 2) /* iff max == 1 */ + num = NULL; /* won't be saving any results */ + else { + size = syms >> 1; + if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) || + (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) || + (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) || + (num = calloc(size, sizeof(big_t))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + } + + /* count possible codes for all numbers of symbols, add up counts */ + sum = 0; + for (n = 2; n <= syms; n++) { + got = count(n, 1, 2); + sum += got; + if (got == (big_t)0 - 1 || sum < got) { /* overflow */ + fputs("abort: can't count that high!\n", stderr); + cleanup(); + return 1; + } + printf("%llu %d-codes\n", got, n); + } + printf("%llu total codes for 2 to %d symbols", sum, syms); + if (max < syms - 1) + printf(" (%d-bit length limit)\n", max); + else + puts(" (no length limit)"); + + /* allocate and clear done array for beenhere() */ + if (syms == 2) + done = NULL; + else if (size > ((size_t)0 - 1) / sizeof(struct tab) || + (done = calloc(size, sizeof(struct tab))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + + /* find and show maximum inflate table usage */ + if (root > max) /* reduce root to max length */ + root = max; + if ((code_t)syms < ((code_t)1 << (root + 1))) + enough(syms); + else + puts("cannot handle minimum code lengths > root"); + + /* done */ + cleanup(); + return 0; +} diff --git a/third_party/zlib/examples/fitblk.c b/third_party/zlib/examples/fitblk.c new file mode 100644 index 00000000..c61de5c9 --- /dev/null +++ b/third_party/zlib/examples/fitblk.c @@ -0,0 +1,233 @@ +/* fitblk.c: example of fitting compressed output to a specified size + Not copyrighted -- provided to the public domain + Version 1.1 25 November 2004 Mark Adler */ + +/* Version history: + 1.0 24 Nov 2004 First version + 1.1 25 Nov 2004 Change deflateInit2() to deflateInit() + Use fixed-size, stack-allocated raw buffers + Simplify code moving compression to subroutines + Use assert() for internal errors + Add detailed description of approach + */ + +/* Approach to just fitting a requested compressed size: + + fitblk performs three compression passes on a portion of the input + data in order to determine how much of that input will compress to + nearly the requested output block size. The first pass generates + enough deflate blocks to produce output to fill the requested + output size plus a specfied excess amount (see the EXCESS define + below). The last deflate block may go quite a bit past that, but + is discarded. The second pass decompresses and recompresses just + the compressed data that fit in the requested plus excess sized + buffer. The deflate process is terminated after that amount of + input, which is less than the amount consumed on the first pass. + The last deflate block of the result will be of a comparable size + to the final product, so that the header for that deflate block and + the compression ratio for that block will be about the same as in + the final product. The third compression pass decompresses the + result of the second step, but only the compressed data up to the + requested size minus an amount to allow the compressed stream to + complete (see the MARGIN define below). That will result in a + final compressed stream whose length is less than or equal to the + requested size. Assuming sufficient input and a requested size + greater than a few hundred bytes, the shortfall will typically be + less than ten bytes. + + If the input is short enough that the first compression completes + before filling the requested output size, then that compressed + stream is return with no recompression. + + EXCESS is chosen to be just greater than the shortfall seen in a + two pass approach similar to the above. That shortfall is due to + the last deflate block compressing more efficiently with a smaller + header on the second pass. EXCESS is set to be large enough so + that there is enough uncompressed data for the second pass to fill + out the requested size, and small enough so that the final deflate + block of the second pass will be close in size to the final deflate + block of the third and final pass. MARGIN is chosen to be just + large enough to assure that the final compression has enough room + to complete in all cases. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +/* print nastygram and leave */ +local void quit(char *why) +{ + fprintf(stderr, "fitblk abort: %s\n", why); + exit(1); +} + +#define RAWLEN 4096 /* intermediate uncompressed buffer size */ + +/* compress from file to def until provided buffer is full or end of + input reached; return last deflate() return value, or Z_ERRNO if + there was read error on the file */ +local int partcompress(FILE *in, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + def->avail_in = fread(raw, 1, RAWLEN, in); + if (ferror(in)) + return Z_ERRNO; + def->next_in = raw; + if (feof(in)) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (def->avail_out != 0 && flush == Z_NO_FLUSH); + return ret; +} + +/* recompress from inf's input to def's output; the input for inf and + the output for def are set in those structures before calling; + return last deflate() return value, or Z_MEM_ERROR if inflate() + was not able to allocate enough memory when it needed to */ +local int recompress(z_streamp inf, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + /* decompress */ + inf->avail_out = RAWLEN; + inf->next_out = raw; + ret = inflate(inf, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR && + ret != Z_NEED_DICT); + if (ret == Z_MEM_ERROR) + return ret; + + /* compress what was decompresed until done or no room */ + def->avail_in = RAWLEN - inf->avail_out; + def->next_in = raw; + if (inf->avail_out != 0) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (ret != Z_STREAM_END && def->avail_out != 0); + return ret; +} + +#define EXCESS 256 /* empirically determined stream overage */ +#define MARGIN 8 /* amount to back off for completion */ + +/* compress from stdin to fixed-size block on stdout */ +int main(int argc, char **argv) +{ + int ret; /* return code */ + unsigned size; /* requested fixed output block size */ + unsigned have; /* bytes written by deflate() call */ + unsigned char *blk; /* intermediate and final stream */ + unsigned char *tmp; /* close to desired size stream */ + z_stream def, inf; /* zlib deflate and inflate states */ + + /* get requested output size */ + if (argc != 2) + quit("need one argument: size of output block"); + ret = strtol(argv[1], argv + 1, 10); + if (argv[1][0] != 0) + quit("argument must be a number"); + if (ret < 8) /* 8 is minimum zlib stream size */ + quit("need positive size of 8 or greater"); + size = (unsigned)ret; + + /* allocate memory for buffers and compression engine */ + blk = malloc(size + EXCESS); + def.zalloc = Z_NULL; + def.zfree = Z_NULL; + def.opaque = Z_NULL; + ret = deflateInit(&def, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK || blk == NULL) + quit("out of memory"); + + /* compress from stdin until output full, or no more input */ + def.avail_out = size + EXCESS; + def.next_out = blk; + ret = partcompress(stdin, &def); + if (ret == Z_ERRNO) + quit("error reading input"); + + /* if it all fit, then size was undersubscribed -- done! */ + if (ret == Z_STREAM_END && def.avail_out >= EXCESS) { + /* write block to stdout */ + have = size + EXCESS - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (all input)\n", + size - have, size); + return 0; + } + + /* it didn't all fit -- set up for recompression */ + inf.zalloc = Z_NULL; + inf.zfree = Z_NULL; + inf.opaque = Z_NULL; + inf.avail_in = 0; + inf.next_in = Z_NULL; + ret = inflateInit(&inf); + tmp = malloc(size + EXCESS); + if (ret != Z_OK || tmp == NULL) + quit("out of memory"); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do first recompression close to the right amount */ + inf.avail_in = size + EXCESS; + inf.next_in = blk; + def.avail_out = size + EXCESS; + def.next_out = tmp; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + + /* set up for next reocmpression */ + ret = inflateReset(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do second and final recompression (third compression) */ + inf.avail_in = size - MARGIN; /* assure stream will complete */ + inf.next_in = tmp; + def.avail_out = size; + def.next_out = blk; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */ + + /* done -- write block to stdout */ + have = size - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + free(tmp); + ret = inflateEnd(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (%lu input)\n", + size - have, size, def.total_in); + return 0; +} diff --git a/third_party/zlib/examples/gun.c b/third_party/zlib/examples/gun.c new file mode 100644 index 00000000..be44fa51 --- /dev/null +++ b/third_party/zlib/examples/gun.c @@ -0,0 +1,702 @@ +/* gun.c -- simple gunzip to give an example of the use of inflateBack() + * Copyright (C) 2003, 2005, 2008, 2010, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.7 12 August 2012 Mark Adler */ + +/* Version history: + 1.0 16 Feb 2003 First version for testing of inflateBack() + 1.1 21 Feb 2005 Decompress concatenated gzip streams + Remove use of "this" variable (C++ keyword) + Fix return value for in() + Improve allocation failure checking + Add typecasting for void * structures + Add -h option for command version and usage + Add a bunch of comments + 1.2 20 Mar 2005 Add Unix compress (LZW) decompression + Copy file attributes from input file to output file + 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] + 1.4 8 Dec 2006 LZW decompression speed improvements + 1.5 9 Feb 2008 Avoid warning in latest version of gcc + 1.6 17 Jan 2010 Avoid signed/unsigned comparison warnings + 1.7 12 Aug 2012 Update for z_const usage in zlib 1.2.8 + */ + +/* + gun [ -t ] [ name ... ] + + decompresses the data in the named gzip files. If no arguments are given, + gun will decompress from stdin to stdout. The names must end in .gz, -gz, + .z, -z, _z, or .Z. The uncompressed data will be written to a file name + with the suffix stripped. On success, the original file is deleted. On + failure, the output file is deleted. For most failures, the command will + continue to process the remaining names on the command line. A memory + allocation failure will abort the command. If -t is specified, then the + listed files or stdin will be tested as gzip files for integrity (without + checking for a proper suffix), no output will be written, and no files + will be deleted. + + Like gzip, gun allows concatenated gzip streams and will decompress them, + writing all of the uncompressed data to the output. Unlike gzip, gun allows + an empty file on input, and will produce no error writing an empty output + file. + + gun will also decompress files made by Unix compress, which uses LZW + compression. These files are automatically detected by virtue of their + magic header bytes. Since the end of Unix compress stream is marked by the + end-of-file, they cannot be concantenated. If a Unix compress stream is + encountered in an input file, it is the last stream in that file. + + Like gunzip and uncompress, the file attributes of the original compressed + file are maintained in the final uncompressed file, to the extent that the + user permissions allow it. + + On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version + 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the + LZW decompression provided by gun is about twice as fast as the standard + Unix uncompress command. + */ + +/* external functions and related types and constants */ +#include /* fprintf() */ +#include /* malloc(), free() */ +#include /* strerror(), strcmp(), strlen(), memcpy() */ +#include /* errno */ +#include /* open() */ +#include /* read(), write(), close(), chown(), unlink() */ +#include +#include /* stat(), chmod() */ +#include /* utime() */ +#include "zlib.h" /* inflateBackInit(), inflateBack(), */ + /* inflateBackEnd(), crc32() */ + +/* function declaration */ +#define local static + +/* buffer constants */ +#define SIZE 32768U /* input and output buffer sizes */ +#define PIECE 16384 /* limits i/o chunks for 16-bit int case */ + +/* structure for infback() to pass to input function in() -- it maintains the + input file and a buffer of size SIZE */ +struct ind { + int infile; + unsigned char *inbuf; +}; + +/* Load input buffer, assumed to be empty, and return bytes loaded and a + pointer to them. read() is called until the buffer is full, or until it + returns end-of-file or error. Return 0 on error. */ +local unsigned in(void *in_desc, z_const unsigned char **buf) +{ + int ret; + unsigned len; + unsigned char *next; + struct ind *me = (struct ind *)in_desc; + + next = me->inbuf; + *buf = next; + len = 0; + do { + ret = PIECE; + if ((unsigned)ret > SIZE - len) + ret = (int)(SIZE - len); + ret = (int)read(me->infile, next, ret); + if (ret == -1) { + len = 0; + break; + } + next += ret; + len += ret; + } while (ret != 0 && len < SIZE); + return len; +} + +/* structure for infback() to pass to output function out() -- it maintains the + output file, a running CRC-32 check on the output and the total number of + bytes output, both for checking against the gzip trailer. (The length in + the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and + the output is greater than 4 GB.) */ +struct outd { + int outfile; + int check; /* true if checking crc and total */ + unsigned long crc; + unsigned long total; +}; + +/* Write output buffer and update the CRC-32 and total bytes written. write() + is called until all of the output is written or an error is encountered. + On success out() returns 0. For a write failure, out() returns 1. If the + output file descriptor is -1, then nothing is written. + */ +local int out(void *out_desc, unsigned char *buf, unsigned len) +{ + int ret; + struct outd *me = (struct outd *)out_desc; + + if (me->check) { + me->crc = crc32(me->crc, buf, len); + me->total += len; + } + if (me->outfile != -1) + do { + ret = PIECE; + if ((unsigned)ret > len) + ret = (int)len; + ret = (int)write(me->outfile, buf, ret); + if (ret == -1) + return 1; + buf += ret; + len -= ret; + } while (len != 0); + return 0; +} + +/* next input byte macro for use inside lunpipe() and gunpipe() */ +#define NEXT() (have ? 0 : (have = in(indp, &next)), \ + last = have ? (have--, (int)(*next++)) : -1) + +/* memory for gunpipe() and lunpipe() -- + the first 256 entries of prefix[] and suffix[] are never used, could + have offset the index, but it's faster to waste the memory */ +unsigned char inbuf[SIZE]; /* input buffer */ +unsigned char outbuf[SIZE]; /* output buffer */ +unsigned short prefix[65536]; /* index to LZW prefix string */ +unsigned char suffix[65536]; /* one-character LZW suffix */ +unsigned char match[65280 + 2]; /* buffer for reversed match or gzip + 32K sliding window */ + +/* throw out what's left in the current bits byte buffer (this is a vestigial + aspect of the compressed data format derived from an implementation that + made use of a special VAX machine instruction!) */ +#define FLUSHCODE() \ + do { \ + left = 0; \ + rem = 0; \ + if (chunk > have) { \ + chunk -= have; \ + have = 0; \ + if (NEXT() == -1) \ + break; \ + chunk--; \ + if (chunk > have) { \ + chunk = have = 0; \ + break; \ + } \ + } \ + have -= chunk; \ + next += chunk; \ + chunk = 0; \ + } while (0) + +/* Decompress a compress (LZW) file from indp to outfile. The compress magic + header (two bytes) has already been read and verified. There are have bytes + of buffered input at next. strm is used for passing error information back + to gunpipe(). + + lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of + file, read error, or write error (a write error indicated by strm->next_in + not equal to Z_NULL), or Z_DATA_ERROR for invalid input. + */ +local int lunpipe(unsigned have, z_const unsigned char *next, struct ind *indp, + int outfile, z_stream *strm) +{ + int last; /* last byte read by NEXT(), or -1 if EOF */ + unsigned chunk; /* bytes left in current chunk */ + int left; /* bits left in rem */ + unsigned rem; /* unused bits from input */ + int bits; /* current bits per code */ + unsigned code; /* code, table traversal index */ + unsigned mask; /* mask for current bits codes */ + int max; /* maximum bits per code for this stream */ + unsigned flags; /* compress flags, then block compress flag */ + unsigned end; /* last valid entry in prefix/suffix tables */ + unsigned temp; /* current code */ + unsigned prev; /* previous code */ + unsigned final; /* last character written for previous code */ + unsigned stack; /* next position for reversed string */ + unsigned outcnt; /* bytes in output buffer */ + struct outd outd; /* output structure */ + unsigned char *p; + + /* set up output */ + outd.outfile = outfile; + outd.check = 0; + + /* process remainder of compress header -- a flags byte */ + flags = NEXT(); + if (last == -1) + return Z_BUF_ERROR; + if (flags & 0x60) { + strm->msg = (char *)"unknown lzw flags set"; + return Z_DATA_ERROR; + } + max = flags & 0x1f; + if (max < 9 || max > 16) { + strm->msg = (char *)"lzw bits out of range"; + return Z_DATA_ERROR; + } + if (max == 9) /* 9 doesn't really mean 9 */ + max = 10; + flags &= 0x80; /* true if block compress */ + + /* clear table */ + bits = 9; + mask = 0x1ff; + end = flags ? 256 : 255; + + /* set up: get first 9-bit code, which is the first decompressed byte, but + don't create a table entry until the next code */ + if (NEXT() == -1) /* no compressed data is ok */ + return Z_OK; + final = prev = (unsigned)last; /* low 8 bits of code */ + if (NEXT() == -1) /* missing a bit */ + return Z_BUF_ERROR; + if (last & 1) { /* code must be < 256 */ + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + rem = (unsigned)last >> 1; /* remaining 7 bits */ + left = 7; + chunk = bits - 2; /* 7 bytes left in this chunk */ + outbuf[0] = (unsigned char)final; /* write first decompressed byte */ + outcnt = 1; + + /* decode codes */ + stack = 0; + for (;;) { + /* if the table will be full after this, increment the code size */ + if (end >= mask && bits < max) { + FLUSHCODE(); + bits++; + mask <<= 1; + mask++; + } + + /* get a code of length bits */ + if (chunk == 0) /* decrement chunk modulo bits */ + chunk = bits; + code = rem; /* low bits of code */ + if (NEXT() == -1) { /* EOF is end of compressed data */ + /* write remaining buffered output */ + if (outcnt && out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + return Z_OK; + } + code += (unsigned)last << left; /* middle (or high) bits of code */ + left += 8; + chunk--; + if (bits > left) { /* need more bits */ + if (NEXT() == -1) /* can't end in middle of code */ + return Z_BUF_ERROR; + code += (unsigned)last << left; /* high bits of code */ + left += 8; + chunk--; + } + code &= mask; /* mask to current code length */ + left -= bits; /* number of unused bits */ + rem = (unsigned)last >> (8 - left); /* unused bits from last byte */ + + /* process clear code (256) */ + if (code == 256 && flags) { + FLUSHCODE(); + bits = 9; /* initialize bits and mask */ + mask = 0x1ff; + end = 255; /* empty table */ + continue; /* get next code */ + } + + /* special code to reuse last match */ + temp = code; /* save the current code */ + if (code > end) { + /* Be picky on the allowed code here, and make sure that the code + we drop through (prev) will be a valid index so that random + input does not cause an exception. The code != end + 1 check is + empirically derived, and not checked in the original uncompress + code. If this ever causes a problem, that check could be safely + removed. Leaving this check in greatly improves gun's ability + to detect random or corrupted input after a compress header. + In any case, the prev > end check must be retained. */ + if (code != end + 1 || prev > end) { + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + match[stack++] = (unsigned char)final; + code = prev; + } + + /* walk through linked list to generate output in reverse order */ + p = match + stack; + while (code >= 256) { + *p++ = suffix[code]; + code = prefix[code]; + } + stack = p - match; + match[stack++] = (unsigned char)code; + final = code; + + /* link new table entry */ + if (end < mask) { + end++; + prefix[end] = (unsigned short)prev; + suffix[end] = (unsigned char)final; + } + + /* set previous code for next iteration */ + prev = temp; + + /* write output in forward order */ + while (stack > SIZE - outcnt) { + while (outcnt < SIZE) + outbuf[outcnt++] = match[--stack]; + if (out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + outcnt = 0; + } + p = match + stack; + do { + outbuf[outcnt++] = *--p; + } while (p > match); + stack = 0; + + /* loop for next code with final and prev as the last match, rem and + left provide the first 0..7 bits of the next code, end is the last + valid table entry */ + } +} + +/* Decompress a gzip file from infile to outfile. strm is assumed to have been + successfully initialized with inflateBackInit(). The input file may consist + of a series of gzip streams, in which case all of them will be decompressed + to the output file. If outfile is -1, then the gzip stream(s) integrity is + checked and nothing is written. + + The return value is a zlib error code: Z_MEM_ERROR if out of memory, + Z_DATA_ERROR if the header or the compressed data is invalid, or if the + trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends + prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip + stream) follows a valid gzip stream. + */ +local int gunpipe(z_stream *strm, int infile, int outfile) +{ + int ret, first, last; + unsigned have, flags, len; + z_const unsigned char *next = NULL; + struct ind ind, *indp; + struct outd outd; + + /* setup input buffer */ + ind.infile = infile; + ind.inbuf = inbuf; + indp = &ind; + + /* decompress concatenated gzip streams */ + have = 0; /* no input data read in yet */ + first = 1; /* looking for first gzip header */ + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + for (;;) { + /* look for the two magic header bytes for a gzip stream */ + if (NEXT() == -1) { + ret = Z_OK; + break; /* empty gzip stream is ok */ + } + if (last != 31 || (NEXT() != 139 && last != 157)) { + strm->msg = (char *)"incorrect header check"; + ret = first ? Z_DATA_ERROR : Z_ERRNO; + break; /* not a gzip or compress header */ + } + first = 0; /* next non-header is junk */ + + /* process a compress (LZW) file -- can't be concatenated after this */ + if (last == 157) { + ret = lunpipe(have, next, indp, outfile, strm); + break; + } + + /* process remainder of gzip header */ + ret = Z_BUF_ERROR; + if (NEXT() != 8) { /* only deflate method allowed */ + if (last == -1) break; + strm->msg = (char *)"unknown compression method"; + ret = Z_DATA_ERROR; + break; + } + flags = NEXT(); /* header flags */ + NEXT(); /* discard mod time, xflgs, os */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); + NEXT(); + if (last == -1) break; + if (flags & 0xe0) { + strm->msg = (char *)"unknown header flags set"; + ret = Z_DATA_ERROR; + break; + } + if (flags & 4) { /* extra field */ + len = NEXT(); + len += (unsigned)(NEXT()) << 8; + if (last == -1) break; + while (len > have) { + len -= have; + have = 0; + if (NEXT() == -1) break; + len--; + } + if (last == -1) break; + have -= len; + next += len; + } + if (flags & 8) /* file name */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 16) /* comment */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + if (last == -1) break; + + /* set up output */ + outd.outfile = outfile; + outd.check = 1; + outd.crc = crc32(0L, Z_NULL, 0); + outd.total = 0; + + /* decompress data to output */ + strm->next_in = next; + strm->avail_in = have; + ret = inflateBack(strm, in, indp, out, &outd); + if (ret != Z_STREAM_END) break; + next = strm->next_in; + have = strm->avail_in; + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + + /* check trailer */ + ret = Z_BUF_ERROR; + if (NEXT() != (int)(outd.crc & 0xff) || + NEXT() != (int)((outd.crc >> 8) & 0xff) || + NEXT() != (int)((outd.crc >> 16) & 0xff) || + NEXT() != (int)((outd.crc >> 24) & 0xff)) { + /* crc error */ + if (last != -1) { + strm->msg = (char *)"incorrect data check"; + ret = Z_DATA_ERROR; + } + break; + } + if (NEXT() != (int)(outd.total & 0xff) || + NEXT() != (int)((outd.total >> 8) & 0xff) || + NEXT() != (int)((outd.total >> 16) & 0xff) || + NEXT() != (int)((outd.total >> 24) & 0xff)) { + /* length error */ + if (last != -1) { + strm->msg = (char *)"incorrect length check"; + ret = Z_DATA_ERROR; + } + break; + } + + /* go back and look for another gzip stream */ + } + + /* clean up and return */ + return ret; +} + +/* Copy file attributes, from -> to, as best we can. This is best effort, so + no errors are reported. The mode bits, including suid, sgid, and the sticky + bit are copied (if allowed), the owner's user id and group id are copied + (again if allowed), and the access and modify times are copied. */ +local void copymeta(char *from, char *to) +{ + struct stat was; + struct utimbuf when; + + /* get all of from's Unix meta data, return if not a regular file */ + if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG) + return; + + /* set to's mode bits, ignore errors */ + (void)chmod(to, was.st_mode & 07777); + + /* copy owner's user and group, ignore errors */ + (void)chown(to, was.st_uid, was.st_gid); + + /* copy access and modify times, ignore errors */ + when.actime = was.st_atime; + when.modtime = was.st_mtime; + (void)utime(to, &when); +} + +/* Decompress the file inname to the file outnname, of if test is true, just + decompress without writing and check the gzip trailer for integrity. If + inname is NULL or an empty string, read from stdin. If outname is NULL or + an empty string, write to stdout. strm is a pre-initialized inflateBack + structure. When appropriate, copy the file attributes from inname to + outname. + + gunzip() returns 1 if there is an out-of-memory error or an unexpected + return code from gunpipe(). Otherwise it returns 0. + */ +local int gunzip(z_stream *strm, char *inname, char *outname, int test) +{ + int ret; + int infile, outfile; + + /* open files */ + if (inname == NULL || *inname == 0) { + inname = "-"; + infile = 0; /* stdin */ + } + else { + infile = open(inname, O_RDONLY, 0); + if (infile == -1) { + fprintf(stderr, "gun cannot open %s\n", inname); + return 0; + } + } + if (test) + outfile = -1; + else if (outname == NULL || *outname == 0) { + outname = "-"; + outfile = 1; /* stdout */ + } + else { + outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (outfile == -1) { + close(infile); + fprintf(stderr, "gun cannot create %s\n", outname); + return 0; + } + } + errno = 0; + + /* decompress */ + ret = gunpipe(strm, infile, outfile); + if (outfile > 2) close(outfile); + if (infile > 2) close(infile); + + /* interpret result */ + switch (ret) { + case Z_OK: + case Z_ERRNO: + if (infile > 2 && outfile > 2) { + copymeta(inname, outname); /* copy attributes */ + unlink(inname); + } + if (ret == Z_ERRNO) + fprintf(stderr, "gun warning: trailing garbage ignored in %s\n", + inname); + break; + case Z_DATA_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg); + break; + case Z_MEM_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + case Z_BUF_ERROR: + if (outfile > 2) unlink(outname); + if (strm->next_in != Z_NULL) { + fprintf(stderr, "gun write error on %s: %s\n", + outname, strerror(errno)); + } + else if (errno) { + fprintf(stderr, "gun read error on %s: %s\n", + inname, strerror(errno)); + } + else { + fprintf(stderr, "gun unexpected end of file on %s\n", + inname); + } + break; + default: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun internal error--aborting\n"); + return 1; + } + return 0; +} + +/* Process the gun command line arguments. See the command syntax near the + beginning of this source file. */ +int main(int argc, char **argv) +{ + int ret, len, test; + char *outname; + unsigned char *window; + z_stream strm; + + /* initialize inflateBack state for repeated use */ + window = match; /* reuse LZW match buffer */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = inflateBackInit(&strm, 15, window); + if (ret != Z_OK) { + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + } + + /* decompress each file to the same name with the suffix removed */ + argc--; + argv++; + test = 0; + if (argc && strcmp(*argv, "-h") == 0) { + fprintf(stderr, "gun 1.6 (17 Jan 2010)\n"); + fprintf(stderr, "Copyright (C) 2003-2010 Mark Adler\n"); + fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); + return 0; + } + if (argc && strcmp(*argv, "-t") == 0) { + test = 1; + argc--; + argv++; + } + if (argc) + do { + if (test) + outname = NULL; + else { + len = (int)strlen(*argv); + if (strcmp(*argv + len - 3, ".gz") == 0 || + strcmp(*argv + len - 3, "-gz") == 0) + len -= 3; + else if (strcmp(*argv + len - 2, ".z") == 0 || + strcmp(*argv + len - 2, "-z") == 0 || + strcmp(*argv + len - 2, "_z") == 0 || + strcmp(*argv + len - 2, ".Z") == 0) + len -= 2; + else { + fprintf(stderr, "gun error: no gz type on %s--skipping\n", + *argv); + continue; + } + outname = malloc(len + 1); + if (outname == NULL) { + fprintf(stderr, "gun out of memory error--aborting\n"); + ret = 1; + break; + } + memcpy(outname, *argv, len); + outname[len] = 0; + } + ret = gunzip(&strm, *argv, outname, test); + if (outname != NULL) free(outname); + if (ret) break; + } while (argv++, --argc); + else + ret = gunzip(&strm, NULL, NULL, test); + + /* clean up */ + inflateBackEnd(&strm); + return ret; +} diff --git a/third_party/zlib/examples/gzappend.c b/third_party/zlib/examples/gzappend.c new file mode 100644 index 00000000..662dec37 --- /dev/null +++ b/third_party/zlib/examples/gzappend.c @@ -0,0 +1,504 @@ +/* gzappend -- command to append to a gzip file + + Copyright (C) 2003, 2012 Mark Adler, all rights reserved + version 1.2, 11 Oct 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 19 Oct 2003 - First version + * 1.1 4 Nov 2003 - Expand and clarify some comments and notes + * - Add version and copyright to help + * - Send help to stdout instead of stderr + * - Add some preemptive typecasts + * - Add L to constants in lseek() calls + * - Remove some debugging information in error messages + * - Use new data_type definition for zlib 1.2.1 + * - Simplfy and unify file operations + * - Finish off gzip file in gztack() + * - Use deflatePrime() instead of adding empty blocks + * - Keep gzip file clean on appended file read errors + * - Use in-place rotate instead of auxiliary buffer + * (Why you ask? Because it was fun to write!) + * 1.2 11 Oct 2012 - Fix for proper z_const usage + * - Check for input buffer malloc failure + */ + +/* + gzappend takes a gzip file and appends to it, compressing files from the + command line or data from stdin. The gzip file is written to directly, to + avoid copying that file, in case it's large. Note that this results in the + 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.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.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. + + gzappend first decompresses the gzip file internally, discarding all but + the last 32K of uncompressed data, and noting the location of the last block + bit and the number of unused bits in the last byte of the compressed data. + The gzip trailer containing the CRC-32 and length of the uncompressed data + is verified. This trailer will be later overwritten. + + Then the last block bit is cleared by seeking back in the file and rewriting + the byte that contains it. Seeking forward, the last byte of the compressed + data is saved along with the number of unused bits to initialize deflate. + + A deflate process is initialized, using the last 32K of the uncompressed + data from the gzip file to initialize the dictionary. If the total + uncompressed data was less than 32K, then all of it is used to initialize + the dictionary. The deflate output bit buffer is also initialized with the + last bits from the original deflate stream. From here on, the data to + append is simply compressed using deflate, and written to the gzip file. + When that is complete, the new CRC-32 and uncompressed length are written + as the trailer of the gzip file. + */ + +#include +#include +#include +#include +#include +#include "zlib.h" + +#define local static +#define LGCHUNK 14 +#define CHUNK (1U << LGCHUNK) +#define DSIZE 32768U + +/* print an error message and terminate with extreme prejudice */ +local void bye(char *msg1, char *msg2) +{ + fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2); + exit(1); +} + +/* return the greatest common divisor of a and b using Euclid's algorithm, + modified to be fast when one argument much greater than the other, and + coded to avoid unnecessary swapping */ +local unsigned gcd(unsigned a, unsigned b) +{ + unsigned c; + + while (a && b) + if (a > b) { + c = b; + while (a - c >= c) + c <<= 1; + a -= c; + } + else { + c = a; + while (b - c >= c) + c <<= 1; + b -= c; + } + return a + b; +} + +/* rotate list[0..len-1] left by rot positions, in place */ +local void rotate(unsigned char *list, unsigned len, unsigned rot) +{ + unsigned char tmp; + unsigned cycles; + unsigned char *start, *last, *to, *from; + + /* normalize rot and handle degenerate cases */ + if (len < 2) return; + if (rot >= len) rot %= len; + if (rot == 0) return; + + /* pointer to last entry in list */ + last = list + (len - 1); + + /* do simple left shift by one */ + if (rot == 1) { + tmp = *list; + memcpy(list, list + 1, len - 1); + *last = tmp; + return; + } + + /* do simple right shift by one */ + if (rot == len - 1) { + tmp = *last; + memmove(list + 1, list, len - 1); + *list = tmp; + return; + } + + /* otherwise do rotate as a set of cycles in place */ + cycles = gcd(len, rot); /* number of cycles */ + do { + start = from = list + cycles; /* start index is arbitrary */ + tmp = *from; /* save entry to be overwritten */ + for (;;) { + to = from; /* next step in cycle */ + from += rot; /* go right rot positions */ + if (from > last) from -= len; /* (pointer better not wrap) */ + if (from == start) break; /* all but one shifted */ + *to = *from; /* shift left */ + } + *to = tmp; /* complete the circle */ + } while (--cycles); +} + +/* structure for gzip file read operations */ +typedef struct { + int fd; /* file descriptor */ + int size; /* 1 << size is bytes in buf */ + unsigned left; /* bytes available at next */ + unsigned char *buf; /* buffer */ + z_const unsigned char *next; /* next byte in buffer */ + char *name; /* file name for error messages */ +} file; + +/* reload buffer */ +local int readin(file *in) +{ + int len; + + len = read(in->fd, in->buf, 1 << in->size); + if (len == -1) bye("error reading ", in->name); + in->left = (unsigned)len; + in->next = in->buf; + return len; +} + +/* read from file in, exit if end-of-file */ +local int readmore(file *in) +{ + if (readin(in) == 0) bye("unexpected end of ", in->name); + return 0; +} + +#define read1(in) (in->left == 0 ? readmore(in) : 0, \ + in->left--, *(in->next)++) + +/* skip over n bytes of in */ +local void skip(file *in, unsigned n) +{ + unsigned bypass; + + if (n > in->left) { + n -= in->left; + bypass = n & ~((1U << in->size) - 1); + if (bypass) { + if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1) + bye("seeking ", in->name); + n -= bypass; + } + readmore(in); + if (n > in->left) + bye("unexpected end of ", in->name); + } + in->left -= n; + in->next += n; +} + +/* read a four-byte unsigned integer, little-endian, from in */ +unsigned long read4(file *in) +{ + unsigned long val; + + val = read1(in); + val += (unsigned)read1(in) << 8; + val += (unsigned long)read1(in) << 16; + val += (unsigned long)read1(in) << 24; + return val; +} + +/* skip over gzip header */ +local void gzheader(file *in) +{ + int flags; + unsigned n; + + if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file"); + if (read1(in) != 8) bye("unknown compression method in", in->name); + flags = read1(in); + if (flags & 0xe0) bye("unknown header flags set in", in->name); + skip(in, 6); + if (flags & 4) { + n = read1(in); + n += (unsigned)(read1(in)) << 8; + skip(in, n); + } + if (flags & 8) while (read1(in) != 0) ; + if (flags & 16) while (read1(in) != 0) ; + if (flags & 2) skip(in, 2); +} + +/* decompress gzip file "name", return strm with a deflate stream ready to + continue compression of the data in the gzip file, and return a file + descriptor pointing to where to write the compressed data -- the deflate + stream is initialized to compress using level "level" */ +local int gzscan(char *name, z_stream *strm, int level) +{ + int ret, lastbit, left, full; + unsigned have; + unsigned long crc, tot; + unsigned char *window; + off_t lastoff, end; + file gz; + + /* open gzip file */ + gz.name = name; + gz.fd = open(name, O_RDWR, 0); + if (gz.fd == -1) bye("cannot open ", name); + gz.buf = malloc(CHUNK); + if (gz.buf == NULL) bye("out of memory", ""); + gz.size = LGCHUNK; + gz.left = 0; + + /* skip gzip header */ + gzheader(&gz); + + /* prepare to decompress */ + window = malloc(DSIZE); + if (window == NULL) bye("out of memory", ""); + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = inflateInit2(strm, -15); + if (ret != Z_OK) bye("out of memory", " or library mismatch"); + + /* decompress the deflate stream, saving append information */ + lastbit = 0; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + left = 0; + strm->avail_in = gz.left; + strm->next_in = gz.next; + crc = crc32(0L, Z_NULL, 0); + have = full = 0; + do { + /* if needed, get more input */ + if (strm->avail_in == 0) { + readmore(&gz); + strm->avail_in = gz.left; + strm->next_in = gz.next; + } + + /* set up output to next available section of sliding window */ + strm->avail_out = DSIZE - have; + strm->next_out = window + have; + + /* inflate and check for errors */ + ret = inflate(strm, Z_BLOCK); + if (ret == Z_STREAM_ERROR) bye("internal stream error!", ""); + if (ret == Z_MEM_ERROR) bye("out of memory", ""); + if (ret == Z_DATA_ERROR) + bye("invalid compressed data--format violated in", name); + + /* update crc and sliding window pointer */ + crc = crc32(crc, window + have, DSIZE - have - strm->avail_out); + if (strm->avail_out) + have = DSIZE - strm->avail_out; + else { + have = 0; + full = 1; + } + + /* process end of block */ + if (strm->data_type & 128) { + if (strm->data_type & 64) + left = strm->data_type & 0x1f; + else { + lastbit = strm->data_type & 0x1f; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in; + } + } + } while (ret != Z_STREAM_END); + inflateEnd(strm); + gz.left = strm->avail_in; + gz.next = strm->next_in; + + /* save the location of the end of the compressed data */ + end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + + /* check gzip trailer and save total for deflate */ + if (crc != read4(&gz)) + bye("invalid compressed data--crc mismatch in ", name); + tot = strm->total_out; + if ((tot & 0xffffffffUL) != read4(&gz)) + bye("invalid compressed data--length mismatch in", name); + + /* if not at end of file, warn */ + if (gz.left || readin(&gz)) + fprintf(stderr, + "gzappend warning: junk at end of gzip file overwritten\n"); + + /* clear last block bit */ + lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + *gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7))); + lseek(gz.fd, -1L, SEEK_CUR); + if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name); + + /* if window wrapped, build dictionary from window by rotating */ + if (full) { + rotate(window, DSIZE, have); + have = DSIZE; + } + + /* set up deflate stream with window, crc, total_in, and leftover bits */ + ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + if (ret != Z_OK) bye("out of memory", ""); + deflateSetDictionary(strm, window, have); + strm->adler = crc; + strm->total_in = tot; + if (left) { + lseek(gz.fd, --end, SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + deflatePrime(strm, 8 - left, *gz.buf); + } + lseek(gz.fd, end, SEEK_SET); + + /* clean up and return */ + free(window); + free(gz.buf); + return gz.fd; +} + +/* append file "name" to gzip file gd using deflate stream strm -- if last + is true, then finish off the deflate stream at the end */ +local void gztack(char *name, int gd, z_stream *strm, int last) +{ + int fd, len, ret; + unsigned left; + unsigned char *in, *out; + + /* open file to compress and append */ + fd = 0; + if (name != NULL) { + fd = open(name, O_RDONLY, 0); + if (fd == -1) + fprintf(stderr, "gzappend warning: %s not found, skipping ...\n", + name); + } + + /* allocate buffers */ + in = malloc(CHUNK); + out = malloc(CHUNK); + if (in == NULL || out == NULL) bye("out of memory", ""); + + /* compress input file and append to gzip file */ + do { + /* get more input */ + len = read(fd, in, CHUNK); + if (len == -1) { + fprintf(stderr, + "gzappend warning: error reading %s, skipping rest ...\n", + name); + len = 0; + } + strm->avail_in = (unsigned)len; + strm->next_in = in; + if (len) strm->adler = crc32(strm->adler, in, (unsigned)len); + + /* compress and write all available output */ + do { + strm->avail_out = CHUNK; + strm->next_out = out; + ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH); + left = CHUNK - strm->avail_out; + while (left) { + len = write(gd, out + CHUNK - strm->avail_out - left, left); + if (len == -1) bye("writing gzip file", ""); + left -= (unsigned)len; + } + } while (strm->avail_out == 0 && ret != Z_STREAM_END); + } while (len != 0); + + /* write trailer after last entry */ + if (last) { + deflateEnd(strm); + out[0] = (unsigned char)(strm->adler); + out[1] = (unsigned char)(strm->adler >> 8); + out[2] = (unsigned char)(strm->adler >> 16); + out[3] = (unsigned char)(strm->adler >> 24); + out[4] = (unsigned char)(strm->total_in); + out[5] = (unsigned char)(strm->total_in >> 8); + out[6] = (unsigned char)(strm->total_in >> 16); + out[7] = (unsigned char)(strm->total_in >> 24); + len = 8; + do { + ret = write(gd, out + 8 - len, len); + if (ret == -1) bye("writing gzip file", ""); + len -= ret; + } while (len); + close(gd); + } + + /* clean up and return */ + free(out); + free(in); + if (fd > 0) close(fd); +} + +/* process the compression level option if present, scan the gzip file, and + append the specified files, or append the data from stdin if no other file + names are provided on the command line -- the gzip file must be writable + and seekable */ +int main(int argc, char **argv) +{ + int gd, level; + z_stream strm; + + /* ignore command name */ + argc--; argv++; + + /* provide usage if no arguments */ + if (*argv == NULL) { + printf( + "gzappend 1.2 (11 Oct 2012) Copyright (C) 2003, 2012 Mark Adler\n" + ); + printf( + "usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n"); + return 0; + } + + /* set compression level */ + level = Z_DEFAULT_COMPRESSION; + if (argv[0][0] == '-') { + if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0) + bye("invalid compression level", ""); + level = argv[0][1] - '0'; + if (*++argv == NULL) bye("no gzip file name after options", ""); + } + + /* prepare to append to gzip file */ + gd = gzscan(*argv++, &strm, level); + + /* append files on command line, or from stdin if none */ + if (*argv == NULL) + gztack(NULL, gd, &strm, 1); + else + do { + gztack(*argv, gd, &strm, argv[1] == NULL); + } while (*++argv != NULL); + return 0; +} diff --git a/third_party/zlib/examples/gzjoin.c b/third_party/zlib/examples/gzjoin.c new file mode 100644 index 00000000..89e80984 --- /dev/null +++ b/third_party/zlib/examples/gzjoin.c @@ -0,0 +1,449 @@ +/* gzjoin -- command to join gzip files into one gzip file + + Copyright (C) 2004, 2005, 2012 Mark Adler, all rights reserved + version 1.2, 14 Aug 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 11 Dec 2004 - First version + * 1.1 12 Jun 2005 - Changed ssize_t to long for portability + * 1.2 14 Aug 2012 - Clean up for z_const usage + */ + +/* + gzjoin takes one or more gzip files on the command line and writes out a + single gzip file that will uncompress to the concatenation of the + uncompressed data from the individual gzip files. gzjoin does this without + having to recompress any of the data and without having to calculate a new + crc32 for the concatenated uncompressed data. gzjoin does however have to + decompress all of the input data in order to find the bits in the compressed + data that need to be modified to concatenate the streams. + + gzjoin does not do an integrity check on the input gzip files other than + checking the gzip header and decompressing the compressed data. They are + otherwise assumed to be complete and correct. + + Each joint between gzip files removes at least 18 bytes of previous trailer + and subsequent header, and inserts an average of about three bytes to the + compressed data in order to connect the streams. The output gzip file + has a minimal ten-byte gzip header with no file name or modification time. + + This program was written to illustrate the use of the Z_BLOCK option of + inflate() and the crc32_combine() function. gzjoin will not compile with + versions of zlib earlier than 1.2.3. + */ + +#include /* fputs(), fprintf(), fwrite(), putc() */ +#include /* exit(), malloc(), free() */ +#include /* open() */ +#include /* close(), read(), lseek() */ +#include "zlib.h" + /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */ + +#define local static + +/* exit with an error (return a value to allow use in an expression) */ +local int bail(char *why1, char *why2) +{ + fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2); + exit(1); + return 0; +} + +/* -- simple buffered file input with access to the buffer -- */ + +#define CHUNK 32768 /* must be a power of two and fit in unsigned */ + +/* bin buffered input file type */ +typedef struct { + char *name; /* name of file for error messages */ + int fd; /* file descriptor */ + unsigned left; /* bytes remaining at next */ + unsigned char *next; /* next byte to read */ + unsigned char *buf; /* allocated buffer of length CHUNK */ +} bin; + +/* close a buffered file and free allocated memory */ +local void bclose(bin *in) +{ + if (in != NULL) { + if (in->fd != -1) + close(in->fd); + if (in->buf != NULL) + free(in->buf); + free(in); + } +} + +/* open a buffered file for input, return a pointer to type bin, or NULL on + failure */ +local bin *bopen(char *name) +{ + bin *in; + + in = malloc(sizeof(bin)); + if (in == NULL) + return NULL; + in->buf = malloc(CHUNK); + in->fd = open(name, O_RDONLY, 0); + if (in->buf == NULL || in->fd == -1) { + bclose(in); + return NULL; + } + in->left = 0; + in->next = in->buf; + in->name = name; + return in; +} + +/* load buffer from file, return -1 on read error, 0 or 1 on success, with + 1 indicating that end-of-file was reached */ +local int bload(bin *in) +{ + long len; + + if (in == NULL) + return -1; + if (in->left != 0) + return 0; + in->next = in->buf; + do { + len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left); + if (len < 0) + return -1; + in->left += (unsigned)len; + } while (len != 0 && in->left < CHUNK); + return len == 0 ? 1 : 0; +} + +/* get a byte from the file, bail if end of file */ +#define bget(in) (in->left ? 0 : bload(in), \ + in->left ? (in->left--, *(in->next)++) : \ + bail("unexpected end of file on ", in->name)) + +/* get a four-byte little-endian unsigned integer from file */ +local unsigned long bget4(bin *in) +{ + unsigned long val; + + val = bget(in); + val += (unsigned long)(bget(in)) << 8; + val += (unsigned long)(bget(in)) << 16; + val += (unsigned long)(bget(in)) << 24; + return val; +} + +/* skip bytes in file */ +local void bskip(bin *in, unsigned skip) +{ + /* check pointer */ + if (in == NULL) + return; + + /* easy case -- skip bytes in buffer */ + if (skip <= in->left) { + in->left -= skip; + in->next += skip; + return; + } + + /* skip what's in buffer, discard buffer contents */ + skip -= in->left; + in->left = 0; + + /* seek past multiples of CHUNK bytes */ + if (skip > CHUNK) { + unsigned left; + + left = skip & (CHUNK - 1); + if (left == 0) { + /* exact number of chunks: seek all the way minus one byte to check + for end-of-file with a read */ + lseek(in->fd, skip - 1, SEEK_CUR); + if (read(in->fd, in->buf, 1) != 1) + bail("unexpected end of file on ", in->name); + return; + } + + /* skip the integral chunks, update skip with remainder */ + lseek(in->fd, skip - left, SEEK_CUR); + skip = left; + } + + /* read more input and skip remainder */ + bload(in); + if (skip > in->left) + bail("unexpected end of file on ", in->name); + in->left -= skip; + in->next += skip; +} + +/* -- end of buffered input functions -- */ + +/* skip the gzip header from file in */ +local void gzhead(bin *in) +{ + int flags; + + /* verify gzip magic header and compression method */ + if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8) + bail(in->name, " is not a valid gzip file"); + + /* get and verify flags */ + flags = bget(in); + if ((flags & 0xe0) != 0) + bail("unknown reserved bits set in ", in->name); + + /* skip modification time, extra flags, and os */ + bskip(in, 6); + + /* skip extra field if present */ + if (flags & 4) { + unsigned len; + + len = bget(in); + len += (unsigned)(bget(in)) << 8; + bskip(in, len); + } + + /* skip file name if present */ + if (flags & 8) + while (bget(in) != 0) + ; + + /* skip comment if present */ + if (flags & 16) + while (bget(in) != 0) + ; + + /* skip header crc if present */ + if (flags & 2) + bskip(in, 2); +} + +/* write a four-byte little-endian unsigned integer to out */ +local void put4(unsigned long val, FILE *out) +{ + putc(val & 0xff, out); + putc((val >> 8) & 0xff, out); + putc((val >> 16) & 0xff, out); + putc((val >> 24) & 0xff, out); +} + +/* Load up zlib stream from buffered input, bail if end of file */ +local void zpull(z_streamp strm, bin *in) +{ + if (in->left == 0) + bload(in); + if (in->left == 0) + bail("unexpected end of file on ", in->name); + strm->avail_in = in->left; + strm->next_in = in->next; +} + +/* Write header for gzip file to out and initialize trailer. */ +local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out) +{ + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + *crc = crc32(0L, Z_NULL, 0); + *tot = 0; +} + +/* Copy the compressed data from name, zeroing the last block bit of the last + block if clr is true, and adding empty blocks as needed to get to a byte + boundary. If clr is false, then the last block becomes the last block of + the output, and the gzip trailer is written. crc and tot maintains the + crc and length (modulo 2^32) of the output for the trailer. The resulting + gzip file is written to out. gzinit() must be called before the first call + of gzcopy() to write the gzip header and to initialize crc and tot. */ +local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot, + FILE *out) +{ + int ret; /* return value from zlib functions */ + int pos; /* where the "last block" bit is in byte */ + int last; /* true if processing the last block */ + bin *in; /* buffered input file */ + unsigned char *start; /* start of compressed data in buffer */ + unsigned char *junk; /* buffer for uncompressed data -- discarded */ + z_off_t len; /* length of uncompressed data (support > 4 GB) */ + z_stream strm; /* zlib inflate stream */ + + /* open gzip file and skip header */ + in = bopen(name); + if (in == NULL) + bail("could not open ", name); + gzhead(in); + + /* allocate buffer for uncompressed data and initialize raw inflate + stream */ + junk = malloc(CHUNK); + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); + if (junk == NULL || ret != Z_OK) + bail("out of memory", ""); + + /* inflate and copy compressed data, clear last-block bit if requested */ + len = 0; + zpull(&strm, in); + start = in->next; + last = start[0] & 1; + if (last && clr) + start[0] &= ~1; + strm.avail_out = 0; + for (;;) { + /* if input used and output done, write used input and get more */ + if (strm.avail_in == 0 && strm.avail_out != 0) { + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + + /* decompress -- return early when end-of-block reached */ + strm.avail_out = CHUNK; + strm.next_out = junk; + ret = inflate(&strm, Z_BLOCK); + switch (ret) { + case Z_MEM_ERROR: + bail("out of memory", ""); + case Z_DATA_ERROR: + bail("invalid compressed data in ", in->name); + } + + /* update length of uncompressed data */ + len += CHUNK - strm.avail_out; + + /* check for block boundary (only get this when block copied out) */ + if (strm.data_type & 128) { + /* if that was the last block, then done */ + if (last) + break; + + /* number of unused bits in last byte */ + pos = strm.data_type & 7; + + /* find the next last-block bit */ + if (pos != 0) { + /* next last-block bit is in last used byte */ + pos = 0x100 >> pos; + last = strm.next_in[-1] & pos; + if (last && clr) + in->buf[strm.next_in - in->buf - 1] &= ~pos; + } + else { + /* next last-block bit is in next unused byte */ + if (strm.avail_in == 0) { + /* don't have that byte yet -- get it */ + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + last = strm.next_in[0] & 1; + if (last && clr) + in->buf[strm.next_in - in->buf] &= ~1; + } + } + } + + /* update buffer with unused input */ + in->left = strm.avail_in; + in->next = in->buf + (strm.next_in - in->buf); + + /* copy used input, write empty blocks to get to byte boundary */ + pos = strm.data_type & 7; + fwrite(start, 1, in->next - start - 1, out); + last = in->next[-1]; + if (pos == 0 || !clr) + /* already at byte boundary, or last file: write last byte */ + putc(last, out); + else { + /* append empty blocks to last byte */ + last &= ((0x100 >> pos) - 1); /* assure unused bits are zero */ + if (pos & 1) { + /* odd -- append an empty stored block */ + putc(last, out); + if (pos == 1) + putc(0, out); /* two more bits in block header */ + fwrite("\0\0\xff\xff", 1, 4, out); + } + else { + /* even -- append 1, 2, or 3 empty fixed blocks */ + switch (pos) { + case 6: + putc(last | 8, out); + last = 0; + case 4: + putc(last | 0x20, out); + last = 0; + case 2: + putc(last | 0x80, out); + putc(0, out); + } + } + } + + /* update crc and tot */ + *crc = crc32_combine(*crc, bget4(in), len); + *tot += (unsigned long)len; + + /* clean up */ + inflateEnd(&strm); + free(junk); + bclose(in); + + /* write trailer if this is the last gzip file */ + if (!clr) { + put4(*crc, out); + put4(*tot, out); + } +} + +/* join the gzip files on the command line, write result to stdout */ +int main(int argc, char **argv) +{ + unsigned long crc, tot; /* running crc and total uncompressed length */ + + /* skip command name */ + argc--; + argv++; + + /* show usage if no arguments */ + if (argc == 0) { + fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n", + stderr); + return 0; + } + + /* join gzip files on command line and write to stdout */ + gzinit(&crc, &tot, stdout); + while (argc--) + gzcopy(*argv++, argc, &crc, &tot, stdout); + + /* done */ + return 0; +} diff --git a/third_party/zlib/examples/gzlog.c b/third_party/zlib/examples/gzlog.c new file mode 100644 index 00000000..b8c29274 --- /dev/null +++ b/third_party/zlib/examples/gzlog.c @@ -0,0 +1,1059 @@ +/* + * gzlog.c + * Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved + * For conditions of distribution and use, see copyright notice in gzlog.h + * version 2.2, 14 Aug 2012 + */ + +/* + gzlog provides a mechanism for frequently appending short strings to a gzip + file that is efficient both in execution time and compression ratio. The + strategy is to write the short strings in an uncompressed form to the end of + the gzip file, only compressing when the amount of uncompressed data has + reached a given threshold. + + gzlog also provides protection against interruptions in the process due to + system crashes. The status of the operation is recorded in an extra field + in the gzip file, and is only updated once the gzip file is brought to a + valid state. The last data to be appended or compressed is saved in an + auxiliary file, so that if the operation is interrupted, it can be completed + the next time an append operation is attempted. + + gzlog maintains another auxiliary file with the last 32K of data from the + compressed portion, which is preloaded for the compression of the subsequent + data. This minimizes the impact to the compression ratio of appending. + */ + +/* + Operations Concept: + + Files (log name "foo"): + foo.gz -- gzip file with the complete log + foo.add -- last message to append or last data to compress + foo.dict -- dictionary of the last 32K of data for next compression + foo.temp -- temporary dictionary file for compression after this one + foo.lock -- lock file for reading and writing the other files + foo.repairs -- log file for log file recovery operations (not compressed) + + gzip file structure: + - fixed-length (no file name) header with extra field (see below) + - compressed data ending initially with empty stored block + - uncompressed data filling out originally empty stored block and + subsequent stored blocks as needed (16K max each) + - gzip trailer + - no junk at end (no other gzip streams) + + When appending data, the information in the first three items above plus the + foo.add file are sufficient to recover an interrupted append operation. The + extra field has the necessary information to restore the start of the last + stored block and determine where to append the data in the foo.add file, as + well as the crc and length of the gzip data before the append operation. + + The foo.add file is created before the gzip file is marked for append, and + deleted after the gzip file is marked as complete. So if the append + operation is interrupted, the data to add will still be there. If due to + some external force, the foo.add file gets deleted between when the append + operation was interrupted and when recovery is attempted, the gzip file will + still be restored, but without the appended data. + + When compressing data, the information in the first two items above plus the + foo.add file are sufficient to recover an interrupted compress operation. + The extra field has the necessary information to find the end of the + compressed data, and contains both the crc and length of just the compressed + data and of the complete set of data including the contents of the foo.add + file. + + Again, the foo.add file is maintained during the compress operation in case + of an interruption. If in the unlikely event the foo.add file with the data + to be compressed is missing due to some external force, a gzip file with + just the previous compressed data will be reconstructed. In this case, all + of the data that was to be compressed is lost (approximately one megabyte). + This will not occur if all that happened was an interruption of the compress + operation. + + The third state that is marked is the replacement of the old dictionary with + the new dictionary after a compress operation. Once compression is + complete, the gzip file is marked as being in the replace state. This + completes the gzip file, so an interrupt after being so marked does not + result in recompression. Then the dictionary file is replaced, and the gzip + file is marked as completed. This state prevents the possibility of + restarting compression with the wrong dictionary file. + + All three operations are wrapped by a lock/unlock procedure. In order to + gain exclusive access to the log files, first a foo.lock file must be + exclusively created. When all operations are complete, the lock is + released by deleting the foo.lock file. If when attempting to create the + lock file, it already exists and the modify time of the lock file is more + than five minutes old (set by the PATIENCE define below), then the old + lock file is considered stale and deleted, and the exclusive creation of + the lock file is retried. To assure that there are no false assessments + of the staleness of the lock file, the operations periodically touch the + lock file to update the modified date. + + Following is the definition of the extra field with all of the information + required to enable the above append and compress operations and their + recovery if interrupted. Multi-byte values are stored little endian + (consistent with the gzip format). File pointers are eight bytes long. + The crc's and lengths for the gzip trailer are four bytes long. (Note that + the length at the end of a gzip file is used for error checking only, and + for large files is actually the length modulo 2^32.) The stored block + length is two bytes long. The gzip extra field two-byte identification is + "ap" for append. It is assumed that writing the extra field to the file is + an "atomic" operation. That is, either all of the extra field is written + to the file, or none of it is, if the operation is interrupted right at the + point of updating the extra field. This is a reasonable assumption, since + the extra field is within the first 52 bytes of the file, which is smaller + than any expected block size for a mass storage device (usually 512 bytes or + larger). + + Extra field (35 bytes): + - Pointer to first stored block length -- this points to the two-byte length + of the first stored block, which is followed by the two-byte, one's + complement of that length. The stored block length is preceded by the + three-bit header of the stored block, which is the actual start of the + stored block in the deflate format. See the bit offset field below. + - Pointer to the last stored block length. This is the same as above, but + for the last stored block of the uncompressed data in the gzip file. + Initially this is the same as the first stored block length pointer. + When the stored block gets to 16K (see the MAX_STORE define), then a new + stored block as added, at which point the last stored block length pointer + is different from the first stored block length pointer. When they are + different, the first bit of the last stored block header is eight bits, or + one byte back from the block length. + - Compressed data crc and length. This is the crc and length of the data + that is in the compressed portion of the deflate stream. These are used + only in the event that the foo.add file containing the data to compress is + lost after a compress operation is interrupted. + - Total data crc and length. This is the crc and length of all of the data + stored in the gzip file, compressed and uncompressed. It is used to + reconstruct the gzip trailer when compressing, as well as when recovering + interrupted operations. + - Final stored block length. This is used to quickly find where to append, + and allows the restoration of the original final stored block state when + an append operation is interrupted. + - First stored block start as the number of bits back from the final stored + block first length byte. This value is in the range of 3..10, and is + stored as the low three bits of the final byte of the extra field after + subtracting three (0..7). This allows the last-block bit of the stored + block header to be updated when a new stored block is added, for the case + when the first stored block and the last stored block are the same. (When + they are different, the numbers of bits back is known to be eight.) This + also allows for new compressed data to be appended to the old compressed + data in the compress operation, overwriting the previous first stored + block, or for the compressed data to be terminated and a valid gzip file + reconstructed on the off chance that a compression operation was + interrupted and the data to compress in the foo.add file was deleted. + - The operation in process. This is the next two bits in the last byte (the + bits under the mask 0x18). The are interpreted as 0: nothing in process, + 1: append in process, 2: compress in process, 3: replace in process. + - The top three bits of the last byte in the extra field are reserved and + are currently set to zero. + + Main procedure: + - Exclusively create the foo.lock file using the O_CREAT and O_EXCL modes of + the system open() call. If the modify time of an existing lock file is + more than PATIENCE seconds old, then the lock file is deleted and the + exclusive create is retried. + - Load the extra field from the foo.gz file, and see if an operation was in + progress but not completed. If so, apply the recovery procedure below. + - Perform the append procedure with the provided data. + - If the uncompressed data in the foo.gz file is 1MB or more, apply the + compress procedure. + - Delete the foo.lock file. + + Append procedure: + - Put what to append in the foo.add file so that the operation can be + restarted if this procedure is interrupted. + - Mark the foo.gz extra field with the append operation in progress. + + Restore the original last-block bit and stored block length of the last + stored block from the information in the extra field, in case a previous + append operation was interrupted. + - Append the provided data to the last stored block, creating new stored + blocks as needed and updating the stored blocks last-block bits and + lengths. + - Update the crc and length with the new data, and write the gzip trailer. + - Write over the extra field (with a single write operation) with the new + pointers, lengths, and crc's, and mark the gzip file as not in process. + Though there is still a foo.add file, it will be ignored since nothing + is in process. If a foo.add file is leftover from a previously + completed operation, it is truncated when writing new data to it. + - Delete the foo.add file. + + Compress and replace procedures: + - Read all of the uncompressed data in the stored blocks in foo.gz and write + it to foo.add. Also write foo.temp with the last 32K of that data to + provide a dictionary for the next invocation of this procedure. + - Rewrite the extra field marking foo.gz with a compression in process. + * If there is no data provided to compress (due to a missing foo.add file + when recovering), reconstruct and truncate the foo.gz file to contain + only the previous compressed data and proceed to the step after the next + one. Otherwise ... + - Compress the data with the dictionary in foo.dict, and write to the + foo.gz file starting at the bit immediately following the last previously + compressed block. If there is no foo.dict, proceed anyway with the + compression at slightly reduced efficiency. (For the foo.dict file to be + missing requires some external failure beyond simply the interruption of + a compress operation.) During this process, the foo.lock file is + periodically touched to assure that that file is not considered stale by + another process before we're done. The deflation is terminated with a + non-last empty static block (10 bits long), that is then located and + written over by a last-bit-set empty stored block. + - Append the crc and length of the data in the gzip file (previously + calculated during the append operations). + - Write over the extra field with the updated stored block offsets, bits + back, crc's, and lengths, and mark foo.gz as in process for a replacement + of the dictionary. + @ Delete the foo.add file. + - Replace foo.dict with foo.temp. + - Write over the extra field, marking foo.gz as complete. + + Recovery procedure: + - If not a replace recovery, read in the foo.add file, and provide that data + to the appropriate recovery below. If there is no foo.add file, provide + a zero data length to the recovery. In that case, the append recovery + restores the foo.gz to the previous compressed + uncompressed data state. + For the the compress recovery, a missing foo.add file results in foo.gz + being restored to the previous compressed-only data state. + - Append recovery: + - Pick up append at + step above + - Compress recovery: + - Pick up compress at * step above + - Replace recovery: + - Pick up compress at @ step above + - Log the repair with a date stamp in foo.repairs + */ + +#include +#include /* rename, fopen, fprintf, fclose */ +#include /* malloc, free */ +#include /* strlen, strrchr, strcpy, strncpy, strcmp */ +#include /* open */ +#include /* lseek, read, write, close, unlink, sleep, */ + /* ftruncate, fsync */ +#include /* errno */ +#include /* time, ctime */ +#include /* stat */ +#include /* utimes */ +#include "zlib.h" /* crc32 */ + +#include "gzlog.h" /* header for external access */ + +#define local static +typedef unsigned int uint; +typedef unsigned long ulong; + +/* Macro for debugging to deterministically force recovery operations */ +#ifdef GZLOG_DEBUG + #include /* longjmp */ + jmp_buf gzlog_jump; /* where to go back to */ + int gzlog_bail = 0; /* which point to bail at (1..8) */ + int gzlog_count = -1; /* number of times through to wait */ +# define BAIL(n) do { if (n == gzlog_bail && gzlog_count-- == 0) \ + longjmp(gzlog_jump, gzlog_bail); } while (0) +#else +# define BAIL(n) +#endif + +/* how old the lock file can be in seconds before considering it stale */ +#define PATIENCE 300 + +/* maximum stored block size in Kbytes -- must be in 1..63 */ +#define MAX_STORE 16 + +/* number of stored Kbytes to trigger compression (must be >= 32 to allow + dictionary construction, and <= 204 * MAX_STORE, in order for >> 10 to + discard the stored block headers contribution of five bytes each) */ +#define TRIGGER 1024 + +/* size of a deflate dictionary (this cannot be changed) */ +#define DICT 32768U + +/* values for the operation (2 bits) */ +#define NO_OP 0 +#define APPEND_OP 1 +#define COMPRESS_OP 2 +#define REPLACE_OP 3 + +/* macros to extract little-endian integers from an unsigned byte buffer */ +#define PULL2(p) ((p)[0]+((uint)((p)[1])<<8)) +#define PULL4(p) (PULL2(p)+((ulong)PULL2(p+2)<<16)) +#define PULL8(p) (PULL4(p)+((off_t)PULL4(p+4)<<32)) + +/* macros to store integers into a byte buffer in little-endian order */ +#define PUT2(p,a) do {(p)[0]=a;(p)[1]=(a)>>8;} while(0) +#define PUT4(p,a) do {PUT2(p,a);PUT2(p+2,a>>16);} while(0) +#define PUT8(p,a) do {PUT4(p,a);PUT4(p+4,a>>32);} while(0) + +/* internal structure for log information */ +#define LOGID "\106\035\172" /* should be three non-zero characters */ +struct log { + char id[4]; /* contains LOGID to detect inadvertent overwrites */ + int fd; /* file descriptor for .gz file, opened read/write */ + char *path; /* allocated path, e.g. "/var/log/foo" or "foo" */ + char *end; /* end of path, for appending suffices such as ".gz" */ + off_t first; /* offset of first stored block first length byte */ + int back; /* location of first block id in bits back from first */ + uint stored; /* bytes currently in last stored block */ + off_t last; /* offset of last stored block first length byte */ + ulong ccrc; /* crc of compressed data */ + ulong clen; /* length (modulo 2^32) of compressed data */ + ulong tcrc; /* crc of total data */ + ulong tlen; /* length (modulo 2^32) of total data */ + time_t lock; /* last modify time of our lock file */ +}; + +/* gzip header for gzlog */ +local unsigned char log_gzhead[] = { + 0x1f, 0x8b, /* magic gzip id */ + 8, /* compression method is deflate */ + 4, /* there is an extra field (no file name) */ + 0, 0, 0, 0, /* no modification time provided */ + 0, 0xff, /* no extra flags, no OS specified */ + 39, 0, 'a', 'p', 35, 0 /* extra field with "ap" subfield */ + /* 35 is EXTRA, 39 is EXTRA + 4 */ +}; + +#define HEAD sizeof(log_gzhead) /* should be 16 */ + +/* initial gzip extra field content (52 == HEAD + EXTRA + 1) */ +local unsigned char log_gzext[] = { + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of first stored block length */ + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of last stored block length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* compressed data crc and length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* total data crc and length */ + 0, 0, /* final stored block data length */ + 5 /* op is NO_OP, last bit 8 bits back */ +}; + +#define EXTRA sizeof(log_gzext) /* should be 35 */ + +/* initial gzip data and trailer */ +local unsigned char log_gzbody[] = { + 1, 0, 0, 0xff, 0xff, /* empty stored block (last) */ + 0, 0, 0, 0, /* crc */ + 0, 0, 0, 0 /* uncompressed length */ +}; + +#define BODY sizeof(log_gzbody) + +/* Exclusively create foo.lock in order to negotiate exclusive access to the + foo.* files. If the modify time of an existing lock file is greater than + PATIENCE seconds in the past, then consider the lock file to have been + abandoned, delete it, and try the exclusive create again. Save the lock + file modify time for verification of ownership. Return 0 on success, or -1 + on failure, usually due to an access restriction or invalid path. Note that + if stat() or unlink() fails, it may be due to another process noticing the + abandoned lock file a smidge sooner and deleting it, so those are not + flagged as an error. */ +local int log_lock(struct log *log) +{ + int fd; + struct stat st; + + strcpy(log->end, ".lock"); + while ((fd = open(log->path, O_CREAT | O_EXCL, 0644)) < 0) { + if (errno != EEXIST) + return -1; + if (stat(log->path, &st) == 0 && time(NULL) - st.st_mtime > PATIENCE) { + unlink(log->path); + continue; + } + sleep(2); /* relinquish the CPU for two seconds while waiting */ + } + close(fd); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; + return 0; +} + +/* Update the modify time of the lock file to now, in order to prevent another + task from thinking that the lock is stale. Save the lock file modify time + for verification of ownership. */ +local void log_touch(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + utimes(log->path, NULL); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; +} + +/* Check the log file modify time against what is expected. Return true if + this is not our lock. If it is our lock, touch it to keep it. */ +local int log_check(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + if (stat(log->path, &st) || st.st_mtime != log->lock) + return 1; + log_touch(log); + return 0; +} + +/* Unlock a previously acquired lock, but only if it's ours. */ +local void log_unlock(struct log *log) +{ + if (log_check(log)) + return; + strcpy(log->end, ".lock"); + unlink(log->path); + log->lock = 0; +} + +/* Check the gzip header and read in the extra field, filling in the values in + the log structure. Return op on success or -1 if the gzip header was not as + expected. op is the current operation in progress last written to the extra + field. This assumes that the gzip file has already been opened, with the + file descriptor log->fd. */ +local int log_head(struct log *log) +{ + int op; + unsigned char buf[HEAD + EXTRA]; + + if (lseek(log->fd, 0, SEEK_SET) < 0 || + read(log->fd, buf, HEAD + EXTRA) != HEAD + EXTRA || + memcmp(buf, log_gzhead, HEAD)) { + return -1; + } + log->first = PULL8(buf + HEAD); + log->last = PULL8(buf + HEAD + 8); + log->ccrc = PULL4(buf + HEAD + 16); + log->clen = PULL4(buf + HEAD + 20); + log->tcrc = PULL4(buf + HEAD + 24); + log->tlen = PULL4(buf + HEAD + 28); + log->stored = PULL2(buf + HEAD + 32); + log->back = 3 + (buf[HEAD + 34] & 7); + op = (buf[HEAD + 34] >> 3) & 3; + return op; +} + +/* Write over the extra field contents, marking the operation as op. Use fsync + to assure that the device is written to, and in the requested order. This + operation, and only this operation, is assumed to be atomic in order to + assure that the log is recoverable in the event of an interruption at any + point in the process. Return -1 if the write to foo.gz failed. */ +local int log_mark(struct log *log, int op) +{ + int ret; + unsigned char ext[EXTRA]; + + PUT8(ext, log->first); + PUT8(ext + 8, log->last); + PUT4(ext + 16, log->ccrc); + PUT4(ext + 20, log->clen); + PUT4(ext + 24, log->tcrc); + PUT4(ext + 28, log->tlen); + PUT2(ext + 32, log->stored); + ext[34] = log->back - 3 + (op << 3); + fsync(log->fd); + ret = lseek(log->fd, HEAD, SEEK_SET) < 0 || + write(log->fd, ext, EXTRA) != EXTRA ? -1 : 0; + fsync(log->fd); + return ret; +} + +/* Rewrite the last block header bits and subsequent zero bits to get to a byte + boundary, setting the last block bit if last is true, and then write the + remainder of the stored block header (length and one's complement). Leave + the file pointer after the end of the last stored block data. Return -1 if + there is a read or write failure on the foo.gz file */ +local int log_last(struct log *log, int last) +{ + int back, len, mask; + unsigned char buf[6]; + + /* determine the locations of the bytes and bits to modify */ + back = log->last == log->first ? log->back : 8; + len = back > 8 ? 2 : 1; /* bytes back from log->last */ + mask = 0x80 >> ((back - 1) & 7); /* mask for block last-bit */ + + /* get the byte to modify (one or two back) into buf[0] -- don't need to + read the byte if the last-bit is eight bits back, since in that case + the entire byte will be modified */ + buf[0] = 0; + if (back != 8 && (lseek(log->fd, log->last - len, SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1)) + return -1; + + /* change the last-bit of the last stored block as requested -- note + that all bits above the last-bit are set to zero, per the type bits + of a stored block being 00 and per the convention that the bits to + bring the stream to a byte boundary are also zeros */ + buf[1] = 0; + buf[2 - len] = (*buf & (mask - 1)) + (last ? mask : 0); + + /* write the modified stored block header and lengths, move the file + pointer to after the last stored block data */ + PUT2(buf + 2, log->stored); + PUT2(buf + 4, log->stored ^ 0xffff); + return lseek(log->fd, log->last - len, SEEK_SET) < 0 || + write(log->fd, buf + 2 - len, len + 4) != len + 4 || + lseek(log->fd, log->stored, SEEK_CUR) < 0 ? -1 : 0; +} + +/* Append len bytes from data to the locked and open log file. len may be zero + if recovering and no .add file was found. In that case, the previous state + of the foo.gz file is restored. The data is appended uncompressed in + deflate stored blocks. Return -1 if there was an error reading or writing + the foo.gz file. */ +local int log_append(struct log *log, unsigned char *data, size_t len) +{ + uint put; + off_t end; + unsigned char buf[8]; + + /* set the last block last-bit and length, in case recovering an + interrupted append, then position the file pointer to append to the + block */ + if (log_last(log, 1)) + return -1; + + /* append, adding stored blocks and updating the offset of the last stored + block as needed, and update the total crc and length */ + while (len) { + /* append as much as we can to the last block */ + put = (MAX_STORE << 10) - log->stored; + if (put > len) + put = (uint)len; + if (put) { + if (write(log->fd, data, put) != put) + return -1; + BAIL(1); + log->tcrc = crc32(log->tcrc, data, put); + log->tlen += put; + log->stored += put; + data += put; + len -= put; + } + + /* if we need to, add a new empty stored block */ + if (len) { + /* mark current block as not last */ + if (log_last(log, 0)) + return -1; + + /* point to new, empty stored block */ + log->last += 4 + log->stored + 1; + log->stored = 0; + } + + /* mark last block as last, update its length */ + if (log_last(log, 1)) + return -1; + BAIL(2); + } + + /* write the new crc and length trailer, and truncate just in case (could + be recovering from partial append with a missing foo.add file) */ + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + + /* write the extra field, marking the log file as done, delete .add file */ + if (log_mark(log, NO_OP)) + return -1; + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + return 0; +} + +/* Replace the foo.dict file with the foo.temp file. Also delete the foo.add + file, since the compress operation may have been interrupted before that was + done. Returns 1 if memory could not be allocated, or -1 if reading or + writing foo.gz fails, or if the rename fails for some reason other than + foo.temp not existing. foo.temp not existing is a permitted error, since + the replace operation may have been interrupted after the rename is done, + but before foo.gz is marked as complete. */ +local int log_replace(struct log *log) +{ + int ret; + char *dest; + + /* delete foo.add file */ + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + BAIL(3); + + /* rename foo.name to foo.dict, replacing foo.dict if it exists */ + strcpy(log->end, ".dict"); + dest = malloc(strlen(log->path) + 1); + if (dest == NULL) + return -2; + strcpy(dest, log->path); + strcpy(log->end, ".temp"); + ret = rename(log->path, dest); + free(dest); + if (ret && errno != ENOENT) + return -1; + BAIL(4); + + /* mark the foo.gz file as done */ + return log_mark(log, NO_OP); +} + +/* Compress the len bytes at data and append the compressed data to the + foo.gz deflate data immediately after the previous compressed data. This + overwrites the previous uncompressed data, which was stored in foo.add + and is the data provided in data[0..len-1]. If this operation is + interrupted, it picks up at the start of this routine, with the foo.add + file read in again. If there is no data to compress (len == 0), then we + simply terminate the foo.gz file after the previously compressed data, + appending a final empty stored block and the gzip trailer. Return -1 if + reading or writing the log.gz file failed, or -2 if there was a memory + allocation failure. */ +local int log_compress(struct log *log, unsigned char *data, size_t len) +{ + int fd; + uint got, max; + ssize_t dict; + off_t end; + z_stream strm; + unsigned char buf[DICT]; + + /* compress and append compressed data */ + if (len) { + /* set up for deflate, allocating memory */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -15, 8, + Z_DEFAULT_STRATEGY) != Z_OK) + return -2; + + /* read in dictionary (last 32K of data that was compressed) */ + strcpy(log->end, ".dict"); + fd = open(log->path, O_RDONLY, 0); + if (fd >= 0) { + dict = read(fd, buf, DICT); + close(fd); + if (dict < 0) { + deflateEnd(&strm); + return -1; + } + if (dict) + deflateSetDictionary(&strm, buf, (uint)dict); + } + log_touch(log); + + /* prime deflate with last bits of previous block, position write + pointer to write those bits and overwrite what follows */ + if (lseek(log->fd, log->first - (log->back > 8 ? 2 : 1), + SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1 || lseek(log->fd, -1, SEEK_CUR) < 0) { + deflateEnd(&strm); + return -1; + } + deflatePrime(&strm, (8 - log->back) & 7, *buf); + + /* compress, finishing with a partial non-last empty static block */ + strm.next_in = data; + max = (((uint)0 - 1) >> 1) + 1; /* in case int smaller than size_t */ + do { + strm.avail_in = len > max ? max : (uint)len; + len -= strm.avail_in; + do { + strm.avail_out = DICT; + strm.next_out = buf; + deflate(&strm, len ? Z_NO_FLUSH : Z_PARTIAL_FLUSH); + got = DICT - strm.avail_out; + if (got && write(log->fd, buf, got) != got) { + deflateEnd(&strm); + return -1; + } + log_touch(log); + } while (strm.avail_out == 0); + } while (len); + deflateEnd(&strm); + BAIL(5); + + /* find start of empty static block -- scanning backwards the first one + bit is the second bit of the block, if the last byte is zero, then + we know the byte before that has a one in the top bit, since an + empty static block is ten bits long */ + if ((log->first = lseek(log->fd, -1, SEEK_CUR)) < 0 || + read(log->fd, buf, 1) != 1) + return -1; + log->first++; + if (*buf) { + log->back = 1; + while ((*buf & ((uint)1 << (8 - log->back++))) == 0) + ; /* guaranteed to terminate, since *buf != 0 */ + } + else + log->back = 10; + + /* update compressed crc and length */ + log->ccrc = log->tcrc; + log->clen = log->tlen; + } + else { + /* no data to compress -- fix up existing gzip stream */ + log->tcrc = log->ccrc; + log->tlen = log->clen; + } + + /* complete and truncate gzip stream */ + log->last = log->first; + log->stored = 0; + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (log_last(log, 1) || write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + BAIL(6); + + /* mark as being in the replace operation */ + if (log_mark(log, REPLACE_OP)) + return -1; + + /* execute the replace operation and mark the file as done */ + return log_replace(log); +} + +/* log a repair record to the .repairs file */ +local void log_log(struct log *log, int op, char *record) +{ + time_t now; + FILE *rec; + + now = time(NULL); + strcpy(log->end, ".repairs"); + rec = fopen(log->path, "a"); + if (rec == NULL) + return; + fprintf(rec, "%.24s %s recovery: %s\n", ctime(&now), op == APPEND_OP ? + "append" : (op == COMPRESS_OP ? "compress" : "replace"), record); + fclose(rec); + return; +} + +/* Recover the interrupted operation op. First read foo.add for recovering an + append or compress operation. Return -1 if there was an error reading or + writing foo.gz or reading an existing foo.add, or -2 if there was a memory + allocation failure. */ +local int log_recover(struct log *log, int op) +{ + int fd, ret = 0; + unsigned char *data = NULL; + size_t len = 0; + struct stat st; + + /* log recovery */ + log_log(log, op, "start"); + + /* load foo.add file if expected and present */ + if (op == APPEND_OP || op == COMPRESS_OP) { + strcpy(log->end, ".add"); + if (stat(log->path, &st) == 0 && st.st_size) { + len = (size_t)(st.st_size); + if ((off_t)len != st.st_size || + (data = malloc(st.st_size)) == NULL) { + log_log(log, op, "allocation failure"); + return -2; + } + if ((fd = open(log->path, O_RDONLY, 0)) < 0) { + log_log(log, op, ".add file read failure"); + return -1; + } + ret = (size_t)read(fd, data, len) != len; + close(fd); + if (ret) { + log_log(log, op, ".add file read failure"); + return -1; + } + log_log(log, op, "loaded .add file"); + } + else + log_log(log, op, "missing .add file!"); + } + + /* recover the interrupted operation */ + switch (op) { + case APPEND_OP: + ret = log_append(log, data, len); + break; + case COMPRESS_OP: + ret = log_compress(log, data, len); + break; + case REPLACE_OP: + ret = log_replace(log); + } + + /* log status */ + log_log(log, op, ret ? "failure" : "complete"); + + /* clean up */ + if (data != NULL) + free(data); + return ret; +} + +/* Close the foo.gz file (if open) and release the lock. */ +local void log_close(struct log *log) +{ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + log_unlock(log); +} + +/* Open foo.gz, verify the header, and load the extra field contents, after + first creating the foo.lock file to gain exclusive access to the foo.* + files. If foo.gz does not exist or is empty, then write the initial header, + extra, and body content of an empty foo.gz log file. If there is an error + creating the lock file due to access restrictions, or an error reading or + writing the foo.gz file, or if the foo.gz file is not a proper log file for + this object (e.g. not a gzip file or does not contain the expected extra + field), then return true. If there is an error, the lock is released. + Otherwise, the lock is left in place. */ +local int log_open(struct log *log) +{ + int op; + + /* release open file resource if left over -- can occur if lock lost + between gzlog_open() and gzlog_write() */ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + + /* negotiate exclusive access */ + if (log_lock(log) < 0) + return -1; + + /* open the log file, foo.gz */ + strcpy(log->end, ".gz"); + log->fd = open(log->path, O_RDWR | O_CREAT, 0644); + if (log->fd < 0) { + log_close(log); + return -1; + } + + /* if new, initialize foo.gz with an empty log, delete old dictionary */ + if (lseek(log->fd, 0, SEEK_END) == 0) { + if (write(log->fd, log_gzhead, HEAD) != HEAD || + write(log->fd, log_gzext, EXTRA) != EXTRA || + write(log->fd, log_gzbody, BODY) != BODY) { + log_close(log); + return -1; + } + strcpy(log->end, ".dict"); + unlink(log->path); + } + + /* verify log file and load extra field information */ + if ((op = log_head(log)) < 0) { + log_close(log); + return -1; + } + + /* check for interrupted process and if so, recover */ + if (op != NO_OP && log_recover(log, op)) { + log_close(log); + return -1; + } + + /* touch the lock file to prevent another process from grabbing it */ + log_touch(log); + return 0; +} + +/* See gzlog.h for the description of the external methods below */ +gzlog *gzlog_open(char *path) +{ + size_t n; + struct log *log; + + /* check arguments */ + if (path == NULL || *path == 0) + return NULL; + + /* allocate and initialize log structure */ + log = malloc(sizeof(struct log)); + if (log == NULL) + return NULL; + strcpy(log->id, LOGID); + log->fd = -1; + + /* save path and end of path for name construction */ + n = strlen(path); + log->path = malloc(n + 9); /* allow for ".repairs" */ + if (log->path == NULL) { + free(log); + return NULL; + } + strcpy(log->path, path); + log->end = log->path + n; + + /* gain exclusive access and verify log file -- may perform a + recovery operation if needed */ + if (log_open(log)) { + free(log->path); + free(log); + return NULL; + } + + /* return pointer to log structure */ + return log; +} + +/* gzlog_compress() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_compress(gzlog *logd) +{ + int fd, ret; + uint block; + size_t len, next; + unsigned char *data, buf[5]; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create space for uncompressed data */ + len = ((size_t)(log->last - log->first) & ~(((size_t)1 << 10) - 1)) + + log->stored; + if ((data = malloc(len)) == NULL) + return -2; + + /* do statement here is just a cheap trick for error handling */ + do { + /* read in the uncompressed data */ + if (lseek(log->fd, log->first - 1, SEEK_SET) < 0) + break; + next = 0; + while (next < len) { + if (read(log->fd, buf, 5) != 5) + break; + block = PULL2(buf + 1); + if (next + block > len || + read(log->fd, (char *)data + next, block) != block) + break; + next += block; + } + if (lseek(log->fd, 0, SEEK_CUR) != log->last + 4 + log->stored) + break; + log_touch(log); + + /* write the uncompressed data to the .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + ret = (size_t)write(fd, data, len) != len; + if (ret | close(fd)) + break; + log_touch(log); + + /* write the dictionary for the next compress to the .temp file */ + strcpy(log->end, ".temp"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + next = DICT > len ? len : DICT; + ret = (size_t)write(fd, (char *)data + len - next, next) != next; + if (ret | close(fd)) + break; + log_touch(log); + + /* roll back to compressed data, mark the compress in progress */ + log->last = log->first; + log->stored = 0; + if (log_mark(log, COMPRESS_OP)) + break; + BAIL(7); + + /* compress and append the data (clears mark) */ + ret = log_compress(log, data, len); + free(data); + return ret; + } while (0); + + /* broke out of do above on i/o error */ + free(data); + return -1; +} + +/* gzlog_write() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_write(gzlog *logd, void *data, size_t len) +{ + int fd, ret; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + if (data == NULL || len <= 0) + return 0; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create and write .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + return -1; + ret = (size_t)write(fd, data, len) != len; + if (ret | close(fd)) + return -1; + log_touch(log); + + /* mark log file with append in progress */ + if (log_mark(log, APPEND_OP)) + return -1; + BAIL(8); + + /* append data (clears mark) */ + if (log_append(log, data, len)) + return -1; + + /* check to see if it's time to compress -- if not, then done */ + if (((log->last - log->first) >> 10) + (log->stored >> 10) < TRIGGER) + return 0; + + /* time to compress */ + return gzlog_compress(log); +} + +/* gzlog_close() return values: + 0: ok + -3: invalid log pointer argument */ +int gzlog_close(gzlog *logd) +{ + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* close the log file and release the lock */ + log_close(log); + + /* free structure and return */ + if (log->path != NULL) + free(log->path); + strcpy(log->id, "bad"); + free(log); + return 0; +} diff --git a/third_party/zlib/examples/gzlog.h b/third_party/zlib/examples/gzlog.h new file mode 100644 index 00000000..86f0cecb --- /dev/null +++ b/third_party/zlib/examples/gzlog.h @@ -0,0 +1,91 @@ +/* gzlog.h + Copyright (C) 2004, 2008, 2012 Mark Adler, all rights reserved + version 2.2, 14 Aug 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* Version History: + 1.0 26 Nov 2004 First version + 2.0 25 Apr 2008 Complete redesign for recovery of interrupted operations + Interface changed slightly in that now path is a prefix + Compression now occurs as needed during gzlog_write() + gzlog_write() now always leaves the log file as valid gzip + 2.1 8 Jul 2012 Fix argument checks in gzlog_compress() and gzlog_write() + 2.2 14 Aug 2012 Clean up signed comparisons + */ + +/* + The gzlog object allows writing short messages to a gzipped log file, + opening the log file locked for small bursts, and then closing it. The log + object works by appending stored (uncompressed) data to the gzip file until + 1 MB has been accumulated. At that time, the stored data is compressed, and + replaces the uncompressed data in the file. The log file is truncated to + its new size at that time. After each write operation, the log file is a + valid gzip file that can decompressed to recover what was written. + + The gzlog operations can be interupted at any point due to an application or + system crash, and the log file will be recovered the next time the log is + opened with gzlog_open(). + */ + +#ifndef GZLOG_H +#define GZLOG_H + +/* gzlog object type */ +typedef void gzlog; + +/* Open a gzlog object, creating the log file if it does not exist. Return + NULL on error. Note that gzlog_open() could take a while to complete if it + has to wait to verify that a lock is stale (possibly for five minutes), or + if there is significant contention with other instantiations of this object + when locking the resource. path is the prefix of the file names created by + this object. If path is "foo", then the log file will be "foo.gz", and + other auxiliary files will be created and destroyed during the process: + "foo.dict" for a compression dictionary, "foo.temp" for a temporary (next) + dictionary, "foo.add" for data being added or compressed, "foo.lock" for the + lock file, and "foo.repairs" to log recovery operations performed due to + interrupted gzlog operations. A gzlog_open() followed by a gzlog_close() + will recover a previously interrupted operation, if any. */ +gzlog *gzlog_open(char *path); + +/* Write to a gzlog object. Return zero on success, -1 if there is a file i/o + error on any of the gzlog files (this should not happen if gzlog_open() + succeeded, unless the device has run out of space or leftover auxiliary + files have permissions or ownership that prevent their use), -2 if there is + a memory allocation failure, or -3 if the log argument is invalid (e.g. if + it was not created by gzlog_open()). This function will write data to the + file uncompressed, until 1 MB has been accumulated, at which time that data + will be compressed. The log file will be a valid gzip file upon successful + return. */ +int gzlog_write(gzlog *log, void *data, size_t len); + +/* Force compression of any uncompressed data in the log. This should be used + sparingly, if at all. The main application would be when a log file will + not be appended to again. If this is used to compress frequently while + appending, it will both significantly increase the execution time and + reduce the compression ratio. The return codes are the same as for + gzlog_write(). */ +int gzlog_compress(gzlog *log); + +/* Close a gzlog object. Return zero on success, -3 if the log argument is + invalid. The log object is freed, and so cannot be referenced again. */ +int gzlog_close(gzlog *log); + +#endif diff --git a/third_party/zlib/examples/zlib_how.html b/third_party/zlib/examples/zlib_how.html new file mode 100644 index 00000000..444ff1c9 --- /dev/null +++ b/third_party/zlib/examples/zlib_how.html @@ -0,0 +1,545 @@ + + + + +zlib Usage Example + + + +

zlib Usage Example

+We often get questions about how the deflate() and inflate() functions should be used. +Users wonder when they should provide more input, when they should use more output, +what to do with a Z_BUF_ERROR, how to make sure the process terminates properly, and +so on. So for those who have read zlib.h (a few times), and +would like further edification, below is an annotated example in C of simple routines to compress and decompress +from an input file to an output file using deflate() and inflate() respectively. The +annotations are interspersed between lines of the code. So please read between the lines. +We hope this helps explain some of the intricacies of zlib. +

+Without further adieu, here is the program zpipe.c: +


+/* zpipe.c: example of proper use of zlib's inflate() and deflate()
+   Not copyrighted -- provided to the public domain
+   Version 1.4  11 December 2005  Mark Adler */
+
+/* Version history:
+   1.0  30 Oct 2004  First version
+   1.1   8 Nov 2004  Add void casting for unused return values
+                     Use switch statement for inflate() return values
+   1.2   9 Nov 2004  Add assertions to document zlib guarantees
+   1.3   6 Apr 2005  Remove incorrect assertion in inf()
+   1.4  11 Dec 2005  Add hack to avoid MSDOS end-of-line conversions
+                     Avoid some compiler warnings for input and output buffers
+ */
+
+We now include the header files for the required definitions. From +stdio.h we use fopen(), fread(), fwrite(), +feof(), ferror(), and fclose() for file i/o, and +fputs() for error messages. From string.h we use +strcmp() for command line argument processing. +From assert.h we use the assert() macro. +From zlib.h +we use the basic compression functions deflateInit(), +deflate(), and deflateEnd(), and the basic decompression +functions inflateInit(), inflate(), and +inflateEnd(). +

+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include "zlib.h"
+
+This is an ugly hack required to avoid corruption of the input and output data on +Windows/MS-DOS systems. Without this, those systems would assume that the input and output +files are text, and try to convert the end-of-line characters from one standard to +another. That would corrupt binary data, and in particular would render the compressed data unusable. +This sets the input and output to binary which suppresses the end-of-line conversions. +SET_BINARY_MODE() will be used later on stdin and stdout, at the beginning of main(). +

+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+#  include <fcntl.h>
+#  include <io.h>
+#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+#  define SET_BINARY_MODE(file)
+#endif
+
+CHUNK is simply the buffer size for feeding data to and pulling data +from the zlib routines. Larger buffer sizes would be more efficient, +especially for inflate(). If the memory is available, buffers sizes +on the order of 128K or 256K bytes should be used. +

+#define CHUNK 16384
+
+The def() routine compresses data from an input file to an output file. The output data +will be in the zlib format, which is different from the gzip or zip +formats. The zlib format has a very small header of only two bytes to identify it as +a zlib stream and to provide decoding information, and a four-byte trailer with a fast +check value to verify the integrity of the uncompressed data after decoding. +

+/* Compress from file source to file dest until EOF on source.
+   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_STREAM_ERROR if an invalid compression
+   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
+   version of the library linked do not match, or Z_ERRNO if there is
+   an error reading or writing the files. */
+int def(FILE *source, FILE *dest, int level)
+{
+
+Here are the local variables for def(). ret will be used for zlib +return codes. flush will keep track of the current flushing state for deflate(), +which is either no flushing, or flush to completion after the end of the input file is reached. +have is the amount of data returned from deflate(). The strm structure +is used to pass information to and from the zlib routines, and to maintain the +deflate() state. in and out are the input and output buffers for +deflate(). +

+    int ret, flush;
+    unsigned have;
+    z_stream strm;
+    unsigned char in[CHUNK];
+    unsigned char out[CHUNK];
+
+The first thing we do is to initialize the zlib state for compression using +deflateInit(). This must be done before the first use of deflate(). +The zalloc, zfree, and opaque fields in the strm +structure must be initialized before calling deflateInit(). Here they are +set to the zlib constant Z_NULL to request that zlib use +the default memory allocation routines. An application may also choose to provide +custom memory allocation routines here. deflateInit() will allocate on the +order of 256K bytes for the internal state. +(See zlib Technical Details.) +

+deflateInit() is called with a pointer to the structure to be initialized and +the compression level, which is an integer in the range of -1 to 9. Lower compression +levels result in faster execution, but less compression. Higher levels result in +greater compression, but slower execution. The zlib constant Z_DEFAULT_COMPRESSION, +equal to -1, +provides a good compromise between compression and speed and is equivalent to level 6. +Level 0 actually does no compression at all, and in fact expands the data slightly to produce +the zlib format (it is not a byte-for-byte copy of the input). +More advanced applications of zlib +may use deflateInit2() here instead. Such an application may want to reduce how +much memory will be used, at some price in compression. Or it may need to request a +gzip header and trailer instead of a zlib header and trailer, or raw +encoding with no header or trailer at all. +

+We must check the return value of deflateInit() against the zlib constant +Z_OK to make sure that it was able to +allocate memory for the internal state, and that the provided arguments were valid. +deflateInit() will also check that the version of zlib that the zlib.h +file came from matches the version of zlib actually linked with the program. This +is especially important for environments in which zlib is a shared library. +

+Note that an application can initialize multiple, independent zlib streams, which can +operate in parallel. The state information maintained in the structure allows the zlib +routines to be reentrant. +


+    /* allocate deflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    ret = deflateInit(&strm, level);
+    if (ret != Z_OK)
+        return ret;
+
+With the pleasantries out of the way, now we can get down to business. The outer do-loop +reads all of the input file and exits at the bottom of the loop once end-of-file is reached. +This loop contains the only call of deflate(). So we must make sure that all of the +input data has been processed and that all of the output data has been generated and consumed +before we fall out of the loop at the bottom. +

+    /* compress until end of file */
+    do {
+
+We start off by reading data from the input file. The number of bytes read is put directly +into avail_in, and a pointer to those bytes is put into next_in. We also +check to see if end-of-file on the input has been reached. If we are at the end of file, then flush is set to the +zlib constant Z_FINISH, which is later passed to deflate() to +indicate that this is the last chunk of input data to compress. We need to use feof() +to check for end-of-file as opposed to seeing if fewer than CHUNK bytes have been read. The +reason is that if the input file length is an exact multiple of CHUNK, we will miss +the fact that we got to the end-of-file, and not know to tell deflate() to finish +up the compressed stream. If we are not yet at the end of the input, then the zlib +constant Z_NO_FLUSH will be passed to deflate to indicate that we are still +in the middle of the uncompressed data. +

+If there is an error in reading from the input file, the process is aborted with +deflateEnd() being called to free the allocated zlib state before returning +the error. We wouldn't want a memory leak, now would we? deflateEnd() can be called +at any time after the state has been initialized. Once that's done, deflateInit() (or +deflateInit2()) would have to be called to start a new compression process. There is +no point here in checking the deflateEnd() return code. The deallocation can't fail. +


+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)deflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
+        strm.next_in = in;
+
+The inner do-loop passes our chunk of input data to deflate(), and then +keeps calling deflate() until it is done producing output. Once there is no more +new output, deflate() is guaranteed to have consumed all of the input, i.e., +avail_in will be zero. +

+        /* run deflate() on input until output buffer not full, finish
+           compression if all of source has been read in */
+        do {
+
+Output space is provided to deflate() by setting avail_out to the number +of available output bytes and next_out to a pointer to that space. +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we call the compression engine itself, deflate(). It takes as many of the +avail_in bytes at next_in as it can process, and writes as many as +avail_out bytes to next_out. Those counters and pointers are then +updated past the input data consumed and the output data written. It is the amount of +output space available that may limit how much input is consumed. +Hence the inner loop to make sure that +all of the input is consumed by providing more output space each time. Since avail_in +and next_in are updated by deflate(), we don't have to mess with those +between deflate() calls until it's all used up. +

+The parameters to deflate() are a pointer to the strm structure containing +the input and output information and the internal compression engine state, and a parameter +indicating whether and how to flush data to the output. Normally deflate will consume +several K bytes of input data before producing any output (except for the header), in order +to accumulate statistics on the data for optimum compression. It will then put out a burst of +compressed data, and proceed to consume more input before the next burst. Eventually, +deflate() +must be told to terminate the stream, complete the compression with provided input data, and +write out the trailer check value. deflate() will continue to compress normally as long +as the flush parameter is Z_NO_FLUSH. Once the Z_FINISH parameter is provided, +deflate() will begin to complete the compressed output stream. However depending on how +much output space is provided, deflate() may have to be called several times until it +has provided the complete compressed stream, even after it has consumed all of the input. The flush +parameter must continue to be Z_FINISH for those subsequent calls. +

+There are other values of the flush parameter that are used in more advanced applications. You can +force deflate() to produce a burst of output that encodes all of the input data provided +so far, even if it wouldn't have otherwise, for example to control data latency on a link with +compressed data. You can also ask that deflate() do that as well as erase any history up to +that point so that what follows can be decompressed independently, for example for random access +applications. Both requests will degrade compression by an amount depending on how often such +requests are made. +

+deflate() has a return value that can indicate errors, yet we do not check it here. Why +not? Well, it turns out that deflate() can do no wrong here. Let's go through +deflate()'s return values and dispense with them one by one. The possible values are +Z_OK, Z_STREAM_END, Z_STREAM_ERROR, or Z_BUF_ERROR. Z_OK +is, well, ok. Z_STREAM_END is also ok and will be returned for the last call of +deflate(). This is already guaranteed by calling deflate() with Z_FINISH +until it has no more output. Z_STREAM_ERROR is only possible if the stream is not +initialized properly, but we did initialize it properly. There is no harm in checking for +Z_STREAM_ERROR here, for example to check for the possibility that some +other part of the application inadvertently clobbered the memory containing the zlib state. +Z_BUF_ERROR will be explained further below, but +suffice it to say that this is simply an indication that deflate() could not consume +more input or produce more output. deflate() can be called again with more output space +or more available input, which it will be in this code. +


+            ret = deflate(&strm, flush);    /* no bad return value */
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+
+Now we compute how much output deflate() provided on the last call, which is the +difference between how much space was provided before the call, and how much output space +is still available after the call. Then that data, if any, is written to the output file. +We can then reuse the output buffer for the next call of deflate(). Again if there +is a file i/o error, we call deflateEnd() before returning to avoid a memory leak. +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)deflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop is repeated until the last deflate() call fails to fill the +provided output buffer. Then we know that deflate() has done as much as it can with +the provided input, and that all of that input has been consumed. We can then fall out of this +loop and reuse the input buffer. +

+The way we tell that deflate() has no more output is by seeing that it did not fill +the output buffer, leaving avail_out greater than zero. However suppose that +deflate() has no more output, but just so happened to exactly fill the output buffer! +avail_out is zero, and we can't tell that deflate() has done all it can. +As far as we know, deflate() +has more output for us. So we call it again. But now deflate() produces no output +at all, and avail_out remains unchanged as CHUNK. That deflate() call +wasn't able to do anything, either consume input or produce output, and so it returns +Z_BUF_ERROR. (See, I told you I'd cover this later.) However this is not a problem at +all. Now we finally have the desired indication that deflate() is really done, +and so we drop out of the inner loop to provide more input to deflate(). +

+With flush set to Z_FINISH, this final set of deflate() calls will +complete the output stream. Once that is done, subsequent calls of deflate() would return +Z_STREAM_ERROR if the flush parameter is not Z_FINISH, and do no more processing +until the state is reinitialized. +

+Some applications of zlib have two loops that call deflate() +instead of the single inner loop we have here. The first loop would call +without flushing and feed all of the data to deflate(). The second loop would call +deflate() with no more +data and the Z_FINISH parameter to complete the process. As you can see from this +example, that can be avoided by simply keeping track of the current flush state. +


+        } while (strm.avail_out == 0);
+        assert(strm.avail_in == 0);     /* all input will be used */
+
+Now we check to see if we have already processed all of the input file. That information was +saved in the flush variable, so we see if that was set to Z_FINISH. If so, +then we're done and we fall out of the outer loop. We're guaranteed to get Z_STREAM_END +from the last deflate() call, since we ran it until the last chunk of input was +consumed and all of the output was generated. +

+        /* done when last data in file processed */
+    } while (flush != Z_FINISH);
+    assert(ret == Z_STREAM_END);        /* stream will be complete */
+
+The process is complete, but we still need to deallocate the state to avoid a memory leak +(or rather more like a memory hemorrhage if you didn't do this). Then +finally we can return with a happy return value. +

+    /* clean up and return */
+    (void)deflateEnd(&strm);
+    return Z_OK;
+}
+
+Now we do the same thing for decompression in the inf() routine. inf() +decompresses what is hopefully a valid zlib stream from the input file and writes the +uncompressed data to the output file. Much of the discussion above for def() +applies to inf() as well, so the discussion here will focus on the differences between +the two. +

+/* Decompress from file source to file dest until stream ends or EOF.
+   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_DATA_ERROR if the deflate data is
+   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
+   the version of the library linked do not match, or Z_ERRNO if there
+   is an error reading or writing the files. */
+int inf(FILE *source, FILE *dest)
+{
+
+The local variables have the same functionality as they do for def(). The +only difference is that there is no flush variable, since inflate() +can tell from the zlib stream itself when the stream is complete. +

+    int ret;
+    unsigned have;
+    z_stream strm;
+    unsigned char in[CHUNK];
+    unsigned char out[CHUNK];
+
+The initialization of the state is the same, except that there is no compression level, +of course, and two more elements of the structure are initialized. avail_in +and next_in must be initialized before calling inflateInit(). This +is because the application has the option to provide the start of the zlib stream in +order for inflateInit() to have access to information about the compression +method to aid in memory allocation. In the current implementation of zlib +(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of +inflate() anyway. However those fields must be initialized since later versions +of zlib that provide more compression methods may take advantage of this interface. +In any case, no decompression is performed by inflateInit(), so the +avail_out and next_out fields do not need to be initialized before calling. +

+Here avail_in is set to zero and next_in is set to Z_NULL to +indicate that no input data is being provided. +


+    /* allocate inflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit(&strm);
+    if (ret != Z_OK)
+        return ret;
+
+The outer do-loop decompresses input until inflate() indicates +that it has reached the end of the compressed data and has produced all of the uncompressed +output. This is in contrast to def() which processes all of the input file. +If end-of-file is reached before the compressed data self-terminates, then the compressed +data is incomplete and an error is returned. +

+    /* decompress until deflate stream ends or end of file */
+    do {
+
+We read input data and set the strm structure accordingly. If we've reached the +end of the input file, then we leave the outer loop and report an error, since the +compressed data is incomplete. Note that we may read more data than is eventually consumed +by inflate(), if the input file continues past the zlib stream. +For applications where zlib streams are embedded in other data, this routine would +need to be modified to return the unused data, or at least indicate how much of the input +data was not used, so the application would know where to pick up after the zlib stream. +

+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)inflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        if (strm.avail_in == 0)
+            break;
+        strm.next_in = in;
+
+The inner do-loop has the same function it did in def(), which is to +keep calling inflate() until has generated all of the output it can with the +provided input. +

+        /* run inflate() on input until output buffer not full */
+        do {
+
+Just like in def(), the same output space is provided for each call of inflate(). +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we run the decompression engine itself. There is no need to adjust the flush parameter, since +the zlib format is self-terminating. The main difference here is that there are +return values that we need to pay attention to. Z_DATA_ERROR +indicates that inflate() detected an error in the zlib compressed data format, +which means that either the data is not a zlib stream to begin with, or that the data was +corrupted somewhere along the way since it was compressed. The other error to be processed is +Z_MEM_ERROR, which can occur since memory allocation is deferred until inflate() +needs it, unlike deflate(), whose memory is allocated at the start by deflateInit(). +

+Advanced applications may use +deflateSetDictionary() to prime deflate() with a set of likely data to improve the +first 32K or so of compression. This is noted in the zlib header, so inflate() +requests that that dictionary be provided before it can start to decompress. Without the dictionary, +correct decompression is not possible. For this routine, we have no idea what the dictionary is, +so the Z_NEED_DICT indication is converted to a Z_DATA_ERROR. +

+inflate() can also return Z_STREAM_ERROR, which should not be possible here, +but could be checked for as noted above for def(). Z_BUF_ERROR does not need to be +checked for here, for the same reasons noted for def(). Z_STREAM_END will be +checked for later. +


+            ret = inflate(&strm, Z_NO_FLUSH);
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+            switch (ret) {
+            case Z_NEED_DICT:
+                ret = Z_DATA_ERROR;     /* and fall through */
+            case Z_DATA_ERROR:
+            case Z_MEM_ERROR:
+                (void)inflateEnd(&strm);
+                return ret;
+            }
+
+The output of inflate() is handled identically to that of deflate(). +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)inflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop ends when inflate() has no more output as indicated +by not filling the output buffer, just as for deflate(). In this case, we cannot +assert that strm.avail_in will be zero, since the deflate stream may end before the file +does. +

+        } while (strm.avail_out == 0);
+
+The outer do-loop ends when inflate() reports that it has reached the +end of the input zlib stream, has completed the decompression and integrity +check, and has provided all of the output. This is indicated by the inflate() +return value Z_STREAM_END. The inner loop is guaranteed to leave ret +equal to Z_STREAM_END if the last chunk of the input file read contained the end +of the zlib stream. So if the return value is not Z_STREAM_END, the +loop continues to read more input. +

+        /* done when inflate() says it's done */
+    } while (ret != Z_STREAM_END);
+
+At this point, decompression successfully completed, or we broke out of the loop due to no +more data being available from the input file. If the last inflate() return value +is not Z_STREAM_END, then the zlib stream was incomplete and a data error +is returned. Otherwise, we return with a happy return value. Of course, inflateEnd() +is called first to avoid a memory leak. +

+    /* clean up and return */
+    (void)inflateEnd(&strm);
+    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
+}
+
+That ends the routines that directly use zlib. The following routines make this +a command-line program by running data through the above routines from stdin to +stdout, and handling any errors reported by def() or inf(). +

+zerr() is used to interpret the possible error codes from def() +and inf(), as detailed in their comments above, and print out an error message. +Note that these are only a subset of the possible return values from deflate() +and inflate(). +


+/* report a zlib or i/o error */
+void zerr(int ret)
+{
+    fputs("zpipe: ", stderr);
+    switch (ret) {
+    case Z_ERRNO:
+        if (ferror(stdin))
+            fputs("error reading stdin\n", stderr);
+        if (ferror(stdout))
+            fputs("error writing stdout\n", stderr);
+        break;
+    case Z_STREAM_ERROR:
+        fputs("invalid compression level\n", stderr);
+        break;
+    case Z_DATA_ERROR:
+        fputs("invalid or incomplete deflate data\n", stderr);
+        break;
+    case Z_MEM_ERROR:
+        fputs("out of memory\n", stderr);
+        break;
+    case Z_VERSION_ERROR:
+        fputs("zlib version mismatch!\n", stderr);
+    }
+}
+
+Here is the main() routine used to test def() and inf(). The +zpipe command is simply a compression pipe from stdin to stdout, if +no arguments are given, or it is a decompression pipe if zpipe -d is used. If any other +arguments are provided, no compression or decompression is performed. Instead a usage +message is displayed. Examples are zpipe < foo.txt > foo.txt.z to compress, and +zpipe -d < foo.txt.z > foo.txt to decompress. +

+/* compress or decompress from stdin to stdout */
+int main(int argc, char **argv)
+{
+    int ret;
+
+    /* avoid end-of-line conversions */
+    SET_BINARY_MODE(stdin);
+    SET_BINARY_MODE(stdout);
+
+    /* do compression if no arguments */
+    if (argc == 1) {
+        ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* do decompression if -d specified */
+    else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
+        ret = inf(stdin, stdout);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* otherwise, report usage */
+    else {
+        fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
+        return 1;
+    }
+}
+
+
+Copyright (c) 2004, 2005 by Mark Adler
Last modified 11 December 2005
+ + diff --git a/third_party/zlib/examples/zpipe.c b/third_party/zlib/examples/zpipe.c new file mode 100644 index 00000000..83535d16 --- /dev/null +++ b/third_party/zlib/examples/zpipe.c @@ -0,0 +1,205 @@ +/* zpipe.c: example of proper use of zlib's inflate() and deflate() + Not copyrighted -- provided to the public domain + Version 1.4 11 December 2005 Mark Adler */ + +/* Version history: + 1.0 30 Oct 2004 First version + 1.1 8 Nov 2004 Add void casting for unused return values + Use switch statement for inflate() return values + 1.2 9 Nov 2004 Add assertions to document zlib guarantees + 1.3 6 Apr 2005 Remove incorrect assertion in inf() + 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions + Avoid some compiler warnings for input and output buffers + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define CHUNK 16384 + +/* Compress from file source to file dest until EOF on source. + def() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_STREAM_ERROR if an invalid compression + level is supplied, Z_VERSION_ERROR if the version of zlib.h and the + version of the library linked do not match, or Z_ERRNO if there is + an error reading or writing the files. */ +int def(FILE *source, FILE *dest, int level) +{ + int ret, flush; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate deflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = deflateInit(&strm, level); + if (ret != Z_OK) + return ret; + + /* compress until end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = in; + + /* run deflate() on input until output buffer not full, finish + compression if all of source has been read in */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = deflate(&strm, flush); /* no bad return value */ + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + assert(strm.avail_in == 0); /* all input will be used */ + + /* done when last data in file processed */ + } while (flush != Z_FINISH); + assert(ret == Z_STREAM_END); /* stream will be complete */ + + /* clean up and return */ + (void)deflateEnd(&strm); + return Z_OK; +} + +/* Decompress from file source to file dest until stream ends or EOF. + inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_DATA_ERROR if the deflate data is + invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and + the version of the library linked do not match, or Z_ERRNO if there + is an error reading or writing the files. */ +int inf(FILE *source, FILE *dest) +{ + int ret; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); + if (ret != Z_OK) + return ret; + + /* decompress until deflate stream ends or end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + if (strm.avail_in == 0) + break; + strm.next_in = in; + + /* run inflate() on input until output buffer not full */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void)inflateEnd(&strm); + return ret; + } + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + + /* done when inflate() says it's done */ + } while (ret != Z_STREAM_END); + + /* clean up and return */ + (void)inflateEnd(&strm); + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; +} + +/* report a zlib or i/o error */ +void zerr(int ret) +{ + fputs("zpipe: ", stderr); + switch (ret) { + case Z_ERRNO: + if (ferror(stdin)) + fputs("error reading stdin\n", stderr); + if (ferror(stdout)) + fputs("error writing stdout\n", stderr); + break; + case Z_STREAM_ERROR: + fputs("invalid compression level\n", stderr); + break; + case Z_DATA_ERROR: + fputs("invalid or incomplete deflate data\n", stderr); + break; + case Z_MEM_ERROR: + fputs("out of memory\n", stderr); + break; + case Z_VERSION_ERROR: + fputs("zlib version mismatch!\n", stderr); + } +} + +/* compress or decompress from stdin to stdout */ +int main(int argc, char **argv) +{ + int ret; + + /* avoid end-of-line conversions */ + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + /* do compression if no arguments */ + if (argc == 1) { + ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* do decompression if -d specified */ + else if (argc == 2 && strcmp(argv[1], "-d") == 0) { + ret = inf(stdin, stdout); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* otherwise, report usage */ + else { + fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); + return 1; + } +} diff --git a/third_party/zlib/examples/zran.c b/third_party/zlib/examples/zran.c new file mode 100644 index 00000000..4fec6594 --- /dev/null +++ b/third_party/zlib/examples/zran.c @@ -0,0 +1,409 @@ +/* zran.c -- example of zlib/gzip stream indexing and random access + * Copyright (C) 2005, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.1 29 Sep 2012 Mark Adler */ + +/* Version History: + 1.0 29 May 2005 First version + 1.1 29 Sep 2012 Fix memory reallocation error + */ + +/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() + for random access of a compressed file. A file containing a zlib or gzip + stream is provided on the command line. The compressed stream is decoded in + its entirety, and an index built with access points about every SPAN bytes + in the uncompressed output. The compressed file is left open, and can then + be read randomly, having to decompress on the average SPAN/2 uncompressed + bytes before getting to the desired block of data. + + An access point can be created at the start of any deflate block, by saving + the starting file offset and bit of that block, and the 32K bytes of + uncompressed data that precede that block. Also the uncompressed offset of + that block is saved to provide a referece for locating a desired starting + point in the uncompressed stream. build_index() works by decompressing the + input zlib or gzip stream a block at a time, and at the end of each block + deciding if enough uncompressed data has gone by to justify the creation of + a new access point. If so, that point is saved in a data structure that + grows as needed to accommodate the points. + + To use the index, an offset in the uncompressed data is provided, for which + the latest access point at or preceding that offset is located in the index. + The input file is positioned to the specified location in the index, and if + necessary the first few bits of the compressed data is read from the file. + inflate is initialized with those bits and the 32K of uncompressed data, and + the decompression then proceeds until the desired offset in the file is + reached. Then the decompression continues to read the desired uncompressed + data from the file. + + Another approach would be to generate the index on demand. In that case, + requests for random access reads from the compressed data would try to use + the index, but if a read far enough past the end of the index is required, + then further index entries would be generated and added. + + There is some fair bit of overhead to starting inflation for the random + access, mainly copying the 32K byte dictionary. So if small pieces of the + file are being accessed, it would make sense to implement a cache to hold + some lookahead and avoid many calls to extract() for small lengths. + + Another way to build an index would be to use inflateCopy(). That would + not be constrained to have access points at block boundaries, but requires + more memory per access point, and also cannot be saved to file due to the + use of pointers in the state. The approach here allows for storage of the + index in a file. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +#define SPAN 1048576L /* desired distance between access points */ +#define WINSIZE 32768U /* sliding window size */ +#define CHUNK 16384 /* file input buffer size */ + +/* access point entry */ +struct point { + off_t out; /* corresponding offset in uncompressed data */ + off_t in; /* offset in input file of first full byte */ + int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ + unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ +}; + +/* access point list */ +struct access { + int have; /* number of list entries filled in */ + int size; /* number of list entries allocated */ + struct point *list; /* allocated list */ +}; + +/* Deallocate an index built by build_index() */ +local void free_index(struct access *index) +{ + if (index != NULL) { + free(index->list); + free(index); + } +} + +/* Add an entry to the access point list. If out of memory, deallocate the + existing list and return NULL. */ +local struct access *addpoint(struct access *index, int bits, + off_t in, off_t out, unsigned left, unsigned char *window) +{ + struct point *next; + + /* if list is empty, create it (start with eight points) */ + if (index == NULL) { + index = malloc(sizeof(struct access)); + if (index == NULL) return NULL; + index->list = malloc(sizeof(struct point) << 3); + if (index->list == NULL) { + free(index); + return NULL; + } + index->size = 8; + index->have = 0; + } + + /* if list is full, make it bigger */ + else if (index->have == index->size) { + index->size <<= 1; + next = realloc(index->list, sizeof(struct point) * index->size); + if (next == NULL) { + free_index(index); + return NULL; + } + index->list = next; + } + + /* fill in entry and increment how many we have */ + next = index->list + index->have; + next->bits = bits; + next->in = in; + next->out = out; + if (left) + memcpy(next->window, window + WINSIZE - left, left); + if (left < WINSIZE) + memcpy(next->window + left, window, WINSIZE - left); + index->have++; + + /* return list, possibly reallocated */ + return index; +} + +/* Make one entire pass through the compressed stream and build an index, with + access points about every span bytes of uncompressed output -- span is + chosen to balance the speed of random access against the memory requirements + of the list, about 32K bytes per access point. Note that data after the end + of the first zlib or gzip stream in the file is ignored. build_index() + returns the number of access points on success (>= 1), Z_MEM_ERROR for out + of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a + file read error. On success, *built points to the resulting index. */ +local int build_index(FILE *in, off_t span, struct access **built) +{ + int ret; + off_t totin, totout; /* our own total counters to avoid 4GB limit */ + off_t last; /* totout value of last access point */ + struct access *index; /* access points being generated */ + z_stream strm; + unsigned char input[CHUNK]; + unsigned char window[WINSIZE]; + + /* initialize inflate */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */ + if (ret != Z_OK) + return ret; + + /* inflate the input, maintain a sliding window, and build an index -- this + also validates the integrity of the compressed data using the check + information at the end of the gzip or zlib stream */ + totin = totout = last = 0; + index = NULL; /* will be allocated by first addpoint() */ + strm.avail_out = 0; + do { + /* get some compressed data from input file */ + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto build_index_error; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto build_index_error; + } + strm.next_in = input; + + /* process all of that, or until end of stream */ + do { + /* reset sliding window if necessary */ + if (strm.avail_out == 0) { + strm.avail_out = WINSIZE; + strm.next_out = window; + } + + /* inflate until out of input, output, or at end of block -- + update the total input and output counters */ + totin += strm.avail_in; + totout += strm.avail_out; + ret = inflate(&strm, Z_BLOCK); /* return at end of block */ + totin -= strm.avail_in; + totout -= strm.avail_out; + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto build_index_error; + if (ret == Z_STREAM_END) + break; + + /* if at end of block, consider adding an index entry (note that if + data_type indicates an end-of-block, then all of the + uncompressed data from that block has been delivered, and none + of the compressed data after that block has been consumed, + except for up to seven bits) -- the totout == 0 provides an + entry point after the zlib or gzip header, and assures that the + index always has at least one access point; we avoid creating an + access point after the last block by checking bit 6 of data_type + */ + if ((strm.data_type & 128) && !(strm.data_type & 64) && + (totout == 0 || totout - last > span)) { + index = addpoint(index, strm.data_type & 7, totin, + totout, strm.avail_out, window); + if (index == NULL) { + ret = Z_MEM_ERROR; + goto build_index_error; + } + last = totout; + } + } while (strm.avail_in != 0); + } while (ret != Z_STREAM_END); + + /* clean up and return index (release unused entries in list) */ + (void)inflateEnd(&strm); + index->list = realloc(index->list, sizeof(struct point) * index->have); + index->size = index->have; + *built = index; + return index->size; + + /* return error */ + build_index_error: + (void)inflateEnd(&strm); + if (index != NULL) + free_index(index); + return ret; +} + +/* Use the index to read len bytes from offset into buf, return bytes read or + negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past + the end of the uncompressed data, then extract() will return a value less + than len, indicating how much as actually read into buf. This function + should not return a data error unless the file was modified since the index + was generated. extract() may also return Z_ERRNO if there is an error on + reading or seeking the input file. */ +local int extract(FILE *in, struct access *index, off_t offset, + unsigned char *buf, int len) +{ + int ret, skip; + z_stream strm; + struct point *here; + unsigned char input[CHUNK]; + unsigned char discard[WINSIZE]; + + /* proceed only if something reasonable to do */ + if (len < 0) + return 0; + + /* find where in stream to start */ + here = index->list; + ret = index->have; + while (--ret && here[1].out <= offset) + here++; + + /* initialize file and inflate state to start there */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); /* raw inflate */ + if (ret != Z_OK) + return ret; + ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); + if (ret == -1) + goto extract_ret; + if (here->bits) { + ret = getc(in); + if (ret == -1) { + ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; + goto extract_ret; + } + (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); + } + (void)inflateSetDictionary(&strm, here->window, WINSIZE); + + /* skip uncompressed bytes until offset reached, then satisfy request */ + offset -= here->out; + strm.avail_in = 0; + skip = 1; /* while skipping to offset */ + do { + /* define where to put uncompressed data, and how much */ + if (offset == 0 && skip) { /* at offset now */ + strm.avail_out = len; + strm.next_out = buf; + skip = 0; /* only do this once */ + } + if (offset > WINSIZE) { /* skip WINSIZE bytes */ + strm.avail_out = WINSIZE; + strm.next_out = discard; + offset -= WINSIZE; + } + else if (offset != 0) { /* last skip */ + strm.avail_out = (unsigned)offset; + strm.next_out = discard; + offset = 0; + } + + /* uncompress until avail_out filled, or end of stream */ + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto extract_ret; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto extract_ret; + } + strm.next_in = input; + } + ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */ + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto extract_ret; + if (ret == Z_STREAM_END) + break; + } while (strm.avail_out != 0); + + /* if reach end of stream, then don't keep trying to get more */ + if (ret == Z_STREAM_END) + break; + + /* do until offset reached and requested data read, or stream ends */ + } while (skip); + + /* compute number of uncompressed bytes read after offset */ + ret = skip ? 0 : len - strm.avail_out; + + /* clean up and return bytes read or error */ + extract_ret: + (void)inflateEnd(&strm); + return ret; +} + +/* Demonstrate the use of build_index() and extract() by processing the file + provided on the command line, and the extracting 16K from about 2/3rds of + the way through the uncompressed output, and writing that to stdout. */ +int main(int argc, char **argv) +{ + int len; + off_t offset; + FILE *in; + struct access *index = NULL; + unsigned char buf[CHUNK]; + + /* open input file */ + if (argc != 2) { + fprintf(stderr, "usage: zran file.gz\n"); + return 1; + } + in = fopen(argv[1], "rb"); + if (in == NULL) { + fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); + return 1; + } + + /* build index */ + len = build_index(in, SPAN, &index); + if (len < 0) { + fclose(in); + switch (len) { + case Z_MEM_ERROR: + fprintf(stderr, "zran: out of memory\n"); + break; + case Z_DATA_ERROR: + fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); + break; + case Z_ERRNO: + fprintf(stderr, "zran: read error on %s\n", argv[1]); + break; + default: + fprintf(stderr, "zran: error %d while building index\n", len); + } + return 1; + } + fprintf(stderr, "zran: built index with %d access points\n", len); + + /* use index by reading some bytes from an arbitrary offset */ + offset = (index->list[index->have - 1].out << 1) / 3; + len = extract(in, index, offset, buf, CHUNK); + if (len < 0) + fprintf(stderr, "zran: extraction failed: %s error\n", + len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); + else { + fwrite(buf, 1, len, stdout); + fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); + } + + /* clean up and exit */ + free_index(index); + fclose(in); + return 0; +} diff --git a/third_party/zlib/gzclose.c b/third_party/zlib/gzclose.c new file mode 100644 index 00000000..caeb99a3 --- /dev/null +++ b/third_party/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/third_party/zlib/gzguts.h b/third_party/zlib/gzguts.h new file mode 100644 index 00000000..990a4d25 --- /dev/null +++ b/third_party/zlib/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/third_party/zlib/gzlib.c b/third_party/zlib/gzlib.c new file mode 100644 index 00000000..4105e6af --- /dev/null +++ b/third_party/zlib/gzlib.c @@ -0,0 +1,637 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + z_size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef WIDECHAR + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (z_size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef WIDECHAR + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef WIDECHAR + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) { + LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ + state->mode = GZ_WRITE; /* simplify later checks */ + } + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef WIDECHAR +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if ((size << 1) < size) + return -1; /* need to be able to double it */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/third_party/zlib/gzread.c b/third_party/zlib/gzread.c new file mode 100644 index 00000000..956b91ea --- /dev/null +++ b/third_party/zlib/gzread.c @@ -0,0 +1,654 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); +local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + unsigned get, max = ((unsigned)-1 >> 2) + 1; + + *have = 0; + do { + get = len - *have; + if (get > max) + get = max; + ret = read(state->fd, buf + *have, get); + if (ret <= 0) + break; + *have += (unsigned)ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* Read len bytes into buf from file, or less than len up to the end of the + input. Return the number of bytes read. If zero is returned, either the + end of file was reached, or there was an error. state->err must be + consulted in that case to determine which. */ +local z_size_t gz_read(state, buf, len) + gz_statep state; + voidp buf; + z_size_t len; +{ + z_size_t got; + unsigned n; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return 0; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* set n to the maximum amount of len that fits in an unsigned int */ + n = -1; + if (n > len) + n = len; + + /* first just try copying data from the output buffer */ + if (state->x.have) { + if (state->x.have < n) + n = state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || n < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return 0; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, n, &n) == -1) + return 0; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + state->strm.avail_out = n; + state->strm.next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return 0; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer */ + return got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); + return -1; + } + + /* read len or fewer bytes to buf */ + len = gz_read(state, buf, len); + + /* check for an error */ + if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* return the number of bytes read (this is assured to fit in an int) */ + return (int)len; +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfread(buf, size, nitems, file) + voidp buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* read len or fewer bytes to buf, return the number of full items read */ + return len ? gz_read(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gz_read() */ + ret = gz_read(state, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/third_party/zlib/gzwrite.c b/third_party/zlib/gzwrite.c new file mode 100644 index 00000000..c7b5651d --- /dev/null +++ b/third_party/zlib/gzwrite.c @@ -0,0 +1,665 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); +local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on a memory allocation failure, or 0 on + success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer (double size for gzprintf) */ + state->in = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + strm->next_in = NULL; + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file or if gz_init() + fails to allocate memory, otherwise 0. flush is assumed to be a valid + deflate() flush value. If flush is Z_FINISH, then the deflate() state is + reset to start a new gzip stream. If gz->direct is true, then simply write + to the output file without compressing, and ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + while (strm->avail_in) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; + } + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + while (strm->next_out > state->x.next) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + state->x.next += writ; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = state->out; + } + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on a write error or memory + allocation failure by gz_comp(), or 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* Write len bytes from buf to file. Return the number of bytes written. If + the returned value is less than len, then there was an error. */ +local z_size_t gz_write(state, buf, len) + gz_statep state; + voidpc buf; + z_size_t len; +{ + z_size_t put = len; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (state->strm.avail_in == 0) + state->strm.next_in = state->in; + have = (unsigned)((state->strm.next_in + state->strm.avail_in) - + state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + state->strm.avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + state->strm.next_in = (z_const Bytef *)buf; + do { + unsigned n = (unsigned)-1; + if (n > len) + n = len; + state->strm.avail_in = n; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + len -= n; + } while (len); + } + + /* input was all buffered or compressed */ + return put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* write len bytes from buf (the return value will fit in an int) */ + return (int)gz_write(state, buf, len); +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) + voidpc buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* write len bytes to buf, return the number of full items written */ + return len ? gz_write(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = (unsigned char)c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = (unsigned char)c; + if (gz_write(state, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* write string */ + len = strlen(str); + ret = gz_write(state, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int len; + unsigned left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->err; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(next, format, va); + for (len = 0; len < state->size; len++) + if (next[len] == 0) break; +# else + len = vsprintf(next, format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(next, state->size, format, va); + len = strlen(next); +# else + len = vsnprintf(next, state->size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += (unsigned)len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + unsigned len, left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return Z_STREAM_ERROR; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->error; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->error; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(strm->next_in + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (next[len] == 0) + break; +# else + len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, + a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(next); +# else + len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return (int)len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* compress remaining data with requested flush */ + (void)gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/third_party/zlib/infback.c b/third_party/zlib/infback.c new file mode 100644 index 00000000..59679ecb --- /dev/null +++ b/third_party/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = (uInt)windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/third_party/zlib/inffast.c b/third_party/zlib/inffast.c new file mode 100644 index 00000000..0dbd1dbc --- /dev/null +++ b/third_party/zlib/inffast.c @@ -0,0 +1,323 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - 5); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + *out++ = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = window; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } while (len > 2); + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/third_party/zlib/inffast.h b/third_party/zlib/inffast.h new file mode 100644 index 00000000..e5c1aa4c --- /dev/null +++ b/third_party/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/third_party/zlib/inffixed.h b/third_party/zlib/inffixed.h new file mode 100644 index 00000000..d6283277 --- /dev/null +++ b/third_party/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/third_party/zlib/inflate.c b/third_party/zlib/inflate.c new file mode 100644 index 00000000..ac333e8c --- /dev/null +++ b/third_party/zlib/inflate.c @@ -0,0 +1,1561 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/third_party/zlib/inflate.h b/third_party/zlib/inflate.h new file mode 100644 index 00000000..a46cce6b --- /dev/null +++ b/third_party/zlib/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/third_party/zlib/inftrees.c b/third_party/zlib/inftrees.c new file mode 100644 index 00000000..2ea08fc1 --- /dev/null +++ b/third_party/zlib/inftrees.c @@ -0,0 +1,304 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.11 Copyright 1995-2017 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 + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + unsigned match; /* use base and extra for symbol >= match */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 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, 202}; + 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, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + match = 20; + break; + case LENS: + base = lbase; + extra = lext; + match = 257; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if (work[sym] + 1U < match) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/third_party/zlib/inftrees.h b/third_party/zlib/inftrees.h new file mode 100644 index 00000000..baa53a0b --- /dev/null +++ b/third_party/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/third_party/zlib/make_vms.com b/third_party/zlib/make_vms.com new file mode 100644 index 00000000..65e9d0cb --- /dev/null +++ b/third_party/zlib/make_vms.com @@ -0,0 +1,867 @@ +$! make libz under VMS written by +$! Martin P.J. Zinser +$! +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! martin.zinser@eurexchange.com (work) +$! +$! Make procedure history for Zlib +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20060120 First version to receive a number +$! 0.02 20061008 Adapt to new Makefile.in +$! 0.03 20091224 Add support for large file check +$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite +$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! subdir path, update module search in makefile.in +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! shared image creation +$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared +$! image +$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)). +$! "" -> automatic, preference: MMK, MMS, built-in. +$! +$ on error then goto err_exit +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ define/nolog tconfig 'th' +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$ s_case = False +$! +$! Setup variables holding "config" information +$! +$ Make = "''p1'" +$ name = "Zlib" +$ version = "?.?.?" +$ v_string = "ZLIB_VERSION" +$ v_file = "zlib.h" +$ ccopt = "/include = []" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in" +$ conf_check_string = "" +$ linkonly = false +$ optfile = name + ".opt" +$ mapfile = name + ".map" +$ libdefs = "" +$ vax = f$getsyi("HW_MODEL").lt.1024 +$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$ ia64 = f$getsyi("HW_MODEL").ge.4096 +$! +$! 2012-03-05 SMS. +$! Why is this needed? And if it is needed, why not simply ".not. vax"? +$! +$!!! if axp .or. ia64 then set proc/parse=extended +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! +$! Check for MMK/MMS +$! +$ if (Make .eqs. "") +$ then +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$ else +$ Make = f$edit( Make, "trim") +$ endif +$! +$ gosub find_version +$! +$ open/write topt tmp.opt +$ open/write optf 'optfile' +$! +$ gosub check_opts +$! +$! Look for the compiler used +$! +$ gosub check_compiler +$ close topt +$ close optf +$! +$ if its_decc +$ then +$ ccopt = "/prefix=all" + ccopt +$ if f$trnlnm("SYS") .eqs. "" +$ then +$ if axp +$ then +$ define sys sys$library: +$ else +$ ccopt = "/decc" + ccopt +$ define sys decc$library_include: +$ endif +$ endif +$! +$! 2012-03-05 SMS. +$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX? +$! +$ if axp .or. ia64 +$ then +$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)" +$ s_case = true +$ endif +$ endif +$ if its_vaxc .or. its_gnuc +$ then +$ if f$trnlnm("SYS").eqs."" then define sys sys$library: +$ endif +$! +$! Build a fake configure input header +$! +$ open/write conf_hin config.hin +$ write conf_hin "#undef _LARGEFILE64_SOURCE" +$ close conf_hin +$! +$! +$ i = 0 +$FIND_ACONF: +$ fname = f$element(i,"#",aconf_in_file) +$ if fname .eqs. "#" then goto AMISS_ERR +$ if f$search(fname) .eqs. "" +$ then +$ i = i + 1 +$ goto find_aconf +$ endif +$ open/read/err=aconf_err aconf_in 'fname' +$ open/write aconf zconf.h +$ACONF_LOOP: +$ read/end_of_file=aconf_exit aconf_in line +$ work = f$edit(line, "compress,trim") +$ if f$extract(0,6,work) .nes. "#undef" +$ then +$ if f$extract(0,12,work) .nes. "#cmakedefine" +$ then +$ write aconf line +$ endif +$ else +$ cdef = f$element(1," ",work) +$ gosub check_config +$ endif +$ goto aconf_loop +$ACONF_EXIT: +$ write aconf "" +$ write aconf "/* VMS specifics added by make_vms.com: */" +$ write aconf "#define VMS 1" +$ write aconf "#include " +$ write aconf "#include " +$ write aconf "#ifdef _LARGEFILE" +$ write aconf "# define off64_t __off64_t" +$ write aconf "# define fopen64 fopen" +$ write aconf "# define fseeko64 fseeko" +$ write aconf "# define lseek64 lseek" +$ write aconf "# define ftello64 ftell" +$ write aconf "#endif" +$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)" +$ write aconf "# define HAVE_VSNPRINTF" +$ write aconf "#endif" +$ close aconf_in +$ close aconf +$ if f$search("''th'") .nes. "" then delete 'th';* +$! Build the thing plain or with mms +$! +$ write sys$output "Compiling Zlib sources ..." +$ if make.eqs."" +$ then +$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;* +$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;* +$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - + adler32.c zlib.h zconf.h +$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - + compress.c zlib.h zconf.h +$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - + crc32.c zlib.h zconf.h +$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - + deflate.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" - + gzclose.c zutil.h zlib.h zconf.h +$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" - + gzlib.c zutil.h zlib.h zconf.h +$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" - + gzread.c zutil.h zlib.h zconf.h +$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" - + gzwrite.c zutil.h zlib.h zconf.h +$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - + infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - + inffast.c zutil.h zlib.h zconf.h inffast.h +$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - + inflate.c zutil.h zlib.h zconf.h infblock.h +$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - + inftrees.c zutil.h zlib.h zconf.h inftrees.h +$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - + trees.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - + uncompr.c zlib.h zconf.h +$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - + zutil.c zutil.h zlib.h zconf.h +$ write sys$output "Building Zlib ..." +$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ +$ write sys$output "Building example..." +$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" - + [.test]example.c zlib.h zconf.h +$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" - + [.test]minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib" - + minigzip.obj libz.olb +$ else +$ gosub crea_mms +$ write sys$output "Make ''name' ''version' with ''Make' " +$ 'make' +$ endif +$! +$! Create shareable image +$! +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call map_2_shopt 'mapfile' 'optfile' +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt +$ write sys$output "Zlib build completed" +$ delete/nolog tmp.opt;* +$ exit +$AMISS_ERR: +$ write sys$output "No source for config.hin found." +$ write sys$output "Tried any of ''aconf_in_file'" +$ goto err_exit +$CC_ERR: +$ write sys$output "C compiler required to build ''name'" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog topt +$ close/nolog aconf_in +$ close/nolog aconf +$ close/nolog out +$ close/nolog min +$ close/nolog mod +$ close/nolog h_in +$ write sys$output "Exiting..." +$ exit 2 +$! +$! +$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES +$ V = 'F$Verify(0) +$! P1 = What we are trying to make +$! P2 = Command to make it +$! P3 - P8 What it depends on +$ +$ If F$Search(P1) .Eqs. "" Then Goto Makeit +$ Time = F$CvTime(F$File(P1,"RDT")) +$arg=3 +$Loop: +$ Argument = P'arg +$ If Argument .Eqs. "" Then Goto Exit +$ El=0 +$Loop2: +$ File = F$Element(El," ",Argument) +$ If File .Eqs. " " Then Goto Endl +$ AFile = "" +$Loop3: +$ OFile = AFile +$ AFile = F$Search(File) +$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl +$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit +$ Goto Loop3 +$NextEL: +$ El = El + 1 +$ Goto Loop2 +$EndL: +$ arg=arg+1 +$ If arg .Le. 8 Then Goto Loop +$ Goto Exit +$ +$Makeit: +$ VV=F$VERIFY(0) +$ write sys$output P2 +$ 'P2 +$ VV='F$Verify(VV) +$Exit: +$ If V Then Set Verify +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20041206 First version to receive a number +$! 0.02 20060126 Add new "HELP" target +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$! +$! Check if parameter actually contains something +$! +$ if f$edit(cparm,"trim") .nes. "" +$ then +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ if cparm .eqs. "HELP" then gosub bhelp +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Look for the compiler used +$! +$! Version history +$! 0.01 20040223 First version to receive a number +$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists +$! 0.03 20060202 Extend handling of GNU C +$! 0.04 20090402 Compaq -> hp +$CHECK_COMPILER: +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then +$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") +$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") +$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") +$ endif +$! +$! Exit if no compiler available +$! +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then goto CC_ERR +$ else +$ if its_decc +$ then +$ write sys$output "CC compiler check ... hp C" +$ if f$trnlnm("decc$no_rooted_search_lists") .nes. "" +$ then +$ dnrsl = f$trnlnm("decc$no_rooted_search_lists") +$ endif +$ define/nolog decc$no_rooted_search_lists 1 +$ else +$ if its_vaxc then write sys$output "CC compiler check ... VAX C" +$ if its_gnuc +$ then +$ write sys$output "CC compiler check ... GNU C" +$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib" +$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib" +$ cc = "gcc" +$ endif +$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" +$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms..." +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser +# + +OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ + gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, \ + inftrees.obj, inffast.obj + +$ eod +$ write out "CFLAGS=", ccopt +$ write out "LOPTS=", lopts +$ write out "all : example.exe minigzip.exe libz.olb" +$ copy sys$input: out +$ deck + @ write sys$output " Example applications available" + +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link $(LOPTS) example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link $(LOPTS) minigzip,libz.olb/lib + +clean : + delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* + + +# Other dependencies. +adler32.obj : adler32.c zutil.h zlib.h zconf.h +compress.obj : compress.c zlib.h zconf.h +crc32.obj : crc32.c zutil.h zlib.h zconf.h +deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h +example.obj : [.test]example.c zlib.h zconf.h +gzclose.obj : gzclose.c zutil.h zlib.h zconf.h +gzlib.obj : gzlib.c zutil.h zlib.h zconf.h +gzread.obj : gzread.c zutil.h zlib.h zconf.h +gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h +inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h +inflate.obj : inflate.c zutil.h zlib.h zconf.h +inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h +minigzip.obj : [.test]minigzip.c zlib.h zconf.h +trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h +uncompr.obj : uncompr.c zlib.h zconf.h +zutil.obj : zutil.c zutil.h zlib.h zconf.h +infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Read list of core library sources from makefile.in and create options +$! needed to build shareable image +$! +$CREA_OLIST: +$ open/read min makefile.in +$ open/write mod modules.opt +$ src_check_list = "OBJZ =#OBJG =" +$MRLOOP: +$ read/end=mrdone min rec +$ i = 0 +$SRC_CHECK_LOOP: +$ src_check = f$element(i, "#", src_check_list) +$ i = i+1 +$ if src_check .eqs. "#" then goto mrloop +$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop +$ rec = rec - src_check +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop +$MRSLOOP: +$ read/end=mrdone min rec +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop +$MRDONE: +$ close min +$ close mod +$ return +$!------------------------------------------------------------------------------ +$! +$! Take record extracted in crea_olist and split it into single filenames +$! +$EXTRA_FILNAM: +$ myrec = f$edit(rec - "\", "trim,compress") +$ i = 0 +$FELOOP: +$ srcfil = f$element(i," ", myrec) +$ if (srcfil .nes. " ") +$ then +$ write mod f$parse(srcfil,,,"NAME"), ".obj" +$ i = i + 1 +$ goto feloop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Find current Zlib version number +$! +$FIND_VERSION: +$ open/read h_in 'v_file' +$hloop: +$ read/end=hdone h_in rec +$ rec = f$edit(rec,"TRIM") +$ if (f$extract(0,1,rec) .nes. "#") then goto hloop +$ rec = f$edit(rec - "#", "TRIM") +$ if f$element(0," ",rec) .nes. "define" then goto hloop +$ if f$element(1," ",rec) .eqs. v_string +$ then +$ version = 'f$element(2," ",rec)' +$ goto hdone +$ endif +$ goto hloop +$hdone: +$ close h_in +$ return +$!------------------------------------------------------------------------------ +$! +$CHECK_CONFIG: +$! +$ in_ldef = f$locate(cdef,libdefs) +$ if (in_ldef .lt. f$length(libdefs)) +$ then +$ write aconf "#define ''cdef' 1" +$ libdefs = f$extract(0,in_ldef,libdefs) + - + f$extract(in_ldef + f$length(cdef) + 1, - + f$length(libdefs) - in_ldef - f$length(cdef) - 1, - + libdefs) +$ else +$ if (f$type('cdef') .eqs. "INTEGER") +$ then +$ write aconf "#define ''cdef' ", 'cdef' +$ else +$ if (f$type('cdef') .eqs. "STRING") +$ then +$ write aconf "#define ''cdef' ", """", '''cdef'', """" +$ else +$ gosub check_cc_def +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$ CHECK_CC_DEF: +$ if (cdef .eqs. "_LARGEFILE64_SOURCE") +$ then +$ copy sys$input: 'tc' +$ deck +#include "tconfig" +#define _LARGEFILE +#include + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} + +$ eod +$ test_inv = false +$ comm_h = false +$ gosub cc_prop_check +$ return +$ endif +$ write aconf "/* ", line, " */" +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler +$! +$! Version history +$! 0.01 20031020 First version to receive a number +$! 0.02 20031022 Added logic for defines with value +$! 0.03 20040309 Make sure local config file gets not deleted +$! 0.04 20041230 Also write include for configure run +$! 0.05 20050103 Add processing of "comment defines" +$CC_PROP_CHECK: +$ cc_prop = true +$ is_need = false +$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true) +$ if f$search(th) .eqs. "" then create 'th' +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'.*;*/exclude='th' +$ if (cc_prop .and. .not. is_need) .or. - + (.not. cc_prop .and. is_need) +$ then +$ write sys$output "Checking for ''cdef'... yes" +$ if f$type('cdef_val'_yes) .nes. "" +$ then +$ if f$type('cdef_val'_yes) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes) +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes) +$ else +$ call write_config f$fao("#define !AS 1",cdef) +$ endif +$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. - + (cdef .eqs. "_LARGEFILE64_SOURCE") then - + call write_config f$string("#define _LARGEFILE 1") +$ else +$ write sys$output "Checking for ''cdef'... no" +$ if (comm_h) +$ then + call write_config f$fao("/* !AS */",line) +$ else +$ if f$type('cdef_val'_no) .nes. "" +$ then +$ if f$type('cdef_val'_no) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no) +$ if f$type('cdef_val'_no) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no) +$ else +$ call write_config f$fao("#undef !AS",cdef) +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler with multiple result values +$! +$! Version history +$! 0.01 20040127 First version +$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05 +$CC_MPROP_CHECK: +$ cc_prop = true +$ i = 1 +$ idel = 1 +$ MT_LOOP: +$ if f$type(result_'i') .eqs. "STRING" +$ then +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam'_'i' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam'_'i',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'_'i'.*;* +$ if (cc_prop) +$ then +$ write sys$output "Checking for ''cdef'... ", mdef_'i' +$ if f$type(mdef_'i') .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,mdef_'i') +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,mdef_'i') +$ goto msym_clean +$ else +$ i = i + 1 +$ goto mt_loop +$ endif +$ endif +$ write sys$output "Checking for ''cdef'... no" +$ call write_config f$fao("#undef !AS",cdef) +$ MSYM_CLEAN: +$ if (idel .le. msym_max) +$ then +$ delete/sym mdef_'idel' +$ idel = idel + 1 +$ goto msym_clean +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Write configuration to both permanent and temporary config file +$! +$! Version history +$! 0.01 20031029 First version to receive a number +$! +$WRITE_CONFIG: SUBROUTINE +$ write aconf 'p1' +$ open/append confh 'th' +$ write confh 'p1' +$ close confh +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Analyze the project map file and create the symbol vector for a shareable +$! image from it +$! +$! Version history +$! 0.01 20120128 First version +$! 0.02 20120226 Add pre-load logic +$! +$ MAP_2_SHOPT: Subroutine +$! +$ SAY := "WRITE_ SYS$OUTPUT" +$! +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_m2s +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT: Error, no output file provided" +$ goto exit_m2s +$ ENDIF +$! +$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary" +$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread" +$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary" +$ module4 = "inflateSync#uncompress#zlibVersion#compress" +$ open/read map 'p1 +$ if axp .or. ia64 +$ then +$ open/write aopt a.opt +$ open/write bopt b.opt +$ write aopt " CASE_SENSITIVE=YES" +$ write bopt "SYMBOL_VECTOR= (-" +$ mod_sym_num = 1 +$ MOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ MOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ mod_in = mod_in + 1 +$ goto mod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto mod_sym_loop +$ endif +$MAP_LOOP: +$ read/end=map_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto map_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ endif +$ goto map_loop +$MAP_END: +$ close/nolog aopt +$ close/nolog bopt +$ open/append libopt 'p2' +$ open/read aopt a.opt +$ open/read bopt b.opt +$ALOOP: +$ read/end=aloop_end aopt line +$ write libopt line +$ goto aloop +$ALOOP_END: +$ close/nolog aopt +$ sv = "" +$BLOOP: +$ read/end=bloop_end bopt svn +$ if (svn.nes."") +$ then +$ if (sv.nes."") then write libopt sv +$ sv = svn +$ endif +$ goto bloop +$BLOOP_END: +$ write libopt f$extract(0,f$length(sv)-2,sv), "-" +$ write libopt ")" +$ close/nolog bopt +$ delete/nolog/noconf a.opt;*,b.opt;* +$ else +$ if vax +$ then +$ open/append libopt 'p2' +$ mod_sym_num = 1 +$ VMOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ VMOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ mod_in = mod_in + 1 +$ goto vmod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto vmod_sym_loop +$ endif +$VMAP_LOOP: +$ read/end=vmap_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto vmap_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ endif +$ goto vmap_loop +$VMAP_END: +$ else +$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)" +$ write sys$output "No options file created" +$ endif +$ endif +$ EXIT_M2S: +$ close/nolog map +$ close/nolog libopt +$ endsubroutine diff --git a/third_party/zlib/msdos/Makefile.bor b/third_party/zlib/msdos/Makefile.bor new file mode 100644 index 00000000..3d12a2c2 --- /dev/null +++ b/third_party/zlib/msdos/Makefile.bor @@ -0,0 +1,115 @@ +# Makefile for zlib +# Borland C++ +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.bor" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C++, Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# memory model: one of s, m, c, l (small, medium, compact, large) +MODEL=l + +# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version +CC=bcc +LD=bcc +AR=tlib + +# compiler flags +# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0 +CFLAGS=-O2 -Z -m$(MODEL) $(LOC) + +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/third_party/zlib/msdos/Makefile.dj2 b/third_party/zlib/msdos/Makefile.dj2 new file mode 100644 index 00000000..59d2037d --- /dev/null +++ b/third_party/zlib/msdos/Makefile.dj2 @@ -0,0 +1,104 @@ +# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.dj2; make test -fmakefile.dj2 +# +# To install libz.a, zconf.h and zlib.h in the djgpp directories, type: +# +# make install -fmakefile.dj2 +# +# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as +# in the sample below if the pattern of the DJGPP distribution is to +# be followed. Remember that, while 'es around <=> are ignored in +# makefiles, they are *not* in batch files or in djgpp.env. +# - - - - - +# [make] +# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include +# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib +# BUTT=-m486 +# - - - - - +# Alternately, these variables may be defined below, overriding the values +# in djgpp.env, as +# INCLUDE_PATH=c:\usr\include +# LIBRARY_PATH=c:\usr\lib + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lz +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=libz.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +OBJA = +# to use the asm code: make OBJA=match.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +check: test +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +libz.a: $(OBJS) $(OBJA) + $(AR) $@ $(OBJS) $(OBJA) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + +# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env . + +.PHONY : uninstall clean + +install: $(INCL) $(LIBS) + -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH) + -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH) + $(INSTALL) zlib.h $(INCLUDE_PATH) + $(INSTALL) zconf.h $(INCLUDE_PATH) + $(INSTALL) libz.a $(LIBRARY_PATH) + +uninstall: + $(RM) $(INCLUDE_PATH)\zlib.h + $(RM) $(INCLUDE_PATH)\zconf.h + $(RM) $(LIBRARY_PATH)\libz.a + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) libz.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/third_party/zlib/msdos/Makefile.emx b/third_party/zlib/msdos/Makefile.emx new file mode 100644 index 00000000..e30f67be --- /dev/null +++ b/third_party/zlib/msdos/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/third_party/zlib/msdos/Makefile.msc b/third_party/zlib/msdos/Makefile.msc new file mode 100644 index 00000000..ae837861 --- /dev/null +++ b/third_party/zlib/msdos/Makefile.msc @@ -0,0 +1,112 @@ +# Makefile for zlib +# Microsoft C 5.1 or later +# Last updated: 19-Mar-2003 + +# To use, do "make makefile.msc" +# To compile in small model, set below: MODEL=S + +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------- Microsoft C 5.1 and later ------------- + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# Memory model: one of S, M, C, L (small, medium, compact, large) +MODEL=L + +CC=cl +CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC) +#-Ox generates bad code with MSC 5.1 +LIB_CFLAGS=-Zl $(CFLAGS) + +LD=link +LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode +# "/farcall/packcode" are only useful for `large code' memory models +# but should be a "no-op" for small code models. + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(LIB_CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + +minigzip.obj: test/minigzip.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + if exist $(ZLIB_LIB) del $(ZLIB_LIB) + lib $(ZLIB_LIB) $(OBJ1); + lib $(ZLIB_LIB) $(OBJ2); + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB); + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB); + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del *.map + -del zlib_*.bak + -del foo.gz diff --git a/third_party/zlib/msdos/Makefile.tc b/third_party/zlib/msdos/Makefile.tc new file mode 100644 index 00000000..5aec82a9 --- /dev/null +++ b/third_party/zlib/msdos/Makefile.tc @@ -0,0 +1,100 @@ +# Makefile for zlib +# Turbo C 2.01, Turbo C++ 1.01 +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.tc" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to CFLAGS below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C 2.01, Turbo C++ 1.01 ------------ +MODEL=l +CC=tcc +LD=tcc +AR=tlib +# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +CFLAGS=-O2 -G -Z -m$(MODEL) +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/third_party/zlib/nintendods/Makefile b/third_party/zlib/nintendods/Makefile new file mode 100644 index 00000000..21337d01 --- /dev/null +++ b/third_party/zlib/nintendods/Makefile @@ -0,0 +1,126 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#--------------------------------------------------------------------------------- +TARGET := $(shell basename $(CURDIR)) +BUILD := build +SOURCES := ../../ +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork + +CFLAGS := -Wall -O2\ + -march=armv5te -mtune=arm946e-s \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := $(ARCH) -march=armv5te -mtune=arm946e-s +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/lib/libz.a + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + @[ -d $@ ] || mkdir -p include + @cp ../../*.h include + +lib: + @[ -d $@ ] || mkdir -p $@ + +$(BUILD): lib + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) lib + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT) : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/third_party/zlib/nintendods/README b/third_party/zlib/nintendods/README new file mode 100644 index 00000000..ba7a37db --- /dev/null +++ b/third_party/zlib/nintendods/README @@ -0,0 +1,5 @@ +This Makefile requires devkitARM (http://www.devkitpro.org/category/devkitarm/) and works inside "contrib/nds". It is based on a devkitARM template. + +Eduardo Costa +January 3, 2009 + diff --git a/third_party/zlib/old/Makefile.emx b/third_party/zlib/old/Makefile.emx new file mode 100644 index 00000000..612b0379 --- /dev/null +++ b/third_party/zlib/old/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc -Zwin32 + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/third_party/zlib/old/Makefile.riscos b/third_party/zlib/old/Makefile.riscos new file mode 100644 index 00000000..57e29d3f --- /dev/null +++ b/third_party/zlib/old/Makefile.riscos @@ -0,0 +1,151 @@ +# Project: zlib_1_03 +# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430 +# test works out-of-the-box, installs `somewhere' on demand + +# Toolflags: +CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah +C++flags = -c -depend !Depend -IC: -throwback +Linkflags = -aif -c++ -o $@ +ObjAsmflags = -throwback -NoCache -depend !Depend +CMHGflags = +LibFileflags = -c -l -o $@ +Squeezeflags = -o $@ + +# change the line below to where _you_ want the library installed. +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 + 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 +test: @.minigzip @.example @.lib + @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV + @echo running tests: hang on. + @/@.minigzip -f -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -f -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -1 libc + @/@.minigzip -d libc-gz + @diff @.lib @.libc + @echo that should have reported '@.lib and @.libc identical' if you have diff. + @/@.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 + Link $(Linkflags) @.o.example @.lib C:o.Stubs + +install: @.lib + cdir $(libdest) + cdir $(libdest).h + @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV + @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV + @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV + @echo okay, installed zlib in $(libdest) + +clean:; remove @.minigzip + remove @.example + remove @.libc + -wipe @.o.* F~r~cV + remove @.fred + +# User-editable dependencies: +.c.o: + cc $(ccflags) -o $@ $< + +# Static dependencies: + +# Dynamic dependencies: +o.example: c.example +o.example: h.zlib +o.example: h.zconf +o.minigzip: c.minigzip +o.minigzip: h.zlib +o.minigzip: h.zconf +o.adler32: c.adler32 +o.adler32: h.zlib +o.adler32: h.zconf +o.compress: c.compress +o.compress: h.zlib +o.compress: h.zconf +o.crc32: c.crc32 +o.crc32: h.zlib +o.crc32: h.zconf +o.deflate: c.deflate +o.deflate: h.deflate +o.deflate: h.zutil +o.deflate: h.zlib +o.deflate: h.zconf +o.gzio: c.gzio +o.gzio: h.zutil +o.gzio: h.zlib +o.gzio: h.zconf +o.infblock: c.infblock +o.infblock: h.zutil +o.infblock: h.zlib +o.infblock: h.zconf +o.infblock: h.infblock +o.infblock: h.inftrees +o.infblock: h.infcodes +o.infblock: h.infutil +o.infcodes: c.infcodes +o.infcodes: h.zutil +o.infcodes: h.zlib +o.infcodes: h.zconf +o.infcodes: h.inftrees +o.infcodes: h.infblock +o.infcodes: h.infcodes +o.infcodes: h.infutil +o.infcodes: h.inffast +o.inffast: c.inffast +o.inffast: h.zutil +o.inffast: h.zlib +o.inffast: h.zconf +o.inffast: h.inftrees +o.inffast: h.infblock +o.inffast: h.infcodes +o.inffast: h.infutil +o.inffast: h.inffast +o.inflate: c.inflate +o.inflate: h.zutil +o.inflate: h.zlib +o.inflate: h.zconf +o.inflate: h.infblock +o.inftrees: c.inftrees +o.inftrees: h.zutil +o.inftrees: h.zlib +o.inftrees: h.zconf +o.inftrees: h.inftrees +o.inftrees: h.inffixed +o.infutil: c.infutil +o.infutil: h.zutil +o.infutil: h.zlib +o.infutil: h.zconf +o.infutil: h.infblock +o.infutil: h.inftrees +o.infutil: h.infcodes +o.infutil: h.infutil +o.trees: c.trees +o.trees: h.deflate +o.trees: h.zutil +o.trees: h.zlib +o.trees: h.zconf +o.trees: h.trees +o.uncompr: c.uncompr +o.uncompr: h.zlib +o.uncompr: h.zconf +o.zutil: c.zutil +o.zutil: h.zutil +o.zutil: h.zlib +o.zutil: h.zconf diff --git a/third_party/zlib/old/README b/third_party/zlib/old/README new file mode 100644 index 00000000..800bf079 --- /dev/null +++ b/third_party/zlib/old/README @@ -0,0 +1,3 @@ +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/third_party/zlib/old/descrip.mms b/third_party/zlib/old/descrip.mms new file mode 100644 index 00000000..7066da5b --- /dev/null +++ b/third_party/zlib/old/descrip.mms @@ -0,0 +1,48 @@ +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser + +cc_defs = +c_deb = + +.ifdef __DECC__ +pref = /prefix=all +.endif + +OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ + inftrees.obj, infcodes.obj, infutil.obj, inffast.obj + +CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) + +all : example.exe minigzip.exe + @ write sys$output " Example applications available" +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;* + + +# Other dependencies. +adler32.obj : zutil.h zlib.h zconf.h +compress.obj : zlib.h zconf.h +crc32.obj : zutil.h zlib.h zconf.h +deflate.obj : deflate.h zutil.h zlib.h zconf.h +example.obj : zlib.h zconf.h +gzio.obj : zutil.h zlib.h zconf.h +infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h +inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h +inflate.obj : zutil.h zlib.h zconf.h infblock.h +inftrees.obj : zutil.h zlib.h zconf.h inftrees.h +infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h +minigzip.obj : zlib.h zconf.h +trees.obj : deflate.h zutil.h zlib.h zconf.h +uncompr.obj : zlib.h zconf.h +zutil.obj : zutil.h zlib.h zconf.h diff --git a/third_party/zlib/old/os2/Makefile.os2 b/third_party/zlib/old/os2/Makefile.os2 new file mode 100644 index 00000000..bb426c0d --- /dev/null +++ b/third_party/zlib/old/os2/Makefile.os2 @@ -0,0 +1,136 @@ +# Makefile for zlib under OS/2 using GCC (PGCC) +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# cp Makefile.os2 .. +# cd .. +# make -f Makefile.os2 test + +# This makefile will build a static library z.lib, a shared library +# z.dll and a import library zdll.lib. You can use either z.lib or +# zdll.lib by specifying either -lz or -lzdll on gcc's command line + +CC=gcc -Zomf -s + +CFLAGS=-O6 -Wall +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DZLIB_DEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +#################### BUG WARNING: ##################### +## infcodes.c hits a bug in pgcc-1.0, so you have to use either +## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem) +## This bug is reportedly fixed in pgcc >1.0, but this was not tested +CFLAGS+=-fno-force-mem + +LDFLAGS=-s -L. -lzdll -Zcrtdll +LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll + +VER=1.1.0 +ZLIB=z.lib +SHAREDLIB=z.dll +SHAREDLIBIMP=zdll.lib +LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP) + +AR=emxomfar cr +IMPLIB=emximp +RANLIB=echo +TAR=tar +SHELL=bash + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o + +TEST_OBJS = example.o minigzip.o + +DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ + algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ + nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \ + contrib/asm386/*.asm contrib/asm386/*.c \ + contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \ + contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \ + contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 + +all: example.exe minigzip.exe + +test: all + @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + echo hello world | ./minigzip | ./minigzip -d || \ + echo ' *** minigzip test FAILED ***' ; \ + if ./example; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; \ + fi + +$(ZLIB): $(OBJS) + $(AR) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +$(SHAREDLIB): $(OBJS) os2/z.def + $(LDSHARED) -o $@ $^ + +$(SHAREDLIBIMP): os2/z.def + $(IMPLIB) -o $@ $^ + +example.exe: example.o $(LIBS) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) + +minigzip.exe: minigzip.o $(LIBS) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + +clean: + rm -f *.o *~ example minigzip libz.a libz.so* foo.gz + +distclean: clean + +zip: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + zip -ul9 zlib$$v $(DISTFILES) + mv Makefile~ Makefile + +dist: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + rm -f $$d.tar.gz; \ + if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ + files=""; \ + for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ + cd ..; \ + GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ + if test ! -d $$d; then rm -f $$d; fi + mv Makefile~ Makefile + +tags: + etags *.[ch] + +depend: + makedepend -- $(CFLAGS) -- *.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h +infcodes.o: zutil.h zlib.h zconf.h +infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h +inffast.o: infblock.h infcodes.h infutil.h inffast.h +inflate.o: zutil.h zlib.h zconf.h infblock.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/third_party/zlib/old/os2/zlib.def b/third_party/zlib/old/os2/zlib.def new file mode 100644 index 00000000..4c753f1a --- /dev/null +++ b/third_party/zlib/old/os2/zlib.def @@ -0,0 +1,51 @@ +; +; Slightly modified version of ../nt/zlib.dnt :-) +; + +LIBRARY Z +DESCRIPTION "Zlib compression library for OS/2" +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE + +EXPORTS + adler32 + compress + crc32 + deflate + deflateCopy + deflateEnd + deflateInit2_ + deflateInit_ + deflateParams + deflateReset + deflateSetDictionary + gzclose + gzdopen + gzerror + gzflush + gzopen + gzread + gzwrite + inflate + inflateEnd + inflateInit2_ + inflateInit_ + inflateReset + inflateSetDictionary + inflateSync + uncompress + zlibVersion + gzprintf + gzputc + gzgetc + gzseek + gzrewind + gztell + gzeof + gzsetparams + zError + inflateSyncPoint + get_crc_table + compress2 + gzputs + gzgets diff --git a/third_party/zlib/old/visual-basic.txt b/third_party/zlib/old/visual-basic.txt new file mode 100644 index 00000000..57efe581 --- /dev/null +++ b/third_party/zlib/old/visual-basic.txt @@ -0,0 +1,160 @@ +See below some functions declarations for Visual Basic. + +Frequently Asked Question: + +Q: Each time I use the compress function I get the -5 error (not enough + room in the output buffer). + +A: Make sure that the length of the compressed buffer is passed by + reference ("as any"), not by value ("as long"). Also check that + before the call of compress this length is equal to the total size of + the compressed buffer and not zero. + + +From: "Jon Caruana" +Subject: Re: How to port zlib declares to vb? +Date: Mon, 28 Oct 1996 18:33:03 -0600 + +Got the answer! (I haven't had time to check this but it's what I got, and +looks correct): + +He has the following routines working: + compress + uncompress + gzopen + gzwrite + gzread + gzclose + +Declares follow: (Quoted from Carlos Rios , in Vb4 form) + +#If Win16 Then 'Use Win16 calls. +Declare Function compress Lib "ZLIB.DLL" (ByVal compr As + String, comprLen As Any, ByVal buf As String, ByVal buflen + As Long) As Integer +Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr + As String, uncomprLen As Any, ByVal compr As String, ByVal + lcompr As Long) As Integer +Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As + String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As + Long) As Integer +#Else +Declare Function compress Lib "ZLIB32.DLL" + (ByVal compr As String, comprLen As Any, ByVal buf As + String, ByVal buflen As Long) As Integer +Declare Function uncompress Lib "ZLIB32.DLL" + (ByVal uncompr As String, uncomprLen As Any, ByVal compr As + String, ByVal lcompr As Long) As Long +Declare Function gzopen Lib "ZLIB32.DLL" + (ByVal file As String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzwrite Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzclose Lib "ZLIB32.DLL" + (ByVal file As Long) As Long +#End If + +-Jon Caruana +jon-net@usa.net +Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member + + +Here is another example from Michael that he +says conforms to the VB guidelines, and that solves the problem of not +knowing the uncompressed size by storing it at the end of the file: + +'Calling the functions: +'bracket meaning: [optional] {Range of possible values} +'Call subCompressFile( [, , [level of compression {1..9}]]) +'Call subUncompressFile() + +Option Explicit +Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller' +Private Const SUCCESS As Long = 0 +Private Const strFilExt As String = ".cpr" +Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long, +ByVal level As Integer) As Long +Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) +As Long + +Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal +strargCprFilPth As String, Optional ByVal intLvl As Integer = 9) + Dim strCprPth As String + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim bytaryOri() As Byte + Dim bytaryCpr() As Byte + lngOriSiz = FileLen(strargOriFilPth) + ReDim bytaryOri(lngOriSiz - 1) + Open strargOriFilPth For Binary Access Read As #1 + Get #1, , bytaryOri() + Close #1 + strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth) +'Select file path and name + strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) = +strFilExt, "", strFilExt) 'Add file extension if not exists + lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit +more space then original file size + ReDim bytaryCpr(lngCprSiz - 1) + If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) = +SUCCESS Then + lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100 + ReDim Preserve bytaryCpr(lngCprSiz - 1) + Open strCprPth For Binary Access Write As #1 + Put #1, , bytaryCpr() + Put #1, , lngOriSiz 'Add the the original size value to the end +(last 4 bytes) + Close #1 + Else + MsgBox "Compression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub + +Public Sub subUncompressFile(ByVal strargFilPth As String) + Dim bytaryCpr() As Byte + Dim bytaryOri() As Byte + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim strOriPth As String + lngCprSiz = FileLen(strargFilPth) + ReDim bytaryCpr(lngCprSiz - 1) + Open strargFilPth For Binary Access Read As #1 + Get #1, , bytaryCpr() + Close #1 + 'Read the original file size value: + lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _ + + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _ + + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _ + + bytaryCpr(lngCprSiz - 4) + ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value + ReDim bytaryOri(lngOriSiz - 1) + If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS +Then + strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt)) + Open strOriPth For Binary Access Write As #1 + Put #1, , bytaryOri() + Close #1 + Else + MsgBox "Uncompression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub +Public Property Get lngPercentSmaller() As Long + lngPercentSmaller = lngpvtPcnSml +End Property diff --git a/third_party/zlib/os400/README400 b/third_party/zlib/os400/README400 new file mode 100644 index 00000000..4f98334f --- /dev/null +++ b/third_party/zlib/os400/README400 @@ -0,0 +1,48 @@ + ZLIB version 1.2.11 for OS/400 installation instructions + +1) Download and unpack the zlib tarball to some IFS directory. + (i.e.: /path/to/the/zlib/ifs/source/directory) + + If the installed IFS command suppors gzip format, this is straightforward, +else you have to unpack first to some directory on a system supporting it, +then move the whole directory to the IFS via the network (via SMB or FTP). + +2) Edit the configuration parameters in the compilation script. + + EDTF STMF('/path/to/the/zlib/ifs/source/directory/os400/make.sh') + +Tune the parameters according to your needs if not matching the defaults. +Save the file and exit after edition. + +3) Enter qshell, then work in the zlib OS/400 specific directory. + + QSH + cd /path/to/the/zlib/ifs/source/directory/os400 + +4) Compile and install + + sh make.sh + +The script will: +- create the libraries, objects and IFS directories for the zlib environment, +- compile all modules, +- create a service program, +- create a static and a dynamic binding directory, +- install header files for C/C++ and for ILE/RPG, both for compilation in + DB2 and IFS environments. + +That's all. + + +Notes: For OS/400 ILE RPG programmers, a /copy member defining the ZLIB + API prototypes for ILE RPG can be found in ZLIB/H(ZLIB.INC). + In the ILE environment, the same definitions are available from + file zlib.inc located in the same IFS include directory as the + C/C++ header files. + Please read comments in this member for more information. + + Remember that most foreign textual data are ASCII coded: this + implementation does not handle conversion from/to ASCII, so + text data code conversions must be done explicitely. + + Mainly for the reason above, always open zipped files in binary mode. diff --git a/third_party/zlib/os400/bndsrc b/third_party/zlib/os400/bndsrc new file mode 100644 index 00000000..5e6e0a2f --- /dev/null +++ b/third_party/zlib/os400/bndsrc @@ -0,0 +1,119 @@ +STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB') + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.1.3 entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32") + EXPORT SYMBOL("compress") + EXPORT SYMBOL("compress2") + EXPORT SYMBOL("crc32") + EXPORT SYMBOL("get_crc_table") + EXPORT SYMBOL("deflate") + EXPORT SYMBOL("deflateEnd") + EXPORT SYMBOL("deflateSetDictionary") + EXPORT SYMBOL("deflateCopy") + EXPORT SYMBOL("deflateReset") + EXPORT SYMBOL("deflateParams") + EXPORT SYMBOL("deflatePrime") + EXPORT SYMBOL("deflateInit_") + EXPORT SYMBOL("deflateInit2_") + EXPORT SYMBOL("gzopen") + EXPORT SYMBOL("gzdopen") + EXPORT SYMBOL("gzsetparams") + EXPORT SYMBOL("gzread") + EXPORT SYMBOL("gzwrite") + EXPORT SYMBOL("gzprintf") + EXPORT SYMBOL("gzputs") + EXPORT SYMBOL("gzgets") + EXPORT SYMBOL("gzputc") + EXPORT SYMBOL("gzgetc") + EXPORT SYMBOL("gzflush") + EXPORT SYMBOL("gzseek") + EXPORT SYMBOL("gzrewind") + EXPORT SYMBOL("gztell") + EXPORT SYMBOL("gzeof") + EXPORT SYMBOL("gzclose") + EXPORT SYMBOL("gzerror") + EXPORT SYMBOL("inflate") + EXPORT SYMBOL("inflateEnd") + EXPORT SYMBOL("inflateSetDictionary") + EXPORT SYMBOL("inflateSync") + EXPORT SYMBOL("inflateReset") + EXPORT SYMBOL("inflateInit_") + EXPORT SYMBOL("inflateInit2_") + EXPORT SYMBOL("inflateSyncPoint") + EXPORT SYMBOL("uncompress") + EXPORT SYMBOL("zlibVersion") + EXPORT SYMBOL("zError") + EXPORT SYMBOL("z_errmsg") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.1 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("compressBound") + EXPORT SYMBOL("deflateBound") + EXPORT SYMBOL("deflatePending") + EXPORT SYMBOL("gzungetc") + EXPORT SYMBOL("gzclearerr") + EXPORT SYMBOL("inflateBack") + EXPORT SYMBOL("inflateBackEnd") + EXPORT SYMBOL("inflateBackInit_") + EXPORT SYMBOL("inflateCopy") + EXPORT SYMBOL("zlibCompileFlags") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.4 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32_combine") + EXPORT SYMBOL("adler32_combine64") + EXPORT SYMBOL("crc32_combine") + EXPORT SYMBOL("crc32_combine64") + EXPORT SYMBOL("deflateSetHeader") + EXPORT SYMBOL("deflateTune") + EXPORT SYMBOL("gzbuffer") + EXPORT SYMBOL("gzclose_r") + EXPORT SYMBOL("gzclose_w") + EXPORT SYMBOL("gzdirect") + EXPORT SYMBOL("gzoffset") + EXPORT SYMBOL("gzoffset64") + EXPORT SYMBOL("gzopen64") + EXPORT SYMBOL("gzseek64") + EXPORT SYMBOL("gztell64") + EXPORT SYMBOL("inflateGetHeader") + EXPORT SYMBOL("inflateMark") + EXPORT SYMBOL("inflatePrime") + EXPORT SYMBOL("inflateReset2") + EXPORT SYMBOL("inflateUndermine") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.6 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("deflateResetKeep") + EXPORT SYMBOL("gzgetc_") + EXPORT SYMBOL("inflateResetKeep") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.8 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("gzvprintf") + EXPORT SYMBOL("inflateGetDictionary") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.9 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32_z") + EXPORT SYMBOL("crc32_z") + EXPORT SYMBOL("deflateGetDictionary") + EXPORT SYMBOL("gzfread") + EXPORT SYMBOL("gzfwrite") + EXPORT SYMBOL("inflateCodesUsed") + EXPORT SYMBOL("inflateValidate") + EXPORT SYMBOL("uncompress2") + +ENDPGMEXP diff --git a/third_party/zlib/os400/make.sh b/third_party/zlib/os400/make.sh new file mode 100644 index 00000000..19eec117 --- /dev/null +++ b/third_party/zlib/os400/make.sh @@ -0,0 +1,366 @@ +#!/bin/sh +# +# ZLIB compilation script for the OS/400. +# +# +# This is a shell script since make is not a standard component of OS/400. + + +################################################################################ +# +# Tunable configuration parameters. +# +################################################################################ + +TARGETLIB='ZLIB' # Target OS/400 program library +STATBNDDIR='ZLIB_A' # Static binding directory. +DYNBNDDIR='ZLIB' # Dynamic binding directory. +SRVPGM="ZLIB" # Service program. +IFSDIR='/zlib' # IFS support base directory. +TGTCCSID='500' # Target CCSID of objects +DEBUG='*NONE' # Debug level +OPTIMIZE='40' # Optimisation level +OUTPUT='*NONE' # Compilation output option. +TGTRLS='V6R1M0' # Target OS release + +export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM IFSDIR +export TGTCCSID DEBUG OPTIMIZE OUTPUT TGTRLS + + +################################################################################ +# +# OS/400 specific definitions. +# +################################################################################ + +LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB" + + +################################################################################ +# +# Procedures. +# +################################################################################ + +# action_needed dest [src] +# +# dest is an object to build +# if specified, src is an object on which dest depends. +# +# exit 0 (succeeds) if some action has to be taken, else 1. + +action_needed() + +{ + [ ! -e "${1}" ] && return 0 + [ "${2}" ] || return 1 + [ "${1}" -ot "${2}" ] && return 0 + return 1 +} + + +# make_module module_name source_name [additional_definitions] +# +# Compile source name into module if needed. +# As side effect, append the module name to variable MODULES. +# Set LINK to "YES" if the module has been compiled. + +make_module() + +{ + MODULES="${MODULES} ${1}" + MODIFSNAME="${LIBIFSNAME}/${1}.MODULE" + CSRC="`basename \"${2}\"`" + + if action_needed "${MODIFSNAME}" "${2}" + then : + elif [ ! "`sed -e \"//,/<\\\\/source>/!d\" \ + -e '/ tmphdrfile + + # Need to translate to target CCSID. + + CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DEST}')" + CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" + system "${CMD}" + # touch -r "${HFILE}" "${DEST}" + rm -f tmphdrfile + fi + + IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" + + if action_needed "${IFSFILE}" "${DEST}" + then rm -f "${IFSFILE}" + ln -s "${DEST}" "${IFSFILE}" + fi +done + + +# Install the ILE/RPG header file. + + +HFILE="${SCRIPTDIR}/zlib.inc" +DEST="${SRCPF}/ZLIB.INC.MBR" + +if action_needed "${DEST}" "${HFILE}" +then CMD="CPY OBJ('${HFILE}') TOOBJ('${DEST}')" + CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" + system "${CMD}" + # touch -r "${HFILE}" "${DEST}" +fi + +IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" + +if action_needed "${IFSFILE}" "${DEST}" +then rm -f "${IFSFILE}" + ln -s "${DEST}" "${IFSFILE}" +fi + + +# Create and compile the identification source file. + +echo '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c +echo '#pragma comment(user, __DATE__)' >> os400.c +echo '#pragma comment(user, __TIME__)' >> os400.c +echo '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c +make_module OS400 os400.c +LINK= # No need to rebuild service program yet. +MODULES= + + +# Get source list. + +CSOURCES=`sed -e '/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Library + + Medium + + 2.0 + + + + zlib + zlib + alain.bonnefoy@icbt.com + Public + public + www.gzip.org/zlib + + + Jean-Loup Gailly,Mark Adler + www.gzip.org/zlib + + zlib@gzip.org + + + A massively spiffy yet delicately unobtrusive compression library. + zlib is designed to be a free, general-purpose, legally unencumbered, lossless data compression library for use on virtually any computer hardware and operating system. + http://www.gzip.org/zlib + + + + + 1.2.11 + Medium + Stable + + + + + + + No License + + + + Software Development/Libraries and Extensions/C Libraries + zlib,compression + qnx6 + qnx6 + None + Developer + + + + + + + + + + + + + + Install + Post + No + Ignore + + No + Optional + + + + + + + + + + + + + InstallOver + zlib + + + + + + + + + + + + + InstallOver + zlib-dev + + + + + + + + + diff --git a/third_party/zlib/test/example.c b/third_party/zlib/test/example.c new file mode 100644 index 00000000..eee17ce7 --- /dev/null +++ b/third_party/zlib/test/example.c @@ -0,0 +1,602 @@ +/* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#if defined(VMS) || defined(RISCOS) +# define TESTFILE "foo-gz" +#else +# define TESTFILE "foo.gz" +#endif + +#define CHECK_ERR(err, msg) { \ + if (err != Z_OK) { \ + fprintf(stderr, "%s error: %d\n", msg, err); \ + exit(1); \ + } \ +} + +static z_const char hello[] = "hello, hello!"; +/* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + */ + +static const char dictionary[] = "hello"; +static uLong dictId; /* Adler32 value of the dictionary */ + +void test_deflate OF((Byte *compr, uLong comprLen)); +void test_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_deflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_flush OF((Byte *compr, uLong *comprLen)); +void test_sync OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_dict_deflate OF((Byte *compr, uLong comprLen)); +void test_dict_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +int main OF((int argc, char *argv[])); + + +#ifdef Z_SOLO + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + (void)q; + return calloc(n, m); +} + +void myfree(void *q, void *p) +{ + (void)q; + free(p); +} + +static alloc_func zalloc = myalloc; +static free_func zfree = myfree; + +#else /* !Z_SOLO */ + +static alloc_func zalloc = (alloc_func)0; +static free_func zfree = (free_func)0; + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); + +/* =========================================================================== + * Test compress() and uncompress() + */ +void test_compress(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + uLong len = (uLong)strlen(hello)+1; + + err = compress(compr, &comprLen, (const Bytef*)hello, len); + CHECK_ERR(err, "compress"); + + strcpy((char*)uncompr, "garbage"); + + err = uncompress(uncompr, &uncomprLen, compr, comprLen); + CHECK_ERR(err, "uncompress"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad uncompress\n"); + exit(1); + } else { + printf("uncompress(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test read/write of .gz files + */ +void test_gzio(fname, uncompr, uncomprLen) + const char *fname; /* compressed file name */ + Byte *uncompr; + uLong uncomprLen; +{ +#ifdef NO_GZCOMPRESS + fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); +#else + int err; + int len = (int)strlen(hello)+1; + gzFile file; + z_off_t pos; + + file = gzopen(fname, "wb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + gzputc(file, 'h'); + if (gzputs(file, "ello") != 4) { + fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); + exit(1); + } + if (gzprintf(file, ", %s!", "hello") != 8) { + fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); + exit(1); + } + gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ + gzclose(file); + + file = gzopen(fname, "rb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + strcpy((char*)uncompr, "garbage"); + + if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { + fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); + exit(1); + } else { + printf("gzread(): %s\n", (char*)uncompr); + } + + pos = gzseek(file, -8L, SEEK_CUR); + if (pos != 6 || gztell(file) != pos) { + fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", + (long)pos, (long)gztell(file)); + exit(1); + } + + if (gzgetc(file) != ' ') { + fprintf(stderr, "gzgetc error\n"); + exit(1); + } + + if (gzungetc(' ', file) != ' ') { + fprintf(stderr, "gzungetc error\n"); + exit(1); + } + + gzgets(file, (char*)uncompr, (int)uncomprLen); + if (strlen((char*)uncompr) != 7) { /* " hello!" */ + fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello + 6)) { + fprintf(stderr, "bad gzgets after gzseek\n"); + exit(1); + } else { + printf("gzgets() after gzseek: %s\n", (char*)uncompr); + } + + gzclose(file); +#endif +} + +#endif /* Z_SOLO */ + +/* =========================================================================== + * Test deflate() with small buffers + */ +void test_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uLong len = (uLong)strlen(hello)+1; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = deflate(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with small buffers + */ +void test_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 0; + d_stream.next_out = uncompr; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { + d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate\n"); + exit(1); + } else { + printf("inflate(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test deflate() with large buffers and dynamic change of compression level + */ +void test_large_deflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_SPEED); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + /* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + */ + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + if (c_stream.avail_in != 0) { + fprintf(stderr, "deflate not greedy\n"); + exit(1); + } + + /* Feed in already compressed data and switch to no compression: */ + deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in = compr; + c_stream.avail_in = (uInt)comprLen/2; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + /* Switch back to compressing mode: */ + deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with large buffers + */ +void test_large_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + for (;;) { + d_stream.next_out = uncompr; /* discard the output */ + d_stream.avail_out = (uInt)uncomprLen; + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "large inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (d_stream.total_out != 2*uncomprLen + comprLen/2) { + fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); + exit(1); + } else { + printf("large_inflate(): OK\n"); + } +} + +/* =========================================================================== + * Test deflate() with full flush + */ +void test_flush(compr, comprLen) + Byte *compr; + uLong *comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uInt len = (uInt)strlen(hello)+1; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + c_stream.avail_in = 3; + c_stream.avail_out = (uInt)*comprLen; + err = deflate(&c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, "deflate"); + + compr[3]++; /* force an error in first compressed block */ + c_stream.avail_in = len - 3; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + CHECK_ERR(err, "deflate"); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + *comprLen = c_stream.total_out; +} + +/* =========================================================================== + * Test inflateSync() + */ +void test_sync(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 2; /* just read the zlib header */ + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + err = inflate(&d_stream, Z_NO_FLUSH); + CHECK_ERR(err, "inflate"); + + d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ + err = inflateSync(&d_stream); /* but skip the damaged part */ + CHECK_ERR(err, "inflateSync"); + + err = inflate(&d_stream, Z_FINISH); + if (err != Z_DATA_ERROR) { + fprintf(stderr, "inflate should report DATA_ERROR\n"); + /* Because of incorrect adler32 */ + exit(1); + } + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + printf("after inflateSync(): hel%s\n", (char *)uncompr); +} + +/* =========================================================================== + * Test deflate() with preset dictionary + */ +void test_dict_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + err = deflateSetDictionary(&c_stream, + (const Bytef*)dictionary, (int)sizeof(dictionary)); + CHECK_ERR(err, "deflateSetDictionary"); + + dictId = c_stream.adler; + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.avail_in = (uInt)strlen(hello)+1; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with a preset dictionary + */ +void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + for (;;) { + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + if (err == Z_NEED_DICT) { + if (d_stream.adler != dictId) { + fprintf(stderr, "unexpected dictionary"); + exit(1); + } + err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, + (int)sizeof(dictionary)); + } + CHECK_ERR(err, "inflate with dict"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate with dict\n"); + exit(1); + } else { + printf("inflate with dictionary: %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Usage: example [output.gz [input.gz]] + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + Byte *compr, *uncompr; + uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ + uLong uncomprLen = comprLen; + static const char* myVersion = ZLIB_VERSION; + + if (zlibVersion()[0] != myVersion[0]) { + fprintf(stderr, "incompatible zlib version\n"); + exit(1); + + } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { + fprintf(stderr, "warning: different zlib version\n"); + } + + printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", + ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); + + compr = (Byte*)calloc((uInt)comprLen, 1); + uncompr = (Byte*)calloc((uInt)uncomprLen, 1); + /* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + */ + if (compr == Z_NULL || uncompr == Z_NULL) { + printf("out of memory\n"); + exit(1); + } + +#ifdef Z_SOLO + (void)argc; + (void)argv; +#else + test_compress(compr, comprLen, uncompr, uncomprLen); + + test_gzio((argc > 1 ? argv[1] : TESTFILE), + uncompr, uncomprLen); +#endif + + test_deflate(compr, comprLen); + test_inflate(compr, comprLen, uncompr, uncomprLen); + + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + + test_flush(compr, &comprLen); + test_sync(compr, comprLen, uncompr, uncomprLen); + comprLen = uncomprLen; + + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + return 0; +} diff --git a/third_party/zlib/test/infcover.c b/third_party/zlib/test/infcover.c new file mode 100644 index 00000000..2be01646 --- /dev/null +++ b/third_party/zlib/test/infcover.c @@ -0,0 +1,671 @@ +/* infcover.c -- test zlib's inflate routines with full code coverage + * Copyright (C) 2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* to use, do: ./configure --cover && make cover */ + +#include +#include +#include +#include +#include "zlib.h" + +/* get definition of internal structure so we can mess with it (see pull()), + and so we can call inflate_trees() (see cover5()) */ +#define ZLIB_INTERNAL +#include "inftrees.h" +#include "inflate.h" + +#define local static + +/* -- memory tracking routines -- */ + +/* + These memory tracking routines are provided to zlib and track all of zlib's + allocations and deallocations, check for LIFO operations, keep a current + and high water mark of total bytes requested, optionally set a limit on the + total memory that can be allocated, and when done check for memory leaks. + + They are used as follows: + + z_stream strm; + mem_setup(&strm) initializes the memory tracking and sets the + zalloc, zfree, and opaque members of strm to use + memory tracking for all zlib operations on strm + mem_limit(&strm, limit) sets a limit on the total bytes requested -- a + request that exceeds this limit will result in an + allocation failure (returns NULL) -- setting the + limit to zero means no limit, which is the default + after mem_setup() + mem_used(&strm, "msg") prints to stderr "msg" and the total bytes used + mem_high(&strm, "msg") prints to stderr "msg" and the high water mark + mem_done(&strm, "msg") ends memory tracking, releases all allocations + for the tracking as well as leaked zlib blocks, if + any. If there was anything unusual, such as leaked + blocks, non-FIFO frees, or frees of addresses not + allocated, then "msg" and information about the + problem is printed to stderr. If everything is + normal, nothing is printed. mem_done resets the + strm members to Z_NULL to use the default memory + allocation routines on the next zlib initialization + using strm. + */ + +/* these items are strung together in a linked list, one for each allocation */ +struct mem_item { + void *ptr; /* pointer to allocated memory */ + size_t size; /* requested size of allocation */ + struct mem_item *next; /* pointer to next item in list, or NULL */ +}; + +/* this structure is at the root of the linked list, and tracks statistics */ +struct mem_zone { + struct mem_item *first; /* pointer to first item in list, or NULL */ + size_t total, highwater; /* total allocations, and largest total */ + size_t limit; /* memory allocation limit, or 0 if no limit */ + int notlifo, rogue; /* counts of non-LIFO frees and rogue frees */ +}; + +/* memory allocation routine to pass to zlib */ +local void *mem_alloc(void *mem, unsigned count, unsigned size) +{ + void *ptr; + struct mem_item *item; + struct mem_zone *zone = mem; + size_t len = count * (size_t)size; + + /* induced allocation failure */ + if (zone == NULL || (zone->limit && zone->total + len > zone->limit)) + return NULL; + + /* perform allocation using the standard library, fill memory with a + non-zero value to make sure that the code isn't depending on zeros */ + ptr = malloc(len); + if (ptr == NULL) + return NULL; + memset(ptr, 0xa5, len); + + /* create a new item for the list */ + item = malloc(sizeof(struct mem_item)); + if (item == NULL) { + free(ptr); + return NULL; + } + item->ptr = ptr; + item->size = len; + + /* insert item at the beginning of the list */ + item->next = zone->first; + zone->first = item; + + /* update the statistics */ + zone->total += item->size; + if (zone->total > zone->highwater) + zone->highwater = zone->total; + + /* return the allocated memory */ + return ptr; +} + +/* memory free routine to pass to zlib */ +local void mem_free(void *mem, void *ptr) +{ + struct mem_item *item, *next; + struct mem_zone *zone = mem; + + /* if no zone, just do a free */ + if (zone == NULL) { + free(ptr); + return; + } + + /* point next to the item that matches ptr, or NULL if not found -- remove + the item from the linked list if found */ + next = zone->first; + if (next) { + if (next->ptr == ptr) + zone->first = next->next; /* first one is it, remove from list */ + else { + do { /* search the linked list */ + item = next; + next = item->next; + } while (next != NULL && next->ptr != ptr); + if (next) { /* if found, remove from linked list */ + item->next = next->next; + zone->notlifo++; /* not a LIFO free */ + } + + } + } + + /* if found, update the statistics and free the item */ + if (next) { + zone->total -= next->size; + free(next); + } + + /* if not found, update the rogue count */ + else + zone->rogue++; + + /* in any case, do the requested free with the standard library function */ + free(ptr); +} + +/* set up a controlled memory allocation space for monitoring, set the stream + parameters to the controlled routines, with opaque pointing to the space */ +local void mem_setup(z_stream *strm) +{ + struct mem_zone *zone; + + zone = malloc(sizeof(struct mem_zone)); + assert(zone != NULL); + zone->first = NULL; + zone->total = 0; + zone->highwater = 0; + zone->limit = 0; + zone->notlifo = 0; + zone->rogue = 0; + strm->opaque = zone; + strm->zalloc = mem_alloc; + strm->zfree = mem_free; +} + +/* set a limit on the total memory allocation, or 0 to remove the limit */ +local void mem_limit(z_stream *strm, size_t limit) +{ + struct mem_zone *zone = strm->opaque; + + zone->limit = limit; +} + +/* show the current total requested allocations in bytes */ +local void mem_used(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total); +} + +/* show the high water allocation in bytes */ +local void mem_high(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater); +} + +/* release the memory allocation zone -- if there are any surprises, notify */ +local void mem_done(z_stream *strm, char *prefix) +{ + int count = 0; + struct mem_item *item, *next; + struct mem_zone *zone = strm->opaque; + + /* show high water mark */ + mem_high(strm, prefix); + + /* free leftover allocations and item structures, if any */ + item = zone->first; + while (item != NULL) { + free(item->ptr); + next = item->next; + free(item); + item = next; + count++; + } + + /* issue alerts about anything unexpected */ + if (count || zone->total) + fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n", + prefix, zone->total, count); + if (zone->notlifo) + fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo); + if (zone->rogue) + fprintf(stderr, "** %s: %d frees not recognized\n", + prefix, zone->rogue); + + /* free the zone and delete from the stream */ + free(zone); + strm->opaque = Z_NULL; + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; +} + +/* -- inflate test routines -- */ + +/* Decode a hexadecimal string, set *len to length, in[] to the bytes. This + decodes liberally, in that hex digits can be adjacent, in which case two in + a row writes a byte. Or they can be delimited by any non-hex character, + where the delimiters are ignored except when a single hex digit is followed + by a delimiter, where that single digit writes a byte. The returned data is + allocated and must eventually be freed. NULL is returned if out of memory. + If the length is not needed, then len can be NULL. */ +local unsigned char *h2b(const char *hex, unsigned *len) +{ + unsigned char *in, *re; + unsigned next, val; + + in = malloc((strlen(hex) + 1) >> 1); + if (in == NULL) + return NULL; + next = 0; + val = 1; + do { + if (*hex >= '0' && *hex <= '9') + val = (val << 4) + *hex - '0'; + else if (*hex >= 'A' && *hex <= 'F') + val = (val << 4) + *hex - 'A' + 10; + else if (*hex >= 'a' && *hex <= 'f') + val = (val << 4) + *hex - 'a' + 10; + else if (val != 1 && val < 32) /* one digit followed by delimiter */ + val += 240; /* make it look like two digits */ + if (val > 255) { /* have two digits */ + in[next++] = val & 0xff; /* save the decoded byte */ + val = 1; /* start over */ + } + } while (*hex++); /* go through the loop with the terminating null */ + if (len != NULL) + *len = next; + re = realloc(in, next); + return re == NULL ? in : re; +} + +/* generic inflate() run, where hex is the hexadecimal input data, what is the + text to include in an error message, step is how much input data to feed + inflate() on each call, or zero to feed it all, win is the window bits + parameter to inflateInit2(), len is the size of the output buffer, and err + is the error code expected from the first inflate() call (the second + inflate() call is expected to return Z_STREAM_END). If win is 47, then + header information is collected with inflateGetHeader(). If a zlib stream + is looking for a dictionary, then an empty dictionary is provided. + inflate() is run until all of the input data is consumed. */ +local void inf(char *hex, char *what, unsigned step, int win, unsigned len, + int err) +{ + int ret; + unsigned have; + unsigned char *in, *out; + z_stream strm, copy; + gz_header head; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, win); + if (ret != Z_OK) { + mem_done(&strm, what); + return; + } + out = malloc(len); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; + head.name = out; + head.name_max = len; + head.comment = out; + head.comm_max = len; + ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + } + in = h2b(hex, &have); assert(in != NULL); + if (step == 0 || step > have) + step = have; + strm.avail_in = step; + have -= step; + strm.next_in = in; + do { + strm.avail_out = len; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) + break; + if (ret == Z_NEED_DICT) { + ret = inflateSetDictionary(&strm, in, 1); + assert(ret == Z_DATA_ERROR); + mem_limit(&strm, 1); + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ((struct inflate_state *)strm.state)->mode = DICT; + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_OK); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR); + } + ret = inflateCopy(©, &strm); assert(ret == Z_OK); + ret = inflateEnd(©); assert(ret == Z_OK); + err = 9; /* don't care next time around */ + have += strm.avail_in; + strm.avail_in = step > have ? have : step; + have -= strm.avail_in; + } while (strm.avail_in); + free(in); + free(out); + ret = inflateReset2(&strm, -8); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, what); +} + +/* cover all of the lines in inflate.c up to inflate() */ +local void cover_support(void) +{ + int ret; + z_stream strm; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + mem_used(&strm, "inflate init"); + ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK); + ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK); + ret = inflateSetDictionary(&strm, Z_NULL, 0); + assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "prime"); + + inf("63 0", "force window allocation", 0, -15, 1, Z_OK); + inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK); + inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK); + inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END); + inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + fputs("inflate built-in memory routines\n", stderr); +} + +/* cover all inflate() header and trailer cases and code after inflate() */ +local void cover_wrap(void) +{ + int ret; + z_stream strm, copy; + unsigned char dict[257]; + + ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflate bad parameters\n", stderr); + + inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); + inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR); + inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR); + inf("8 99", "set window size from header", 0, 0, 0, Z_OK); + inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR); + inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END); + inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1, + Z_DATA_ERROR); + inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length", + 0, 47, 0, Z_STREAM_END); + inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR); + inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT); + inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -8); + strm.avail_in = 2; + strm.next_in = (void *)"\x63"; + strm.avail_out = 1; + strm.next_out = (void *)&ret; + mem_limit(&strm, 1); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + memset(dict, 0, 257); + ret = inflateSetDictionary(&strm, dict, 257); + assert(ret == Z_OK); + mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); + ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x80"; + ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + strm.avail_in = 4; + strm.next_in = (void *)"\0\0\xff\xff"; + ret = inflateSync(&strm); assert(ret == Z_OK); + (void)inflateSyncPoint(&strm); + ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR); + (void)inflateMark(&strm); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "miscellaneous, force memory errors"); +} + +/* input and output functions for inflateBack() */ +local unsigned pull(void *desc, unsigned char **buf) +{ + static unsigned int next = 0; + static unsigned char dat[] = {0x63, 0, 2, 0}; + struct inflate_state *state; + + if (desc == Z_NULL) { + next = 0; + return 0; /* no input (already provided at next_in) */ + } + state = (void *)((z_stream *)desc)->state; + if (state != Z_NULL) + state->mode = SYNC; /* force an otherwise impossible situation */ + return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; +} + +local int push(void *desc, unsigned char *buf, unsigned len) +{ + buf += len; + return desc != Z_NULL; /* force error if desc not null */ +} + +/* cover inflateBack() up to common deflate data cases and after those */ +local void cover_back(void) +{ + int ret; + z_stream strm; + unsigned char win[32768]; + + ret = inflateBackInit_(Z_NULL, 0, win, 0, 0); + assert(ret == Z_VERSION_ERROR); + ret = inflateBackInit(Z_NULL, 0, win); assert(ret == Z_STREAM_ERROR); + ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflateBack bad parameters\n", stderr); + + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x03"; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret == Z_STREAM_END); + /* force output error */ + strm.avail_in = 3; + strm.next_in = (void *)"\x63\x00"; + ret = inflateBack(&strm, pull, Z_NULL, push, &strm); + assert(ret == Z_BUF_ERROR); + /* force mode error by mucking with state */ + ret = inflateBack(&strm, pull, &strm, push, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "inflateBack bad state"); + + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + fputs("inflateBack built-in memory routines\n", stderr); +} + +/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ +local int try(char *hex, char *id, int err) +{ + int ret; + unsigned len, size; + unsigned char *in, *out, *win; + char *prefix; + z_stream strm; + + /* convert to hex */ + in = h2b(hex, &len); + assert(in != NULL); + + /* allocate work areas */ + size = len << 3; + out = malloc(size); + assert(out != NULL); + win = malloc(32768); + assert(win != NULL); + prefix = malloc(strlen(id) + 6); + assert(prefix != NULL); + + /* first with inflate */ + strcpy(prefix, id); + strcat(prefix, "-late"); + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, err < 0 ? 47 : -15); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + do { + strm.avail_out = size; + strm.next_out = out; + ret = inflate(&strm, Z_TREES); + assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR); + if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT) + break; + } while (strm.avail_in || strm.avail_out == 0); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateEnd(&strm); + mem_done(&strm, prefix); + + /* then with inflateBack */ + if (err >= 0) { + strcpy(prefix, id); + strcat(prefix, "-back"); + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret != Z_STREAM_ERROR); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateBackEnd(&strm); + mem_done(&strm, prefix); + } + + /* clean up */ + free(prefix); + free(win); + free(out); + free(in); + return ret; +} + +/* cover deflate data cases in both inflate() and inflateBack() */ +local void cover_inflate(void) +{ + try("0 0 0 0 0", "invalid stored block lengths", 1); + try("3 0", "fixed", 0); + try("6", "invalid block type", 1); + try("1 1 0 fe ff 0", "stored", 0); + try("fc 0 0", "too many length or distance symbols", 1); + try("4 0 fe ff", "invalid code lengths set", 1); + try("4 0 24 49 0", "invalid bit length repeat", 1); + try("4 0 24 e9 ff ff", "invalid bit length repeat", 1); + try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1); + try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0", + "invalid literal/lengths set", 1); + try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1); + try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1); + try("2 7e ff ff", "invalid distance code", 1); + try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1); + + /* also trailer mismatch just in inflate() */ + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1); + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1", + "incorrect length check", -1); + try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0); + try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f", + "long code", 0); + try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0); + try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c", + "long distance and extra", 0); + try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0); + inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258, + Z_STREAM_END); + inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK); +} + +/* cover remaining lines in inftrees.c */ +local void cover_trees(void) +{ + int ret; + unsigned bits; + unsigned short lens[16], work[16]; + code *next, table[ENOUGH_DISTS]; + + /* we need to call inflate_table() directly in order to manifest not- + enough errors, since zlib insures that enough is always enough */ + for (bits = 0; bits < 15; bits++) + lens[bits] = (unsigned short)(bits + 1); + lens[15] = 15; + next = table; + bits = 15; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + next = table; + bits = 1; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + fputs("inflate_table not enough errors\n", stderr); +} + +/* cover remaining inffast.c decoding and window copying */ +local void cover_fast(void) +{ + inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" + " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); + inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49" + " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258, + Z_DATA_ERROR); + inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258, + Z_DATA_ERROR); + inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258, + Z_DATA_ERROR); + inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0", + "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR); + inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK); + inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0", + "contiguous and wrap around window", 6, -8, 259, Z_OK); + inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259, + Z_STREAM_END); +} + +int main(void) +{ + fprintf(stderr, "%s\n", zlibVersion()); + cover_support(); + cover_wrap(); + cover_back(); + cover_inflate(); + cover_trees(); + cover_fast(); + return 0; +} diff --git a/third_party/zlib/test/minigzip.c b/third_party/zlib/test/minigzip.c new file mode 100644 index 00000000..e22fb08c --- /dev/null +++ b/third_party/zlib/test/minigzip.c @@ -0,0 +1,651 @@ +/* minigzip.c -- simulate gzip using the zlib compression library + * Copyright (C) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * minigzip is a minimal implementation of the gzip utility. This is + * only an example of using zlib and isn't meant to replace the + * full-featured gzip. No attempt is made to deal with file systems + * limiting names to 14 or 8+3 characters, etc... Error checking is + * very limited. So use minigzip only for testing; use gzip for the + * real thing. On MSDOS, use only on file names without extension + * or in pipe mode. + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#ifdef USE_MMAP +# include +# include +# include +#endif + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# ifdef UNDER_CE +# include +# endif +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifdef VMS +# define unlink delete +# define GZ_SUFFIX "-gz" +#endif +#ifdef RISCOS +# define unlink remove +# define GZ_SUFFIX "-gz" +# define fileno(file) file->__file +#endif +#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fileno */ +#endif + +#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) +#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ + extern int unlink OF((const char *)); +#endif +#endif + +#if defined(UNDER_CE) +# include +# define perror(s) pwinerror(s) + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +static char *strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +static void pwinerror (s) + const char *s; +{ + if (s && *s) + fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); + else + fprintf(stderr, "%s\n", strwinerror(GetLastError ())); +} + +#endif /* UNDER_CE */ + +#ifndef GZ_SUFFIX +# define GZ_SUFFIX ".gz" +#endif +#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) + +#define BUFLEN 16384 +#define MAX_NAME_LEN 1024 + +#ifdef MAXSEG_64K +# define local static + /* Needed for systems with limitation on stack size. */ +#else +# define local +#endif + +#ifdef Z_SOLO +/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ + +#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) +# include /* for unlink() */ +#endif + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + (void)q; + return calloc(n, m); +} + +void myfree(q, p) + void *q, *p; +{ + (void)q; + free(p); +} + +typedef struct gzFile_s { + FILE *file; + int write; + int err; + char *msg; + z_stream strm; +} *gzFile; + +gzFile gzopen OF((const char *, const char *)); +gzFile gzdopen OF((int, const char *)); +gzFile gz_open OF((const char *, int, const char *)); + +gzFile gzopen(path, mode) +const char *path; +const char *mode; +{ + return gz_open(path, -1, mode); +} + +gzFile gzdopen(fd, mode) +int fd; +const char *mode; +{ + return gz_open(NULL, fd, mode); +} + +gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gzFile gz; + int ret; + + gz = malloc(sizeof(struct gzFile_s)); + if (gz == NULL) + return NULL; + gz->write = strchr(mode, 'w') != NULL; + gz->strm.zalloc = myalloc; + gz->strm.zfree = myfree; + gz->strm.opaque = Z_NULL; + if (gz->write) + ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); + else { + gz->strm.next_in = 0; + gz->strm.avail_in = Z_NULL; + ret = inflateInit2(&(gz->strm), 15 + 16); + } + if (ret != Z_OK) { + free(gz); + return NULL; + } + gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : + fopen(path, gz->write ? "wb" : "rb"); + if (gz->file == NULL) { + gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); + free(gz); + return NULL; + } + gz->err = 0; + gz->msg = ""; + return gz; +} + +int gzwrite OF((gzFile, const void *, unsigned)); + +int gzwrite(gz, buf, len) + gzFile gz; + const void *buf; + unsigned len; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL || !gz->write) + return 0; + strm = &(gz->strm); + strm->next_in = (void *)buf; + strm->avail_in = len; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_NO_FLUSH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + return len; +} + +int gzread OF((gzFile, void *, unsigned)); + +int gzread(gz, buf, len) + gzFile gz; + void *buf; + unsigned len; +{ + int ret; + unsigned got; + unsigned char in[1]; + z_stream *strm; + + if (gz == NULL || gz->write) + return 0; + if (gz->err) + return 0; + strm = &(gz->strm); + strm->next_out = (void *)buf; + strm->avail_out = len; + do { + got = fread(in, 1, 1, gz->file); + if (got == 0) + break; + strm->next_in = in; + strm->avail_in = 1; + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_DATA_ERROR) { + gz->err = Z_DATA_ERROR; + gz->msg = strm->msg; + return 0; + } + if (ret == Z_STREAM_END) + inflateReset(strm); + } while (strm->avail_out); + return len - strm->avail_out; +} + +int gzclose OF((gzFile)); + +int gzclose(gz) + gzFile gz; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL) + return Z_STREAM_ERROR; + strm = &(gz->strm); + if (gz->write) { + strm->next_in = Z_NULL; + strm->avail_in = 0; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_FINISH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + deflateEnd(strm); + } + else + inflateEnd(strm); + fclose(gz->file); + free(gz); + return Z_OK; +} + +const char *gzerror OF((gzFile, int *)); + +const char *gzerror(gz, err) + gzFile gz; + int *err; +{ + *err = gz->err; + return gz->msg; +} + +#endif + +static char *prog; + +void error OF((const char *msg)); +void gz_compress OF((FILE *in, gzFile out)); +#ifdef USE_MMAP +int gz_compress_mmap OF((FILE *in, gzFile out)); +#endif +void gz_uncompress OF((gzFile in, FILE *out)); +void file_compress OF((char *file, char *mode)); +void file_uncompress OF((char *file)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Display error message and exit + */ +void error(msg) + const char *msg; +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + +/* =========================================================================== + * Compress input to output then close both files. + */ + +void gz_compress(in, out) + FILE *in; + gzFile out; +{ + local char buf[BUFLEN]; + int len; + int err; + +#ifdef USE_MMAP + /* Try first compressing with mmap. If mmap fails (minigzip used in a + * pipe), use the normal fread loop. + */ + if (gz_compress_mmap(in, out) == Z_OK) return; +#endif + for (;;) { + len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) break; + + if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); + } + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); +} + +#ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ + +/* Try compressing the input file at once using mmap. Return Z_OK if + * if success, Z_ERRNO otherwise. + */ +int gz_compress_mmap(in, out) + FILE *in; + gzFile out; +{ + int len; + int err; + int ifd = fileno(in); + caddr_t buf; /* mmap'ed buffer for the entire input file */ + off_t buf_len; /* length of the input file */ + struct stat sb; + + /* Determine the size of the file, needed for mmap: */ + if (fstat(ifd, &sb) < 0) return Z_ERRNO; + buf_len = sb.st_size; + if (buf_len <= 0) return Z_ERRNO; + + /* Now do the actual mmap: */ + buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (caddr_t)(-1)) return Z_ERRNO; + + /* Compress the whole file at once: */ + len = gzwrite(out, (char *)buf, (unsigned)buf_len); + + if (len != (int)buf_len) error(gzerror(out, &err)); + + munmap(buf, buf_len); + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); + return Z_OK; +} +#endif /* USE_MMAP */ + +/* =========================================================================== + * Uncompress input to output then close both files. + */ +void gz_uncompress(in, out) + gzFile in; + FILE *out; +{ + local char buf[BUFLEN]; + int len; + int err; + + for (;;) { + len = gzread(in, buf, sizeof(buf)); + if (len < 0) error (gzerror(in, &err)); + if (len == 0) break; + + if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + error("failed fwrite"); + } + } + if (fclose(out)) error("failed fclose"); + + if (gzclose(in) != Z_OK) error("failed gzclose"); +} + + +/* =========================================================================== + * Compress the given file: create a corresponding .gz file and remove the + * original. + */ +void file_compress(file, mode) + char *file; + char *mode; +{ + local char outfile[MAX_NAME_LEN]; + FILE *in; + gzFile out; + + if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX); +#else + strcpy(outfile, file); + strcat(outfile, GZ_SUFFIX); +#endif + + in = fopen(file, "rb"); + if (in == NULL) { + perror(file); + exit(1); + } + out = gzopen(outfile, mode); + if (out == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); + exit(1); + } + gz_compress(in, out); + + unlink(file); +} + + +/* =========================================================================== + * Uncompress the given file and remove the original. + */ +void file_uncompress(file) + char *file; +{ + local char buf[MAX_NAME_LEN]; + char *infile, *outfile; + FILE *out; + gzFile in; + unsigned len = strlen(file); + + if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf, sizeof(buf), "%s", file); +#else + strcpy(buf, file); +#endif + + if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { + infile = file; + outfile = buf; + outfile[len-3] = '\0'; + } else { + outfile = file; + infile = buf; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX); +#else + strcat(infile, GZ_SUFFIX); +#endif + } + in = gzopen(infile, "rb"); + if (in == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); + exit(1); + } + out = fopen(outfile, "wb"); + if (out == NULL) { + perror(file); + exit(1); + } + + gz_uncompress(in, out); + + unlink(infile); +} + + +/* =========================================================================== + * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -c : write to standard output + * -d : decompress + * -f : compress with Z_FILTERED + * -h : compress with Z_HUFFMAN_ONLY + * -r : compress with Z_RLE + * -1 to -9 : compression level + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + int copyout = 0; + int uncompr = 0; + gzFile file; + char *bname, outmode[20]; + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outmode, sizeof(outmode), "%s", "wb6 "); +#else + strcpy(outmode, "wb6 "); +#endif + + prog = argv[0]; + bname = strrchr(argv[0], '/'); + if (bname) + bname++; + else + bname = argv[0]; + argc--, argv++; + + if (!strcmp(bname, "gunzip")) + uncompr = 1; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + + while (argc > 0) { + if (strcmp(*argv, "-c") == 0) + copyout = 1; + else if (strcmp(*argv, "-d") == 0) + uncompr = 1; + else if (strcmp(*argv, "-f") == 0) + outmode[3] = 'f'; + else if (strcmp(*argv, "-h") == 0) + outmode[3] = 'h'; + else if (strcmp(*argv, "-r") == 0) + outmode[3] = 'R'; + else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && + (*argv)[2] == 0) + outmode[2] = (*argv)[1]; + else + break; + argc--, argv++; + } + if (outmode[3] == ' ') + outmode[3] = 0; + if (argc == 0) { + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + if (uncompr) { + file = gzdopen(fileno(stdin), "rb"); + if (file == NULL) error("can't gzdopen stdin"); + gz_uncompress(file, stdout); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + gz_compress(stdin, file); + } + } else { + if (copyout) { + SET_BINARY_MODE(stdout); + } + do { + if (uncompr) { + if (copyout) { + file = gzopen(*argv, "rb"); + if (file == NULL) + fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + else + gz_uncompress(file, stdout); + } else { + file_uncompress(*argv); + } + } else { + if (copyout) { + FILE * in = fopen(*argv, "rb"); + + if (in == NULL) { + perror(*argv); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + + gz_compress(in, file); + } + + } else { + file_compress(*argv, outmode); + } + } + } while (argv++, --argc); + } + return 0; +} diff --git a/third_party/zlib/treebuild.xml b/third_party/zlib/treebuild.xml new file mode 100644 index 00000000..fd75525f --- /dev/null +++ b/third_party/zlib/treebuild.xml @@ -0,0 +1,116 @@ + + + + zip compression library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/zlib/trees.c b/third_party/zlib/trees.c new file mode 100644 index 00000000..50cf4b45 --- /dev/null +++ b/third_party/zlib/trees.c @@ -0,0 +1,1203 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2017 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef ZLIB_DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local const static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local const static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local const static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef ZLIB_DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* !ZLIB_DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef ZLIB_DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !ZLIB_DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = (int)value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* ZLIB_DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef ZLIB_DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (unsigned)(bits + xbits); + if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); + } + if (overflow == 0) return; + + Tracev((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ + bi_windup(s); /* align on byte boundary */ + put_short(s, (ush)stored_len); + put_short(s, (ush)~stored_len); + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + s->pending += stored_len; +#ifdef ZLIB_DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; + s->bits_sent += 2*16; + s->bits_sent += stored_len<<3; +#endif +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef ZLIB_DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and write out the encoded block. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef ZLIB_DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} diff --git a/third_party/zlib/trees.h b/third_party/zlib/trees.h new file mode 100644 index 00000000..d35639d8 --- /dev/null +++ b/third_party/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/third_party/zlib/uncompr.c b/third_party/zlib/uncompr.c new file mode 100644 index 00000000..f03a1a86 --- /dev/null +++ b/third_party/zlib/uncompr.c @@ -0,0 +1,93 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. *sourceLen is + the byte length of the source buffer. Upon entry, *destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, + *destLen is the size of the decompressed data and *sourceLen is the number + of source bytes consumed. Upon return, source + *sourceLen points to the + first unused input byte. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, or + Z_DATA_ERROR if the input data was corrupted, including if the input data is + an incomplete zlib stream. +*/ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong *sourceLen; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong len, left; + Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ + + len = *sourceLen; + if (*destLen) { + left = *destLen; + *destLen = 0; + } + else { + left = 1; + dest = buf; + } + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = len > (uLong)max ? max : (uInt)len; + len -= stream.avail_in; + } + err = inflate(&stream, Z_NO_FLUSH); + } while (err == Z_OK); + + *sourceLen -= len + stream.avail_in; + if (dest != buf) + *destLen = stream.total_out; + else if (stream.total_out && err == Z_BUF_ERROR) + left = 1; + + inflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : + err == Z_NEED_DICT ? Z_DATA_ERROR : + err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : + err; +} + +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return uncompress2(dest, destLen, source, &sourceLen); +} diff --git a/third_party/zlib/watcom/watcom_f.mak b/third_party/zlib/watcom/watcom_f.mak new file mode 100644 index 00000000..37f4d74c --- /dev/null +++ b/third_party/zlib/watcom/watcom_f.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom flat model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_f.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc386 +LINKER = wcl386 +CFLAGS = -zq -mf -3r -fp3 -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_f.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -ldos32a -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -ldos32a -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/third_party/zlib/watcom/watcom_l.mak b/third_party/zlib/watcom/watcom_l.mak new file mode 100644 index 00000000..193eed7b --- /dev/null +++ b/third_party/zlib/watcom/watcom_l.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom large model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_l.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc +LINKER = wcl +CFLAGS = -zq -ml -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_l.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/third_party/zlib/win32/DLL_FAQ.txt b/third_party/zlib/win32/DLL_FAQ.txt new file mode 100644 index 00000000..12c00901 --- /dev/null +++ b/third_party/zlib/win32/DLL_FAQ.txt @@ -0,0 +1,397 @@ + + Frequently Asked Questions about ZLIB1.DLL + + +This document describes the design, the rationale, and the usage +of the official DLL build of zlib, named ZLIB1.DLL. If you have +general questions about zlib, you should see the file "FAQ" found +in the zlib distribution, or at the following location: + http://www.gzip.org/zlib/zlib_faq.html + + + 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 character '1' in the name.) + + Pointers to a precompiled ZLIB1.DLL can be found in the zlib + web site at: + http://www.zlib.net/ + + Applications that link to ZLIB1.DLL can rely on the following + specification: + + * The exported symbols are exclusively defined in the source + files "zlib.h" and "zlib.def", found in an official zlib + source distribution. + * The symbols are exported by name, not by ordinal. + * The exported names are undecorated. + * The calling convention of functions is "C" (CDECL). + * The ZLIB1.DLL binary is linked to MSVCRT.DLL. + + The archive in which ZLIB1.DLL is bundled contains compiled + test programs that must run with a valid build of ZLIB1.DLL. + It is recommended to download the prebuilt DLL from the zlib + web site, instead of building it yourself, to avoid potential + incompatibilities that could be introduced by your compiler + 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. + + If, for any reason, you need to build an incompatible DLL, + 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.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: + + * ZLIB_DLL was missing from the old makefile. When building + the DLL, not all people added it to the build options. In + consequence, incompatible incarnations of ZLIB.DLL started + to circulate around the net. + + * When switching from using the static library to using the + DLL, applications had to define the ZLIB_DLL macro and + to recompile all the sources that contained calls to zlib + 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 interface, in order to + remove the dependency on the ZLIB_DLL macro, and to release + the new DLL under a different name. + + We chose the name ZLIB1.DLL, where '1' indicates the major + zlib version number. We hope that we will not have to break + the binary compatibility again, at least not as long as the + zlib-1.x series will last. + + There is still a ZLIB_DLL macro, that can trigger a more + efficient build and use of the DLL, but compatibility no + longer dependents on it. + + + 3. Can I build ZLIB.DLL from the new zlib sources, and replace + an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier? + + - 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. + 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 + link it to an old ZLIB.DLL, that was built from zlib-1.1.4 or + earlier? + + - The official answer is "no"; the real answer depends again on + what kind of ZLIB.DLL you have. Even if you are lucky, this + course of action is unreliable. + + If you rebuild your application and you intend to use a newer + version of zlib (post- 1.1.4), it is strongly recommended to + link it to the new ZLIB1.DLL. + + + 5. Why are the zlib symbols exported by name, and not by ordinal? + + - Although exporting symbols by ordinal is a little faster, it + is risky. Any single glitch in the maintenance or use of the + DEF file that contains the ordinals can result in incompatible + builds and frustrating crashes. Simply put, the benefits of + exporting symbols by ordinal do not justify the risks. + + Technically, it should be possible to maintain ordinals in + the DEF file, and still export the symbols by name. Ordinals + exist in every DLL, and even if the dynamic linking performed + at the DLL startup is searching for names, ordinals serve as + hints, for a faster name lookup. However, if the DEF file + contains ordinals, the Microsoft linker automatically builds + an implib that will cause the executables linked to it to use + those ordinals, and not the names. It is interesting to + notice that the GNU linker for Win32 does not suffer from this + problem. + + It is possible to avoid the DEF file if the exported symbols + are accompanied by a "__declspec(dllexport)" attribute in the + source files. You can do this in zlib by predefining the + ZLIB_DLL macro. + + + 6. I see that the ZLIB1.DLL functions use the "C" (CDECL) calling + convention. Why not use the STDCALL convention? + STDCALL is the standard convention in Win32, and I need it in + my Visual Basic project! + + (For readability, we use CDECL to refer to the convention + triggered by the "__cdecl" keyword, STDCALL to refer to + the convention triggered by "__stdcall", and FASTCALL to + refer to the convention triggered by "__fastcall".) + + - Most of the native Windows API functions (without varargs) use + indeed the WINAPI convention (which translates to STDCALL in + Win32), but the standard C functions use CDECL. If a user + application is intrinsically tied to the Windows API (e.g. + it calls native Windows API functions such as CreateFile()), + sometimes it makes sense to decorate its own functions with + WINAPI. But if ANSI C or POSIX portability is a goal (e.g. + it calls standard C functions such as fopen()), it is not a + sound decision to request the inclusion of , or to + use non-ANSI constructs, for the sole purpose to make the user + functions STDCALL-able. + + The functionality offered by zlib is not in the category of + "Windows functionality", but is more like "C functionality". + + Technically, STDCALL is not bad; in fact, it is slightly + faster than CDECL, and it works with variable-argument + functions, just like CDECL. It is unfortunate that, in spite + of using STDCALL in the Windows API, it is not the default + convention used by the C compilers that run under Windows. + The roots of the problem reside deep inside the unsafety of + the K&R-style function prototypes, where the argument types + are not specified; but that is another story for another day. + + 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. + + In fairness to all possible uses of zlib outside the C + programming language, we choose the default "C" convention. + Anyone interested in different bindings or conventions is + encouraged to maintain specialized projects. The "contrib/" + directory from the zlib distribution already holds a couple + of foreign bindings, such as Ada, C++, and Delphi. + + + 7. I need a DLL for my Visual Basic project. What can I do? + + - Define the ZLIB_WINAPI macro before including "zlib.h", when + building both the DLL and the user application (except that + you don't need to define anything when using the DLL in Visual + Basic). The ZLIB_WINAPI macro will switch on the WINAPI + (STDCALL) convention. The name of this DLL must be different + than the official ZLIB1.DLL. + + Gilles Vollant has contributed a build named ZLIBWAPI.DLL, + with the ZLIB_WINAPI macro turned on, and with the minizip + functionality built in. For more information, please read + the notes inside "contrib/vstudio/readme.txt", found in the + zlib distribution. + + + 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 + application to MSVCRT.DLL, if it uses ZLIB1.DLL. + + The executables (.EXE, .DLL, etc.) that are involved in the + same process and are using the C run-time library (i.e. they + are calling standard C functions), must link to the same + library. There are several libraries in the Win32 system: + CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc. + Since ZLIB1.DLL is linked to MSVCRT.DLL, the executables that + depend on it should also be linked to MSVCRT.DLL. + + +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. + + - If a user library invokes only pure Win32 API (accessible via + and the related headers), its DLL build will work + in any context. But if this library invokes standard C API, + things get more complicated. + + There is a single Win32 library in a Win32 system. Every + function in this library resides in a single DLL module, that + is safe to call from anywhere. On the other hand, there are + multiple versions of the C library, and each of them has its + own separate internal state. Standalone executables and user + DLLs that call standard C functions must link to a C run-time + (CRT) library, be it static or shared (DLL). Intermixing + occurs when an executable (not necessarily standalone) and a + DLL are linked to different CRTs, and both are running in the + same process. + + Intermixing multiple CRTs is possible, as long as their + internal states are kept intact. The Microsoft Knowledge Base + articles KB94248 "HOWTO: Use the C Run-Time" and KB140584 + "HOWTO: Link with the Correct C Run-Time (CRT) Library" + mention the potential problems raised by intermixing. + + If intermixing works for you, it's because your application + 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. + + +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 + on all other Windows 4.x or later (Windows 98, Windows NT 4, + or later). It is freely distributable; if not present in the + system, it can be downloaded from Microsoft or from other + software provider for free. + + The fact that MSVCRT.DLL does not exist on a virgin Windows 95 + 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. + + +12. Why are you not linking ZLIB1.DLL to + <> ? + + - We considered and abandoned the following alternatives: + + * Linking ZLIB1.DLL to a static C library (LIBC.LIB, or + LIBCMT.LIB) is not a good option. People are using the DLL + mainly to save disk space. If you are linking your program + to a static C library, you may as well consider linking zlib + in statically, too. + + * 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 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 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. + + +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 + it the way you want. You should, however, clearly state that + your build is unofficial. You should give it a different file + name, and/or install it in a private directory that can be + accessed by your application only, and is not visible to the + others (i.e. it's neither in the PATH, nor in the SYSTEM or + SYSTEM32 directories). Otherwise, your build may clash with + applications that link to the official build. + + For example, in Cygwin, zlib is linked to the Cygwin runtime + CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL. + + +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 + that does not originate from the official zlib source code. + But you can make your own private DLL build, under a different + file name, as suggested in the previous answer. + + 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. + + +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 + zlib functionality, as implemented in the official zlib source + code. But you can make your own private DLL build, under a + different file name, as suggested in the previous answer. + + +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 + can send your suggestion to the zlib mailing list. + + However, in case you do rebuild the DLL yourself, you can run + it with the test programs found in the DLL distribution. + Running these test programs is not a guarantee of compliance, + but a failure can imply a detected problem. + +** + +This document is written and maintained by +Cosmin Truta diff --git a/third_party/zlib/win32/Makefile.bor b/third_party/zlib/win32/Makefile.bor new file mode 100644 index 00000000..d152bbb7 --- /dev/null +++ b/third_party/zlib/win32/Makefile.bor @@ -0,0 +1,110 @@ +# Makefile for zlib +# Borland C++ for Win32 +# +# Usage: +# make -f win32/Makefile.bor +# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj + +# ------------ Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or +# added to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +CC = bcc32 +AS = bcc32 +LD = bcc32 +AR = tlib +CFLAGS = -a -d -k- -O2 $(LOC) +ASFLAGS = $(LOC) +LDFLAGS = $(LOC) + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +#OBJA = +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj +#OBJPA= + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $< + +.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) $(OBJA) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + $(AR) $(ZLIB_LIB) $(OBJPA) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del $(ZLIB_LIB) + -del *.obj + -del *.exe + -del *.tds + -del zlib.bak + -del foo.gz diff --git a/third_party/zlib/win32/Makefile.gcc b/third_party/zlib/win32/Makefile.gcc new file mode 100644 index 00000000..305be50a --- /dev/null +++ b/third_party/zlib/win32/Makefile.gcc @@ -0,0 +1,182 @@ +# Makefile for zlib, derived from Makefile.dj2. +# Modified for mingw32 by C. Spieler, 6/16/98. +# Updated for zlib 1.2.x by Christian Spieler and Cosmin Truta, Mar-2003. +# Last updated: Mar 2012. +# Tested under Cygwin and MinGW. + +# Copyright (C) 1995-2003 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type from the top level zlib directory: +# +# make -fwin32/Makefile.gcc; make test testdll -fwin32/Makefile.gcc +# +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc +# +# To install libz.a, zconf.h and zlib.h in the system directories, type: +# +# make install -fwin32/Makefile.gcc +# +# BINARY_PATH, INCLUDE_PATH and LIBRARY_PATH must be set. +# +# To install the shared lib, append SHARED_MODE=1 to the make command : +# +# make install -fwin32/Makefile.gcc SHARED_MODE=1 + +# Note: +# If the platform is *not* MinGW (e.g. it is Cygwin or UWIN), +# the DLL name should be changed from "zlib1.dll". + +STATICLIB = libz.a +SHAREDLIB = zlib1.dll +IMPLIB = libz.dll.a + +# +# Set to 1 if shared object needs to be installed +# +SHARED_MODE=0 + +#LOC = -DASMV +#LOC = -DZLIB_DEBUG -g + +PREFIX = +CC = $(PREFIX)gcc +CFLAGS = $(LOC) -O3 -Wall + +AS = $(CC) +ASFLAGS = $(LOC) -Wall + +LD = $(CC) +LDFLAGS = $(LOC) + +AR = $(PREFIX)ar +ARFLAGS = rcs + +RC = $(PREFIX)windres +RCFLAGS = --define GCC_WINDRES + +STRIP = $(PREFIX)strip + +CP = cp -fp +# If GNU install is available, replace $(CP) with install. +INSTALL = $(CP) +RM = rm -f + +prefix ?= /usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJA = + +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) example.exe minigzip.exe example_d.exe minigzip_d.exe + +test: example.exe minigzip.exe + ./example + echo hello world | ./minigzip | ./minigzip -d + +testdll: example_d.exe minigzip_d.exe + ./example_d + echo hello world | ./minigzip_d | ./minigzip_d -d + +.c.o: + $(CC) $(CFLAGS) -c -o $@ $< + +.S.o: + $(AS) $(ASFLAGS) -c -o $@ $< + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) $@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(CC) -shared -Wl,--out-implib,$(IMPLIB) $(LDFLAGS) \ + -o $@ win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(STRIP) $@ + +example.exe: example.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(STATICLIB) + $(STRIP) $@ + +minigzip.exe: minigzip.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(STATICLIB) + $(STRIP) $@ + +example_d.exe: example.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(IMPLIB) + $(STRIP) $@ + +minigzip_d.exe: minigzip.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(IMPLIB) + $(STRIP) $@ + +example.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/example.c + +minigzip.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/minigzip.c + +zlibrc.o: win32/zlib1.rc + $(RC) $(RCFLAGS) -o $@ win32/zlib1.rc + +.PHONY: install uninstall clean + +install: zlib.h zconf.h $(STATICLIB) $(IMPLIB) + @if test -z "$(DESTDIR)$(INCLUDE_PATH)" -o -z "$(DESTDIR)$(LIBRARY_PATH)" -o -z "$(DESTDIR)$(BINARY_PATH)"; then \ + echo INCLUDE_PATH, LIBRARY_PATH, and BINARY_PATH must be specified; \ + exit 1; \ + fi + -@mkdir -p '$(DESTDIR)$(INCLUDE_PATH)' + -@mkdir -p '$(DESTDIR)$(LIBRARY_PATH)' '$(DESTDIR)$(LIBRARY_PATH)'/pkgconfig + -if [ "$(SHARED_MODE)" = "1" ]; then \ + mkdir -p '$(DESTDIR)$(BINARY_PATH)'; \ + $(INSTALL) $(SHAREDLIB) '$(DESTDIR)$(BINARY_PATH)'; \ + $(INSTALL) $(IMPLIB) '$(DESTDIR)$(LIBRARY_PATH)'; \ + fi + -$(INSTALL) zlib.h '$(DESTDIR)$(INCLUDE_PATH)' + -$(INSTALL) zconf.h '$(DESTDIR)$(INCLUDE_PATH)' + -$(INSTALL) $(STATICLIB) '$(DESTDIR)$(LIBRARY_PATH)' + sed \ + -e 's|@prefix@|${prefix}|g' \ + -e 's|@exec_prefix@|${exec_prefix}|g' \ + -e 's|@libdir@|$(LIBRARY_PATH)|g' \ + -e 's|@sharedlibdir@|$(LIBRARY_PATH)|g' \ + -e 's|@includedir@|$(INCLUDE_PATH)|g' \ + -e 's|@VERSION@|'`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' zlib.h`'|g' \ + zlib.pc.in > '$(DESTDIR)$(LIBRARY_PATH)'/pkgconfig/zlib.pc + +uninstall: + -if [ "$(SHARED_MODE)" = "1" ]; then \ + $(RM) '$(DESTDIR)$(BINARY_PATH)'/$(SHAREDLIB); \ + $(RM) '$(DESTDIR)$(LIBRARY_PATH)'/$(IMPLIB); \ + fi + -$(RM) '$(DESTDIR)$(INCLUDE_PATH)'/zlib.h + -$(RM) '$(DESTDIR)$(INCLUDE_PATH)'/zconf.h + -$(RM) '$(DESTDIR)$(LIBRARY_PATH)'/$(STATICLIB) + +clean: + -$(RM) $(STATICLIB) + -$(RM) $(SHAREDLIB) + -$(RM) $(IMPLIB) + -$(RM) *.o + -$(RM) *.exe + -$(RM) foo.gz + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +gzclose.o: zlib.h zconf.h gzguts.h +gzlib.o: zlib.h zconf.h gzguts.h +gzread.o: zlib.h zconf.h gzguts.h +gzwrite.o: zlib.h zconf.h gzguts.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/third_party/zlib/win32/Makefile.msc b/third_party/zlib/win32/Makefile.msc new file mode 100644 index 00000000..6831882d --- /dev/null +++ b/third_party/zlib/win32/Makefile.msc @@ -0,0 +1,163 @@ +# Makefile for zlib using Microsoft (Visual) C +# zlib is copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +# +# Usage: +# nmake -f win32/Makefile.msc (standard build) +# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) +# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ +# OBJA="inffas32.obj match686.obj" (use ASM code, x86) +# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \ +# OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64) + +# The toplevel directory of the source tree. +# +TOP = . + +# optional build flags +LOC = + +# variables +STATICLIB = zlib.lib +SHAREDLIB = zlib1.dll +IMPLIB = zdll.lib + +CC = cl +AS = ml +LD = link +AR = lib +RC = rc +CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) +WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE +ASFLAGS = -coff -Zi $(LOC) +LDFLAGS = -nologo -debug -incremental:no -opt:ref +ARFLAGS = -nologo +RCFLAGS = /dWIN32 /r + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \ + gzwrite.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj +OBJA = + + +# targets +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \ + example.exe minigzip.exe example_d.exe minigzip_d.exe + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) -out:$@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): $(TOP)/win32/zlib.def $(OBJS) $(OBJA) zlib1.res + $(LD) $(LDFLAGS) -def:$(TOP)/win32/zlib.def -dll -implib:$(IMPLIB) \ + -out:$@ -base:0x5A4C0000 $(OBJS) $(OBJA) zlib1.res + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;2 + +example.exe: example.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip.exe: minigzip.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +example_d.exe: example.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip_d.exe: minigzip.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +{$(TOP)}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/test}.c.obj: + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/contrib/masmx64}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/contrib/masmx64}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +{$(TOP)/contrib/masmx86}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: $(TOP)/adler32.c $(TOP)/zlib.h $(TOP)/zconf.h + +compress.obj: $(TOP)/compress.c $(TOP)/zlib.h $(TOP)/zconf.h + +crc32.obj: $(TOP)/crc32.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/crc32.h + +deflate.obj: $(TOP)/deflate.c $(TOP)/deflate.h $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h + +gzclose.obj: $(TOP)/gzclose.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzlib.obj: $(TOP)/gzlib.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzread.obj: $(TOP)/gzread.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzwrite.obj: $(TOP)/gzwrite.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +infback.obj: $(TOP)/infback.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h $(TOP)/inffixed.h + +inffast.obj: $(TOP)/inffast.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h + +inflate.obj: $(TOP)/inflate.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h $(TOP)/inffixed.h + +inftrees.obj: $(TOP)/inftrees.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h + +trees.obj: $(TOP)/trees.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/deflate.h $(TOP)/trees.h + +uncompr.obj: $(TOP)/uncompr.c $(TOP)/zlib.h $(TOP)/zconf.h + +zutil.obj: $(TOP)/zutil.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h + +gvmat64.obj: $(TOP)/contrib\masmx64\gvmat64.asm + +inffasx64.obj: $(TOP)/contrib\masmx64\inffasx64.asm + +inffas8664.obj: $(TOP)/contrib\masmx64\inffas8664.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h \ + $(TOP)/inftrees.h $(TOP)/inflate.h $(TOP)/inffast.h + +inffas32.obj: $(TOP)/contrib\masmx86\inffas32.asm + +match686.obj: $(TOP)/contrib\masmx86\match686.asm + +example.obj: $(TOP)/test/example.c $(TOP)/zlib.h $(TOP)/zconf.h + +minigzip.obj: $(TOP)/test/minigzip.c $(TOP)/zlib.h $(TOP)/zconf.h + +zlib1.res: $(TOP)/win32/zlib1.rc + $(RC) $(RCFLAGS) /fo$@ $(TOP)/win32/zlib1.rc + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +testdll: example_d.exe minigzip_d.exe + example_d + echo hello world | minigzip_d | minigzip_d -d + + +# cleanup +clean: + -del $(STATICLIB) + -del $(SHAREDLIB) + -del $(IMPLIB) + -del *.obj + -del *.res + -del *.exp + -del *.exe + -del *.pdb + -del *.manifest + -del foo.gz diff --git a/third_party/zlib/win32/README-WIN32.txt b/third_party/zlib/win32/README-WIN32.txt new file mode 100644 index 00000000..df7ab7f4 --- /dev/null +++ b/third_party/zlib/win32/README-WIN32.txt @@ -0,0 +1,103 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.11 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) +and rfc1952.txt (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). Two compiled +examples are distributed in this package, example and minigzip. The example_d +and minigzip_d flavors validate that the zlib1.dll file is working correctly. + +Questions about zlib should be sent to . The zlib home page +is http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html +before asking for help. + + +Manifest: + +The package zlib-1.2.11-win32-x86.zip will contain the following files: + + README-WIN32.txt This document + ChangeLog Changes since previous zlib packages + DLL_FAQ.txt Frequently asked questions about zlib1.dll + zlib.3.pdf Documentation of this library in Adobe Acrobat format + + example.exe A statically-bound example (using zlib.lib, not the dll) + example.pdb Symbolic information for debugging example.exe + + example_d.exe A zlib1.dll bound example (using zdll.lib) + example_d.pdb Symbolic information for debugging example_d.exe + + minigzip.exe A statically-bound test program (using zlib.lib, not the dll) + minigzip.pdb Symbolic information for debugging minigzip.exe + + minigzip_d.exe A zlib1.dll bound test program (using zdll.lib) + minigzip_d.pdb Symbolic information for debugging minigzip_d.exe + + zlib.h Install these files into the compilers' INCLUDE path to + zconf.h compile programs which use zlib.lib or zdll.lib + + zdll.lib Install these files into the compilers' LIB path if linking + zdll.exp a compiled program to the zlib1.dll binary + + zlib.lib Install these files into the compilers' LIB path to link zlib + zlib.pdb into compiled programs, without zlib1.dll runtime dependency + (zlib.pdb provides debugging info to the compile time linker) + + zlib1.dll Install this binary shared library into the system PATH, or + the program's runtime directory (where the .exe resides) + zlib1.pdb Install in the same directory as zlib1.dll, in order to debug + an application crash using WinDbg or similar tools. + +All .pdb files above are entirely optional, but are very useful to a developer +attempting to diagnose program misbehavior or a crash. Many additional +important files for developers can be found in the zlib127.zip source package +available from http://zlib.net/ - review that package's README file for details. + + +Acknowledgments: + +The deflate format used by zlib was defined by Phil Katz. The deflate and +zlib specifications were written by L. Peter Deutsch. Thanks to all the +people who reported problems and suggested various improvements in zlib; they +are too numerous to cite here. + + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/third_party/zlib/win32/VisualC.txt b/third_party/zlib/win32/VisualC.txt new file mode 100644 index 00000000..1005b219 --- /dev/null +++ b/third_party/zlib/win32/VisualC.txt @@ -0,0 +1,3 @@ + +To build zlib using the Microsoft Visual C++ environment, +use the appropriate project from the contrib/vstudio/ directory. diff --git a/third_party/zlib/win32/zlib.def b/third_party/zlib/win32/zlib.def new file mode 100644 index 00000000..a2188b00 --- /dev/null +++ b/third_party/zlib/win32/zlib.def @@ -0,0 +1,94 @@ +; zlib data compression library +EXPORTS +; basic functions + zlibVersion + deflate + deflateEnd + inflate + inflateEnd +; advanced functions + deflateSetDictionary + deflateGetDictionary + deflateCopy + deflateReset + deflateParams + deflateTune + deflateBound + deflatePending + deflatePrime + deflateSetHeader + inflateSetDictionary + inflateGetDictionary + inflateSync + inflateCopy + inflateReset + inflateReset2 + inflatePrime + inflateMark + inflateGetHeader + inflateBack + inflateBackEnd + zlibCompileFlags +; utility functions + compress + compress2 + compressBound + uncompress + uncompress2 + gzopen + gzdopen + gzbuffer + gzsetparams + gzread + gzfread + gzwrite + gzfwrite + gzprintf + gzvprintf + gzputs + gzgets + gzputc + gzgetc + gzungetc + gzflush + gzseek + gzrewind + gztell + gzoffset + gzeof + gzdirect + gzclose + gzclose_r + gzclose_w + gzerror + gzclearerr +; large file functions + gzopen64 + gzseek64 + gztell64 + gzoffset64 + adler32_combine64 + crc32_combine64 +; checksum functions + adler32 + adler32_z + crc32 + crc32_z + adler32_combine + crc32_combine +; various hacks, don't look :) + deflateInit_ + deflateInit2_ + inflateInit_ + inflateInit2_ + inflateBackInit_ + gzgetc_ + zError + inflateSyncPoint + get_crc_table + inflateUndermine + inflateValidate + inflateCodesUsed + inflateResetKeep + deflateResetKeep + gzopen_w diff --git a/third_party/zlib/win32/zlib1.rc b/third_party/zlib/win32/zlib1.rc new file mode 100644 index 00000000..234e641c --- /dev/null +++ b/third_party/zlib/win32/zlib1.rc @@ -0,0 +1,40 @@ +#include +#include "../zlib.h" + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + PRODUCTVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", ZLIB_VERSION "\0" + VALUE "InternalName", "zlib1.dll\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "OriginalFilename", "zlib1.dll\0" + VALUE "ProductName", "zlib\0" + VALUE "ProductVersion", ZLIB_VERSION "\0" + VALUE "Comments", "For more information visit http://www.zlib.net/\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zconf.h b/third_party/zlib/zconf.h.cmakein similarity index 99% rename from third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zconf.h rename to third_party/zlib/zconf.h.cmakein index 352f552b..a7f24cce 100644 --- a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zconf.h +++ b/third_party/zlib/zconf.h.cmakein @@ -7,8 +7,8 @@ #ifndef ZCONF_H #define ZCONF_H -/* #undef Z_PREFIX */ -/* #undef Z_HAVE_UNISTD_H */ +#cmakedefine Z_PREFIX +#cmakedefine Z_HAVE_UNISTD_H /* * If you *really* need a unique prefix for all types and library functions, diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/include/zconf.h b/third_party/zlib/zconf.h.in similarity index 99% rename from third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/include/zconf.h rename to third_party/zlib/zconf.h.in index 352f552b..5e1d68a0 100644 --- a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/include/zconf.h +++ b/third_party/zlib/zconf.h.in @@ -7,8 +7,6 @@ #ifndef ZCONF_H #define ZCONF_H -/* #undef Z_PREFIX */ -/* #undef Z_HAVE_UNISTD_H */ /* * If you *really* need a unique prefix for all types and library functions, diff --git a/third_party/zlib/zconf.h.included b/third_party/zlib/zconf.h.included new file mode 100644 index 00000000..5e1d68a0 --- /dev/null +++ b/third_party/zlib/zconf.h.included @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/third_party/zlib/zlib.3 b/third_party/zlib/zlib.3 new file mode 100644 index 00000000..bda4eb07 --- /dev/null +++ b/third_party/zlib/zlib.3 @@ -0,0 +1,149 @@ +.TH ZLIB 3 "15 Jan 2017" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms may be added later +with the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +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 the case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I test/example.c +and +.IR test/minigzip.c, +as well as other examples in the +.IR examples/ +directory. +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source. +.LP +.I zlib +is built in to many languages and operating systems, including but not limited to +Java, Python, .NET, PHP, Perl, Ruby, Swift, and Go. +.LP +An experimental package to read and write files in the .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/minizip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +source distribution. +.SH "SEE ALSO" +The +.I zlib +web site can be found at: +.IP +http://zlib.net/ +.LP +The data format used by the +.I zlib +library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) +.br +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) +.br +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) +.LP +Mark Nelson wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://marknelson.us/1997/01/01/zlib-engine/ +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://zlib.net/zlib_faq.html +.LP +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 AND LICENSE +Version 1.2.11 +.LP +Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +.LP +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +.LP +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +.LP +.nr step 1 1 +.IP \n[step]. 3 +The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +.IP \n+[step]. +Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +.IP \n+[step]. +This notice may not be removed or altered from any source distribution. +.LP +Jean-loup Gailly Mark Adler +.br +jloup@gzip.org madler@alumni.caltech.edu +.LP +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/third_party/zlib/zlib.3.pdf b/third_party/zlib/zlib.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6fa519c5bdf5df33b2f17549e1df142c619c916c GIT binary patch literal 19318 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 + +my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments + +my $d1 = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ; +my $decl = qr{ $sp (?: \w+ $sp )+ $d1 }xo ; +my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ; + + +while (s/^ + ( # Start $1 + ( # Start $2 + .*? # Minimal eat content + ( ^ \w [\w\s\*]+ ) # $3 -- function name + \s* # optional whitespace + ) # $2 - Matched up to before parameter list + + \( \s* # Literal "(" + optional whitespace + ( [^\)]+ ) # $4 - one or more anythings except ")" + \s* \) # optional whitespace surrounding a Literal ")" + + ( (?: $dList )+ ) # $5 + + $sp ^ { # literal "{" at start of line + ) # Remember to $1 + //xsom + ) +{ + my $all = $1 ; + my $prefix = $2; + my $param_list = $4 ; + my $params = $5; + + StripComments($params); + StripComments($param_list); + $param_list =~ s/^\s+//; + $param_list =~ s/\s+$//; + + my $i = 0 ; + my %pList = map { $_ => $i++ } + split /\s*,\s*/, $param_list; + my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ; + + my @params = split /\s*;\s*/, $params; + my @outParams = (); + foreach my $p (@params) + { + if ($p =~ /,/) + { + my @bits = split /\s*,\s*/, $p; + my $first = shift @bits; + $first =~ s/^\s*//; + push @outParams, $first; + $first =~ /^(\w+\s*)/; + my $type = $1 ; + push @outParams, map { $type . $_ } @bits; + } + else + { + $p =~ s/^\s+//; + push @outParams, $p; + } + } + + + my %tmp = map { /$pMatch/; $_ => $pList{$1} } + @outParams ; + + @outParams = map { " $_" } + sort { $tmp{$a} <=> $tmp{$b} } + @outParams ; + + print $prefix ; + print "(\n" . join(",\n", @outParams) . ")\n"; + print "{" ; + +} + +# Output any trailing code. +print ; +exit 0; + + +sub StripComments +{ + + no warnings; + + # Strip C & C++ coments + # From the perlfaq + $_[0] =~ + + s{ + /\* ## Start of /* ... */ comment + [^*]*\*+ ## Non-* followed by 1-or-more *'s + ( + [^/*][^*]*\*+ + )* ## 0-or-more things which don't start with / + ## but do end with '*' + / ## End of /* ... */ comment + + | ## OR C++ Comment + // ## Start of C++ comment // + [^\n]* ## followed by 0-or-more non end of line characters + + | ## OR various things which aren't comments: + + ( + " ## Start of " ... " string + ( + \\. ## Escaped char + | ## OR + [^"\\] ## Non "\ + )* + " ## End of " ... " string + + | ## OR + + ' ## Start of ' ... ' string + ( + \\. ## Escaped char + | ## OR + [^'\\] ## Non '\ + )* + ' ## End of ' ... ' string + + | ## OR + + . ## Anything other char + [^/"'\\]* ## Chars which doesn't start a comment, string or escape + ) + }{$2}gxs; + +} diff --git a/third_party/zlib/zutil.c b/third_party/zlib/zutil.c new file mode 100644 index 00000000..a76c6b0c --- /dev/null +++ b/third_party/zlib/zutil.c @@ -0,0 +1,325 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2017 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef ZLIB_DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef ZLIB_DEBUG +#include +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf; + ulg bsize = (ulg)items*size; + + (void)opaque; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + + (void)opaque; + + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + (void)opaque; + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + (void)opaque; + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + (void)opaque; + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + (void)opaque; + free(ptr); +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/third_party/zlib/zutil.h b/third_party/zlib/zutil.h new file mode 100644 index 00000000..b079ea6a --- /dev/null +++ b/third_party/zlib/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */

CPulXW}*6bLVHS zyXMmDH3A^|xA;uxRnXg@oNF9skDW}h z$AeH_Oyc!W+E_day%s9(0283(#rgpBbI?i94bbbLo1k)b@>ifm(CyHv&>uocQ|-Si zf&PU14?_PNN?#cN6?6{t2y`yAkH@m+K`(_`=Xb_M2XcQ66n)2wptnNhT@~4tp7QW& z-qqAQT!4FdwH2MnH4T3(gUC9C^54R5^A4llZ35i$Ev>a0$h81}S3YB*%kXTnS?$ zR;bATZRpL=|A30T+n@`f-+_vp--X7Z?NI8n^?j(6{|}&2?z^CbwVs3ShW-e80Qx-i zx6l`$8OXN>D&_nl^jzrwgARxO6e{PgcR)u$e+89yo`cXg2=4{vT|uom1-Qpqx;%C5 zGyde6XP&R>xf|gAY)}m3dIW!>k1s%_j(ib%8T3(T0aWVU1anUvwY~&j($5Dz^W40W z-vQ7I*yXbhe-iIQP}-pN857ROZ}WVTHl@P#hN`rnzcb-}50!Fz6FL-n3@YXG7POX( zuBGy91lzz~a2RAQrago7b+uA>YQ2quEVx~-u~k6V0(-43j-T{>uPdmq&b_bpdRq&A zSCn_X=GN+`E?rG~I~Td2_PX0EhN30^fY|pdN3x4{E@2ojKFZSZ{b^kl+^CUjtA7ee@A8FmehgwY?Q*|%Ey>mX1 zqEPdYUZ~7#4udk+FY}afsiVwI#+fTUY0gmQ6J^fOo*(Rqxj}ng(4G^NMluRa0_kTe zI=_vVIlnyS?z)=md#CT?E1Jldd$}5LHQ;K%)qtx3R|BpFTn)Gya5eCMrU4oMFYMv* zfASmms5baV8fSX!zm!4#-)cPlk1}rlN8iVn$=t|Z#*BwSW{kZmpa7JDDzE~i@2!zB zvh$nuuJ+M%wTI@NY{xnG&2+bCCVjkY@0W4zl}UWBUci1iPzTcY$8@zf=Krj7a1(Yl z;A+6tfU5yl1Fi;K4Y(R`HQ;LCpGpHV{=cn<$N$Z-a9udI>^*<`KOFn|4Ckz++43z1 z-$5rQ7OMQgCb2QVcT|0I!mR6;C_fxJ*jyJfHvNOK(9&?s9}6z53$ZUi`wMjC&%d}i zT)D{a@XmLMr#@$3BXbT5&3=Quj8*00`zuSn1Cnn^mLON_S?Zftzp^M$9c+qW*uRpa z5&eF#uJY#L4!`coE4`RFh(*U2jLZ{YGtp zuDT3~fp24g$R+ZLT%9M$6>9if$Th|2>$s6izNrzp27#r><_;)rPBMN>6i)JTduLh>P`kOWK6^ zt-X-%foyr2#3V#RFdA*VQy(lDX{-xZE}J;9vaz8$T+?p-PgcrV+Ey4E(tE%`Yy@_zWa+XpKThYlZ{B>#_D7m?{ZliFpufeR3 z-ajLHyup0Sy;U|@aNQ52KHUrAq#w^x^@+|S(ijUh$mtq&%cLfStNc#woa#Gd$!|V! z>hGVOA+?@x>QaaD{c?A@5Z$g)I?|`3a9B!0`JyW+m+o}s{4PBEEJ@w6&e25We>L&u z_fdJD8JpT1jgt5B(85!;9f{X&qq|MKeAcDfgnV~+FY)?xyync3U?sgLwckE3S-4t&1yBPo@57ea31jpz82KUGJnG3?S`YU=n`(Iz3e%y@@c5cVbMn#ttQN3qEMt z^CbDGkZUxMCMIc#?CmMC+n@LctLcgzj~9O>-ru1e>u>&@>1{UY4I!MQCuJ+?S?8Gk zO!XgjdJ99E3~vSq)y$T8q`sQr|utn z%1(py2lJ6lY&6XBD04yD;t@P)y8)=Sp^%hOJztG`E%g07UuJod?qY?Q&nuNZoS*9a zs`#Ddo^2Yr>=~1C9|`0fq3m9>Pb_?gyMm8YspUhZQ`cKwdVldC~J!QhMh zf|;h@JJuH_*T;c0rH_L937g%|SwF<4P-DZL6q39g6P>?OKO*!qkuZ`Msoy7GKJ$*% zJLgk6&V-F1X5ceQvETR8V6c`6>KKCu&(l0RFYHorT4VnZk89Z>3u{d|v{rv)4X zk@j{a_ylFto>Et$A&j{tBy9-tD&E&7xw<~bw;+k@h9zQCHNGwl^NM| z)7P?;;MT>J&_fxHpH_9hy1Bu;$J>39Zr7$GQLos#O^-M2S;nh!NgN`_P2eHX(fLY8 z!I)$03Rmey^47(bkjIDP`2O44jp;*g z`o;|-=HBoUi4PF|yFc^p|H{VCKhmE1eAH^@QPliJ7IQ5O6BD*Qe(lk=SN;boefJUQ z8&C;n<~h{-M|!x|O}ICpGB1MZwnR8H520+eq=);33HRU7L4@lt;k^7d^95=ip`Cj~ zP1rzLZu~8UXU6wx+#ldx`oB6L7tbMOJBZ026+iuBT;?@=P?2*QbT0G;XassA^i$C3 z&~HKMBb1Gw8PM-?KMVRSvF%AdNuSO=s2j1(t%G!DcIug1K`hMtk zs4b@%3#xh_z|ARVJN_j8??FXR--pVp#}25Zw-YMylmRo&Q{%q?_cE+526BA}fAZ+# zOxO4o&?=~USHmWdvX{S3%^B|+{E2+`L8ZJt4wZSy2cVZi zKMBo+J_wckuY*dwg}{u368V;Rq;1IcS^UZUSD@!YzY3N7ZZ_c~{5E47HRcI$FaD~4 zT+dkA)|J?PlJ>a`D&egXHlL8bjxLi3>^ zsI-km(CN@R=mKax6gR68D)Pmk%b`o4cR`my?}pMhDLGd`MIJ9OV*oWa2ypKK(l+G! zu<=*MZ}ZM9_S%#_o%O2~f70F_g-XA(5i0V389EsH1XT3A87lAKPeLVqiPyXfi~Y8f z;(ZZ+ec}HE>V@uu=0f*F<=yH4RO;w|LnlHzpmx0GJyzL24&dgL*F$;qfrmY?_$AOx z=y2#+&{F6*(3#M_(3Q|^sKiV8*zcuE_5ioee&!PVNxayPQ}GUgO1$rbioC<1QjV8F zMc!Pf)U(T>62G{acSZF*XMp=&K=Lft1^AQr2S6phi=gy9Ruu&-`vk>MS_jlVV^-{N zZGyKKSX78yPzu@u`dhmlRGt;wi;b@JP_fY!0b-|X%N*Jeu)oLKg8Qky$!q7KEjGIb zl+(9E3;eW2WU%)h?jeo{{1(tEz`YH;(|3AevrG0K9wh7vsPA0lgKhxw&7RX)Lh;UWhLre_2%a^u39L;fd|8QP3FJ1`Yu)4b}%DU@h1R4uQc` zmQt_+YzF&4-@Aw(1i*T*7f3_Q13pjz+{@K~tAR74flQ+9>GS`ZWjb6w{5QM*-^q;t+l68E#j;tz@_$r)okx1a)^{721?$Q**b zh7|86t-w2^mAcAudg*m`lV0T1>803qKRIiPb5j16it@PR*)R3rEbtk08GncLoU?Iw zS93K&ySNhbP4W&P&+b_szZ6P6%L0_!S=g403&rG>^OX9r=d1?d_i|qDvpwF=F8V;-PtPCyr>6cd zKCs~d-UHsiP4s8#xMj;F)PDCtyg0Yk1yCtg-cb|pOs2ke8E%*fH{67~%n{DiyDq~q zURCK`VZ!A(!kPM`>XpdklvApg)HU)Om-=?GBb+JkF2fBr;f9!SLmlBvxpXP#`|(FI zYA!y<82r8gMn>YQWWis{vO7t_EBU{IhC6-o+Q5 znf?FlbZ=S|YmB_-?*QJ-Ui_CC0NLjd`8>L`&WA|;&I6A#@bLCGa|CL;UT9%+O%1y~ zYa1IEoqC)m`&nchtM`v5&v%pYTVk(<8JMw7q}Fp;SF-+%bbTt_EVEx$J_4}M%j=)r zDGOyMUux_ud)8%8J}O(r&a!(@)?jmTitw-ZuG}eKLD(6Ih*S+Ry`M_v;u*^kE_MHp z?2Rdb|7GM#?*H%;E-JI&YF||uRPU=|Z+k4-Sm%#aikqYzfDUDx>fE4}E=!eO zgnOM=&J$!qTezu~a;=UA>q9C(OL6ao9%p%KgAG-6xK#yXK|Kc{b{Riz;+llaa{pCx zf4#YX%iK>f_X{pi^~jPr0rCH^xgTTPH=6t5+)Mqi_gft`^WaOeXuZ;_y%$?{lxi9MIt}ZqxQk5o9<2G& zK)8%(xUr5;zS>e`O3t8(RQ4V$74YOgiFqbF4a?N=f5WdN_b8A#yY|#Hn*8;_2EJEd zk8(tcROPu)ew=(I^6bT}t8W*iy)q|ZzCqv%3bV6b%IgP47ayUni7xEDldFxK6q}MW z2kN2iwG4EYPZQ2ZaHzdgqDhDwv| znSTAKuP$G7@SN#67j~v+k*yV43Zrz&4l5>mZ*{Jpb z1W>c|2f0A5CCr&gyJcxFF3(by^3>eo9)9a*o7x*;1-Pf`$bJNMv2>@_r|*Vd0_Ps+ z2X)Ez5T8$A`UsIL0HkXu z0CG_^)jBhIRrwkOm3)!Mxb*2VM=9~-1JjQxeFnJi1#G<*;g4H&7Mt|D#U@-UzfIq0 zNuL=2(ig1*a(VHW2^|I%{%|PssA^vpZfaka==XB?*FZ-?rRm6A=&jIE&;`(|pwhqK zSIp$7{aCWxI-dJ`pcA2=hkgM1Md)PcqtNT1cK%G?C^}JcI`cONeOovu;e-o5fHTr8U_be!Tt4^{3RF3fW`C77m-x)-o z3*Y5BJ{7R5wfy7oyE=c%xt2eGG**zdoW)h{XAPTsdu_jv-|1`n>+svv`hHyznWW%G zfv#-v))7}%Yx`^9i(TF}=oaF3uI+Ci&aG51du@L|e(bgV^mY9mgq3yu{m@P@U^Th} z0k8&a1|7h?Tn)Gy_{Y{jCgNXW#{V}@oilG{`Scmn#unrkUnO7H%U<3Kb7Wmsp7nB_ z2R?B7jBsVNv8k~-=FOWk(px%xCSCL2Upyj{d$}5LHQ;K%)qtx3R|BpFTn)Gya5dm+ zz}0}O0apWho$H;(|5tHlpL6`LX8=BXyT|H!4q&L2Ayd6p#3=U%SIF8Kv%B@7dRETV zTGyFKufwF*?ntjPvh0kdSH`@vT)Um=)kb?fy{n8q_n7p4W2fi$FOh8wrH#R=((uA) zFuH8o(p&UeVo&P#YLk9>hR*N7wDfNb#bzj@izRAl9SP2y4Eu}>zvxbe8^U#=nXLMs z0X>X2dIz}0}O0apXA23!re8gMn>YT#d81G4^qp;`Zz@Ak!3cvZJ+ z|L0gu3%efo_e323>Sf{P-_?Mt0apXA23!re8gMn>YQWWis{vO7t_EBUoGA^w)A;{% z*Zzm6t^H@^nYI5rE1P1C^$VNGgnUEV-CV(6n_h=e&RR!$to{4XRC@N>|8hG$+xT0k zXY*(8rNG{{y8dXd^|HcT7iu^ox*TQJ*u8e%NGrslcTpth$+ENaw%(+dVW)?6Ku!=l zBWY!tHS^=P9;>4vimXS|y4)Rx1_rOz85UNpoW|O$;N3 z&PZBi(s6K|mrScM(!+Jq*5wY9Ry>(jeQ;68R%MUo?@CjCljMV6uHr+DjKUST3Vv7sRk3cqwYJ({MS$3rH~ zt4~U^XVbImYHgO}#IkNqNskjY!^=Z@{g$l1w`qZD{P#eA@N7L=J@D zs!gONyASmd%fj!;{MmhQyGgSlEluZSFAH>U6)7;3*lAaMlqILkIm#IO_3-E zVpsR{yOEv#0PLm6)oH)`VU4S+^u(V^!W+Wlfz}F|R2U zZK?>?H`c|1cZ4g7IjOmhZR$-G%j?1mN7rNjE)=a;*c`5_vUpfZh_Yy74d&XsvVptF zo42%Z{K$&rK7*UXP0hhN@7!239fo&o!BzPcH&3lt7;dP*qd!<*HNK#t4#}^Q*dkR6 zPfv!5VlkknWUIPLLRZ#TS>7?z=FFKjXU?>;S#!!Kmd%+pqpaLJX4bs&iKmsnl(;dd z;2kr4=F~aUW=xw|UR3HGGjmqytQ%)}$IK|2IsJxdbIZNM6F=t_O`TX5S`w<8d_}Nn zdc%@N%H;}gbGWFolB3cmUr`<8{q>6B-Z9ur3s&gwnR92APVI zc;Z-6xpijIjOkOS6wQS@bN*EHQ-p%1&nPRM{$3KMf`~e%mQ0^HZQ}g#1(LtY+HgZ? z;!?ROE-h8{brj#2^j0>RTDQrWOdjg6=E*C=p7p{>^3I1>#vy-B-T-*|Ot7Rsv7waz zN~*u1@LGSLn#N`DI(p08Rx)g!#P`3cVMoK;(~`=&8eT*_gOXvdg{SQyC3#{CsclDU zx|r}$2l+YEy#ZeSv#I{X7)QK4l~)F@BaJr?USMCUzuVwNFcRfV15-wpwhxw+k0GJe z%0Y`xe_@F)m>RYLo<18Z8CK@y+Hz9$w-lZ}>niDQrTD|JlrxRH;q4io8unxGT6?AP z)=F63Ih?yw0?+kHhPr(m2!j3Ows~sbRkkOP{5X z%-a?Ti-9d?*k|DR{+t>X(Ui?5r@!yR)90imC$7+wputepOS z3QwO8n2c{fya2|voc>-Be`lrY`PcCD*?-BfzZG7ZzfO4iEY76AH{tF1Rcac4h8K7} zmG?Hhvd&aqriVJN&f`eN*9Ttvw^Q?W9=rgVapr?_!mLQ|)c6L$v(nnR*pSobq$SfB z4lkb8ey@Pn{>#+(I5W?jg_aCE7G6i1PRGM5qfngkeE?oOtq%F%bzYa6#x!_s9KPoa z%UOEXo)4wQH%r2DSfA5hx$x)!oV;7%Wh+~!NtyZ3&+6o0Kc~M+c=|lnq`z8tEop70 zUgD$UafangN-MiMm3Jq+vb6fL0$yucAF&Ev%eYioJ}O~%rpCwljaFcGDvxg1(r3CR zWqt@=q$1Vd=is$5kK&a1i}143`oxX!ylFB&0na*+D&N?wWmaXtw zPo#$3F1)ll{=F`EKZK|41t#O$4X?wSnvWOZ<i`)&{eLH!Rg3 z$Cz8$Q&V+H^|sp5o?8@;)%xAku!G@w+f#YN;FYEMyIgqZrpo+&iEm13y7}-rI2hBZ z=W+0?w0>Sq z?!UwH{vg%gwWPXW^yi?FaBW|0C7ke@fURsk}Y#((A@c@WfcDQ|6zE zzqEIn|AwdSp(b^35MCP(FK5`-;N^cJmG?V%`b^(s*gr^oeNy#z4Bno*Q^TGRURvAA zV2vxA19_e4o(-=oO@Dpib(W{*EeD>q$C{MoLU@6+KKs%x;`4UF8zH>yscBpZ&zIIW zjS=4ARGAClwOyaen*cA8R-dnfr_aPr$~+ZbOIjaR0?$f&9?gK~^QERS2i_h!Wcg>0 znQnpCk=CXw;H9^PAUu5@buw%g`@;w6YiC?Gkz67u3wp8Ai z;aSYJIrFv|o_Am>?5 z_0N0Z=`+kd*nb?KlxS$#m!3? zaT7mDx7_@E{7TrW9PJ({NxI8ePtwegG$R?-pFd7L<^NStZI@rdWqULauU3Y2)zmrV zx$~zM={RjSp$WI!Qr*1t9k$!_v~c<4J>ixX&c}q9?N*i+u8g(Wgj-s;z*$MR^0aUf z-Y4yFymCW(qxTOb`r0IyDiPFr7_`Fo*rjwBD&3CtQ3nksg(@j$^tX|gZ)Ghq9Uu7IGq+UdHxOP0?L%Rrn6*`XNSKQ$* zY$8pmW0?|{x0e+$vM|G^&VGoA^n%G3g`e4KQw7oNm`>H#^Q7Nu@UoIdiHh!Z2-lE1S=PG2uM zt6lu~uBxdHSE;;Tn`84x);i15F1gEexU(f(SuZ(@TZhZfudJ@o>DfF9ceZtvana$j zBwV1E6{g<$B)w=;v=V=kzjhOsgv+9S;gXv_R=Yi+^WYOd2{)ye@i~1YP96}u$vbgQ zxhfixEkN$&YQWWis{vO7t_EBUxEgRZa0WDBkMm^QC*wcsHYj5t=jG*%&mN)3SWU)k za(It*JJfOcf1H>1x2$fU5yl1Fi;K4Y(R`HQ;K%)qtx3R|BpF{^lBZ zo9mK3V_t7(t-AAE%UaN1)_5&zF>66WPcZJi2wGpHM)TIHS(<-jp{A?mX!_tSn!dPP z)9?&Um(}Va_QSdQ{`u?mS+6G;S4;fM&e!zKOEi5(?b)!bRX6GT3C4Yh+Ouj|FPnJB zA}gy#*2QY?fo07w;fjz~;`Jb}Oc~5rtkZubpyluF)9x?5Pt(~Zot-SsNw{a#eq+m8 z8P)esvqlBWdUJukA2L|eafYs9{zAeHK}kY)8vaiFvs`QqV=Yejqme`Cear+1oq_No z-|Idt-%E!7#8mD6kcnqD>zU&J$&jYAjT|dEbXdiMK80S4{29<;EA;(Srkq|gdh27{ zSE{|CmUXMq>oCe&BAo+gC zw2#HitI2)uCQY9-{Ap$S{#D9B%CWa8r|l8V4;#IVH1dW`dXHYJ{r55T^QpM@KhWsw zP4X@EbeL%e&s1vnl}1lb&(Zny%-8(4hHE<6)bH*2`hJ?p|4!pRa;oOPMm$oE7vHS! zrL$GklZZRi?i7G4UTT?RMa0 z+TTdy|3NY@@jYks@A-(nf6eei#{a9dbCrHTy9e*mbeySY!CTEe`a6sG`Wg3urXLuR zt=$h8`Xup5y3d>Vn?J1YN1FP!pi19AJw?;$hCc#5NVpR@n%0wFX)h0$=f%@e&3}~k zL{iq1tM&a5Q}6E`q3_3;@_jO>@8?kuCElGynyxhEKFpNk;^CSl>cwV92)Ad>tNT(O{)uGz`ArtP+ za(#cq$o-6Y4lFk5dW_tojb0awHSrt%%W-}Gy3xmdMjsEFcJ?~{MXw94(d}=XUr#M_ zgpQJPp2^q6v@=AtUNhxYZ{+cqa_VE!pKjXw0#mO?nEVVea-E?4WfD&xqu=@)bUMAw zb6|nVckn}+Uu5JQ8!-LNV9kHa)VF>{jv2U%ULP^~8EfQx%EXs5PUmxm3ICGOYsl#3 zDN{e+H0}?WdOIOs$2->4lP7X?`v{wS%^RZKx6^q^`a6xjjudHqzBX0!Up4vZZTgcF zrW~f3`tXS9cZL`}K1@0i-|MD5JYm}TgoQf&WhNdE{X{SPJ!jH1%X_I@+WkGWng|U#AU0R*(SZwCf?Up=x`HExxZ=R>1XO` z$ms7O^eOdi@m%fyfl^H$G3D`$NpGOZ=VBA@OSfx(M+hu>xzEIZvC+@-rrr0Rt=%t< zYWk9){fs`srXPKv()cs&{UM{zR|>RzN2sSt|3?1pcj)_(1GFAaAdl$%)`6Pe+tj1p zMvfxW-XAdOjlE0z3z_oqn0{TA%X`(lOWPgtPottOtQOnS?Fn*Xqg_w{@9 z{R1Z4Ge+)lrrdH2Ei!bTSNmT{`;qpzz|_Czs8342M$ZES`u+(M-%F-^ABbrFtwvwV z-ly+hpQCC06isKW)bv%-m3R-Ba(%#*>yzd^dWb2v$@B*z&wZ=4|B*%?ubBSq6~hl+ zt;^|Y`kxH^A2IFk`JfIrtxD6eCO;EQc^^S;@n2-8KUn(jkT&F+H)Xzs|YWE@3 zd%Rjflh2)Fbox)4=i(zq&Jm^_%p0!54I8KFQzpJ=%==E*#QWwn?S8=Mx3}HTR+w~S zn!aT8y$XHH^P27fPr@e&%VX-(0Kj4!_g1{|8ODWkz3< zP5cW6Xn!Y+oZD~F@db%b@-xinsoxZR|6;DDM@+drV&XYs%4dej_vkY1Z$?bhS4=&a zW|yNWzp*C1fknDqKQLVTf5xln;@fq;Mo>RRo{=X02Tl74&)59>f|_1js_Dzd-}9#3 zzK(ka;pX94N<#{Xy|@4#{+pXn#xr2dOMD@{A2>j^_2 zHT~lOQ?F*5_+AR>^hZ!WBG&<t{uFWsf-1EyTJoAxt1s`(F__nHN!Uc7AD(VIiG z`;kSOK4a>~kSY3pEc%r3?V~1No@=z;A6%^UwrZI6H^JoV6_ZZL@FyGp&lvp;H1+M- zfR_JJ1ji!n|KGV*6HLJ`TNn1J;-&y==VXRua}HICQx6cKO0@7>&+|l zs{^^8ZuEJdiNA>cm!hy{n{t1Wd`Y~|m23J4}0o-plm+-l8#)wH{M^d|B?c!%bPjXa}GxTj6Mo@e44 zXW}_w>gNJek3z=(;wl|azw1(FFJ!j-OVEXNqJp4o-D@}d$P~Rlqi%mH{PJI^lft8v* z<=1+B+35du{7d<)L~kPRQzjozn0oe{sn^dMd7fIR{f+#Hj_+l|KVtIx0OhCZ`)nf@ z_mcke)D!+&_nGjM4gX=IkCmj`7x$5-e)XQF!%Z{s=McZdGcQ}ySMV=#KVaI&5Gb!2 z)}!RFx5PvJ6+N6V`hDDldu@OYztX%{E%xgBCoa(RdBRIN(@pp{;fr2!jGpSR*X~EC zA5;bF1nCMrVxCvSNL0d)Ht|2>)AtAN(KKl4>C@)^Nt3_HCfotjF8dj|N0|QQ!S|VX zNl)?}GUYk0T=VOZSNIv8wbnUnGVhOnKhv6$Wue8p3$imZzf|zJH3GTLvTnS=;u{fP zUUr7{VCE>^H*%*8%k&Lf-Lcwd#jW^Pva@n?)_D3@)B12r)^kv_<>Ls~tSO##?N)An zcE+Rexc6?Hvh%Wi{k@(HA3ln#qIi~-xn_hf!+JI&%j+37%UG!!3w!Et{^ZMf`ip~mJ=cu;k=@tK;$I9s2`~L}>UdEGQ zJw%#qUMnlBq;$NV zZh5k-j7-a$bN@}B&d9b9%$I?DB~;bBSKXagvW2|R_F5SutTj_F@Xq)62&^t?OM^fz z$On@^381=I0YEdemV(uw1#AGDz!uOB_JM<-6C4L*-5LPAKx`Wnf?`kxDnJax!CJ5$ zYy@p!8`uT*f)2oEkk&DfnSrK(d}mz%e4rG}2UTDNSOeC9R;ij12RIClflMB5*}`*&9W`POe8*bKIU9bgaG4-SE&z~Y^! zFBk-JK|YuSN;nfuCpZqW=qLvOFBk=iK^dq3wIBxQ zEUk^84eSDYK?gVtj)6?xFS5a4kOvBY50rxWK)z#L0oH(ZU^CbXc7Q!#KR5)A0*hx^ zUyuv(!6Z-)0$?dv4O+kkunBAd?O-?92M&Txa2#au{xJY}!6;A&ia{Bu0JR_v)`In5 zBiIJ^f(~#P90QpH$Q#H51;7VN!F*5!B47nr1J;37uo-LxJHQ^W9~=TlfxKMx1%p5? z$On@^2`C2vPzRQR)u07z0Gq%T&<=Kkec&MI1jj)ZFEImv7mNahpcs^a3Q!ATAP&}o z^p&~m3U+`!U_Uqnjskh8 z_637LK9~ebKmgQ%rC>E^0UN+3um!Y(-C!R$2#$lSi^(S#1&To#r~tJf2E-1-TCg5$ z1Z`j&*ah|iu|0Jd90Qq*2eQFnkOvBY4^)8&SOM06b)Xe&23x@num|i1hrm%_F{bGY zazQ?r1WG_T2!J}U6s!g#@$o55DF9~=UFxNh|YgFr6G z2a`YvCpapCIn?O6*4fcV9pc5PiS-hVQ0A4T(6oO(<1}Z=;h=Dj*3)X{; zpbcyT9pErH1~R>rBgg{Q2ixq&2qN@H_F71LP0s!(+u=hnctdK5f^%W_e{@C@6;*qK8EN)ONzfO-|RbqIO)`KCR*VqY3|IN2NS$ z{+$WFw$WO%yeb?GRmPI>YkQUO^^svIa=->HuMOT@2jKG!TqdzDTdXuIf|PxVUp*S4P(pO%~C$J@0I z8mp_NZY1iew!dAoT=T~lIKyar$+*ekfJ|rEdCPy+#08%a34Vv227LdWNxrtNTeDoB z5|rd?o7C`|Ro)WuXnWI&FL_AtwXN%#C zzgSA%lebu?u8z3sZC&Vd9%_~gpSTiyeKteQ^5zCratXe+t6Z~u ziBX0fkG5Z5v)mMaqCB;&`*4Hl_Y&o%?U)+=lwhS~&~B^R_P@hT_isVlUE8sDxJ&=# zw-WB!mb7u7+E^88;wX};WLwuZHUnhrET2P`dyz-thhSd9R04gzi-@T1f!y_gv`p`t#K<;{c6HZ+qgAux?fGWX`A3q zx2qFnpzY;4-BSBpZ42MHr}eqET>5+f+t0EFI)Iq1Cv5}V;a1kj5nPTkoZ`^MyaxK} zdU^OK%2?Z0H{oyQ*gtIl(3d8jHQE+_bA$b~M_n;nE^Tu;>Bc)p%&y1Ue*E%jraNr1 z<<&NO<>Z>FyjO5k&<%CLnxE7 zYVQITEz{ieb4Q;~QP)TlY>N5ogR#omMA>QEz>4RW(;X!)XPlW<*KV6V%<)^PaZ27L ze0zm#gIVt9Sy10pW4$f<68;`u(t2Bdf4Dy4H^Vrq4A|ZgXp!V^y5%l*n%ja`d)RbWc6j z`aP6zODQ*G)b8`q2Vw2P!-4c18vI!rI|(-^LbRO@@; zQ(g^?CXPXbxnX+gG}s9lj0lPMLw#0;(&g0JQ01bzG5X(|gHd@{*>z|gzt6IgZA9X; z-Plu<;zs*X@?JsOs;vFh1k}8%;4SC4JDz#<5&TKMz0fJkq`7K8dH9jKV1lW*u5^SG ze-bXCKa+Pae2Ir!<=zZ!o=z{qW!K%7nNp|y99dn%;m4Ic3>zXjnD@t`y45B4+Ah5CW2j(Rq94^~FbQA1N%VnuyYV0 z2Zr*-w#;8CH32m=E(%M*NIarPcBxstX!}Wj+K1hKTJUnVl0)}GHvedXZ|g(1x7E}g z?LS=~+P%0}ntMVY+Py8|ZtFwy_p#SW$D68;OROtYK4c%$+4Qr#DA+|n9no$9+SJ)r zWU+KAwV_}{vTeKdWslL>Rt+zN3&Sxv_?+uP6K*ZK(QZ<&ni64TKhW8hI@yc@QpbEJ z!fa&^&)HT}Ww1dz*>TC<9QX{HG~Z5N+Or+k!aD6X)TH04+*BCqoN`lj$96x|U&7i? zz+}E{cQ1Ps&Snf4WAxw`+j;)jvWRLQS}$9b`@*n4%3*L(8LA}nE_)b|E9{q7*5*he ze_L$688}=*|9BH}cGV8^=u5lWe;0x8+=D0k@3sQjgD20TzjhzqYUROW&(kbsqH_*n9O_`EBplJJnvjGqF#vkUpuqy?SeLTMz6#d)xT^*Y4Yk z@bq!+-D~AOeg9ti-n~Ke+s^%aCEVM4`0DuW+{fqK!*{y-_hJ{YCkQzA@5$aixe5W> z#H_xTvyTW`3*uk{*bUl1D}8ZkE_;#qUBGkQ$Gz;y9t32MwTv}ZLyzMw`>+pzD(+jL zvS-`N?@mxgzq}2~i?~(G?-gJ#_w#wC4}vFqlymvL21GzU_tIBR;`g4535%ez|7rlg z55e0^_`cBnP}$d92+aaVK?(QLpYGsytAqzz!8-1}K=wb&zUQ^{k6Y;DWH0kRsJxrY z{^X^=2XcY*p|YR(F!U&N0DYV6KQ7~b9rvD`KnR)IVU_X%kvV&=31)!WT zvQJs|BX0!qULpI4We>6JLoNUv@Q%;d{l-4%iel<0kp0EEpqzM?F3@dO=5{wTmXkf6 zefeDgS{unHSYJrGp!8bg2BSdc1o94I{B8r*he+=>@(GyW*QvVk91gucMwI|vgdu3F0W zZt5HH1)yzUE!YQg?;&5)D05JO%z;AkHiq&i++o6v3K0&-ncpQBBj>%OfxiOc-+u!# z+=w5r>wf%+`^TsQU=S!=gU-Re`_L8lgUNd#$VA4$U_WVXWRTGb1}!0e5CQAKHn0y& zBENl+aV=?W0z1Hd;;bUQT~IG597&tWBOjpk3iJ%+&|~WuzpJh!E)d7hAn2jXiG$x; zM$&-y8AMm)|~q@8x$szn9{^1DZ{}>Kj4#U_WJY6v!xLE!YUQ0ogOSg8Ej`mvCTB zAM#s=eh5=H4t;{m@yH0)gATBZa#=SK_YV*c=m3S2kO{PbV_?)|(gGX7evo?|_h19q z1v0NkAGh)wWK(C$z<)Ad22eL^aX)l1yc+aHnQhBMF3O?~>ZLpeLDybM zKEO80rV8E)+?VpZma=OF#gwH53gG2&zZpM=pljjn1BZ#XFJUGTM=QVQgZ=oiK8l=R zK3D^`0ktRgUgQObxX*^le%=!3o=Zs|x`q2u(0xNFyN{u_HOK^AaX zE(L|~W8ANYW^tbfI{7`|E`ph;0nqS z-L0oTC=cPcns8tTXx)vhn>uGIlpE*bWuKQ}?P>K`k!v%owh>@2 zd3}*ML3|H>K;RH{FpU0(XQ(qS1B)qB&UtJbmcbwwdO7i5joStM9!$F+-nRdu9dK@8 zC%-#JqFWAvj7;G72jQQCU;2b>;wYm$yp)slf%%tYSb;SjE1z@yBK(d(JHehmc&va2 zzg7nIhR?8mgiME#X&?_k@==BiapZ4*gZuZ9262@A68TB9bEd~?yU}CqS%iN1;HeYc zWRs81>F9vCTaYoEdYZk2c(`vRPc733{}O4?=ld=~jyl@XMfedN;K$#5F zWzaIpsdbLW>L?{G^6f+B7G4bYpgYk)8|RRDac?DT0GXwah(r0djI)mkp9$q~%Y1au z_PEx4K;(qi0&StJ1LUp6!W~(>KOw)8hu@%AXy<=Y#wUoA-_n+(FZGeXwi_s)FOVO~ z$9FMh^C@IP*6c5$GYLoiYr|gv9m&1I^Moa@zT>1d3t5mSpRg_D*+QQ_$=BQDl{~Z% z#v*Qc7Iw}+XXWG%9dx44GGq#rkQQ|+?jdgKao|rL>xn-i&mF`?JMoS{e&msO;=PEI zwBzVZ@|KN$+DX^SmNlWbsX71nmwcbmau)5Jtn>y_TWo6E29$4!O0xLIpT0ocJs;IH z7}RvewdS5SBJNL_cwQll+&@W#LU)?`RXkJVelq1H^r3*JA@ncza#obkN2xPH`(-T9o&$!PvaxONso@b}Tv&zI%l&9}k(!Z+s`)XQm;(grse-1}+Z#J}#N#{td z=D&)YxR1V9(<40d zlVoTf%~m*exnr72NoRMNzAw76qw_F053mq5^`vzu&$0 zJagyC%+mtt{@?w-3`{4_{oQl!IrpCXeeQj3Gx>F$(fg%M8lO3$e{VJU{`{bRzSr2* zpNxI{eya|D=v@7Kph5rs$)vLq2~)1$zeoSxh^o!!mFMZ-_nUl(U7(-QoGJXC~k4?|nwjm4?quqj%KMf7$3Y_go$S43kf{ z8@svF==Tvr_hqBk0aMO5n{>}G{GT?@#h2;uhm3wDCLbQC(cupm`Wx%@^9GZD_n3BM zrl~)VoAggPU&p)C*m=!j{ru?7`giSI{d=29{}f}lPoJX0n-}WeHFf&;d1JTDram+n zx)LMr4^2MbW9q}BCcSZty_tV&O#aL?oCo`gl~o zSDAcz+~_-Q?B#JI{~GiA5aw2-yLm+a-e=0;_s8hxTTQwpH|poJO}+g@t$u#oe7z2TXr=zW>RA2zw9(@l zlkZz@*5O|^?Z7qX>gV%JxjwW(KR;mV&2@&~;;0V)m}$Sar1kTOM&Cz`T#uUiT43tM zh_S!hjh?5CXuA8%?*Y?JeEUWnzQ)MeW8~U!lMer(N%wJM7g1xkH=2CB&)CJ&CO_7! z&~#;{T<$dG@P30|XY6*Rk?VPr-r2J>-JPagSZwOoiCc7dkE!1yCVx)5(!@9RyWH@J znsj4^{yND&lV8X5Yr2514Ye z)5!OJlfN^iz1*tfpJDR(7^#mY-aTC!|GX);2TVKjfU(~-CSUF|_7^kHYfS$#ZtBH} z@6~*sH~DkB!B2U&4nJnL{=L(b`%5PLDx=TL3XMN%%44O;pRd>I@CVMf<=jj%5}4Y-eH#tkz-0s*LF zzzKq4A<{-_>Fd)+K~#KZrXfb4$T_nF%!4z6>7x;|sQ9R$vn>b+Daov zGswx|zmN)8k%L^Qc6Q7zoDo3aj&$0=AK>j==cJu<@CIi_+L;{;6eIR^ete(7_c?rNBgObGz?Z%OO~{#Tt<2|0 zmLJZk&YY5FVyO6q4&Dc!fMXO~Fwoq9Zca%Hu;R81)^B00q_ePILwFMCcsIv>g~6L* zEI}V|#cvJ5op$m|rg~DbzR0ll++bR5z|!k2tUrTMMyHclFWl9PpAmwX7G+FlFzTn$ z>OlB&DqPZvz1fpbcT&EH_BrLofuR&HZZK@qC-ib~!JTI0bEuOQ_Q>C86%R^xs2 z9V}A(O{!GFrDwb|z$ZMGRK8T`rr|A<8o-Zwj^mfEY77wHHN;goebu5!d+_QA+-Fpl zsyKZJGoB^t8ACj$feGM4nk#|ZLWpk|WOezjv-!sPDn#Q4HazIc0S|Q*Uv!|yy7;*8 zUW-{sMP&$zReU8~|E4D9wecf``%`>NA~raba?Uq?Qr%dmgP#>#VB%wmR3y;@XH4ZP zHP90q9#2G}%JJf(xc7R-6<+$BfcVUP5D|~@V8=PLN=Bfc<5aa)<8oPfE^wM^T40Ov zTar@19t7(b89A_wnF%E$qyQxv8x$83?q^}E(SR6#U7S(x^JM!FiG^y2i= zjF7kX7rGzq(`;uTHWBSt%Cn%U!#2oVQPHs>T*GqL&!LL;j@GuCYHBZWsw+A|m2h2@ z=lTldgN27Hs#{yYL+~{fl_4^qEv1ph*mz1@2oa~KI?@XBxe?LoXNe_&Q6R8;-W(cznYp4c>E=;iLSa-Sp?7Yj!dBtdGw31;<#J>%*I#9<#awD^dPE~}`op^?h-@`~D~P@S&ptQRXP zIvScSo4%x?6*WH-zr3QRleIwTSK_&&E#yA0s%Qz3Uh37GE2>(Xn`>G+EFPCu)K|4t zW#U{`QQc70(U4X5E>~fhI6+lktI;!OWT^!2@P>$+c9nY0(A2QL>ZZ$;rxtOlYjmLK zP{(*^H$>(JK0_@#t<{jH9U&5@Q9bKO!l$XCIn+^A@5<9$(bQn;-BM9iUsKiS@@Qo` zbshC~I&BrrHO-ce?G^1CT98-LfAD@R*Jj$;scJ`B=^u7{k8N#4yJ@47>5q*?^wF5e zSe&QslFspr%QW|6%p-pE@TgUB;hi}$HX7NK^qi*&f1i9eB}YxT_%rXcc__zkCnCPd z4~oySIw9pGq>tNS(a;myoNaK=^!!=T0nz@gxRzhb%ki4XD`(XNE3$Z+Ge7P*w!njw z9isuAQmWSQqYu?lPDP|uXG}XBmwN`I!HTkq3cm~t23H1GGXJDq`yl?F1OD0PoOJtx zEjNW_&LQb=>Oz{#`7|BA2YN8vWHZKXIy`=q2_F}KY#qJ`{e+6I&wRP@51R1Ic{v?F zjlP5NRsP{nnegvNf5Gs~IV$6ej6Qd| z+++m%!%rjs)!BhQ)~lkDd-05v)KHN;8Rs4qR*M5JI?h=LM-+XC0e?&Rr!Cu{m;8_# zM;o7U%QnneH&^d%;4v4edc&82AH#7Dpr;>kB%e56U^q^psd1wlj`A_#&?Xa~cWg4; zoLh7GOrU%io;fS2%ja1WuFHpKE_L`bC^zAcrV8P@eCS)ta8!6Brw;E&xvB7;O&Azv z;s;S~CjQt)i_fJfHx=F=RV6C?d3U4=AHac0^du6_zFdVTH^x|263%-eRk+DFmZ5t_ zM8(r*iFT=W%56?Am$qTjDyz+X@SPv&RrxICOuuVs10tK%NlJAl3ap)7Ha5)Dh%p=? z%-9I$c|vQ>V6Kq-r5zl{@-Tpe_rnetZqC!XhjMGnj68IqZYs<~*ev{uvW4=Tt>6`Tz=lGy`t@ zyRC3$p2S}Sdy;hR@FLigq|0#8?FJK`eGXRZb|GwvG^Ra98ro)`k?@2%Z|#P6z@}7u zlNslmyk3Oy+j0JVohv`@^*qjT?ad8OV+?nk)vt-ZY}1d2jHaJK|Et@QU8S6#$*eXr zKeOqI1y{DGb!NNnhI_{Iyo=Yx@{H%{6Y9pvGoGifz8l9gX6HS)F6J4tFF@J4m^ni) zo%MSV0 zAvzQ5Ru_?f8D;Am8y$!Zjwi6fhC#1hAz^z^R8odG8fBgqmGCZH_vDg3PUx2HrSq9L zNu2qOMuvK@*n&%l@IAl?` zk4Qaz2NEm6xiI@q2r2V@3ez$S$5J>pma!A|L6TN)Y|ypmdbBs-H?WlFd=s&WND9|u zpeL5Pvfqm*uNue25-v`Ec;Rbg<*)^~ZV!ji9(iz;FI=arL|$`+ALZlTZ^1I*dfnCf z&I>hOMAdNOsYHKlU_hNmwcFqm+|tVQVb#dLOt`f!f&9sY>xN9qk9X;2?sPGlKvFxc zH)QULal;oPEjJvcD0)AZ6)vTi$yb(RhAxwHLf?t11 zPt!$u5{}#-@XVq@=(ZkaTZNU>jYE1FqYIJjWum8HBGp##$A_Obsp1Q7fYnZdxqDHM{y5K8)ag8VJp3?7;xE< zv!eGaxz~;ksgtDrH4}YNHG{(}A%*qxrX_|Knq*h@ys;5S%KAHsZ-+YCkBN0SG1kZX zdio?U7FqnJ#KO{^%)!5+_@Lv;pJ+m4MAPBQ=tm(kepc~rOAVXMSv#uk=;#+2(Ivb5 zro_UMq~zf);nRfkv*Ynv9FS%kSTma9tvt?{lq>$W`Q?g@>w$G!_etSd)e}!)ExKxK zG=-fKb;g%`_Ga_)#LC>ouwV1(i6x_M*@ARTY-EqkCp*@J==TT3Lm5{%niv>MjP#85 zL85VpgsEXl^xI|e$`@Pe%dZtrx0ZB_Nrk|9Y{~ygi(jsoBHts5S3}Ym*;t}B+QU2x zbL@*F<6_N}=LSffZj0VUv6~=ti(I51mGx zCdu0wiVlP1_ASX&bfg14S18FP1pWnDDf{gfpM0^!woh_-a*Qz^Zx|gI!xr3#*kszn z%Z?>HmI)72=+qfxqr#&zn@3hG;ZbYz2=({FTsS|D3XkAa9&Rk*u|RkP2Njck19_W?;W+CVhxC6_whFXrJduFW zcMNfS*}!r0dal0Ch!Ta__}Nfpl4C*Ag8nd5!PP(FoE>C|<5Lw@B&`aT8-8c|D4louO_vR-qk zg-1sT_G65s^Wba6ns%UP(-_+1UdbD-QSpukecMH3G!==V(N4PKmc3_k{DAvk>@@X6 z2evt@gzu?13OmP}qX}HJlxXgmh>eVoU~dCh3ox~R8Ey(~sA_GgZK#X1SA|-d8d_>1 zt!>pcZ4E7Tk%pFznzp7;mEI5JoF$cCSCqHLbL*-xkFLn)StVh}Qs8uiBUPcMrpi!N zVOR1=6SB3i4sLHr0e$ z)`lZ>ZLMp=h{tho9P^HFRegvI_UT{4?=fZ4x{k{P`{wC99Y~LrZ%{sHKVtFn#(% zhTH2grq=qB9;%rFWWE+DJIZB6hzi>*DoI%R>W<3|f6AxiQFDl*l0hR+JL)_NUo2C} z5=ez4ZM)s%kAe#$50RwGL!QsK%hF_FWZlIc zdpAaQK6o#p4U)*VcN870s3}u|#-5OlDFU4@l$*SeG1QCsBx3S8j%QN@Xn*zGo&D&^ zx!Yg2|Cq1Z@CtRQlNuT{;m(%fWH5MfI8+~UoYkfeD195-V{Eup1tX;`Ey0$$aAS32 zxH{M|6s=gksb_c`KVt(G%WK-h70WmGBrBGWj-@J=#}il#P7DVjipwjA6$Y1AWo1jS zF5KMIvbw4^7^+y_hcQaU^3+(x@}7$2NnQ;WO;jxBEi(wk#JFPlP!G6?T-&>CUM<1e z+SZ1a=9bk#tPA#StXPh|X)LkDNYpo$NQ}p^@>H>+VqvHS-w;?iwMNHDn^$#Ru)cA1 zb5m1Om}05xw5Vtz#?H|&9LN2D70Y|0n72fOE+41IlBud0dDYO;+8D0#%G8tKm9Z7e zaYYl^8=gT|w{n|LWoxjmr6E+?(AXGUJGyZccMer7Z^JYRW95qFYI7Nx&%s@maxzxh zag^$dc}LpXQLMtH(Bne&Mj6NKz`4W%?6ERJt#(lg1~-H{!!@DK`rsALD&!Hzg8Oms zM&e;as1oF)l##($Xugz#p9;#8qZOdoT~}dYd@1-lkUbZ>C#}Go6yI zDq63QOc%*j8aa32jH|>~^NyaW1fjJ`U9{+}RUvfc)iuE&bzNb21aVeZcyQj4=xf4V zf)o~7hHCJQtZ&4>^<|Azv`W(6`+`clVqqk*sSnOyxSLI_ct&s=Qfy!gmUafmM=*|7 z*CqwmP;h2-Co@aR<8n2&&9mDd;hj;sJc?DGx_$tWWMo*4+n8tD6lOdGKqF)D@2h?L zNTe!~j7R%o18{HCOEd{5C2<^_lf~F=5Q~NV=8mseAM6xt-FIG z0DkJsv9t$ebgLKID`*@48RtKv{3peKV*F=>|3vvu#d7{z#eas}z&`%9 zk^gA8hJPm9f5zOuDwe58Y!O2Es#ZahtYwf&wTFN8@}FV;W2LI(84Ef;GP)eJ>TFp} zDA-cl*wRqDI-EnaU`or6ps*}hYm)jO`;y&7g#t10|ReM3Y&Mdkbv|*L4l`U0P z8>XkN70X*(+I1$)xJ_FX3O2M>w^UV!>w;+ZDpqolz-{U;tJx((9j(DaS+km9$6MOe)EsVZY^g=6)vaO|73>#T zM|hu&%d@<3bq&nCvC1Q%$Vy@07AyHQ-=;+e)>^;1GTdCL#w?k^3Jb9}imhGPvKq3m zeBt&Q#8`Gt$+eK8{;iZ@Tn!B(@v&rzH@V`&`QUZHF`wkn0F%SUsD~?y)ODH%^&kk(l<0U)zoo9&3W?mNLP^X%=IcP$T@42V876X3D!FkG$5I5Aua?o>J?tMOiFqKnL z4g(_tqgePP?NR8bF$dyQ*?xuxq<)q;5(60jx8O6}AKS#uIz9)~97#{;_?*(uYBr>v z!H4rp%EsqML0`94`-xJnB24nKSdH@0@@}7_@WE)R zIXY6wOK922v}3DTT}SNZ5AWmyAMFfEPu5MA&hW>W?+jp8!Da{B)2vaDPh_Z`=gMHu zOPs_q?ZQ-?5+o*pw_I2A)pal$h8 z4Ik~!m9W+4PH`A#x$xhHyIwFpuEHLwYPZnpx%_ub#YnrJw#v1Wdh|ayuHfqTHGro~ z;idJPfZcg8@^Wb}ggpUQGGJC`?!MNvcV{s7?(36GpEI;kwR4d~3TIn-dfc_%^r#hn zwSG4W)7v(d2~Sz^cP6ZG#Fsn{;*J~SkI1Drr;rDN^By9DyIZtKWMpP4zDnm}UmsYl5iV{@Fm-km2t znKPbj6|tSr{QldH*90F_vrADkvEH4B?M0=OaYz})T+L14#`?-Sj1gs`fnk!FtLTY? znuF>2f||>0c5yXr(vj3mEHmHI6B89ZGf^3I2^BXrt5WC|0-BGS;FM*atv^du=&~U0 z1BbrIK4;N@rAuXFaCLoCOQ>dbQ$`mx3))0NHHXTmb}_@2YL5I@MO2Bae;5>WWGr59 zrBm7(tZJ=qt!!?p47NoFTj8747~O&#)+8Yr6L;D)m6gFdidKzP01&CYZJbdV$CkR# zNm{(SUCO7lIauG+S|4ty4Uw#huY^HjIwcGZ9yIxowrI-gYl1bEHKDquT0OUJXY^M7 zqvnNbCaMy}RME`5Yxq}%$_<66a@@>7HR4^yzcLx7CeJF0$~0ZnidfA@)I3$0gDP7U zQI)s)Yk<5|$?Npip*SnvX7nh=XjF7BtE>ywget?8O-&q8heBcglVPdS9%qh{e^qcbh93+GQHf*L- zwJuV*wxOw-W2H!AOY8a;(sN9G8Sv9iY^sf{tJR0&tnkwr&SQ0vrV!7{EJ6GWF{Ya5 z@bJ^RSadUY%~!3eg74Z`L-ndv4S0{nL}e@mKZ?{)CjOkf@khq`Gtpgn=A49d8>&sJ zTFwf{iD_Rd*1lyV*-}}`0~_4`%PCJ{ESYSFFK@J=f7PlczTlw2PDkjD^~#k+*U+z6 zSn{nh>CH$Z@w6uovS=|xN~Ef+AXnBI>6c$V-Zxz%Z*xx)U9Uxl^U~M)rl}R4LU*Y2 zu$^j>L~>}abe_IE%P%d^nEWLT?I?uuX(@o6g_^5ZEQ_>NhBM)JZOsYn7o$D|S+_ZaD~V zq5f!-dQn4Yw4V>H`eje_QLG1Tx9ZnMlJWjtcAk)PPRVM7?}p7E<*0BaJ9RB#oeH%z zN7^ny-#@3M5nQFrJh?Sj$VAlZ6JEKz*ALc4|qxo&~ozwW5lt@K%IlnRs2K zs#+!k00e`|OOb+6tx{#VHfsvj;L1=eSaUEvUEFYGW0~-0 zB|gf7GhfQf{9ZB6GHPmStEoft)~3!eik+$aCD5Xd{HnA`gSKrQgsO{RS3=Te_(_>? zSa2qdQyJb~-&|AO5Q?;wu}IwX7i44Qf~^5Rm0#`aJ0hH{m$lb7m1#O+MT*W~OEVbd z*kSXmZG#)8rfUZ_BOQAG(gJiEct^>mvND>D(o19aeXL9{SQPU?hqsiu;g^&u*>(7b zmRRA{(RfC$y|XNxtJ+jL%yUgwy}MM>Szd}&Zd(RRK7^BIZI;|4@lEThl;o6eJu&iv zUqfdk9OB7JwjB(2X7u%9#)XDRhiyREY^SCwvaT!w3dGav8SPhKEec!kl!JS~Da31N z4%O8}uy@O&v+$gtm2v%H3otByB>LzV7frN|r*!z=XNRkK75SeDo}sF$n)Y@G*xsnt zAZ|n4`o@|KOpkMj50Tac2n}+t0e)=CF^X{z#cARS&DwS)<9!IwGV)D3MoPq?Z@^nz zjP5;=>IPPz);5(M_4^{z8yH0vs1afnwqknu_A_En5vy(KXs%|J18+FRP)=fha_Q7O zwhBwk>IFK?7wQR_uliR_J%r`qLS-8H-2?%yA_xGFJ#7L-`Mc@$SBr0Ny$7aBk$Ulme!6MW?*weyFMSx zbPNsBDO(}yVM_nz*6OwD&H){#qe0q;qLMFbeyFc&*4DIb$nwp2^E~V~huW}0S*7xo zWzd55mU$QirpuUzg0jn*_Qbew_gIG?rO%rfU&{@0^8!KdNiY5ncxjlX80##lm8Lz!2)K*ommRt2I9p{-vB|p{j zC{HIWOS-tcSBh~y4co!VX;^loGSuFH6<-Wp;X_4}pP{8Z%S2`dOrhf^f@#GW?wMK0?q|NC)0LxbD(2{1>FnZc5y8>`?t? z?zTvD+eG?-(OO&upw~^ZXTdVRklyPHiL(Ex@_CXH5$*%!3{|MXF*m~JB)9RoSiDh z8qXUYEVhLEd#kb4Eo-1Wmt%$3CdNh@uv&~JIE~-yM;qj?Ui@jE^2Aw+^?ox~-P)g-mzP$q4%TD)roOtiRrcxPd_5y~6wRh8 zcNx`e7uUDf8Xh}s9@v|#t*L8mXbo2et9ry2$aMtLE|{;~ajDwfloCKk;25tZ9~ zD#O9ny2`4i1~~Ajg3PhQo7r$yStDf}$gD%RjE|`PJBi|H72L_-up{8rybUUY$1}LB zV|VaHT|!?v6{jl?+J!kK_oDuEs{B-T8cihB>jhz>bJTuLpqO(Ig(<=G61yT-akv*n zf4AIm*1LAP2zBl>w=O7Fiiz0i!?|%aRufx~!y9hNb4dp@?$ZiHwf%U28g>{nzGBCxvw0 zBtAbm=p~)>Z?!Jj?+8SDj~huK2Fia{$>(7|1&(_xh)0ZKqvO$bx#)&{>6d9^?V)uw z5j_MTEyKTv@U<-syZ{CpoOJZo`-NXcc(|=YZ7i!zUNuAyhd2Yokhfjvzs`8@2a7aS zw`p&A-M3;`rhI@y)K(Kh_sV|yM@A0H#Xf5vpVzjmZ)mBG)FVv}f@E<{^-JhK!kjl6=Tn9~ z1{y=c{7`-N&&bE@Uq@=!wy5zo(x9CCiPd35t@fB)^;P;TlZ+0yCnwz6-e3k^92fm6 zlU9~^k~iG5<=#m++zww@{c5BrHfbma4{4mwx?LKe=kRl}ZeNXzrOxlp0;1@t0 z%eHCSovwpv)Qzcl#^%NEgZC_;&9myNdhaDB9V7AKD82riar!o#h4io>kSi|6QyM=E zUXV}M{dD$ybJA2uD}(Fnb-eH&vf3d}yc*29opIsmNSnp8d#*;p(wSgiz%t?);G-NE zom<`8a5+f=y$9`nPRRk}eE|0es5s`Zp~N7M)4?O4{2pu`>XI)WCqa9HF&oRa1518Q z@bhkpWGu-{cis9UPVz{bcF25IzT%hz(tgRO$&V4@b4;DWFWoI@JCrYzU>FX@y0sy{ z^C=fr-donSHenJ&SA5-YpoU01%E3Ia?J+>Q984K^Au&^V#Qr!oJrj17$Xyn|w4Lsg zc>3N!yPttw={UpaEEKQ&cN4mH&-bZWaXt1z9~;e+J`nliDZ2tsJx&gyuRPP~(}zzZ zc#kX(m7#{{Q>dBoG|#4I;$hygDK<8q%tRDB-F3X`_go8AM~o27ypnc;wy_#{+7#wY zRNtG%cBhVEp*E};v83QQgfeH`dW2_UX4(L@5og(Tn*+a0I;t)riu&N4vQwRBBLirz z9GrcftLAWw=o3%1+3O%n-P%xFbyaOd`6@-+rW1Li^PX}olzzKUjSa+CSINY&L0s?u zPVwhe0|U4{N&AH%nDn8|jc&Z$X+!t9C2%NEAHRHNd&@cXVd#!L*L!qiI@>MdfmlCQlk}0g z%sJ5Veu#Lm_qi%g ze!X?R>_BblZxsi~$&bod5LW+L{=ZVqv@WH)#Af6kouZs1k2( zNd@xd(EN0pK{*$RoH_aFJS;VJ9Jz-T51y#z@r6ye@P%(g*FKh*z`%@g;YUhi}5=`ijW%woXn1=TSIw@uoo@+137!YmTtt4tnr zqb{BQ3UyI@;*C%ApIuC3MfNM1&@tMWg*#^HH(w!DW(0A6sfy z9W@_Jv(B}vS(>}4!1iR}$?)UC5=2J>-QKE(dy+}c{1dS_u62U^oO7K&HBKmz=-I-2 zWZPBe;)=dL7R3SZzM(BPBN^lD0nG(D%FN9U;1V~8@^$0p&IY$HDOY3PNW5CxHP*AS z`qP#xJUcvs$~r7G#j1?lG$Qm@ zQSBw(>zAo-N!ZgUZ-HdD#^y){YOxXRzUj^>g2z~NJ$+Y=#}b$>nAQRn5dIEs+(|o) zM07aH+s{35Wz8gx_x)w$$(SD+8n<0^@GeI;PF6lMR;Dl5hWFvQ@zBJMAbTTGxsfI^ zps%EHVq(WmuK4<(AM(Pj34JIFyi!Q#-=v)nl19$}$|ajb>SD32pTy7B!4Y}FhmMP) z;y@@PPiZb4*h;6=Jq3}T6x`E?GIK)I8sB06kNDm&By)(QN^9&P?)v`=DF%{mI9iQ_i z6RzSjKN*+r@mBM6=7(7JDE2cpWy}#~$-PqdUR$ZBRs}`2Qy{ zDm;w%{8;k3;U0O_*sC4!bEK`tZZ?*q{ZR97HW)=l-#9k>Ou?%Q*p@=hwd8;J`Jv|3 z+@pzv8jj*ziHWZuE{RL9wd za?FlHP2fr{Rtz31Ox*1#iwm7@n_+h3j63}(ee)%aU9hd(X&B45(&)z=HcuKlvL_Ak z|K~f%GihY>6#st*<9ds)M96T{#|eWXk8pkzA6@T}?%WcFd+U*ePnBQCpDMo&pDMo&_sY*Uow5Y&dgN(O zbXQ1w({W4fvA>DymLxhxuBJ;{8&>zsnDZ=|4k**6+PK|^pjt|Qvn^j74BbuN;qvRY z<7W34?%h-I9C1udQFn;5t*_SOkYseo^s$`Z;Ps^<(+!r$7 z#qH}?YhHRPjJ=b{Xb%oLZB~;GB<1$Q;mp{_3_VT6=;)?cVr*2c!h%57kJe3zkBciY z&N4H4b&nQx>C*8M(Lvm?g-+eX8ZdXVxp~*C<3%T;edDR9MAORyGCmv9aoE_&pe`ok zo>3c%U^s;{WM1WDRK5Zy z4(8w&9ew5exaLD2E&ah=K^*j}(?zT|vq}cg#s<;jQ|J+WagzufNe;yZIOdRbwZm%@ z=PF;7!)X(_XMk?onNV%5S}TzOIaVB!s)acRabl3MUd6#`1ujrC3kJHrnaaJy#Oux# z&oV|?-Q!qiJNJ_Gf>)NaA+e1}(_mSSZF%XS2iKgbk7?a|$Hs=$80#wVLIRlH>Nsl5 zB~4Qn9ZNxxDY`MrUxu(qe|?!`HFI{tJEx$=NXh~(3=b1mB3>mz7?wa%&Ithm{E z$+Zu6EMJWCx5!WFb6tDhuEKj#Rx{_)^rJnz$dRE5>x}NNWE`sOJeeBrjbNuIqI&#H zjv@;se%g!?bHukLR`-Rl|B^AuA>wC7C}`?rjYP&MIcPmr@1%rA#<2Nm#PXe#j5*Ah zRo8Vl5AqLTxxc{jIMmv_)UBO}TPkgd%YRB9XX*>u0?9FoS>+pRx*mqwm+ zJY}ivlXqkvMtr+0-MUAgt*Nwrd93GDpHcm|tVEd0bt6OA3y#pk-5sL`%-R*3M0K(U zckrrcIKCotli)mS%~0)D3}LpRUnyWVK-@9=q#YMx;u>QNm@piP$K83xuB;$W_ITMf$VcX z47xHihVhgc($_Y}yW<&0)#uEbq}#ss!>(LBcbU5F>vMM8OzTDqQ0=S8)rE0{%hOZ# z(x=V9*ujl+h%%LSfbR)$X?)6#^Cae}{obvJej&=RV8y75ywfu_5|3aDEQ)cEi(vsJ zgYjx#3oEiQ{Z1&Cj%#wl6TY?3${A+6PgywjA~xkp+Q_;p67)7PK(BjojoVpoid5rJvDBfoT``8@*+F^Ek!TG*NsbOZhZou zXDYSq@vQjRYs|N^hI|ouCbDR9+{A|IfXK65#l1EwVY7OpP^$?RnXlza$`~1aNgqDhG$hv$}4Qg$-7$Q;K-WR@55RiRr4h513FBJD00u!VeT8V z#7`t`r^j}R1%e$v!MEnZk*^|erx!P?X7;!k(bbpLs{|6t7WoR6V*NxW!bJ}k=IMP zemkXEJk%=Exa8-AjTzqqtY_NqYs6I_`W|-D{j z%!BRu;-LIQ|AQ*dwQi-)(Uz!pz>weTpVxEX^&EIT2mWu$ftT^wd`wvZ+fFQ{y>FKD zfwy5f%9+3->K&bq!+Apdl#IlfmN++J3{~Lt-z1?gzpVcvFa9OZI`mj)9^&&;jxW=3 z79Hfj>Ql9UZTp8=C#%;`ev1hXD>fu=L;t{OkM-yGW6|w}c z5A9OtJ=J5`61)z?nI<+`CXqk4K3I@q2Icv@GC?wG^e=&*-z!wZOHGlO)!qM9;GB%{ zX}}3{cwv2xbLL|n#LrV$(`4L9l!YmtSC~3W$0`f>zF~?uv0~YhvED1Ela&%z$+-8I z15SUXvKhqZ z1m|wkHWp#6ndP_Zj%m^fGrDNXgaf*VM{DsSGE|O`Wz~ zQQ(vYv`$dXY1w`6>BJo8LN$(y%pabylYn6nTp-f9Txs0@EtV{8k1x~6; z>ogm6Y5$o;*J$)4=Tfsro<^ObPLrwW(`gv<+iB6sW#sDQOhU}x!iSHxhixvW_V%ZK zrO}g}8yJ935Wj50_ts8ReHy%4t;M`{ooq%*RM;LqKY))8&l*A}jCh>JPdsq1M&~;_ zjZQlNP^aSQ>X-B@>8C>_uKy@Ll$muY{6)w44pug(51MM{q0et_CdM0I`%MouY07Bd z^y$Mf(rX?M4XPmt+2{|;XYvbp5g&f354J9yNB{lfrc_RK<}(66_+|O*ubDQRQ)@TV zp;3mBl9Zx4`&Z#iU{vdLyi-%~{MhJi8hxYl)O`KdqSJI6zJI#@_JkcEQ}-($~yX=u81Qm;LJ?HXm+C^1zTv2FgQ8LyV0 zj0QjWg6WA)a~?C}JFdsGJj3TslijJ&9sHB0K_zqNj^aeEDCaJ;W0%3_fn|hd+(|W` z1S{m{bY}(&2A^__A^7Lkf1DKN>u8Urq9Y>ATxD(1MTjb^Ndb! za=5R@Pr%G80(H}*lOCFtub7VMl7|=NrCxl0GYu|K9O#}0y)vIOoQK&_<@q#>@FuQR z@(#!)^qj>w2{#!HCVEB!+=@yD7EP3|IIn9xoSeosCj*VKRI;nAv2OJTmGBc>yC z!#lxhpbK?875d!p*yF|+&vCY^9XPDf0iOqK+pRBAW%Zf1GQ+n7bexw}3N1_~Y=nU@uN2alX>@-Eb!%yns0z5w*edtX5 z;Iqj2nn%ZA^a$804z?$H;;|#8C3T$qT>*S&P>vW&oTjXn`tfs~v!4<08N!#H$pqF` z{)GYfOq;Euxkq&zOdcU6sY1BCP_>uT(JZnk9q46pzemT;I}bXK8g$xp^xQOdq>PrT zl;X}YOtnB&}WEG&2UCEiFD z{%~ZJR4QORz_AW>JPSHjed{b1D?S%FrAEgI{Hk(XIsN6RE*t6_7(6l>vadX#?oHBj zw{Z7DXtrVXci*m5gm*IiANlFVFUxV~k*JUA1*}K3C=b!@lsR`PEi>&-=d$UySMHu4 z!J<@U$@_q0+;a|e%FIEQy6ca$TbAY4vgy~+zJBP)*(};j_>-Lt9at~V#c%rI!7K2C z&&94^1KcE#C-{75`t{Uz6Gc<{z}1n_l(O?~BB`5;@chvWKKKw-!qvjg9HkuY7sV6* z+<)8j>*-#EbYxVd+-crpBsO~<<|7%KUG6+)bli#Y57!L>;|(Tc`o^(XAg?J?(S|)?@HdG#_ubYUm8?&_Cjasy6Bkc*EMrY zCE;#8Ot+paGM-zPb&@4`zO=|p$1qFVTZ{mFiqVl$&!?Q}*OP8MvDB6$Xt&sZ#o0w! zm%RvjyrpZ=�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 I|4|P7AJZaCr2qf` diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.exp b/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.exp deleted file mode 100644 index ce526df3c63afeb07e1094f4e43cfb3285b9604e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9446 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 N{ck>@{-m?~=U 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 diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.lib b/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.lib deleted file mode 100644 index 1800b2e7fe7ba81b777643cb660a4b631e849fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16334 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 R8T&0TXIB_YJ|1&0{{w~#&%FQu diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/bin/zlib.dll b/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/bin/zlib.dll deleted file mode 100644 index eac1b2767ef35c65eb4e5517ddb66d417b3e5029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86528 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�l_48hDfAvp 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 i{J{9g_~G%<@rTD-j$C!*GWbM^NX{0Y9<>MUw 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 M|K=m=fBJg*Z#Ho?L;wH) diff --git a/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.lib b/third_party/ZLIB-Windows/zlib-1.2.11_deploy_v140/release_dynamic/x64/lib/zlib.lib deleted file mode 100644 index dbfc51d4119c63ce2c4a9a40c4435504eeb814b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16228 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 IbyL&-06+$!$N&HU diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.dll b/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.dll deleted file mode 100644 index 8b50a01da4daff1d669e5ccd52ce5d7cc9327f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205824 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 z¨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 wrA1{$!m=VD5OYI%~oT9f1(Bc3l+&Cod5s; diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.pdb b/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/bin/zlibd.pdb deleted file mode 100644 index d29e60715916041ffb1342eb07153c9fa660c119..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 782336 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 GIPTGMGUz& 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Г{d6Q3Tac}VU&HsM$aaBJ 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 L?>TF?TGsy$VH@@b diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.lib b/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/debug_dynamic/x64/lib/zlibd.lib deleted file mode 100644 index d5f04ff5121ba506a60db69ea9b692e655587c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16334 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 TF2@q~TVT#EGnRZj=3xE@l(YZ_ diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zlib.h b/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zlib.h deleted file mode 100644 index ef6b995f..00000000 --- a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/include/zlib.h +++ /dev/null @@ -1,1913 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 - - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#define ZLIB_WINAPI -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 -#define ZLIB_VER_SUBREVISION 0 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed data. - This version of the library supports only one compression method (deflation) - but other algorithms will be added later and will have the same stream - interface. - - Compression can be done in a single step if the buffers are large enough, - or can be done by repeated calls of the compression function. In the latter - case, the application must provide more input and/or consume the output - (providing more output space) before each call. - - 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 and raw deflate 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. - - 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 the case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - z_const Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total number of input bytes read so far */ - - Bytef *next_out; /* next output byte will go here */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total number of bytes output so far */ - - z_const char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text - for deflate, or the decoding state for inflate */ - uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. In that case, zlib is thread-safe. When zalloc and zfree are - Z_NULL on entry to the initialization function, they are set to internal - routines that use the standard library functions malloc() and free(). - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this if - the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers - returned by zalloc for objects of exactly 65536 bytes *must* have their - offset normalized to zero. The default allocation function provided by this - library ensures this (see zutil.c). To reduce memory requirements and avoid - any allocation of 64K objects, at the expense of compression ratio, compile - the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use by the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -#define Z_TREES 6 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field for deflate() */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is not - compatible with the zlib.h header file used by the application. This check - is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. If - zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at all - (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION - requests a default compromise between speed and compression (currently - equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if level is not a valid compression level, or - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). msg is set to null - if there is no error message. deflateInit does not perform any compression: - this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Generate more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary. Some output may be provided even if - flush is zero. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating avail_in or avail_out accordingly; avail_out should - never be zero before the call. The application can consume the compressed - output when it wants, for example when the output buffer is full (avail_out - == 0), or after each call of deflate(). If deflate returns Z_OK and with - zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput - in that case. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumulate before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, 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. This - completes the current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed by four bytes - (00 00 ff ff). - - If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the - output buffer, but the output is not aligned to a byte boundary. All of the - input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. - This completes the current deflate block and follows it with an empty fixed - codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed - codes block. - - If flush is set to Z_BLOCK, a deflate block is completed and emitted, as - for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to - seven bits of the current block are held to be written as the next byte after - the next deflate block is completed. In this case, the decompressor may not - be provided enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait for the next - block to be emitted. This is for advanced applications that need to control - the emission of deflate blocks. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_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 Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this - function must be called again with Z_FINISH and more output space (updated - avail_out) but no more input data, until it returns with Z_STREAM_END or an - error. After deflate has returned Z_STREAM_END, the only possible operations - on the stream are deflateReset or deflateEnd. - - Z_FINISH can be used in the first deflate call after deflateInit if all the - compression is to be done in a single step. In order to complete in one - call, avail_out must be at least the value returned by deflateBound (see - below). Then deflate is guaranteed to return Z_STREAM_END. If not enough - output space is provided, deflate will not return Z_STREAM_END, and it must - be called again as described above. - - deflate() sets strm->adler to the Adler-32 checksum of all input read - so far (that is, total_in bytes). If a gzip stream is being generated, then - strm->adler will be the CRC-32 checksum of the input read so far. (See - deflateInit2 below.) - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is - considered binary. This field is only for information purposes and does not - affect the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL or the state was inadvertently written over - by the application), or Z_BUF_ERROR if no progress is possible (for example - avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and - deflate() can be called again with more input and more output space to - continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, msg - may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. In the current version of inflate, the provided input is not - read or consumed. The allocation of a sliding window will be deferred to - the first call of inflate (if the decompression does not complete on the - first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression. - Actual decompression will be done by inflate(). So next_in, and avail_in, - next_out, and avail_out are unused and unchanged. The current - implementation of inflateInit() does not process any header information -- - that is deferred until inflate() is called. -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), then next_in and avail_in are updated - accordingly, and processing will resume at this point for the next call of - inflate(). - - - Generate more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there is - no more input data or no more space in the output buffer (see below about - the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. If the - caller of inflate() does not provide both available input and available - output space, it is possible that there will be no progress made. The - application can consume the uncompressed output when it wants, for example - when the output buffer is full (avail_out == 0), or after each call of - inflate(). If inflate returns Z_OK and with zero avail_out, it must be - called again after making room in the output buffer because there might be - more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, - Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() - stop if and when it gets 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. - - The Z_BLOCK option assists in appending to or combining deflate streams. - To assist in this, on return inflate() always sets strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if - inflate() is currently decoding the last block in the deflate stream, plus - 128 if inflate() returned immediately after decoding an end-of-block code or - decoding the complete header up to just before the first byte of the deflate - stream. The end-of-block will not be indicated until all of the uncompressed - data from that block has been written to strm->next_out. The number of - unused bits may in general be greater than seven, except when bit 7 of - data_type is set, in which case the number of unused bits will be less than - eight. data_type is set as noted here every time inflate() returns for all - flush options, and so can be used to determine the amount of currently - consumed input in bits. - - The Z_TREES option behaves as Z_BLOCK does, but it also returns when the - end of each deflate block header is reached, before any actual data in that - block is decoded. This allows the caller to determine the length of the - deflate block header for later use in random access within a deflate block. - 256 is added to the value of strm->data_type when inflate() returns - immediately after reaching the end of the deflate block header. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step (a - single call of inflate), the parameter flush should be set to Z_FINISH. In - this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all of the uncompressed data for the - operation to complete. (The size of the uncompressed data may have been - saved by the compressor for this purpose.) The use of Z_FINISH is not - required to perform an inflation in one step. However it may be used to - inform inflate that a faster approach can be used for the single inflate() - call. Z_FINISH also informs inflate to not maintain a sliding window if the - stream completes, which reduces inflate's memory footprint. If the stream - does not complete, either because not all of the stream is provided or not - enough output space is provided, then a sliding window will be allocated and - inflate() can be called again to continue the operation as if Z_NO_FLUSH had - been used. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the effects of the flush parameter in this implementation are - on the return value of inflate() as noted below, when inflate() returns early - when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of - memory for a sliding window when Z_FINISH is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the Adler-32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the Adler-32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed Adler-32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() can decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically, if requested when - initializing with inflateInit2(). Any information contained in the gzip - header is not retained unless inflateGetHeader() is used. When processing - gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output - produced so far. The CRC-32 is checked against the gzip trailer, as is the - uncompressed length, modulo 2^32. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value, in which case strm->msg points to a string with a more specific - error), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL, or the state was inadvertently written over - by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR - if no progress was possible or if there was not enough room in the output - buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may - then call inflateSync() to look for a good compression block if a partial - recovery of the data is to be attempted. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state - was inconsistent. -*/ - - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - For the current implementation of deflate(), a windowBits value of 8 (a - window size of 256 bytes) is not supported. As a result, a request for 8 - will result in 9 (a 512-byte window). In that case, providing 8 to - inflateInit2() will result in an error when the zlib header with 9 is - checked against the initialization of inflate(). The remedy is to not use 8 - with deflateInit2() with this initialization, or at least in that case use 9 - with inflateInit2(). - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute a check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 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 the appropriate value, - if the operating system was determined at compile time. If a gzip stream is - being written, strm->adler is a CRC-32 instead of an Adler-32. - - For raw deflate or gzip encoding, a request for a 256-byte window is - rejected as invalid, since only the zlib header provides a means of - transmitting the window size to the decompressor. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but is - slow and reduces compression ratio; memLevel=9 uses maximum memory for - optimal speed. The default value is 8. See zconf.h for total memory usage - as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid - method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is - incompatible with the version assumed by the caller (ZLIB_VERSION). msg is - set to null if there is no error message. deflateInit2 does not perform any - compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. When using the zlib format, this - function must be called immediately after deflateInit, deflateInit2 or - deflateReset, and before any call of deflate. When doing raw deflate, this - function must be called either before any call of deflate, or immediately - after the completion of a deflate block, i.e. after all input has been - consumed and all output has been delivered when using any of the flush - options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The - compressor and decompressor must use exactly the same dictionary (see - inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size - provided in deflateInit or deflateInit2. Thus the strings most likely to be - useful should be put at the end of the dictionary, not at the front. In - addition, the current implementation of deflate will use at most the window - size minus 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the Adler-32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The Adler-32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - Adler-32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if not at a block boundary for raw deflate). deflateSetDictionary does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); -/* - Returns the sliding dictionary being maintained by deflate. dictLength is - set to the number of bytes in the dictionary, and that many bytes are copied - to dictionary. dictionary must have enough space, where 32768 bytes is - always enough. If deflateGetDictionary() is called with dictionary equal to - Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. - - deflateGetDictionary() may return a length less than the window size, even - when more than the window size in input has been provided. It may return up - to 258 bytes less in that case, due to how zlib's implementation of deflate - manages the sliding window and lookahead for matches, where matches can be - up to 258 bytes long. If the application needs the last window-size bytes of - input, then that would need to be saved by the application outside of zlib. - - deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the - stream state is inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and can - consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, but - does not free and reallocate the internal compression state. The stream - will leave the compression level and any other attributes that may have been - set unchanged. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2(). This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). - - If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does - not have enough output space to complete, then the parameter change will not - take effect. In this case, deflateParams() can be called again with the - same parameters and more output space to try again. - - In order to assure a change in the parameters on the first try, the - deflate stream should be flushed using deflate() with Z_BLOCK or other flush - request until strm.avail_out is not zero, before calling deflateParams(). - Then no more input data should be provided before the deflateParams() call. - If this is done, the old level and strategy will be applied to the data - compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). - - deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream - state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if - there was not enough output space to complete the compression of the - available input data before a change in the strategy or approach. Note that - in the case of a Z_BUF_ERROR, the parameters are not changed. A return - value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be - retried with more output space. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() or - deflateInit2(), and after deflateSetHeader(), if used. This would be used - to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). If that first deflate() call is provided the - sourceLen input bytes, an output buffer allocated to the size returned by - deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed - to return Z_STREAM_END. Note that it is possible for the compressed size to - be larger than the value returned by deflateBound() if flush options other - than Z_FINISH or Z_NO_FLUSH are used. -*/ - -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); -/* - deflatePending() returns the number of bytes and bits of output that have - been generated, but not yet provided in the available output. The bytes not - provided would be due to the available output space having being consumed. - The number of bits of output not provided are between 0 and 7, where they - await more bits to join them in order to fill out a full byte. If pending - or bits are Z_NULL, then those values are not set. - - deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. - */ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the bits - leftover from a previous deflate stream when appending to it. As such, this - function can only be used for raw deflate, and must be used before the first - deflate() call after a deflateInit2() or deflateReset(). bits must be less - than or equal to 16, and that many of the least significant bits of value - will be inserted in the output. - - deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough - room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be zero to request that inflate use the window size in - the zlib header of the compressed stream. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an Adler-32 or a CRC-32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - 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). If a gzip stream is being decoded, strm->adler is a - CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit2 does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit2() does not process any header information -- that is - deferred until inflate() is called. -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the Adler-32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called at any - time to set the dictionary. If the provided dictionary is smaller than the - window and there is already data in the window, then the provided dictionary - will amend what's there. The application must insure that the dictionary - that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect Adler-32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); -/* - Returns the sliding dictionary being maintained by inflate. dictLength is - set to the number of bytes in the dictionary, and that many bytes are copied - to dictionary. dictionary must have enough space, where 32768 bytes is - always enough. If inflateGetDictionary() is called with dictionary equal to - Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. - - inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the - stream state is inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a possible full flush point (see above - for the description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync searches for a 00 00 FF FF pattern in the compressed data. - All full flush points have this pattern, but not all occurrences of this - pattern are full flush points. - - inflateSync returns Z_OK if a possible full flush point has been found, - Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point - has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate the internal decompression state. The - stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); -/* - This function is the same as inflateReset, but it also permits changing - the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. If the window size is changed, then the - memory allocated for the window is freed, and the window will be reallocated - by inflate() if needed. - - inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL), or if - the windowBits parameter is invalid. -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - If bits is negative, then the input stream bit buffer is emptied. Then - inflatePrime() can be called again to put bits in the buffer. This is used - to clear out bits leftover after feeding inflate a block description prior - to feeding inflate codes. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); -/* - This function returns two values, one in the lower 16 bits of the return - value, and the other in the remaining upper bits, obtained by shifting the - return value down 16 bits. If the upper value is -1 and the lower value is - zero, then inflate() is currently decoding information outside of a block. - If the upper value is -1 and the lower value is non-zero, then inflate is in - the middle of a stored block, with the lower value equaling the number of - bytes from the input remaining to copy. If the upper value is not -1, then - it is the number of bits back from the current bit position in the input of - the code (literal or length/distance pair) currently being processed. In - that case the lower value is the number of bytes already emitted for that - code. - - A code is being processed if inflate is waiting for more input to complete - decoding of the code, or if it has completed decoding but is waiting for - more output space to write the literal or match data. - - inflateMark() is used to mark locations in the input data for random - access, which may be at bit positions, and to note those cases where the - output of a code may span boundaries of random access blocks. The current - location in the input stream can be determined from avail_in and data_type - as noted in the description for the Z_BLOCK flush parameter for inflate. - - inflateMark returns the value noted above, or -65536 if the provided - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be - used to force inflate() to return immediately after header processing is - complete and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the parameters are invalid, Z_MEM_ERROR if the internal state could not be - allocated, or Z_VERSION_ERROR if the version of the library does not match - the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is potentially more efficient than - inflate() for file i/o applications, in that it avoids copying between the - output and the sliding window by simply making the window itself the output - buffer. inflate() can be faster on modern CPUs when used with large - buffers. inflateBack() trusts the application to not change the output - buffer passed by the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free the - allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the default - behavior of inflate(), which expects a zlib header and trailer around the - deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero -- buf is ignored in that - case -- and inflateBack() will return a buffer error. inflateBack() will - call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. - out() should return zero on success, or non-zero on failure. If out() - returns non-zero, inflateBack() will return with an error. Neither in() nor - out() are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format error - in the deflate stream (in which case strm->msg is set to indicate the nature - of the error), or Z_STREAM_ERROR if the stream was not properly initialized. - In the case of Z_BUF_ERROR, an input or output error can be distinguished - using strm->next_in which will be Z_NULL only if in() returned an error. If - strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning - non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() - cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: ZLIB_DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - -#ifndef Z_SOLO - - /* utility functions */ - -/* - The following utility functions are implemented on top of the basic - stream-oriented functions. To simplify the interface, some default options - are assumed (compression level and memory usage, standard memory allocation - functions). The source code of these utility functions can be modified if - you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed data. compress() is equivalent to compress2() with a level - parameter of Z_DEFAULT_COMPRESSION. - - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed data. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before a - compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be large enough to hold the entire - uncompressed data. (The size of the uncompressed data must have been saved - previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed data. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In - the case where there is not enough room, uncompress() will fill the output - buffer with the uncompressed data up to that point. -*/ - -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); -/* - Same as uncompress, except that sourceLen is a pointer, where the - length of the source is *sourceLen. On return, *sourceLen is the number of - source bytes consumed. -*/ - - /* gzip file access functions */ - -/* - This library 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. -*/ - -typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ - -/* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. - - "a" can be used instead of "w" to request that the gzip stream that will - be written be appended to the file. "+" will result in an error, since - reading and writing to the same gzip file is not supported. The addition of - "x" when writing will create the file exclusively, which fails if the file - already exists. On systems that support it, the addition of "e" when - reading or writing will set the flag to close the file on an execve() call. - - These functions, as well as gzip, will read and decode a sequence of gzip - streams in a file. The append function of gzopen() can be used to create - such a file. (Also see gzflush() for another way to do this.) When - appending, gzopen does not test whether the file begins with a gzip stream, - nor does it look for the end of the gzip streams to begin appending. gzopen - will simply append a gzip stream to the existing file. - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. When - reading, this will be detected automatically by looking for the magic two- - byte gzip header. - - gzopen returns NULL if the file could not be opened, if there was - insufficient memory to allocate the gzFile state, or if an invalid mode was - specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). - errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. -*/ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. - - The next call of gzclose on the returned gzFile will also close the file - descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor - fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, - mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. If you are using fileno() to get the - file descriptor from a FILE *, then you will have to use dup() to avoid - double-close()ing the file descriptor. Both gzclose() and fclose() will - close the associated file descriptor, so they need to have different file - descriptors. - - gzdopen returns NULL if there was insufficient memory to allocate the - gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not - provided, or '+' was provided), or if fd is -1. The file descriptor is not - used until the next gz* read, write, seek, or close operation, so gzdopen - will not detect if fd is invalid (unless fd is -1). -*/ - -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -/* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). - - The new buffer size also affects the maximum length for gzprintf(). - - gzbuffer() returns 0 on success, or -1 on failure, such as being called - too late. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. - - gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not - opened for writing, Z_ERRNO if there is an error writing the flushed data, - or Z_MEM_ERROR if there is a memory allocation error. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. If - the input file is not in gzip format, gzread copies the given number of - bytes into the buffer directly from the file. - - After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream. Any number of gzip streams may be - concatenated in the input file, and will all be decompressed by gzread(). - If something other than a gzip stream is encountered after a gzip stream, - that remaining trailing garbage is ignored (and no error is returned). - - gzread can be used to read a gzip file that is being concurrently written. - Upon reaching the end of the input, gzread will return with the available - data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then - gzclearerr can be used to clear the end of file indicator in order to permit - gzread to be tried again. Z_OK indicates that a gzip stream was completed - on the last gzread. Z_BUF_ERROR indicates that the input file ended in the - middle of a gzip stream. Note that gzread does not return -1 in the event - of an incomplete gzip stream. This error is deferred until gzclose(), which - will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip - stream. Alternatively, gzerror can be used before gzclose to detect this - case. - - gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. If len is too large to fit in an int, - then nothing is read, -1 is returned, and the error state is set to - Z_STREAM_ERROR. -*/ - -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); -/* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. - - gzfread() returns the number of full items read of size size, or zero if - the end of the file was reached and a full item could not be read, or if - there was an error. gzerror() must be consulted if zero is returned in - order to determine if there was an error. If the multiplication of size and - nitems overflows, i.e. the product does not fit in a z_size_t, then nothing - is read, zero is returned, and the error state is set to Z_STREAM_ERROR. - - In the event that the end of file is reached and only a partial item is - available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf - and the end-of-file flag is set. The length of the partial item read is not - provided, but could be inferred from the result of gztell(). This behavior - is the same as the behavior of fread() implementations in common libraries, - but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. -*/ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. -*/ - -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); -/* - gzfwrite() writes nitems items of size size from buf to file, duplicating - the interface of stdio's fwrite(), with size_t request and return types. If - the library defines size_t, then z_size_t is identical to size_t. If not, - then z_size_t is an unsigned integer type that can contain a pointer. - - gzfwrite() returns the number of full items written of size size, or zero - if there was an error. If the multiplication of size and nitems overflows, - i.e. the product does not fit in a z_size_t, then nothing is written, zero - is returned, and the error state is set to Z_STREAM_ERROR. -*/ - -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or a negative zlib error code in case - of error. The number of uncompressed bytes written is limited to 8191, or - one less than the buffer size given to gzbuffer(). The caller should assure - that this limit is not exceeded. If it is exceeded, then gzprintf() will - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. - This can be determined using zlibCompileFlags(). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. - - gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. gzputc - returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. This is implemented as a macro for speed. - As such, it does not do all of the checking the other functions do. I.e. - it does not check to see if file is NULL, nor whether the structure file - points to has been clobbered or not. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. - gzungetc() returns the character pushed, or -1 on failure. gzungetc() will - fail if c is -1, and may fail if a character has been pushed but not read - yet. If gzungetc is used immediately after gzopen or gzdopen, at least the - output buffer size of pushed characters is allowed. (See gzbuffer above.) - The pushed character will be discarded if the stream is repositioned with - gzseek() or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. - - If the flush parameter is Z_FINISH, the remaining data is written and the - gzip stream is completed in the output. If gzwrite() is called again, a new - gzip stream will be started in the output. gzread() is able to read such - concatenated gzip streams. - - gzflush should be called only when strictly necessary because it will - degrade compression if called too often. -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); - - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. - - If gzeof() returns true, then the read functions will return no more data, - unless the end-of-file indicator is reset by gzclearerr() and the input file - has grown since the previous end of file was detected. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. - - If the input file is empty, gzdirect() will return true, since the input - does not contain a gzip stream. - - If gzdirect() is used immediately after gzopen() or gzdopen() it will - cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). - - When writing, gzdirect() returns true (1) if transparent writing was - requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: - gzdirect() is not needed when writing. Transparent writing must be - explicitly requested, so the application already knows the answer. When - linking statically, using gzdirect() will include all of the zlib code for - gzip file reading and decompression, which may not be desired.) -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you - cannot call gzerror with file, since its structures have been deallocated. - gzclose must not be called more than once on the same file, just as free - must not be called more than once on the same allocation. - - gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the - last read ended in the middle of a gzip stream, or Z_OK on success. -*/ - -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -/* - Same as gzclose(), but gzclose_r() is only for use when reading, and - gzclose_w() is only for use when writing or appending. The advantage to - using these instead of gzclose() is that they avoid linking in zlib - compression or decompression code that is not used when only reading or only - writing respectively. If gzclose() is used, then both compression and - decompression code will be included the application when linking to a static - zlib library. -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. - - The application must not modify the returned string. Future calls to - this function may invalidate the previously returned string. If file is - closed, then the string previously returned by gzerror will no longer be - available. - - gzerror() should be used to distinguish errors from end-of-file for those - functions above that do not distinguish those cases in their return values. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - -#endif /* !Z_SOLO */ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the compression - library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. - - An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed - much faster. - - Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); -/* - Same as adler32(), but with a size_t length. -*/ - -/* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); - - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note - that the z_off_t type (like off_t) is a signed integer. If len2 is - negative, the result has no meaning or utility. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); -/* - Same as crc32(), but with a size_t length. -*/ - -/* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#ifdef Z_PREFIX_SET -# define z_deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -# define z_inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -# define z_inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -# define z_inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) -#else -# define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -# define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -# define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -# define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) -#endif - -#ifndef Z_SOLO - -/* gzgetc() macro and its supporting function and exposed data structure. Note - * that the real internal state is much larger than the exposed structure. - * This abbreviated structure exposes just enough for the gzgetc() macro. The - * user should not mess with these exposed elements, since their names or - * behavior could change in the future, perhaps even capriciously. They can - * only be used by the gzgetc() macro. You have been warned. - */ -struct gzFile_s { - unsigned have; - unsigned char *next; - z_off64_t pos; -}; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ -#ifdef Z_PREFIX_SET -# undef z_gzgetc -# define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) -#else -# define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) -#endif - -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); -#endif - -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) -# ifdef Z_PREFIX_SET -# define z_gzopen z_gzopen64 -# define z_gzseek z_gzseek64 -# define z_gztell z_gztell64 -# define z_gzoffset z_gzoffset64 -# define z_adler32_combine z_adler32_combine64 -# define z_crc32_combine z_crc32_combine64 -# else -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# endif -# ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -# endif -#else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); -#endif - -#else /* Z_SOLO */ - - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - -#endif /* !Z_SOLO */ - -/* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); -#endif -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); -# endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/bin/zlib.dll b/third_party/ZLIB-Windows/zlibwapi-1.2.11_deploy_v140/release_dynamic/x64/bin/zlib.dll deleted file mode 100644 index 29ece8527f19ada827f12fe57e9383a9656662a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86528 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 z 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