Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
200e2e211e |
@@ -1,12 +1,9 @@
|
||||
*.a
|
||||
compat/zlib/win32/zdll.lib
|
||||
compat/zlib/win32/zlib1.dll
|
||||
compat/zlib/win64/zdll.lib
|
||||
compat/zlib/win64/zlib1.dll
|
||||
compat/zlib/win64/libz.dll.a
|
||||
compat/zlib/zlib.3.pdf
|
||||
*.bmp
|
||||
*.dll
|
||||
*.exe
|
||||
*.gif
|
||||
*.gz
|
||||
*.jpg
|
||||
*.lib
|
||||
*.pdf
|
||||
*.png
|
||||
*.xlsx
|
||||
*.zip
|
||||
*.png
|
||||
@@ -1,13 +1,8 @@
|
||||
compat/zlib/contrib/dotzlib/readme.txt
|
||||
compat/zlib/contrib/dotzlib/*.cs
|
||||
compat/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
|
||||
compat/zlib/contrib/vstudio/readme.txt
|
||||
compat/zlib/contrib/vstudio/*/zlib.rc
|
||||
compat/zlib/contrib/vstudio/*/zlibvc.def
|
||||
compat/zlib/contrib/vstudio/*/*.sln
|
||||
compat/zlib/win32/zlib.def
|
||||
compat/zlib/win32/*.txt
|
||||
compat/zlib/win64/*.txt
|
||||
compat/zlib/zlib.map
|
||||
libtommath/*.dsp
|
||||
libtommath/*.sln
|
||||
libtommath/*.vcproj
|
||||
@@ -21,4 +16,4 @@ win/rules-ext.vc
|
||||
win/targets.vc
|
||||
win/tcl.dsp
|
||||
win/tcl.dsw
|
||||
win/tcl.hpj.in
|
||||
win/tcl.hpj.in
|
||||
@@ -0,0 +1,19 @@
|
||||
compat/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
|
||||
compat/zlib/contrib/vstudio/readme.txt
|
||||
compat/zlib/contrib/vstudio/*/zlib.rc
|
||||
compat/zlib/win32/*.txt
|
||||
compat/zlib/win64/*.txt
|
||||
libtommath/*.dsp
|
||||
libtommath/*.sln
|
||||
libtommath/*.vcproj
|
||||
tools/tcl.hpj.in
|
||||
tools/tcl.wse.in
|
||||
win/buildall.vc.bat
|
||||
win/coffbase.txt
|
||||
win/makefile.vc
|
||||
win/rules.vc
|
||||
win/rules-ext.vc
|
||||
win/targets.vc
|
||||
win/tcl.dsp
|
||||
win/tcl.dsw
|
||||
win/tcl.hpj.in
|
||||
@@ -1,12 +1,9 @@
|
||||
*.a
|
||||
*.dll
|
||||
*.dylib
|
||||
*.dylib.E
|
||||
*.exe
|
||||
*.exp
|
||||
*.la
|
||||
*.lib
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
*.pdb
|
||||
@@ -14,7 +11,6 @@
|
||||
*.sl
|
||||
*.so
|
||||
*/Makefile
|
||||
*/autom4te.cache
|
||||
*/config.cache
|
||||
*/config.log
|
||||
*/config.status
|
||||
@@ -23,19 +19,14 @@
|
||||
*/tcltest*
|
||||
*/versions.vc
|
||||
*/version.vc
|
||||
*/libtcl.vfs
|
||||
*/libtcl*.zip
|
||||
*/tclUuid.h
|
||||
html
|
||||
libtommath/bn.ilg
|
||||
libtommath/bn.ind
|
||||
libtommath/pretty.build
|
||||
libtommath/tommath.src
|
||||
libtommath/*.log
|
||||
libtommath/*.pdf
|
||||
libtommath/*.pl
|
||||
libtommath/*.sh
|
||||
libtommath/doc/*
|
||||
libtommath/tombc/*
|
||||
libtommath/pre_gen/*
|
||||
libtommath/pics/*
|
||||
@@ -45,25 +36,13 @@ libtommath/etc/*
|
||||
libtommath/demo/*
|
||||
libtommath/*.out
|
||||
libtommath/*.tex
|
||||
macosx/configure
|
||||
unix/autoMkindex.tcl
|
||||
unix/dltest.marker
|
||||
unix/dltest/*.bundle
|
||||
unix/dltest/*.dll
|
||||
unix/dltest/*.dylib
|
||||
unix/dltest/*.o
|
||||
unix/dltest/*.sl
|
||||
unix/dltest/*.so
|
||||
unix/tcl.pc
|
||||
unix/tclIndex
|
||||
unix/Tcl-Info.plist
|
||||
unix/Tclsh-Info.plist
|
||||
unix/pkgs/*
|
||||
win/Debug*
|
||||
win/Release*
|
||||
win/*.manifest
|
||||
win/pkgs/*
|
||||
win/coffbase.txt
|
||||
win/tcl.hpj
|
||||
win/nmakehlp.out
|
||||
win/nmhlp-out.txt
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
u
|
||||
@@ -1,41 +0,0 @@
|
||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||
* eol=lf
|
||||
* text=auto
|
||||
|
||||
# Explicitly declare text files you want to always be normalized and converted
|
||||
# to native line endings on checkout.
|
||||
*.3 text
|
||||
*.c text
|
||||
*.css text
|
||||
*.enc text
|
||||
*.h text
|
||||
*.htm text
|
||||
*.html text
|
||||
*.java text
|
||||
*.js text
|
||||
*.json text
|
||||
*.n text
|
||||
*.svg text
|
||||
*.ts text
|
||||
*.tcl text
|
||||
*.test text
|
||||
|
||||
# Declare files that will always have CRLF line endings on checkout.
|
||||
*.bat eol=crlf
|
||||
*.cs eol=crlf
|
||||
*.sln eol=crlf
|
||||
*.vc eol=crlf
|
||||
|
||||
# Denote all files that are truly binary and should not be modified.
|
||||
*.a binary
|
||||
*.bmp binary
|
||||
*.dll binary
|
||||
*.exe binary
|
||||
*.gif binary
|
||||
*.gz binary
|
||||
*.jpg binary
|
||||
*.lib binary
|
||||
*.pdf binary
|
||||
*.png binary
|
||||
*.xlsx binary
|
||||
*.zip binary
|
||||
@@ -1,3 +0,0 @@
|
||||
Important Note
|
||||
==========
|
||||
Please do not file issues with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues are hosted in the [tcl fossil repository on core.tcl-lang.org](https://core.tcl-lang.org/tcl/tktnew); please post them there.
|
||||
@@ -1,3 +0,0 @@
|
||||
Important Note
|
||||
==========
|
||||
Please do not file pull requests with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues (including patches) are hosted in the [tcl fossil repository on core.tcl-lang.org](https://core.tcl-lang.org/tcl/tktnew); please post them there.
|
||||
@@ -1,78 +0,0 @@
|
||||
name: Linux
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "main"
|
||||
- "core-8-branch"
|
||||
- "core-8-6-branch"
|
||||
tags:
|
||||
- "core-**"
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
gcc:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- ""
|
||||
- "--disable-shared"
|
||||
- "--enable-symbols"
|
||||
- "--enable-symbols=mem"
|
||||
- "--enable-symbols=all"
|
||||
- "CFLAGS=-ftrapv"
|
||||
- "CFLAGS=-DTCL_UTF_MAX=4"
|
||||
- "CFLAGS=-DTCL_UTF_MAX=6"
|
||||
# Duplicated below
|
||||
- "CFLAGS=-m32 CPPFLAGS=-m32 LDFLAGS=-m32 --disable-64bit"
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: unix
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
timeout-minutes: 5
|
||||
- name: Install 32-bit dependencies if needed
|
||||
# Duplicated from above
|
||||
if: ${{ matrix.config == 'CFLAGS=-m32 CPPFLAGS=-m32 LDFLAGS=-m32 --disable-64bit' }}
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install gcc-multilib libc6-dev-i386
|
||||
- name: Prepare
|
||||
run: |
|
||||
touch tclStubInit.c tclOOStubInit.c
|
||||
working-directory: generic
|
||||
- name: Configure ${{ matrix.config }}
|
||||
run: |
|
||||
mkdir "${HOME}/install dir"
|
||||
./configure ${CFGOPT} "--prefix=$HOME/install dir" || (cat config.log && exit 1)
|
||||
env:
|
||||
CFGOPT: ${{ matrix.config }}
|
||||
timeout-minutes: 5
|
||||
- name: Build
|
||||
run: |
|
||||
make all
|
||||
timeout-minutes: 5
|
||||
- name: Build Test Harness
|
||||
run: |
|
||||
make tcltest
|
||||
timeout-minutes: 5
|
||||
- name: Run Tests
|
||||
run: |
|
||||
make test
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
timeout-minutes: 30
|
||||
- name: Test-Drive Installation
|
||||
run: |
|
||||
make install
|
||||
timeout-minutes: 5
|
||||
- name: Create Distribution Package
|
||||
run: |
|
||||
make dist
|
||||
timeout-minutes: 5
|
||||
- name: Convert Documentation to HTML
|
||||
run: |
|
||||
make html-tcl
|
||||
timeout-minutes: 5
|
||||
@@ -1,75 +0,0 @@
|
||||
name: macOS
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "main"
|
||||
- "core-8-branch"
|
||||
- "core-8-6-branch"
|
||||
tags:
|
||||
- "core-**"
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
xcode:
|
||||
runs-on: macos-11
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: macosx
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
timeout-minutes: 5
|
||||
- name: Prepare
|
||||
run: |
|
||||
touch tclStubInit.c tclOOStubInit.c
|
||||
working-directory: generic
|
||||
- name: Build
|
||||
run: make all
|
||||
timeout-minutes: 15
|
||||
- name: Run Tests
|
||||
run: make test styles=develop
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
MAC_CI: 1
|
||||
timeout-minutes: 15
|
||||
clang:
|
||||
runs-on: macos-11
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- ""
|
||||
- "--disable-shared"
|
||||
- "--enable-symbols"
|
||||
- "--enable-symbols=mem"
|
||||
- "--enable-symbols=all"
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: unix
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
timeout-minutes: 5
|
||||
- name: Prepare
|
||||
run: |
|
||||
touch tclStubInit.c tclOOStubInit.c
|
||||
mkdir "$HOME/install dir"
|
||||
working-directory: generic
|
||||
- name: Configure ${{ matrix.config }}
|
||||
# Note that macOS is always a 64 bit platform
|
||||
run: ./configure --enable-64bit --enable-dtrace --enable-framework ${CFGOPT} "--prefix=$HOME/install" || (cat config.log && exit 1)
|
||||
env:
|
||||
CFGOPT: ${{ matrix.config }}
|
||||
timeout-minutes: 5
|
||||
- name: Build
|
||||
run: |
|
||||
make all tcltest
|
||||
timeout-minutes: 15
|
||||
- name: Run Tests
|
||||
run: |
|
||||
make test
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
MAC_CI: 1
|
||||
timeout-minutes: 15
|
||||
@@ -1,105 +0,0 @@
|
||||
name: Windows
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "main"
|
||||
- "core-8-branch"
|
||||
- "core-8-6-branch"
|
||||
tags:
|
||||
- "core-**"
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
ERROR_ON_FAILURES: 1
|
||||
jobs:
|
||||
msvc:
|
||||
runs-on: windows-2022
|
||||
defaults:
|
||||
run:
|
||||
shell: powershell
|
||||
working-directory: win
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- ""
|
||||
- "OPTS=static,msvcrt"
|
||||
- "OPTS=static,staticpkg,msvcrt"
|
||||
- "OPTS=symbols"
|
||||
- "OPTS=symbols STATS=compdbg,memdbg"
|
||||
# Using powershell means we need to explicitly stop on failure
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
timeout-minutes: 5
|
||||
- name: Init MSVC
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
timeout-minutes: 5
|
||||
- name: Build ${{ matrix.config }}
|
||||
run: |
|
||||
&nmake -f makefile.vc ${{ matrix.config }} all
|
||||
if ($lastexitcode -ne 0) {
|
||||
throw "nmake exit code: $lastexitcode"
|
||||
}
|
||||
timeout-minutes: 5
|
||||
- name: Build Test Harness ${{ matrix.config }}
|
||||
run: |
|
||||
&nmake -f makefile.vc ${{ matrix.config }} tcltest
|
||||
if ($lastexitcode -ne 0) {
|
||||
throw "nmake exit code: $lastexitcode"
|
||||
}
|
||||
timeout-minutes: 5
|
||||
- name: Run Tests ${{ matrix.config }}
|
||||
run: |
|
||||
&nmake -f makefile.vc ${{ matrix.config }} test
|
||||
if ($lastexitcode -ne 0) {
|
||||
throw "nmake exit code: $lastexitcode"
|
||||
}
|
||||
timeout-minutes: 30
|
||||
gcc:
|
||||
runs-on: windows-2022
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
working-directory: win
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- ""
|
||||
- "--disable-shared"
|
||||
- "--enable-symbols"
|
||||
- "--enable-symbols=mem"
|
||||
- "--enable-symbols=all"
|
||||
# Using powershell means we need to explicitly stop on failure
|
||||
steps:
|
||||
- name: Install MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: MINGW64
|
||||
install: git mingw-w64-x86_64-toolchain make
|
||||
timeout-minutes: 10
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
timeout-minutes: 5
|
||||
- name: Prepare
|
||||
run: |
|
||||
touch tclStubInit.c tclOOStubInit.c
|
||||
mkdir "${HOME}/install dir"
|
||||
working-directory: generic
|
||||
- name: Configure ${{ matrix.config }}
|
||||
run: |
|
||||
./configure ${CFGOPT} "--prefix=$HOME/install dir" || (cat config.log && exit 1)
|
||||
env:
|
||||
CFGOPT: --enable-64bit ${{ matrix.config }}
|
||||
timeout-minutes: 5
|
||||
- name: Build
|
||||
run: make all
|
||||
timeout-minutes: 5
|
||||
- name: Build Test Harness
|
||||
run: make tcltest
|
||||
timeout-minutes: 5
|
||||
- name: Run Tests
|
||||
run: make test
|
||||
timeout-minutes: 30
|
||||
|
||||
# If you add builds with Wine, be sure to define the environment variable
|
||||
# CI_USING_WINE when running them so that broken tests know not to run.
|
||||
-66
@@ -1,66 +0,0 @@
|
||||
*.a
|
||||
*.bundle
|
||||
*.dll
|
||||
*.dylib
|
||||
*.dylib.E
|
||||
*.exe
|
||||
*.exp
|
||||
*.lib
|
||||
*.o
|
||||
*.obj
|
||||
*.pdb
|
||||
*.res
|
||||
*.sl
|
||||
*.so
|
||||
.fslckout
|
||||
Makefile
|
||||
Tcl-Info.plist
|
||||
Tclsh-Info.plist
|
||||
autom4te.cache
|
||||
config.cache
|
||||
config.log
|
||||
config.status
|
||||
config.status.lineno
|
||||
html
|
||||
manifest.uuid
|
||||
_FOSSIL_
|
||||
*/tclConfig.sh
|
||||
*/tclsh*
|
||||
*/tcltest
|
||||
*/versions.vc
|
||||
*/version.vc
|
||||
*/libtcl.vfs
|
||||
*/libtcl*.zip
|
||||
*/tclUuid.h
|
||||
libtommath/bn.ilg
|
||||
libtommath/bn.ind
|
||||
libtommath/pretty.build
|
||||
libtommath/tommath.src
|
||||
libtommath/*.log
|
||||
libtommath/*.pdf
|
||||
libtommath/*.pl
|
||||
libtommath/*.sh
|
||||
libtommath/doc/*
|
||||
libtommath/tombc/*
|
||||
libtommath/pre_gen/*
|
||||
libtommath/pics/*
|
||||
libtommath/mtest/*
|
||||
libtommath/logs/*
|
||||
libtommath/etc/*
|
||||
libtommath/demo/*
|
||||
libtommath/*.out
|
||||
libtommath/*.tex
|
||||
macosx/configure
|
||||
unix/autoMkindex.tcl
|
||||
unix/dltest.marker
|
||||
unix/tcl.pc
|
||||
unix/tclIndex
|
||||
unix/pkgs/*
|
||||
win/Debug*
|
||||
win/Release*
|
||||
win/*.manifest
|
||||
win/pkgs/*
|
||||
win/coffbase.txt
|
||||
win/tcl.hpj
|
||||
win/nmakehlp.out
|
||||
win/nmhlp-out.txt
|
||||
+207
-338
@@ -1,367 +1,236 @@
|
||||
dist: trusty
|
||||
sudo: false
|
||||
language: c
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- binutils-mingw-w64-i686
|
||||
- binutils-mingw-w64-x86-64
|
||||
- gcc-mingw-w64
|
||||
- gcc-mingw-w64-base
|
||||
- gcc-mingw-w64-i686
|
||||
- gcc-mingw-w64-x86-64
|
||||
- gcc-multilib
|
||||
jobs:
|
||||
matrix:
|
||||
include:
|
||||
# Testing on Linux GCC
|
||||
- name: "Linux/GCC/Shared"
|
||||
os: linux
|
||||
dist: focal
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env:
|
||||
- MATRIX_EVAL="" BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env:
|
||||
- MATRIX_EVAL="" BUILD_DIR=unix CFGOPT=--disable-shared
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- name: "Linux/GCC/Shared: UTF_MAX=4"
|
||||
os: linux
|
||||
dist: focal
|
||||
- MATRIX_EVAL="" BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT=CFLAGS=-DTCL_UTF_MAX=4
|
||||
- name: "Linux/GCC/Shared: UTF_MAX=6"
|
||||
os: linux
|
||||
dist: focal
|
||||
- MATRIX_EVAL="" BUILD_DIR=unix CFGOPT=--disable-shared
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT=CFLAGS=-DTCL_UTF_MAX=6
|
||||
- name: "Linux/GCC/Static"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: gcc
|
||||
env:
|
||||
- CFGOPT="--disable-shared"
|
||||
- BUILD_DIR=unix
|
||||
- name: "Linux/GCC/Debug"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT="--enable-symbols"
|
||||
- name: "Linux/GCC/Mem-Debug"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT="--enable-symbols=mem"
|
||||
# Newer/Older versions of GCC
|
||||
- name: "Linux/GCC 10/Shared"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: gcc-10
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-10
|
||||
- g++-4.9
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- name: "Linux/GCC 5/Shared"
|
||||
os: linux
|
||||
dist: bionic
|
||||
compiler: gcc-5
|
||||
- MATRIX_EVAL="CC=gcc-4.9" BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
# Testing on Linux Clang
|
||||
- name: "Linux/Clang/Shared"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: clang
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- name: "Linux/Clang/Static"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: clang
|
||||
env:
|
||||
- CFGOPT="--disable-shared"
|
||||
- BUILD_DIR=unix
|
||||
- name: "Linux/Clang/Debug"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: clang
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT="--enable-symbols"
|
||||
- name: "Linux/Clang/Mem-Debug"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: clang
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT="--enable-symbols=mem"
|
||||
# Testing on Mac, various styles
|
||||
- name: "macOS/Xcode 12/Shared"
|
||||
os: osx
|
||||
osx_image: xcode12.2
|
||||
env:
|
||||
- BUILD_DIR=macosx
|
||||
install: []
|
||||
script: &mactest
|
||||
- make all
|
||||
# The styles=develop avoids some weird problems on OSX
|
||||
- make test styles=develop
|
||||
- name: "macOS/Xcode 12/Shared/Unix-like"
|
||||
os: osx
|
||||
osx_image: xcode12.2
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT="--enable-dtrace"
|
||||
# Newer MacOS versions
|
||||
- name: "macOS/Xcode 12/Universal Apps/Shared"
|
||||
os: osx
|
||||
osx_image: xcode12u
|
||||
env:
|
||||
- BUILD_DIR=macosx
|
||||
install: []
|
||||
script: *mactest
|
||||
# Older MacOS versions
|
||||
- name: "macOS/Xcode 11/Shared"
|
||||
os: osx
|
||||
osx_image: xcode11.7
|
||||
env:
|
||||
- BUILD_DIR=macosx
|
||||
install: []
|
||||
script: *mactest
|
||||
- name: "macOS/Xcode 10/Shared"
|
||||
os: osx
|
||||
osx_image: xcode10.3
|
||||
env:
|
||||
- BUILD_DIR=macosx
|
||||
install: []
|
||||
script: *mactest
|
||||
- name: "macOS/Xcode 9/Shared"
|
||||
os: osx
|
||||
osx_image: xcode9.4
|
||||
env:
|
||||
- BUILD_DIR=macosx
|
||||
install: []
|
||||
script: *mactest
|
||||
- name: "macOS/Xcode 8/Shared"
|
||||
os: osx
|
||||
osx_image: xcode8.3
|
||||
env:
|
||||
- BUILD_DIR=macosx
|
||||
install: []
|
||||
script: *mactest
|
||||
# Test with mingw-w64 cross-compile
|
||||
# Doesn't run tests because wine is only an imperfect Windows emulation
|
||||
- name: "Linux-cross-Windows/GCC/Shared/no test"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: x86_64-w64-mingw32-gcc
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--host=x86_64-w64-mingw32 --enable-64bit"
|
||||
script: &crosstest
|
||||
- make all tcltest
|
||||
# Include a high visibility marker that tests are skipped outright
|
||||
- >
|
||||
echo "`tput setaf 3`SKIPPED TEST: CROSS COMPILING`tput sgr0`"
|
||||
# Test with mingw-w64 (32 bit) cross-compile
|
||||
# Doesn't run tests because wine is only an imperfect Windows emulation
|
||||
- name: "Linux-cross-Windows-32/GCC/Shared/no test"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: i686-w64-mingw32-gcc
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT=--host=i686-w64-mingw32
|
||||
script: *crosstest
|
||||
# Test on Windows with MSVC native
|
||||
- name: "Windows/MSVC/Shared"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: &vcenv
|
||||
- BUILD_DIR=win
|
||||
- VCDIR="/C/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Auxiliary/Build"
|
||||
before_install: &vcpreinst
|
||||
- touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||
- PATH="$PATH:$VCDIR"
|
||||
- cd ${BUILD_DIR}
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake '-f' makefile.vc test
|
||||
- name: "Windows/MSVC/Static"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc test
|
||||
- name: "Windows/MSVC/StaticPackage"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,staticpkg,msvcrt' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,staticpkg,msvcrt' '-f' makefile.vc test
|
||||
- name: "Windows/MSVC/Debug"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=symbols' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=symbols' '-f' makefile.vc test
|
||||
- name: "Windows/MSVC/Mem-Debug"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'STATS=memdbg' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'STATS=memdbg' '-f' makefile.vc test
|
||||
# Test on Windows with MSVC native (32-bit)
|
||||
- name: "Windows/MSVC-x86/Shared"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake '-f' makefile.vc test
|
||||
- name: "Windows/MSVC-x86/Static"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc test
|
||||
- name: "Windows/MSVC-x86/Debug"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=symbols' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=symbols' '-f' makefile.vc test
|
||||
- name: "Windows/MSVC-x86/Mem-Debug"
|
||||
os: windows
|
||||
compiler: cl
|
||||
env: *vcenv
|
||||
before_install: *vcpreinst
|
||||
install: []
|
||||
script:
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'STATS=memdbg' '-f' makefile.vc all tcltest
|
||||
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'STATS=memdbg' '-f' makefile.vc test
|
||||
# Test on Windows with GCC native
|
||||
- name: "Windows/GCC/Shared"
|
||||
os: windows
|
||||
- MATRIX_EVAL="CC=gcc-5" BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-6
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-64bit"
|
||||
before_install: &makepreinst
|
||||
- touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||
- choco install -y make
|
||||
- cd ${BUILD_DIR}
|
||||
- name: "Windows/GCC/Shared: UTF_MAX=4"
|
||||
os: windows
|
||||
- MATRIX_EVAL="CC=gcc-6" BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-7
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-64bit CFLAGS=-DTCL_UTF_MAX=4"
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC/Static"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
- MATRIX_EVAL="CC=gcc-7" BUILD_DIR=unix
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-64bit --disable-shared"
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC/Debug"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
- MATRIX_EVAL="" BUILD_DIR=unix
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-64bit --enable-symbols"
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC/Mem-Debug"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
- MATRIX_EVAL="" BUILD_DIR=macosx NO_DIRECT_CONFIGURE=1
|
||||
- os: osx
|
||||
osx_image: xcode9
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-64bit --enable-symbols=mem"
|
||||
before_install: *makepreinst
|
||||
# Test on Windows with GCC native (32-bit)
|
||||
- name: "Windows/GCC-x86/Shared"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
- MATRIX_EVAL="" BUILD_DIR=macosx NO_DIRECT_CONFIGURE=1
|
||||
- os: osx
|
||||
osx_image: xcode10
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC-x86/Shared: UTF_MAX=4"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="CFLAGS=-DTCL_UTF_MAX=4"
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC-x86/Static"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--disable-shared"
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC-x86/Debug"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-symbols"
|
||||
before_install: *makepreinst
|
||||
- name: "Windows/GCC-x86/Mem-Debug"
|
||||
os: windows
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT="--enable-symbols=mem"
|
||||
before_install: *makepreinst
|
||||
# "make dist" only
|
||||
- name: "Linux: make dist"
|
||||
os: linux
|
||||
dist: focal
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_DIR=unix
|
||||
script:
|
||||
- make dist
|
||||
- MATRIX_EVAL="" BUILD_DIR=macosx NO_DIRECT_CONFIGURE=1
|
||||
### C builds not currently supported on Windows instances
|
||||
# - os: windows
|
||||
# env:
|
||||
# - MATRIX_EVAL="" BUILD_DIR=win
|
||||
|
||||
before_install:
|
||||
- touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||
- eval "${MATRIX_EVAL}"
|
||||
- export ERROR_ON_FAILURES=1
|
||||
- cd ${BUILD_DIR}
|
||||
install:
|
||||
- mkdir "$HOME/install dir"
|
||||
- ./configure ${CFGOPT} "--prefix=$HOME/install dir" || (cat config.log && exit 1)
|
||||
before_script:
|
||||
- export ERROR_ON_FAILURES=1
|
||||
- test -n "$NO_DIRECT_CONFIGURE" || ./configure ${CFGOPT}
|
||||
script:
|
||||
- make all tcltest || echo "Something wrong, maybe a hickup, let's try again"
|
||||
- make
|
||||
- make test
|
||||
- make install
|
||||
dist: trusty
|
||||
sudo: false
|
||||
language: c
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT=--disable-shared
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=unix
|
||||
- CFGOPT=--disable-shared
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.9
|
||||
env:
|
||||
- MATRIX_EVAL="CC=gcc-4.9"
|
||||
- BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
env:
|
||||
- MATRIX_EVAL="CC=gcc-5"
|
||||
- BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-6
|
||||
env:
|
||||
- MATRIX_EVAL="CC=gcc-6"
|
||||
- BUILD_DIR=unix
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-7
|
||||
env:
|
||||
- MATRIX_EVAL="CC=gcc-7"
|
||||
- BUILD_DIR=unix
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=unix
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=macosx
|
||||
- NO_DIRECT_CONFIGURE=1
|
||||
- os: osx
|
||||
osx_image: xcode9
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=macosx
|
||||
- NO_DIRECT_CONFIGURE=1
|
||||
- os: osx
|
||||
osx_image: xcode10
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=macosx
|
||||
- NO_DIRECT_CONFIGURE=1
|
||||
# Test with mingw-w64 (32 bit)
|
||||
- os: linux
|
||||
compiler: i686-w64-mingw32-gcc
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- gcc-mingw-w64-base
|
||||
- binutils-mingw-w64-i686
|
||||
- gcc-mingw-w64-i686
|
||||
- gcc-mingw-w64
|
||||
- gcc-multilib
|
||||
- wine
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT=--host=i686-w64-mingw32
|
||||
- NO_DIRECT_TEST=1
|
||||
|
||||
# Test with mingw-w64 (64 bit)
|
||||
- os: linux
|
||||
compiler: x86_64-w64-mingw32-gcc
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- gcc-mingw-w64-base
|
||||
- binutils-mingw-w64-x86-64
|
||||
- gcc-mingw-w64-x86-64
|
||||
- gcc-mingw-w64
|
||||
- wine
|
||||
env:
|
||||
- MATRIX_EVAL=""
|
||||
- BUILD_DIR=win
|
||||
- CFGOPT=--host=x86_64-w64-mingw32 --enable-64bit
|
||||
- NO_DIRECT_TEST=1
|
||||
|
||||
### C builds not currently supported on Windows instances
|
||||
# - os: windows
|
||||
# env:
|
||||
# - MATRIX_EVAL=""
|
||||
# - BUILD_DIR=win
|
||||
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then rvm get stable; fi
|
||||
- eval "${MATRIX_EVAL}"
|
||||
- export ERROR_ON_FAILURES=1
|
||||
- cd ${BUILD_DIR}
|
||||
install:
|
||||
- test -n "$NO_DIRECT_CONFIGURE" || ./configure ${CFGOPT}
|
||||
script:
|
||||
- make
|
||||
- test -n "$NO_DIRECT_TEST" || make test
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
A NOTE ON THE CHANGELOG:
|
||||
Starting in early 2011, Tcl source code has been under the management of
|
||||
fossil, hosted at https://core.tcl-lang.org/tcl/ . Fossil presents a "Timeline"
|
||||
fossil, hosted at http://core.tcl.tk/tcl/ . Fossil presents a "Timeline"
|
||||
view of changes made that is superior in every way to a hand edited log file.
|
||||
Because of this, many Tcl developers are now out of the habit of maintaining
|
||||
this log file. You may still find useful things in it, but the Timeline is
|
||||
@@ -1382,7 +1382,7 @@ a better first place to look now.
|
||||
|
||||
2012-05-03 Jan Nijtmans <nijtmans@users.sf.net>
|
||||
|
||||
* compat/zlib/*: Upgrade to zlib 1.2.7 (prebuilt dll is still 1.2.5,
|
||||
* compat/zlib/*: Upgrade to zlib 1.2.7 (pre-built dll is still 1.2.5,
|
||||
will be upgraded as soon as the official build is available)
|
||||
|
||||
2012-05-03 Don Porter <dgp@users.sourceforge.net>
|
||||
@@ -1847,7 +1847,7 @@ a better first place to look now.
|
||||
|
||||
* tools/uniClass.tcl: [FRQ 3473670]: Various Unicode-related
|
||||
* tools/uniParse.tcl: speedups/robustness. Enhanced tools to be
|
||||
* generic/tclUniData.c: able to handle characters > 0xFFFF. Done in
|
||||
* generic/tclUniData.c: able to handle characters > 0xffff. Done in
|
||||
* generic/tclUtf.c: all branches in order to simplify merges for
|
||||
* generic/regc_locale.c: new Unicode versions (such as 6.1)
|
||||
|
||||
@@ -5232,7 +5232,7 @@ a better first place to look now.
|
||||
deletion of traces is not optimized out...
|
||||
|
||||
* generic/tclExecute.c (ExecuteExtendedBinaryMathOp)
|
||||
(CompareTwoNumbers,ExecuteExtendedUnaryMathOp,TclExecuteByteCode):
|
||||
(TclCompareTwoNumbers,ExecuteExtendedUnaryMathOp,TclExecuteByteCode):
|
||||
[Patch 2981677]: Move the less common arithmetic operations (i.e.,
|
||||
exponentiation and operations on non-longs) out of TEBC for a big drop
|
||||
in the overall size of the stack frame for most code. Net effect on
|
||||
@@ -5482,7 +5482,7 @@ a better first place to look now.
|
||||
* generic/tclIORChan.c (ReflectClose, ReflectInput, ReflectOutput,
|
||||
(ReflectSeekWide, ReflectWatch, ReflectBlock, ReflectSetOption,
|
||||
(ReflectGetOption, ForwardProc): [Bug 2978773]: Preserve
|
||||
ReflectedChannel* structures across handler invocations, to avoid
|
||||
ReflectedChannel* structures across handler invokations, to avoid
|
||||
crashes when the handler implementation induces nested callbacks and
|
||||
destruction of the channel deep inside such a nesting.
|
||||
|
||||
@@ -6363,7 +6363,7 @@ a better first place to look now.
|
||||
2009-12-28 Donal K. Fellows <dkf@users.sf.net>
|
||||
|
||||
* unix/Makefile.in (trace-shell, trace-test): [FRQ 1083288]: Added
|
||||
targets to allow easier tracing of shell and test invocations.
|
||||
targets to allow easier tracing of shell and test invokations.
|
||||
|
||||
* unix/configure.in: [Bug 942170]: Detect the st_blocks field of
|
||||
* generic/tclCmdAH.c (StoreStatData): 'struct stat' correctly.
|
||||
@@ -6847,7 +6847,7 @@ a better first place to look now.
|
||||
|
||||
* unix/tclUnixChan.c (TtyParseMode): Partial undo of Donal's tidy-up
|
||||
from a few days ago (2009-11-9, not in ChangeLog). It seems that
|
||||
strchr is apparently a macro on AIX and reacts badly to preprocessor
|
||||
strchr is apparently a macro on AIX and reacts badly to pre-processor
|
||||
directives in its arguments.
|
||||
|
||||
2009-11-16 Alexandre Ferrieux <ferrieux@users.sourceforge.net>
|
||||
@@ -7141,7 +7141,7 @@ a better first place to look now.
|
||||
package-* that were for building Solaris packages. Appears that the
|
||||
pieces needed for these targets to function have never been present in
|
||||
the current era of Tcl development and belong completely to Tcl
|
||||
prehistory.
|
||||
pre-history.
|
||||
|
||||
2009-10-19 Don Porter <dgp@users.sourceforge.net>
|
||||
|
||||
@@ -8096,7 +8096,7 @@ a better first place to look now.
|
||||
2009-03-25 Jan Nijtmans <nijtmans@users.sf.net>
|
||||
|
||||
* doc/tclsh.1: Bring doc and tools in line with
|
||||
* tools/installData.tcl: https://wiki.tcl-lang.org/page/exec+magic
|
||||
* tools/installData.tcl: http://wiki.tcl.tk/812
|
||||
* tools/str2c
|
||||
* tools/tcltk-man2html.tcl
|
||||
|
||||
@@ -8709,7 +8709,7 @@ a better first place to look now.
|
||||
2009-01-19 David Gravereaux <davygrvy@pobox.com>
|
||||
|
||||
* win/build.vc.bat: Improved tools detection and error message
|
||||
* win/makefile.vc: Reorganized the $(TCLOBJ) file list into separate
|
||||
* win/makefile.vc: Reorganized the $(TCLOBJ) file list into seperate
|
||||
parts for easier maintenance. Matched all sources built using -GL to
|
||||
both $(lib) and $(link) to use -LTCG and avoid a warning message.
|
||||
Addressed the over-building nature of the htmlhelp target by moving
|
||||
|
||||
+2
-2
@@ -388,7 +388,7 @@
|
||||
the beginning of the test run
|
||||
|
||||
* tests/basic.test: Use version information defined in tcltest instead
|
||||
of hard-coded version number
|
||||
of hardcoded version number
|
||||
|
||||
* tests/socket.test: package require tcltest before attempting to use
|
||||
variable defined in tcltest namespace
|
||||
@@ -2596,7 +2596,7 @@
|
||||
|
||||
* tclUtf.c: added Unicode character table support
|
||||
|
||||
* tclInt.h: added Tcl_UniCharIsWordChar
|
||||
* tclInt.h: added TclUniCharIsWordChar
|
||||
|
||||
* tclCmdMZ.c (Tcl_StringObjCmd): added "totitle" subcommand, changed
|
||||
"wordend" and "wordstart" to properly handle Unicode word characters
|
||||
|
||||
+8
-8
@@ -103,7 +103,7 @@
|
||||
119398]
|
||||
|
||||
* library/init.tcl (unknown): Added specific level parameters to
|
||||
all uplevel invocation to boost performance; didn't dare touch
|
||||
all uplevel invokations to boost performance; didn't dare touch
|
||||
the "namespace inscope" stuff though, since it looks sensitive
|
||||
to me! Should fix [Bug 123217], though testing is tricky...
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
makeFile/makeDirectory and removeFile/removeDirectory.
|
||||
|
||||
* tests/basic.test: Changed references to tcltest::tclVersion to
|
||||
hard-coded numbers.
|
||||
hardcoded numbers.
|
||||
* generic/tcl.h: Changed reference to tcltest2.tcl and tcltest.tcl in
|
||||
comments to tests/basic.test.
|
||||
|
||||
@@ -1121,7 +1121,7 @@
|
||||
|
||||
2000-06-27 Eric Melski <ericm@scriptics.com>
|
||||
|
||||
* tests/stringObj.test: Tweaked tests to avoid hard-coded high-ASCII
|
||||
* tests/stringObj.test: Tweaked tests to avoid hardcoded high-ASCII
|
||||
characters (which will fail in multibyte locales); instead used \uXXXX
|
||||
syntax. [Bug: 3842].
|
||||
|
||||
@@ -1546,7 +1546,7 @@
|
||||
* unix/mkLinks: Regen'd with new mkLinks.tcl.
|
||||
|
||||
* unix/mkLinks.tcl: Fixed indentation, made link setup more
|
||||
intelligent (only do one existence test per man page, instead of one
|
||||
intelligent (only do one existance test per man page, instead of one
|
||||
per function).
|
||||
|
||||
* doc/library.n: Fixed .SH NAME macro to include each function
|
||||
@@ -1641,7 +1641,7 @@
|
||||
2000-04-21 Brent Welch <welch@scriptics.com>
|
||||
|
||||
* library/http2.1/http.tcl: More thrashing with the "server closes
|
||||
without reading post data" scenario. Reverted to the previous fileevent
|
||||
without reading post data" scenario. Reverted to the previous filevent
|
||||
configuratiuon, which seems to work better with small amounts of post
|
||||
data.
|
||||
|
||||
@@ -1779,7 +1779,7 @@
|
||||
* generic/tclCmdMZ.c: Fixed infinite loop bug with [regexp -all]
|
||||
[Bug: 4981].
|
||||
|
||||
* tests/*.test: Changed all occurrences of "namespace import
|
||||
* tests/*.test: Changed all occurances of "namespace import
|
||||
::tcltest" to "namespace import -force ::tcltest" [Bug: 3948].
|
||||
|
||||
2000-04-09 Brent Welch <welch@scriptics.com>
|
||||
@@ -2267,7 +2267,7 @@
|
||||
* library/auto.tcl: Fixed the regular expression that performs $
|
||||
escaping before sourcing a file to index. It was erroneously adding \
|
||||
escapes even to $'s that were already escaped, effectively
|
||||
"unescaping" those $'s. (bug #2611).
|
||||
"un-escaping" those $'s. (bug #2611).
|
||||
|
||||
2000-01-27 Eric Melski <ericm@scriptics.com>
|
||||
|
||||
@@ -2378,7 +2378,7 @@
|
||||
|
||||
* generic/tclVar.c: Changed behavior of variable command when name
|
||||
refers to an element in an array (ie, "variable foo(x)") to always
|
||||
return an error, regardless of existence of that element in the array
|
||||
return an error, regardless of existance of that element in the array
|
||||
(now behavior is consistant with docs too) (bug #981).
|
||||
|
||||
2000-01-20 Jeff Hobbs <hobbs@scriptics.com>
|
||||
|
||||
+2
-2
@@ -351,7 +351,7 @@
|
||||
|
||||
* mac/tclMacFile.c: fixed bug in permission checking code
|
||||
|
||||
* mac/tclMacLoad.c: corrected utf-8 handling, comparison of package
|
||||
* mac/tclMacLoad.c: corrected utf8 handling, comparison of package
|
||||
names to code fragment names changed to only match on the length of
|
||||
package name, this allows for fragment names with version numbers
|
||||
appended.
|
||||
@@ -3525,7 +3525,7 @@
|
||||
* generic/tclVar.c (Tcl_UnsetObjCmd): Rewrote argument parser to avoid
|
||||
a read off the end of the argument array that could occur when
|
||||
executing something like [unset -nocomplain] was executed. Improved
|
||||
the error message given when not enough arguments are given (-nocomplain
|
||||
the error message given when too few arguments are given (-nocomplain
|
||||
should obviously be *before* --, not after it) and also modified the
|
||||
test suite to take account of that and the documentation to use the
|
||||
same improvement. [Bug 405769]
|
||||
|
||||
+8
-8
@@ -15,7 +15,7 @@
|
||||
* tests/winPipe.test:
|
||||
* win/tclWinPipe.c (Tcl_WaitPid):
|
||||
* win/tclWinTest.c: Gave Tcl_WaitPid the ability to return a Win32
|
||||
exception code translated into a Posix-style SIG*. This allows [close]
|
||||
exception code translated into a posix style SIG*. This allows [close]
|
||||
to report "CHILDKILLED" without the meaning getting lost in a
|
||||
truncated exit code. In TclCleanupChildren(), TclpGetPid() had to get
|
||||
moved to before Tcl_WaitPid() as the the handle is removed from the
|
||||
@@ -1753,7 +1753,7 @@
|
||||
|
||||
2002-07-05 Reinhard Max <max@suse.de>
|
||||
|
||||
* generic/tclClock.c (FormatClock): Convert the format string to utf-8
|
||||
* generic/tclClock.c (FormatClock): Convert the format string to UTF8
|
||||
before calling TclpStrftime, so that non-ASCII characters don't get
|
||||
mangled when the result string is being converted back.
|
||||
* tests/clock.test: Added a test for that.
|
||||
@@ -1941,7 +1941,7 @@
|
||||
|
||||
* tests/pkg/samename.tcl: restored. needed by pkgMkIndex.test.
|
||||
|
||||
* library/tcltest/tcltest.tcl: restored writability testing of
|
||||
* library/tcltest/tcltest.tcl: restored writeability testing of
|
||||
-tmpdir, augmented by a special exception for the deafault value.
|
||||
|
||||
2002-07-01 Donal K. Fellows <fellowsd@cs.man.ac.uk>
|
||||
@@ -1959,9 +1959,9 @@
|
||||
* tests/info.test: [temporaryDirectory] of tcltest.
|
||||
* tests/interp.test:
|
||||
|
||||
* library/tcltest/tcltest.tcl: Stopped checking for writability of
|
||||
* library/tcltest/tcltest.tcl: Stopped checking for writeability of
|
||||
-tmpdir value because no default directory can be guaranteed to be
|
||||
writable.
|
||||
writeable.
|
||||
|
||||
* tests/autoMkindex.tcl: removed.
|
||||
* tests/pkg/samename.tcl: removed.
|
||||
@@ -2469,7 +2469,7 @@
|
||||
thread-safe *_r counterparts are not available.
|
||||
* unix/tcl.m4: added configure check for readdir_r
|
||||
* unix/tcl.m4 (Darwin): set TCL_DEFAULT_ENCODING to utf-8 on MacOSX
|
||||
(where Posix file apis expect utf-8, not iso8859-1).
|
||||
(where posix file apis expect utf-8, not iso8859-1).
|
||||
* unix/configure: regen
|
||||
* unix/Makefile.in: set DYLD_LIBRARY_PATH in parallel to
|
||||
LD_LIBRARY_PATH for MacOSX dynamic linker.
|
||||
@@ -3683,7 +3683,7 @@
|
||||
|
||||
* win/tclAppInit.c: Changed #include "tcl.h" to be tclPort.h to remove
|
||||
the raw windows.h include. tclPort.h brings in windows.h already and
|
||||
lessens the precompiled-header mush and the randomly useless #pragma
|
||||
lessens the pre-compiled-header mush and the randomly useless #pragma
|
||||
comment (lib,...) references throughout the big windows.h tree (as
|
||||
observed at high linker warning levels).
|
||||
|
||||
@@ -3793,7 +3793,7 @@
|
||||
* generic/tclIO.c: Large-file support (with many consequences.)
|
||||
* compat/strtoll.c, compat/strtoull.c: New support functions.
|
||||
* unix/tcl.m4, unix/configure: 64-bit support and greatly enhanced
|
||||
caching.
|
||||
cacheing.
|
||||
|
||||
Most other changes, including all those in doc/* and test/* as well as
|
||||
the majority in the platform directories, follow on from these.
|
||||
|
||||
+1
-1
@@ -268,7 +268,7 @@
|
||||
recently fixed by 2003-11-15 commit to regcomp.c by Pavel Goran. His
|
||||
notes on the fix: This bug results from an error in code that splits
|
||||
states into "progress" and "no-progress" ones. This error causes an
|
||||
interesting situation with the precollected single-linked list of
|
||||
interesting situation with the pre-collected single-linked list of
|
||||
states to be splitted: many items were added to the list, but only
|
||||
several of them are accessible from the list beginning, since the
|
||||
"tmp" member of struct state (which is used here to hold a pointer to
|
||||
|
||||
+8
-8
@@ -345,7 +345,7 @@
|
||||
* library/clock.tcl: Corrected the regular expressions that match a
|
||||
time zone to allow for time zones specified as +HH or -HH.
|
||||
* tests/clock.test: Added regression test case for the above issue.
|
||||
Thanks to Rolf Ade for reporting this issue [https://wiki.tcl-lang.org/page/Parsing+ISO8601+dates+and+times]
|
||||
Thanks to Rolf Ade for reporting this issue [http://wiki.tcl.tk/13094]
|
||||
* win/tclWinDde.c (Tcl_DdeObjCmd): Corrected a typo that caused a
|
||||
compilation failure on VC++.
|
||||
|
||||
@@ -377,7 +377,7 @@
|
||||
strstr, strtoul and strtod.
|
||||
* unix/tcl.m4 (SC_TCL_CHECK_BROKEN_FUNC): Split a complex stanza out
|
||||
of configure.in into its own function. Also force it to do the right
|
||||
thing with caching of results of AC_TRY_RUN to deal with issue raised
|
||||
thing with cacheing of results of AC_TRY_RUN to deal with issue raised
|
||||
in [Patch 1073524]
|
||||
|
||||
* doc/foreach.n: Added simple example. [FRQ 1073334]
|
||||
@@ -1975,7 +1975,7 @@
|
||||
* doc/FileSystem.3:
|
||||
* generic/tclIOUtil.c: Clarified documentation regarding ability of a
|
||||
filesystem to say that it doesn't support a given operation using the
|
||||
EXDEV Posix error code (copyFileProc, renameFileProc, etc), and
|
||||
EXDEV posix error code (copyFileProc, renameFileProc, etc), and
|
||||
updated one piece of code to ensure correct behaviour when an
|
||||
operation is not supported [Bug 1017072]
|
||||
|
||||
@@ -2277,7 +2277,7 @@
|
||||
with vfs [Bug 991420].
|
||||
* tests/fileSystem.test: added test for above bug.
|
||||
|
||||
* doc/FileSystem.3: clarified documentation of Posix error codes in
|
||||
* doc/FileSystem.3: clarified documentation of posix error codes in
|
||||
'remove directory' FS proc - 'EEXIST' is used to signify a non-empty
|
||||
directory error (bug reported against tclvfs).
|
||||
|
||||
@@ -2302,7 +2302,7 @@
|
||||
934511].
|
||||
|
||||
* doc/CrtCommand.3: Added note that the arguments given to the command
|
||||
proc of a Tcl_CreateCommand are in utf-8 since Tcl 8.1. Closing [Patch
|
||||
proc of a Tcl_CreateCommand are in utf8 since Tcl 8.1. Closing [Patch
|
||||
414778].
|
||||
|
||||
* doc/ChnlStack.3: Removed the declaration that the interp argument to
|
||||
@@ -2873,7 +2873,7 @@
|
||||
2004-06-02 Jeff Hobbs <jeffh@ActiveState.com>
|
||||
|
||||
* win/tclWinFile.c (TclpFindExecutable): when using GetModuleFileNameA
|
||||
(Win9x), convert from CP_ACP to WCHAR then convert back to utf-8.
|
||||
(Win9x), convert from CP_ACP to WCHAR then convert back to utf8.
|
||||
Adjunct to 2004-04-07 fix.
|
||||
|
||||
2004-06-02 David Gravereaux <davygrvy@pobox.com>
|
||||
@@ -4339,7 +4339,7 @@
|
||||
provided by the c-runtime. [Bug 672938]
|
||||
|
||||
* win/nmakehlp.c: defensive techniques to avoid static buffer
|
||||
overflows and a couple envars upsetting invocations of cl.exe and
|
||||
overflows and a couple envars upsetting invokations of cl.exe and
|
||||
link.exe. [Bug 885537]
|
||||
|
||||
* tests/winPipe.test: Added proof that BuildCommandLine() is not doing
|
||||
@@ -4548,7 +4548,7 @@
|
||||
dictionary is computed at compile time (when it is fully known). The
|
||||
dictionary is pushed on the stack along with the result, and the code
|
||||
and level values are included in the bytecode as operands. Also
|
||||
supports optimized compilation of un[catch]ed [return]s from procs
|
||||
supports optimized compilation of un-[catch]ed [return]s from procs
|
||||
with default options into the INST_DONE instruction.
|
||||
|
||||
* generic/tclExecute.c: Rewrote INST_RETURN instruction to retrieve
|
||||
|
||||
+2
-2
@@ -229,7 +229,7 @@
|
||||
***POTENTIAL INCOMPATIBILITY*** for bytecode savers/loaders. See below
|
||||
|
||||
* generic/tclCompCmds.c (TclCompileSwitchCmd): Arrange for very simple
|
||||
[switch] invocations to be compiled into hash lookups into jump tables;
|
||||
[switch] invokations to be compiled into hash lookups into jump tables;
|
||||
only a very specific kind of [switch] can be safely compiled this way,
|
||||
but that happens to be the most common kind. This makes around 5-10%
|
||||
difference to the speed of execution of clock.test.
|
||||
@@ -2913,7 +2913,7 @@
|
||||
* generic/tclCompCmds.c: Updated callers to call new routine.
|
||||
* generic/tclDictObj.c: Updated callers to call new routine.
|
||||
* tests/obj.test: Corrected bad tests that actually expected
|
||||
values like "47" and "0xAC" to be accepted as booleans.
|
||||
values like "47" and "0xac" to be accepted as booleans.
|
||||
|
||||
* generic/tclLiteral.c: Disabled the code that forces some literals
|
||||
into the "int" Tcl_ObjType during registration. We can re-enable it if
|
||||
|
||||
+6
-6
@@ -1426,7 +1426,7 @@
|
||||
initialization assumptions of the TIP 280 code in CompileWord().
|
||||
|
||||
* generic/tclCompExpr.c: Suppress the attempt to convert to
|
||||
numeric when precompiling a constant expression indicates an error.
|
||||
numeric when pre-compiling a constant expresion indicates an error.
|
||||
|
||||
2007-08-22 Miguel Sofer <msofer@users.sf.net>
|
||||
|
||||
@@ -2827,8 +2827,8 @@
|
||||
2007-03-24 Zoran Vasiljevic <vasiljevic@users.sourceforge.net>
|
||||
|
||||
* win/tclWinThrd.c: Thread exit handler marks the current thread as
|
||||
uninitialized. This allows exit handlers that are registered later to
|
||||
reinitialize this subsystem in case they need to use some sync
|
||||
un-initialized. This allows exit handlers that are registered later to
|
||||
re-initialize this subsystem in case they need to use some sync
|
||||
primitives (cond variables) from this file again.
|
||||
|
||||
2007-03-23 Miguel Sofer <msofer@users.sf.net>
|
||||
@@ -4938,7 +4938,7 @@
|
||||
|
||||
Misc patches to make code more efficient. [Bug 1530474] (afredd)
|
||||
* generic/*.c, macosx/tclMacOSXNotify.c, unix/tclUnixNotfy.c,
|
||||
* win/tclWinThrd.c: Tidy up invocations of Tcl_Panic() to promote
|
||||
* win/tclWinThrd.c: Tidy up invokations of Tcl_Panic() to promote
|
||||
string constant sharing and consistent style.
|
||||
* generic/tclBasic.c (Tcl_CreateInterp): More efficient handling of
|
||||
* generic/tclClock.c (TclClockInit): registration of commands not
|
||||
@@ -5016,7 +5016,7 @@
|
||||
|
||||
2006-07-24 Don Porter <dgp@users.sourceforge.net>
|
||||
|
||||
* win/tclWinSock.c: Correct uninitialized Tcl_DString. Thanks to
|
||||
* win/tclWinSock.c: Correct un-initialized Tcl_DString. Thanks to
|
||||
afredd. [Bug 1518166]
|
||||
|
||||
2006-07-21 Miguel Sofer <msofer@users.sf.net>
|
||||
@@ -5262,7 +5262,7 @@
|
||||
* generic/tclStrToD.c: Added code to support the "middle endian"
|
||||
floating point format used in the Nokia N770's software-based floating
|
||||
point. Thanks to Bruce Johnson for reporting this bug, originally on
|
||||
https://wiki.tcl-lang.org/page/Nokia+770.
|
||||
http://wiki.tcl.tk/15408.
|
||||
* library/clock.tcl: Fixed a bug with Daylight Saving Time and Posix
|
||||
time zone specifiers reported by Martin Lemburg in
|
||||
http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/9a8b15a4dfc0b7a0
|
||||
|
||||
+2
-2
@@ -1207,7 +1207,7 @@
|
||||
* generic/tcl.decls, doc/Ensemble.3, doc/namespace.n
|
||||
* tests/namespace.test: Allow the handling of a (fixed) number of
|
||||
formal parameters between an ensemble's command and subcommand at
|
||||
invocation time. [Patch 1901783]
|
||||
invokation time. [Patch 1901783]
|
||||
|
||||
2008-09-28 Miguel Sofer <msofer@users.sf.net>
|
||||
|
||||
@@ -3252,7 +3252,7 @@
|
||||
2008-03-21 Donal K. Fellows <dkf@users.sf.net>
|
||||
|
||||
* doc/switch.n: Clarified documentation in respect of two-argument
|
||||
invocation. [Bug 1899962]
|
||||
invokation. [Bug 1899962]
|
||||
|
||||
* tests/switch.test: Added more tests of regexp-mode compilation of
|
||||
the [switch] command. [Bug 1854435]
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
# README: Tcl
|
||||
|
||||
This is the **Tcl 8.6.18** source distribution.
|
||||
|
||||
You can get any source release of Tcl from [our distribution
|
||||
site](https://sourceforge.net/projects/tcl/files/Tcl/).
|
||||
|
||||
9.0 (production release, daily build)
|
||||
[](https://github.com/tcltk/tcl/actions/workflows/linux-build.yml?query=branch%3Amain)
|
||||
[](https://github.com/tcltk/tcl/actions/workflows/win-build.yml?query=branch%3Amain)
|
||||
[](https://github.com/tcltk/tcl/actions/workflows/mac-build.yml?query=branch%3Amain)
|
||||
<br>
|
||||
8.6 (this release, daily build)
|
||||
[](https://github.com/tcltk/tcl/actions/workflows/linux-build.yml?query=branch%3Acore-8-6-branch)
|
||||
[](https://github.com/tcltk/tcl/actions/workflows/win-build.yml?query=branch%3Acore-8-6-branch)
|
||||
[](https://github.com/tcltk/tcl/actions/workflows/mac-build.yml?query=branch%3Acore-8-6-branch)
|
||||
|
||||
## Contents
|
||||
1. [Introduction](#intro)
|
||||
2. [Documentation](#doc)
|
||||
3. [Compiling and installing Tcl](#build)
|
||||
4. [Development tools](#devtools)
|
||||
5. [Tcl newsgroup](#complangtcl)
|
||||
6. [The Tcler's Wiki](#wiki)
|
||||
7. [Mailing lists](#email)
|
||||
8. [Support and Training](#support)
|
||||
9. [Tracking Development](#watch)
|
||||
10. [Thank You](#thanks)
|
||||
|
||||
## <a id="intro">1.</a> Introduction
|
||||
Tcl provides a powerful platform for creating integration applications that
|
||||
tie together diverse applications, protocols, devices, and frameworks.
|
||||
When paired with the Tk toolkit, Tcl provides the fastest and most powerful
|
||||
way to create GUI applications that run on PCs, Unix, and Mac OS X.
|
||||
Tcl can also be used for a variety of web-related tasks and for creating
|
||||
powerful command languages for applications.
|
||||
|
||||
Tcl is maintained, enhanced, and distributed freely by the Tcl community.
|
||||
Source code development and tracking of bug reports and feature requests
|
||||
take place at [core.tcl-lang.org](https://core.tcl-lang.org/).
|
||||
Tcl/Tk release and mailing list services are [hosted by
|
||||
SourceForge](https://sourceforge.net/projects/tcl/)
|
||||
with the Tcl Developer Xchange hosted at
|
||||
[www.tcl-lang.org](https://www.tcl-lang.org).
|
||||
|
||||
Tcl is a freely available open-source package. You can do virtually
|
||||
anything you like with it, such as modifying it, redistributing it,
|
||||
and selling it either in whole or in part. See the file
|
||||
`license.terms` for complete information.
|
||||
|
||||
## <a id="doc">2.</a> Documentation
|
||||
Extensive documentation is available on our website.
|
||||
The home page for this release, including new features, is
|
||||
[here](https://www.tcl-lang.org/software/tcltk/8.6.html).
|
||||
Detailed release notes can be found at the
|
||||
[file distributions page](https://sourceforge.net/projects/tcl/files/Tcl/)
|
||||
by clicking on the relevant version.
|
||||
|
||||
Information about Tcl itself can be found at the [Developer
|
||||
Xchange](https://www.tcl-lang.org/about/).
|
||||
There have been many Tcl books on the market. Many are mentioned in
|
||||
[the Wiki](https://wiki.tcl-lang.org/_/ref?N=25206).
|
||||
|
||||
The complete set of reference manual entries for Tcl 8.6 is [online,
|
||||
here](https://www.tcl-lang.org/man/tcl8.6/).
|
||||
|
||||
### <a id="doc.unix">2a.</a> Unix Documentation
|
||||
The `doc` subdirectory in this release contains a complete set of
|
||||
reference manual entries for Tcl. Files with extension "`.1`" are for
|
||||
programs (for example, `tclsh.1`); files with extension "`.3`" are for C
|
||||
library procedures; and files with extension "`.n`" describe Tcl
|
||||
commands. The file "`doc/Tcl.n`" gives a quick summary of the Tcl
|
||||
language syntax. To print any of the man pages on Unix, cd to the
|
||||
"doc" directory and invoke your favorite variant of troff using the
|
||||
normal -man macros, for example
|
||||
|
||||
groff -man -Tpdf Tcl.n >output.pdf
|
||||
|
||||
to print Tcl.n to PDF. If Tcl has been installed correctly and your "man" program
|
||||
supports it, you should be able to access the Tcl manual entries using the
|
||||
normal "man" mechanisms, such as
|
||||
|
||||
man Tcl
|
||||
|
||||
### <a id="doc.win">2b.</a> Windows Documentation
|
||||
The "doc" subdirectory in this release contains a complete set of Windows
|
||||
help files for Tcl. Once you install this Tcl release, a shortcut to the
|
||||
Windows help Tcl documentation will appear in the "Start" menu:
|
||||
|
||||
Start | Programs | Tcl | Tcl Help
|
||||
|
||||
## <a id="build">3.</a> Compiling and installing Tcl
|
||||
There are brief notes in the `unix/README`, `win/README`, and `macosx/README`
|
||||
about compiling on these different platforms. There is additional information
|
||||
about building Tcl from sources
|
||||
[online](https://www.tcl-lang.org/doc/howto/compile.html).
|
||||
|
||||
## <a id="devtools">4.</a> Development tools
|
||||
ActiveState produces a high-quality set of commercial quality development
|
||||
tools that is available to accelerate your Tcl application development.
|
||||
Tcl Dev Kit builds on the earlier TclPro toolset and provides a debugger,
|
||||
static code checker, single-file wrapping utility, bytecode compiler, and
|
||||
more. More information can be found at
|
||||
|
||||
https://www.activestate.com/products/tcl/
|
||||
|
||||
## <a id="complangtcl">5.</a> Tcl newsgroup
|
||||
There is a USENET newsgroup, "`comp.lang.tcl`", intended for the exchange of
|
||||
information about Tcl, Tk, and related applications. The newsgroup is a
|
||||
great place to ask general information questions. For bug reports, please
|
||||
see the "Support and bug fixes" section below.
|
||||
|
||||
## <a id="wiki">6.</a> Tcl'ers Wiki
|
||||
There is a [wiki-based open community site](https://wiki.tcl-lang.org/)
|
||||
covering all aspects of Tcl/Tk.
|
||||
|
||||
It is dedicated to the Tcl programming language and its extensions. A
|
||||
wealth of useful information can be found there. It contains code
|
||||
snippets, references to papers, books, and FAQs, as well as pointers to
|
||||
development tools, extensions, and applications. You can also recommend
|
||||
additional URLs by editing the wiki yourself.
|
||||
|
||||
## <a id="email">7.</a> Mailing lists
|
||||
Several mailing lists are hosted at SourceForge to discuss development or use
|
||||
issues (like Macintosh and Windows topics). For more information and to
|
||||
subscribe, visit [here](https://sourceforge.net/projects/tcl/) and go to the
|
||||
Mailing Lists page.
|
||||
|
||||
## <a id="support">8.</a> Support and Training
|
||||
We are very interested in receiving bug reports, patches, and suggestions for
|
||||
improvements. We prefer that you send this information to us as tickets
|
||||
entered into [our issue tracker](https://core.tcl-lang.org/tcl/reportlist).
|
||||
|
||||
We will log and follow-up on each bug, although we cannot promise a
|
||||
specific turn-around time. Enhancements may take longer and may not happen
|
||||
at all unless there is widespread support for them (we're trying to
|
||||
slow the rate at which Tcl/Tk turns into a kitchen sink). It's very
|
||||
difficult to make incompatible changes to Tcl/Tk at this point, due to
|
||||
the size of the installed base.
|
||||
|
||||
The Tcl community is too large for us to provide much individual support for
|
||||
users. If you need help we suggest that you post questions to `comp.lang.tcl`
|
||||
or ask a question on [Stack
|
||||
Overflow](https://stackoverflow.com/questions/tagged/tcl). We read the
|
||||
newsgroup and will attempt to answer esoteric questions for which no one else
|
||||
is likely to know the answer. In addition, see the wiki for [links to other
|
||||
organizations](https://wiki.tcl-lang.org/training) that offer Tcl/Tk training.
|
||||
|
||||
## <a id="watch">9.</a> Tracking Development
|
||||
Tcl is developed in public. You can keep an eye on how Tcl is changing at
|
||||
[core.tcl-lang.org](https://core.tcl-lang.org/).
|
||||
|
||||
## <a id="thanks">10.</a> Thank You
|
||||
We'd like to express our thanks to the Tcl community for all the
|
||||
helpful suggestions, bug reports, and patches we have received.
|
||||
Tcl/Tk has improved vastly and will continue to do so with your help.
|
||||
@@ -217,7 +217,7 @@ fake_getaddrinfo(const char *hostname, const char *servname,
|
||||
}
|
||||
|
||||
if (!hostname) {
|
||||
*res = malloc_ai(port, htonl(0x7F000001), hints);
|
||||
*res = malloc_ai(port, htonl(0x7f000001), hints);
|
||||
if (*res == NULL)
|
||||
return (EAI_MEMORY);
|
||||
return (0);
|
||||
|
||||
+1
-2
@@ -21,11 +21,10 @@ gettimeofday(
|
||||
struct timezone *tz)
|
||||
{
|
||||
struct timeb t;
|
||||
(void)tz;
|
||||
|
||||
ftime(&t);
|
||||
tp->tv_sec = t.time;
|
||||
tp->tv_usec = t.millitm * 1000;
|
||||
tp->tv_usec = t. millitm * 1000;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
This software is copyrighted by the Regents of the University of
|
||||
California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
|
||||
Corporation and other parties. The following terms apply to all files
|
||||
associated with the software unless explicitly disclaimed in
|
||||
individual files.
|
||||
|
||||
The authors hereby grant permission to use, copy, modify, distribute,
|
||||
and license this software and its documentation for any purpose, provided
|
||||
that existing copyright notices are retained in all copies and that this
|
||||
notice is included verbatim in any distributions. No written agreement,
|
||||
license, or royalty fee is required for any of the authorized uses.
|
||||
Modifications to this software may be copyrighted by their authors
|
||||
and need not follow the licensing terms described here, provided that
|
||||
the new terms are clearly indicated on the first page of each file where
|
||||
they apply.
|
||||
|
||||
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
|
||||
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
|
||||
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
|
||||
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
|
||||
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
|
||||
MODIFICATIONS.
|
||||
|
||||
GOVERNMENT USE: If you are acquiring this software on behalf of the
|
||||
U.S. government, the Government shall have only "Restricted Rights"
|
||||
in the software and related documentation as defined in the Federal
|
||||
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
|
||||
are acquiring the software on behalf of the Department of Defense, the
|
||||
software shall be classified as "Commercial Computer Software" and the
|
||||
Government shall have only "Restricted Rights" as defined in Clause
|
||||
252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the
|
||||
authors grant the U.S. Government and others acting in its behalf
|
||||
permission to use and distribute the software in accordance with the
|
||||
terms specified in this license.
|
||||
+1
-1
@@ -36,7 +36,7 @@ mkstemp(
|
||||
{
|
||||
static const char alphanumerics[] =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
char *a, *b;
|
||||
register char *a, *b;
|
||||
int fd, count, alphanumericsLen = strlen(alphanumerics); /* == 62 */
|
||||
|
||||
a = template + strlen(template);
|
||||
|
||||
+8
-8
@@ -20,15 +20,15 @@ DIR *
|
||||
opendir(
|
||||
char *name)
|
||||
{
|
||||
DIR *dirp;
|
||||
int fd;
|
||||
const char *myname;
|
||||
register DIR *dirp;
|
||||
register int fd;
|
||||
char *myname;
|
||||
|
||||
myname = ((*name == '\0') ? "." : name);
|
||||
if ((fd = open(myname, 0, 0)) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
dirp = (DIR *) attemptckalloc(sizeof(DIR));
|
||||
dirp = (DIR *) ckalloc(sizeof(DIR));
|
||||
if (dirp == NULL) {
|
||||
/* unreachable? */
|
||||
close(fd);
|
||||
@@ -65,9 +65,9 @@ struct olddirect {
|
||||
|
||||
struct dirent *
|
||||
readdir(
|
||||
DIR *dirp)
|
||||
register DIR *dirp)
|
||||
{
|
||||
struct olddirect *dp;
|
||||
register struct olddirect *dp;
|
||||
static struct dirent dir;
|
||||
|
||||
for (;;) {
|
||||
@@ -101,10 +101,10 @@ readdir(
|
||||
|
||||
void
|
||||
closedir(
|
||||
DIR *dirp)
|
||||
register DIR *dirp)
|
||||
{
|
||||
close(dirp->dd_fd);
|
||||
dirp->dd_fd = -1;
|
||||
dirp->dd_loc = 0;
|
||||
ckfree((char *)dirp);
|
||||
ckfree((char *) dirp);
|
||||
}
|
||||
|
||||
+6
-10
@@ -5,7 +5,7 @@
|
||||
* This file isn't complete in the ANSI-C sense; it only declares things
|
||||
* that are needed by Tcl. This file is needed even on many systems with
|
||||
* their own stdlib.h (e.g. SunOS) because not all stdlib.h files declare
|
||||
* all the procedures needed here (such as strtol/strtoul).
|
||||
* all the procedures needed here (such as strtod).
|
||||
*
|
||||
* Copyright (c) 1991 The Regents of the University of California.
|
||||
* Copyright (c) 1994-1998 Sun Microsystems, Inc.
|
||||
@@ -21,18 +21,14 @@ extern void abort(void);
|
||||
extern double atof(const char *string);
|
||||
extern int atoi(const char *string);
|
||||
extern long atol(const char *string);
|
||||
extern void * calloc(unsigned long numElements, unsigned long size);
|
||||
extern char * calloc(unsigned int numElements, unsigned int size);
|
||||
extern void exit(int status);
|
||||
extern void free(void *blockPtr);
|
||||
extern int free(char *blockPtr);
|
||||
extern char * getenv(const char *name);
|
||||
extern void * malloc(unsigned long numBytes);
|
||||
extern void qsort(void *base, unsigned long n, unsigned long size, int (*compar)(
|
||||
extern char * malloc(unsigned int numBytes);
|
||||
extern void qsort(void *base, int n, int size, int (*compar)(
|
||||
const void *element1, const void *element2));
|
||||
extern void * realloc(void *ptr, unsigned long numBytes);
|
||||
extern char * realpath(const char *path, char *resolved_path);
|
||||
extern int mkstemps(char *templ, int suffixlen);
|
||||
extern int mkstemp(char *templ);
|
||||
extern char * mkdtemp(char *templ);
|
||||
extern char * realloc(char *ptr, unsigned int numBytes);
|
||||
extern long strtol(const char *string, char **endPtr, int base);
|
||||
extern unsigned long strtoul(const char *string, char **endPtr, int base);
|
||||
|
||||
|
||||
+5
-5
@@ -36,10 +36,10 @@
|
||||
|
||||
char *
|
||||
strstr(
|
||||
const char *string, /* String to search. */
|
||||
const char *substring) /* Substring to try to find in string. */
|
||||
register char *string, /* String to search. */
|
||||
char *substring) /* Substring to try to find in string. */
|
||||
{
|
||||
const char *a, *b;
|
||||
register char *a, *b;
|
||||
|
||||
/*
|
||||
* First scan quickly through the two strings looking for a
|
||||
@@ -49,7 +49,7 @@ strstr(
|
||||
|
||||
b = substring;
|
||||
if (*b == 0) {
|
||||
return (char *)string;
|
||||
return string;
|
||||
}
|
||||
for ( ; *string != 0; string += 1) {
|
||||
if (*string != *b) {
|
||||
@@ -58,7 +58,7 @@ strstr(
|
||||
a = string;
|
||||
while (1) {
|
||||
if (*b == 0) {
|
||||
return (char *)string;
|
||||
return string;
|
||||
}
|
||||
if (*a++ != *b++) {
|
||||
break;
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ strtol(
|
||||
* hex, "0" means octal, anything else means
|
||||
* decimal. */
|
||||
{
|
||||
const char *p;
|
||||
register const char *p;
|
||||
long result;
|
||||
|
||||
/*
|
||||
|
||||
+3
-3
@@ -62,9 +62,9 @@ strtoul(
|
||||
* hex, "0" means octal, anything else means
|
||||
* decimal. */
|
||||
{
|
||||
const char *p;
|
||||
unsigned long int result = 0;
|
||||
unsigned digit;
|
||||
register const char *p;
|
||||
register unsigned long int result = 0;
|
||||
register unsigned digit;
|
||||
int anyDigits = 0;
|
||||
int negative=0;
|
||||
int overflow=0;
|
||||
|
||||
+5
-5
@@ -17,7 +17,7 @@
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef NULL
|
||||
# define NULL 0
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -35,9 +35,9 @@ extern int dup2(int oldfd, int newfd);
|
||||
extern int execl(const char *path, ...);
|
||||
extern int execle(const char *path, ...);
|
||||
extern int execlp(const char *file, ...);
|
||||
extern int execv(const char *path, char *const argv[]);
|
||||
extern int execve(const char *path, char *const argv[], char *const *envp);
|
||||
extern int execvp(const char *file, char *const argv[]);
|
||||
extern int execv(const char *path, char **argv);
|
||||
extern int execve(const char *path, char **argv, char **envp);
|
||||
extern int execvpw(const char *file, char **argv);
|
||||
extern pid_t fork(void);
|
||||
extern char * getcwd(char *buf, size_t size);
|
||||
extern gid_t getegid(void);
|
||||
@@ -65,7 +65,7 @@ extern int ftruncate(int fd, unsigned long length);
|
||||
extern int ioctl(int fd, int request, ...);
|
||||
extern int readlink(const char *path, char *buf, int bufsize);
|
||||
extern int setegid(gid_t group);
|
||||
extern int seteuid(uid_t user);
|
||||
extern int seteuidw(uid_t user);
|
||||
extern int setreuid(int ruid, int euid);
|
||||
extern int symlink(const char *, const char *);
|
||||
extern int ttyslot(void);
|
||||
|
||||
+2
-6
@@ -70,7 +70,7 @@ waitpid(
|
||||
int options) /* OR'ed combination of WNOHANG and
|
||||
* WUNTRACED. */
|
||||
{
|
||||
WaitInfo *waitPtr, *prevPtr;
|
||||
register WaitInfo *waitPtr, *prevPtr;
|
||||
pid_t result;
|
||||
WAIT_STATUS_TYPE status;
|
||||
|
||||
@@ -156,11 +156,7 @@ waitpid(
|
||||
goto waitAgain;
|
||||
}
|
||||
}
|
||||
waitPtr = (WaitInfo *) attemptckalloc(sizeof(WaitInfo));
|
||||
if (!waitPtr) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
waitPtr = (WaitInfo *) ckalloc(sizeof(WaitInfo));
|
||||
waitPtr->pid = result;
|
||||
waitPtr->status = status;
|
||||
waitPtr->nextPtr = deadList;
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
# Copied from https://github.com/bazelbuild/bazel-central-registry/tree/main/modules/zlib/1.3.1.bcr.4/patches
|
||||
# Adapted from https://github.com/protocolbuffers/protobuf/blob/master/third_party/zlib.BUILD
|
||||
|
||||
# Copyright 2008 Google Inc. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Code generated by the Protocol Buffer compiler is owned by the owner
|
||||
# of the input file used when generating it. This code is not
|
||||
# standalone and requires a support library to be linked with it. This
|
||||
# support library is itself covered by the above license.
|
||||
|
||||
load("@rules_cc//cc:defs.bzl", "cc_library")
|
||||
load("@rules_license//rules:license.bzl", "license")
|
||||
|
||||
package(
|
||||
default_applicable_licenses = [":license"],
|
||||
)
|
||||
|
||||
license(
|
||||
name = "license",
|
||||
license_kinds = ["@rules_license//licenses/spdx:Zlib"],
|
||||
license_text = "LICENSE",
|
||||
)
|
||||
|
||||
exports_files([
|
||||
"LICENSE",
|
||||
])
|
||||
|
||||
_ZLIB_HEADERS = [
|
||||
"crc32.h",
|
||||
"deflate.h",
|
||||
"gzguts.h",
|
||||
"inffast.h",
|
||||
"inffixed.h",
|
||||
"inflate.h",
|
||||
"inftrees.h",
|
||||
"trees.h",
|
||||
"zconf.h",
|
||||
"zlib.h",
|
||||
"zutil.h",
|
||||
]
|
||||
|
||||
_ZLIB_PREFIXED_HEADERS = ["zlib/include/" + hdr for hdr in _ZLIB_HEADERS]
|
||||
|
||||
# In order to limit the damage from the `includes` propagation
|
||||
# via `:zlib`, copy the public headers to a subdirectory and
|
||||
# expose those.
|
||||
genrule(
|
||||
name = "copy_public_headers",
|
||||
srcs = _ZLIB_HEADERS,
|
||||
outs = _ZLIB_PREFIXED_HEADERS,
|
||||
cmd_bash = "cp $(SRCS) $(@D)/zlib/include/",
|
||||
cmd_bat = " && ".join(
|
||||
["@copy /Y \"$(location %s)\" \"$(@D)\\zlib\\include\\\" >NUL" %
|
||||
s for s in _ZLIB_HEADERS],
|
||||
),
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "mingw_gcc_compiler",
|
||||
flag_values = {
|
||||
"@bazel_tools//tools/cpp:compiler": "mingw-gcc",
|
||||
},
|
||||
visibility = [":__subpackages__"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "z",
|
||||
srcs = [
|
||||
"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",
|
||||
# Include the un-prefixed headers in srcs to work
|
||||
# around the fact that zlib isn't consistent in its
|
||||
# choice of <> or "" delimiter when including itself.
|
||||
] + _ZLIB_HEADERS,
|
||||
hdrs = _ZLIB_PREFIXED_HEADERS,
|
||||
copts = select({
|
||||
":mingw_gcc_compiler": [
|
||||
"-fpermissive",
|
||||
],
|
||||
"@platforms//os:windows": [],
|
||||
"//conditions:default": [
|
||||
"-Wno-deprecated-non-prototype",
|
||||
"-Wno-unused-variable",
|
||||
"-Wno-implicit-function-declaration",
|
||||
],
|
||||
}),
|
||||
includes = ["zlib/include/"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
alias(
|
||||
name = "zlib",
|
||||
actual = ":z",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
+182
-243
@@ -1,126 +1,99 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
cmake_minimum_required(VERSION 2.4.4)
|
||||
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
|
||||
|
||||
project(
|
||||
zlib
|
||||
LANGUAGES C
|
||||
VERSION 1.3.2
|
||||
HOMEPAGE_URL "https://zlib.net/"
|
||||
DESCRIPTION "a general-purpose lossless data-compression library")
|
||||
project(zlib C)
|
||||
|
||||
# ============================================================================
|
||||
# CPack
|
||||
# ============================================================================
|
||||
set(CPACK_PACKAGE_VENDOR "zlib-Project")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_FILE ${zlib_SOURCE_DIR}/README)
|
||||
set(CPACK_RESOURCE_FILE_LICENSE ${zlib_SOURCE_DIR}/LICENSE)
|
||||
set(CPACK_RESOURCE_FILE_README ${zlib_SOURCE_DIR}/README)
|
||||
set(VERSION "1.2.11")
|
||||
|
||||
# ============================================================================
|
||||
# configuration
|
||||
# ============================================================================
|
||||
option(ASM686 "Enable building i686 assembly implementation")
|
||||
option(AMD64 "Enable building amd64 assembly implementation")
|
||||
|
||||
option(ZLIB_BUILD_TESTING "Enable Zlib Examples as tests" ON)
|
||||
option(ZLIB_BUILD_SHARED "Enable building zlib shared library" ON)
|
||||
option(ZLIB_BUILD_STATIC "Enable building zlib static library" ON)
|
||||
option(ZLIB_INSTALL "Enable installation of zlib" ON)
|
||||
option(ZLIB_PREFIX "prefix for all types and library functions, see zconf.h.in"
|
||||
OFF)
|
||||
mark_as_advanced(ZLIB_PREFIX)
|
||||
set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
|
||||
set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
|
||||
set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
|
||||
set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages")
|
||||
set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
|
||||
|
||||
get_property(IS_MULTI GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
|
||||
if(NOT DEFINED CMAKE_BUILD_TYPE AND NOT IS_MULTI)
|
||||
message(STATUS "No CMAKE_BUILD_TYPE set -- using Release")
|
||||
set(CMAKE_BUILD_TYPE Release)
|
||||
endif(NOT DEFINED CMAKE_BUILD_TYPE AND NOT IS_MULTI)
|
||||
|
||||
include(CheckCSourceCompiles)
|
||||
include(CheckTypeSize)
|
||||
include(CheckFunctionExists)
|
||||
include(CheckIncludeFile)
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(CheckTypeSize)
|
||||
include(CPack)
|
||||
include(GNUInstallDirs)
|
||||
include(CheckCSourceCompiles)
|
||||
enable_testing()
|
||||
|
||||
set(CPACK_INCLUDED TRUE)
|
||||
|
||||
if(NOT ZLIB_CONF_WRITTEN)
|
||||
set(Z_PREFIX ${ZLIB_PREFIX})
|
||||
set(CONF_OUT_FILE ${zlib_BINARY_DIR}/zconf.h.cmakein)
|
||||
file(READ ${zlib_SOURCE_DIR}/zconf.h ZCONF_CONTENT LIMIT 245)
|
||||
file(WRITE ${CONF_OUT_FILE} ${ZCONF_CONTENT})
|
||||
file(APPEND ${CONF_OUT_FILE} "#cmakedefine Z_PREFIX 1\n")
|
||||
file(APPEND ${CONF_OUT_FILE} "#cmakedefine HAVE_STDARG_H 1\n")
|
||||
file(APPEND ${CONF_OUT_FILE} "#cmakedefine HAVE_UNISTD_H 1\n")
|
||||
file(READ ${zlib_SOURCE_DIR}/zconf.h ZCONF_CONTENT OFFSET 244)
|
||||
set(FIRST_ITEM TRUE)
|
||||
|
||||
foreach(item IN LISTS ZCONF_CONTENT)
|
||||
if(FIRST_ITEM)
|
||||
string(APPEND OUT_CONTENT ${item})
|
||||
set(FIRST_ITEM FALSE)
|
||||
else(FIRST_ITEM)
|
||||
string(APPEND OUT_CONTENT "\;" ${item})
|
||||
endif(FIRST_ITEM)
|
||||
endforeach(item IN LISTS ${ZCONF_CONTENT})
|
||||
|
||||
file(APPEND ${CONF_OUT_FILE} ${OUT_CONTENT})
|
||||
set(ZLIB_CONF_WRITTEN
|
||||
TRUE
|
||||
CACHE BOOL "zconf.h.cmakein was created")
|
||||
mark_as_advanced(ZLIB_CONF_WRITTEN)
|
||||
endif(NOT ZLIB_CONF_WRITTEN)
|
||||
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
|
||||
check_include_file(stdint.h HAVE_STDINT_H)
|
||||
check_include_file(stddef.h HAVE_STDDEF_H)
|
||||
|
||||
#
|
||||
# Check to see if we have large file support
|
||||
#
|
||||
set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
|
||||
# We add these other definitions here because CheckTypeSize.cmake
|
||||
# in CMake 2.4.x does not automatically do so and we want
|
||||
# compatibility with CMake 2.4.x.
|
||||
if(HAVE_SYS_TYPES_H)
|
||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
|
||||
endif()
|
||||
if(HAVE_STDINT_H)
|
||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H)
|
||||
endif()
|
||||
if(HAVE_STDDEF_H)
|
||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H)
|
||||
endif()
|
||||
check_type_size(off64_t OFF64_T)
|
||||
unset(CMAKE_REQUIRED_DEFINITIONS) # clear variable
|
||||
if(HAVE_OFF64_T)
|
||||
add_definitions(-D_LARGEFILE64_SOURCE=1)
|
||||
endif()
|
||||
set(CMAKE_REQUIRED_DEFINITIONS) # clear variable
|
||||
|
||||
#
|
||||
# Check for fseeko
|
||||
#
|
||||
check_function_exists(fseeko HAVE_FSEEKO)
|
||||
|
||||
#
|
||||
# Check for stdarg.h
|
||||
#
|
||||
check_include_file(stdarg.h HAVE_STDARG_H)
|
||||
if(NOT HAVE_FSEEKO)
|
||||
add_definitions(-DNO_FSEEKO)
|
||||
endif()
|
||||
|
||||
#
|
||||
# Check for unistd.h
|
||||
#
|
||||
check_include_file(unistd.h HAVE_UNISTD_H)
|
||||
check_include_file(unistd.h Z_HAVE_UNISTD_H)
|
||||
|
||||
#
|
||||
# Check visibility attribute is supported
|
||||
#
|
||||
if(MSVC)
|
||||
set(CMAKE_REQUIRED_FLAGS "-WX")
|
||||
else(MSVC)
|
||||
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
||||
endif(MSVC)
|
||||
set(CMAKE_DEBUG_POSTFIX "d")
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
endif()
|
||||
|
||||
check_c_source_compiles(
|
||||
"
|
||||
#include <stdlib.h>
|
||||
static void f(void) __attribute__ ((visibility(\"hidden\")));
|
||||
int main(void) {return 0;}
|
||||
"
|
||||
HAVE___ATTR__VIS_HIDDEN)
|
||||
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
|
||||
# If we're doing an out of source build and the user has a zconf.h
|
||||
# in their source tree...
|
||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h)
|
||||
message(STATUS "Renaming")
|
||||
message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h")
|
||||
message(STATUS "to 'zconf.h.included' because this file is included with zlib")
|
||||
message(STATUS "but CMake generates it automatically in the build directory.")
|
||||
file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
unset(CMAKE_COMPILE_FLAGS)
|
||||
set(ZLIB_PC ${zlib_BINARY_DIR}/zlib.pc)
|
||||
configure_file(${zlib_SOURCE_DIR}/zlib.pc.cmakein ${ZLIB_PC} @ONLY)
|
||||
configure_file(${zlib_BINARY_DIR}/zconf.h.cmakein ${zlib_BINARY_DIR}/zconf.h)
|
||||
set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc)
|
||||
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
|
||||
${ZLIB_PC} @ONLY)
|
||||
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
|
||||
${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
|
||||
|
||||
# ============================================================================
|
||||
|
||||
#============================================================================
|
||||
# zlib
|
||||
# ============================================================================
|
||||
|
||||
set(ZLIB_PUBLIC_HDRS ${zlib_BINARY_DIR}/zconf.h zlib.h)
|
||||
#============================================================================
|
||||
|
||||
set(ZLIB_PUBLIC_HDRS
|
||||
${CMAKE_CURRENT_BINARY_DIR}/zconf.h
|
||||
zlib.h
|
||||
)
|
||||
set(ZLIB_PRIVATE_HDRS
|
||||
crc32.h
|
||||
deflate.h
|
||||
@@ -130,8 +103,8 @@ set(ZLIB_PRIVATE_HDRS
|
||||
inflate.h
|
||||
inftrees.h
|
||||
trees.h
|
||||
zutil.h)
|
||||
|
||||
zutil.h
|
||||
)
|
||||
set(ZLIB_SRCS
|
||||
adler32.c
|
||||
compress.c
|
||||
@@ -147,164 +120,130 @@ set(ZLIB_SRCS
|
||||
inffast.c
|
||||
trees.c
|
||||
uncompr.c
|
||||
zutil.c)
|
||||
zutil.c
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
set(zlib_static_suffix "s")
|
||||
set(CMAKE_DEBUG_POSTFIX "d")
|
||||
endif(WIN32)
|
||||
if(NOT MINGW)
|
||||
set(ZLIB_DLL_SRCS
|
||||
win32/zlib1.rc # If present will override custom build rule below.
|
||||
)
|
||||
endif()
|
||||
|
||||
if(ZLIB_BUILD_SHARED)
|
||||
add_library(
|
||||
zlib SHARED ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}
|
||||
$<$<OR:$<BOOL:${WIN32}>,$<BOOL:${CYGWIN}>>:win32/zlib1.rc>)
|
||||
add_library(ZLIB::ZLIB ALIAS zlib)
|
||||
target_include_directories(
|
||||
zlib
|
||||
PUBLIC $<BUILD_INTERFACE:${zlib_BINARY_DIR}>
|
||||
$<BUILD_INTERFACE:${zlib_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||
target_compile_definitions(
|
||||
zlib
|
||||
PRIVATE ZLIB_BUILD
|
||||
$<$<BOOL:NOT:${HAVE_FSEEKO}>:NO_FSEEKO>
|
||||
$<$<BOOL:${HAVE___ATTR__VIS_HIDDEN}>:HAVE_HIDDEN>
|
||||
$<$<BOOL:${MSVC}>:_CRT_SECURE_NO_DEPRECATE>
|
||||
$<$<BOOL:${MSVC}>:_CRT_NONSTDC_NO_DEPRECATE>
|
||||
PUBLIC $<$<BOOL:${HAVE_OFF64_T}>:_LARGEFILE64_SOURCE=1>)
|
||||
set(INSTALL_VERSION ${zlib_VERSION})
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
if(ASM686)
|
||||
set(ZLIB_ASMS contrib/asm686/match.S)
|
||||
elseif (AMD64)
|
||||
set(ZLIB_ASMS contrib/amd64/amd64-match.S)
|
||||
endif ()
|
||||
|
||||
if(NOT CYGWIN)
|
||||
set_target_properties(zlib PROPERTIES SOVERSION ${zlib_VERSION_MAJOR}
|
||||
VERSION ${INSTALL_VERSION})
|
||||
endif(NOT CYGWIN)
|
||||
if(ZLIB_ASMS)
|
||||
add_definitions(-DASMV)
|
||||
set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set_target_properties(
|
||||
zlib
|
||||
PROPERTIES DEFINE_SYMBOL ZLIB_DLL
|
||||
EXPORT_NAME ZLIB
|
||||
OUTPUT_NAME z)
|
||||
if(UNIX
|
||||
AND NOT APPLE
|
||||
AND NOT (CMAKE_SYSTEM_NAME STREQUAL AIX)
|
||||
AND NOT (CMAKE_SYSTEM_NAME STREQUAL SunOS))
|
||||
# On unix-like platforms the library is almost always called libz
|
||||
set_target_properties(
|
||||
zlib
|
||||
PROPERTIES LINK_FLAGS
|
||||
"-Wl,--version-script,\"${zlib_SOURCE_DIR}/zlib.map\"")
|
||||
endif(
|
||||
UNIX
|
||||
AND NOT APPLE
|
||||
AND NOT (CMAKE_SYSTEM_NAME STREQUAL AIX)
|
||||
AND NOT (CMAKE_SYSTEM_NAME STREQUAL SunOS))
|
||||
endif(ZLIB_BUILD_SHARED)
|
||||
if(MSVC)
|
||||
if(ASM686)
|
||||
ENABLE_LANGUAGE(ASM_MASM)
|
||||
set(ZLIB_ASMS
|
||||
contrib/masmx86/inffas32.asm
|
||||
contrib/masmx86/match686.asm
|
||||
)
|
||||
elseif (AMD64)
|
||||
ENABLE_LANGUAGE(ASM_MASM)
|
||||
set(ZLIB_ASMS
|
||||
contrib/masmx64/gvmat64.asm
|
||||
contrib/masmx64/inffasx64.asm
|
||||
)
|
||||
endif()
|
||||
|
||||
if(ZLIB_BUILD_STATIC)
|
||||
add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS}
|
||||
${ZLIB_PRIVATE_HDRS})
|
||||
add_library(ZLIB::ZLIBSTATIC ALIAS zlibstatic)
|
||||
target_include_directories(
|
||||
zlibstatic
|
||||
PUBLIC $<BUILD_INTERFACE:${zlib_BINARY_DIR}>
|
||||
$<BUILD_INTERFACE:${zlib_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||
target_compile_definitions(
|
||||
zlibstatic
|
||||
PRIVATE ZLIB_BUILD
|
||||
$<$<BOOL:NOT:${HAVE_FSEEKO}>:NO_FSEEKO>
|
||||
$<$<BOOL:${HAVE___ATTR__VIS_HIDDEN}>:HAVE_HIDDEN>
|
||||
$<$<BOOL:${MSVC}>:_CRT_SECURE_NO_DEPRECATE>
|
||||
$<$<BOOL:${MSVC}>:_CRT_NONSTDC_NO_DEPRECATE>
|
||||
PUBLIC $<$<BOOL:${HAVE_OFF64_T}>:_LARGEFILE64_SOURCE=1>)
|
||||
set_target_properties(
|
||||
zlibstatic PROPERTIES EXPORT_NAME ZLIBSTATIC OUTPUT_NAME
|
||||
z${zlib_static_suffix})
|
||||
endif(ZLIB_BUILD_STATIC)
|
||||
if(ZLIB_ASMS)
|
||||
add_definitions(-DASMV -DASMINF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(ZLIB_INSTALL)
|
||||
if(ZLIB_BUILD_SHARED)
|
||||
install(
|
||||
TARGETS zlib
|
||||
COMPONENT Runtime
|
||||
EXPORT zlibSharedExport
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||
install(
|
||||
EXPORT zlibSharedExport
|
||||
FILE ZLIB-shared.cmake
|
||||
NAMESPACE ZLIB::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib)
|
||||
# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
|
||||
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
|
||||
string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
|
||||
"\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
|
||||
|
||||
if(MSVC)
|
||||
install(
|
||||
FILES $<TARGET_PDB_FILE:zlib>
|
||||
COMPONENT Runtime
|
||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
CONFIGURATIONS Debug OR RelWithDebInfo
|
||||
OPTIONAL)
|
||||
endif(MSVC)
|
||||
endif(ZLIB_BUILD_SHARED)
|
||||
if(MINGW)
|
||||
# This gets us DLL resource information when compiling on MinGW.
|
||||
if(NOT CMAKE_RC_COMPILER)
|
||||
set(CMAKE_RC_COMPILER windres.exe)
|
||||
endif()
|
||||
|
||||
if(ZLIB_BUILD_STATIC)
|
||||
install(
|
||||
TARGETS zlibstatic
|
||||
COMPONENT Development
|
||||
EXPORT zlibStaticExport
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||
install(
|
||||
EXPORT zlibStaticExport
|
||||
FILE ZLIB-static.cmake
|
||||
NAMESPACE ZLIB::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib)
|
||||
endif(ZLIB_BUILD_STATIC)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
|
||||
COMMAND ${CMAKE_RC_COMPILER}
|
||||
-D GCC_WINDRES
|
||||
-I ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
-I ${CMAKE_CURRENT_BINARY_DIR}
|
||||
-o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
|
||||
-i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
|
||||
set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
|
||||
endif(MINGW)
|
||||
|
||||
configure_package_config_file(
|
||||
${zlib_SOURCE_DIR}/zlibConfig.cmake.in
|
||||
${zlib_BINARY_DIR}/ZLIBConfig.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib)
|
||||
add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
|
||||
add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
|
||||
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
|
||||
set_target_properties(zlib PROPERTIES SOVERSION 1)
|
||||
|
||||
write_basic_package_version_file(
|
||||
"${zlib_BINARY_DIR}/ZLIBConfigVersion.cmake"
|
||||
VERSION "${zlib_VERSION}"
|
||||
COMPATIBILITY AnyNewerVersion)
|
||||
if(NOT CYGWIN)
|
||||
# This property causes shared libraries on Linux to have the full version
|
||||
# encoded into their final filename. We disable this on Cygwin because
|
||||
# it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
|
||||
# seems to be the default.
|
||||
#
|
||||
# This has no effect with MSVC, on that platform the version info for
|
||||
# the DLL comes from the resource file win32/zlib1.rc
|
||||
set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
|
||||
endif()
|
||||
|
||||
install(FILES ${zlib_BINARY_DIR}/ZLIBConfig.cmake
|
||||
${zlib_BINARY_DIR}/ZLIBConfigVersion.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/zlib)
|
||||
install(
|
||||
FILES ${ZLIB_PUBLIC_HDRS}
|
||||
COMPONENT Development
|
||||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
install(
|
||||
FILES zlib.3
|
||||
COMPONENT Docs
|
||||
DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
|
||||
install(
|
||||
FILES LICENSE
|
||||
doc/algorithm.txt
|
||||
doc/crc-doc.1.0.pdf
|
||||
doc/rfc1950.txt
|
||||
doc/rfc1951.txt
|
||||
doc/rfc1952.txt
|
||||
doc/txtvsbin.txt
|
||||
COMPONENT Docs
|
||||
DESTINATION "${CMAKE_INSTALL_DOCDIR}/zlib")
|
||||
install(
|
||||
FILES ${ZLIB_PC}
|
||||
COMPONENT Development
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||
endif(ZLIB_INSTALL)
|
||||
if(UNIX)
|
||||
# On unix-like platforms the library is almost always called libz
|
||||
set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
|
||||
if(NOT APPLE)
|
||||
set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
|
||||
endif()
|
||||
elseif(BUILD_SHARED_LIBS AND WIN32)
|
||||
# Creates zlib1.dll when building shared library version
|
||||
set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
|
||||
endif()
|
||||
|
||||
# ============================================================================
|
||||
# Tests
|
||||
# ============================================================================
|
||||
if(ZLIB_BUILD_TESTING)
|
||||
enable_testing()
|
||||
add_subdirectory(test)
|
||||
endif(ZLIB_BUILD_TESTING)
|
||||
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
|
||||
install(TARGETS zlib zlibstatic
|
||||
RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
|
||||
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
|
||||
LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
|
||||
endif()
|
||||
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
|
||||
install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}")
|
||||
endif()
|
||||
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
||||
install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3")
|
||||
endif()
|
||||
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
|
||||
install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}")
|
||||
endif()
|
||||
|
||||
add_subdirectory(contrib)
|
||||
#============================================================================
|
||||
# Example binaries
|
||||
#============================================================================
|
||||
|
||||
add_executable(example test/example.c)
|
||||
target_link_libraries(example zlib)
|
||||
add_test(example example)
|
||||
|
||||
add_executable(minigzip test/minigzip.c)
|
||||
target_link_libraries(minigzip zlib)
|
||||
|
||||
if(HAVE_OFF64_T)
|
||||
add_executable(example64 test/example.c)
|
||||
target_link_libraries(example64 zlib)
|
||||
set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
|
||||
add_test(example64 example64)
|
||||
|
||||
add_executable(minigzip64 test/minigzip.c)
|
||||
target_link_libraries(minigzip64 zlib)
|
||||
set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
|
||||
endif()
|
||||
|
||||
+56
-210
@@ -1,160 +1,6 @@
|
||||
|
||||
ChangeLog file for zlib
|
||||
|
||||
Changes in 1.3.2 (17 Feb 2026)
|
||||
- Continued rewrite of CMake build [Vollstrecker]
|
||||
- Various portability improvements
|
||||
- Various github workflow additions and improvements
|
||||
- Check for negative lengths in crc32_combine functions
|
||||
- Copy only the initialized window contents in inflateCopy
|
||||
- Prevent the use of insecure functions without an explicit request
|
||||
- Add compressBound_z and deflateBound_z functions for large values
|
||||
- Use atomics to build inflate fixed tables once
|
||||
- Add definition of ZLIB_INSECURE to build tests with c89 and c94
|
||||
- Add --undefined option to ./configure for UBSan checker
|
||||
- Copy only the initialized deflate state in deflateCopy
|
||||
- Zero inflate state on allocation
|
||||
- Remove untgz from contrib
|
||||
- Add _z versions of the compress and uncompress functions
|
||||
- Vectorize the CRC-32 calculation on the s390x
|
||||
- Set bit 11 of the zip header flags in minizip if UTF-8
|
||||
- Update OS/400 support
|
||||
- Add a test to configure to check for a working compiler
|
||||
- Check for invalid NULL pointer inputs to zlib operations
|
||||
- Add --mandir to ./configure to specify manual directory
|
||||
- Add LICENSE.Info-Zip to contrib/minizip
|
||||
- Remove vstudio projects in lieu of cmake-generated projects
|
||||
- Replace strcpy() with memcpy() in contrib/minizip
|
||||
|
||||
Changes in 1.3.1.2 (8 Dec 2025)
|
||||
- Improve portability to RISC OS
|
||||
- Permit compiling contrib/minizip/unzip.c with decryption
|
||||
- Enable build of shared library on AIX
|
||||
- Make deflateBound() more conservative and handle Z_STREAM_END
|
||||
- Add zipAlreadyThere() to minizip zip.c to help avoid duplicates
|
||||
- Make z_off_t 64 bits by default
|
||||
- Add deflateUsed() function to get the used bits in the last byte
|
||||
- Avoid out-of-bounds pointer arithmetic in inflateCopy()
|
||||
- Add Haiku to configure for proper LDSHARED settings
|
||||
- Add Bazel targets
|
||||
- Complete rewrite of CMake build [Vollstrecker]
|
||||
- Clarify the use of errnum in gzerror()
|
||||
- Note that gzseek() requests are deferred until the next operation
|
||||
- Note the use of gzungetc() to run a deferred seek while reading
|
||||
- Fix bug in inflatePrime() for 16-bit ints
|
||||
- Add a "G" option to force gzip, disabling transparency in gzread()
|
||||
- Improve the discrimination between trailing garbage and bad gzip
|
||||
- Allow gzflush() to write empty gzip members
|
||||
- Remove redundant frees of point list on error in examples/zran.c
|
||||
- Clarify the use of inflateGetHeader()
|
||||
- Update links to the RFCs
|
||||
- Return all available uncompressed data on error in gzread.c
|
||||
- Support non-blocking devices in the gz* routines
|
||||
- Various other small improvements
|
||||
|
||||
Changes in 1.3.1 (22 Jan 2024)
|
||||
- Reject overflows of zip header fields in minizip
|
||||
- Fix bug in inflateSync() for data held in bit buffer
|
||||
- Add LIT_MEM define to use more memory for a small deflate speedup
|
||||
- Fix decision on the emission of Zip64 end records in minizip
|
||||
- Add bounds checking to ERR_MSG() macro, used by zError()
|
||||
- Neutralize zip file traversal attacks in miniunz
|
||||
- Fix a bug in ZLIB_DEBUG compiles in check_match()
|
||||
- Various portability and appearance improvements
|
||||
|
||||
Changes in 1.3 (18 Aug 2023)
|
||||
- Remove K&R function definitions and zlib2ansi
|
||||
- Fix bug in deflateBound() for level 0 and memLevel 9
|
||||
- Fix bug when gzungetc() is used immediately after gzopen()
|
||||
- Fix bug when using gzflush() with a very small buffer
|
||||
- Fix crash when gzsetparams() attempted for transparent write
|
||||
- Fix test/example.c to work with FORCE_STORED
|
||||
- Rewrite of zran in examples (see zran.c version history)
|
||||
- Fix minizip to allow it to open an empty zip file
|
||||
- Fix reading disk number start on zip64 files in minizip
|
||||
- Fix logic error in minizip argument processing
|
||||
- Add minizip testing to Makefile
|
||||
- Read multiple bytes instead of byte-by-byte in minizip unzip.c
|
||||
- Add memory sanitizer to configure (--memory)
|
||||
- Various portability improvements
|
||||
- Various documentation improvements
|
||||
- Various spelling and typo corrections
|
||||
|
||||
Changes in 1.2.13 (13 Oct 2022)
|
||||
- Fix configure issue that discarded provided CC definition
|
||||
- Correct incorrect inputs provided to the CRC functions
|
||||
- Repair prototypes and exporting of new CRC functions
|
||||
- Fix inflateBack to detect invalid input with distances too far
|
||||
- Have infback() deliver all of the available output up to any error
|
||||
- Fix a bug when getting a gzip header extra field with inflate()
|
||||
- Fix bug in block type selection when Z_FIXED used
|
||||
- Tighten deflateBound bounds
|
||||
- Remove deleted assembler code references
|
||||
- Various portability and appearance improvements
|
||||
|
||||
Changes in 1.2.12 (27 Mar 2022)
|
||||
- Cygwin does not have _wopen(), so do not create gzopen_w() there
|
||||
- Permit a deflateParams() parameter change as soon as possible
|
||||
- Limit hash table inserts after switch from stored deflate
|
||||
- Fix bug when window full in deflate_stored()
|
||||
- Fix CLEAR_HASH macro to be usable as a single statement
|
||||
- Avoid a conversion error in gzseek when off_t type too small
|
||||
- Have Makefile return non-zero error code on test failure
|
||||
- Avoid some conversion warnings in gzread.c and gzwrite.c
|
||||
- Update use of errno for newer Windows CE versions
|
||||
- Small speedup to inflate [psumbera]
|
||||
- Return an error if the gzputs string length can't fit in an int
|
||||
- Add address checking in clang to -w option of configure
|
||||
- Don't compute check value for raw inflate if asked to validate
|
||||
- Handle case where inflateSync used when header never processed
|
||||
- Avoid the use of ptrdiff_t
|
||||
- Avoid an undefined behavior of memcpy() in gzappend()
|
||||
- Avoid undefined behaviors of memcpy() in gz*printf()
|
||||
- Avoid an undefined behavior of memcpy() in _tr_stored_block()
|
||||
- Make the names in functions declarations identical to definitions
|
||||
- Remove old assembler code in which bugs have manifested
|
||||
- Fix deflateEnd() to not report an error at start of raw deflate
|
||||
- Add legal disclaimer to README
|
||||
- Emphasize the need to continue decompressing gzip members
|
||||
- Correct the initialization requirements for deflateInit2()
|
||||
- Fix a bug that can crash deflate on some input when using Z_FIXED
|
||||
- Assure that the number of bits for deflatePrime() is valid
|
||||
- Use a structure to make globals in enough.c evident
|
||||
- Use a macro for the printf format of big_t in enough.c
|
||||
- Clean up code style in enough.c, update version
|
||||
- Use inline function instead of macro for index in enough.c
|
||||
- Clarify that prefix codes are counted in enough.c
|
||||
- Show all the codes for the maximum tables size in enough.c
|
||||
- Add gznorm.c example, which normalizes gzip files
|
||||
- Fix the zran.c example to work on a multiple-member gzip file
|
||||
- Add tables for crc32_combine(), to speed it up by a factor of 200
|
||||
- Add crc32_combine_gen() and crc32_combine_op() for fast combines
|
||||
- Speed up software CRC-32 computation by a factor of 1.5 to 3
|
||||
- Use atomic test and set, if available, for dynamic CRC tables
|
||||
- Don't bother computing check value after successful inflateSync()
|
||||
- Correct comment in crc32.c
|
||||
- Add use of the ARMv8 crc32 instructions when requested
|
||||
- Use ARM crc32 instructions if the ARM architecture has them
|
||||
- Explicitly note that the 32-bit check values are 32 bits
|
||||
- Avoid adding empty gzip member after gzflush with Z_FINISH
|
||||
- Fix memory leak on error in gzlog.c
|
||||
- Fix error in comment on the polynomial representation of a byte
|
||||
- Clarify gz* function interfaces, referring to parameter names
|
||||
- Change macro name in inflate.c to avoid collision in VxWorks
|
||||
- Correct typo in blast.c
|
||||
- Improve portability of contrib/minizip
|
||||
- Fix indentation in minizip's zip.c
|
||||
- Replace black/white with allow/block. (theresa-m)
|
||||
- minizip warning fix if MAXU32 already defined. (gvollant)
|
||||
- Fix unztell64() in minizip to work past 4GB. (Daniël Hörchner)
|
||||
- Clean up minizip to reduce warnings for testing
|
||||
- Add fallthrough comments for gcc
|
||||
- Eliminate use of ULL constants
|
||||
- Separate out address sanitizing from warnings in configure
|
||||
- Remove destructive aspects of make distclean
|
||||
- Check for cc masquerading as gcc or clang in configure
|
||||
- Fix crc32.c to compile local functions only if used
|
||||
|
||||
Changes in 1.2.11 (15 Jan 2017)
|
||||
- Fix deflate stored bug when pulling last block from window
|
||||
- Permit immediate deflateParams changes before any deflate input
|
||||
@@ -250,7 +96,7 @@ Changes in 1.2.7.1 (24 Mar 2013)
|
||||
- Fix types in contrib/minizip to match result of get_crc_table()
|
||||
- Simplify contrib/vstudio/vc10 with 'd' suffix
|
||||
- Add TOP support to win32/Makefile.msc
|
||||
- Support i686 and amd64 assembler builds in CMakeLists.txt
|
||||
- Suport i686 and amd64 assembler builds in CMakeLists.txt
|
||||
- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h
|
||||
- Add vc11 and vc12 build files to contrib/vstudio
|
||||
- Add gzvprintf() as an undocumented function in zlib
|
||||
@@ -450,14 +296,14 @@ Changes in 1.2.5.1 (10 Sep 2011)
|
||||
- Use u4 type for crc_table to avoid conversion warnings
|
||||
- Apply casts in zlib.h to avoid conversion warnings
|
||||
- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller]
|
||||
- Improve inflateSync() documentation to note indeterminacy
|
||||
- Improve inflateSync() documentation to note indeterminancy
|
||||
- Add deflatePending() function to return the amount of pending output
|
||||
- Correct the spelling of "specification" in FAQ [Randers-Pehrson]
|
||||
- Add a check in configure for stdarg.h, use for gzprintf()
|
||||
- Check that pointers fit in ints when gzprint() compiled old style
|
||||
- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler]
|
||||
- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt]
|
||||
- Add debug records in assembler code [Londer]
|
||||
- Add debug records in assmebler code [Londer]
|
||||
- Update RFC references to use http://tools.ietf.org/html/... [Li]
|
||||
- Add --archs option, use of libtool to configure for Mac OS X [Borstel]
|
||||
|
||||
@@ -665,7 +511,7 @@ Changes in 1.2.3.5 (8 Jan 2010)
|
||||
- Don't use _vsnprintf on later versions of MSVC [Lowman]
|
||||
- Add CMake build script and input file [Lowman]
|
||||
- Update contrib/minizip to 1.1 [Svensson, Vollant]
|
||||
- Moved nintendods directory from contrib to root
|
||||
- Moved nintendods directory from contrib to .
|
||||
- Replace gzio.c with a new set of routines with the same functionality
|
||||
- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
|
||||
- Update contrib/minizip to 1.1b
|
||||
@@ -839,7 +685,7 @@ Changes in 1.2.2.4 (11 July 2005)
|
||||
- Be more strict on incomplete code sets in inflate_table() and increase
|
||||
ENOUGH and MAXD -- this repairs a possible security vulnerability for
|
||||
invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
|
||||
discovering the vulnerability and providing test cases
|
||||
discovering the vulnerability and providing test cases.
|
||||
- Add ia64 support to configure for HP-UX [Smith]
|
||||
- Add error return to gzread() for format or i/o error [Levin]
|
||||
- Use malloc.h for OS/2 [Necasek]
|
||||
@@ -875,7 +721,7 @@ Changes in 1.2.2.2 (30 December 2004)
|
||||
- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
|
||||
- Add updated make_vms.com [Coghlan], update README
|
||||
- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
|
||||
fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html
|
||||
fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.
|
||||
- Add FAQ entry and comments in deflate.c on uninitialized memory access
|
||||
- Add Solaris 9 make options in configure [Gilbert]
|
||||
- Allow strerror() usage in gzio.c for STDC
|
||||
@@ -946,7 +792,7 @@ Changes in 1.2.1.1 (9 January 2004)
|
||||
- Fix a big fat bug in inftrees.c that prevented decoding valid
|
||||
dynamic blocks with only literals and no distance codes --
|
||||
Thanks to "Hot Emu" for the bug report and sample file
|
||||
- Add a note to puff.c on no distance codes case
|
||||
- Add a note to puff.c on no distance codes case.
|
||||
|
||||
Changes in 1.2.1 (17 November 2003)
|
||||
- Remove a tab in contrib/gzappend/gzappend.c
|
||||
@@ -1124,7 +970,7 @@ Changes in 1.2.0.1 (17 March 2003)
|
||||
- Include additional header file on VMS for off_t typedef
|
||||
- Try to use _vsnprintf where it supplants vsprintf [Vollant]
|
||||
- Add some casts in inffast.c
|
||||
- Enhance comments in zlib.h on what happens if gzprintf() tries to
|
||||
- Enchance comments in zlib.h on what happens if gzprintf() tries to
|
||||
write more than 4095 bytes before compression
|
||||
- Remove unused state from inflateBackEnd()
|
||||
- Remove exit(0) from minigzip.c, example.c
|
||||
@@ -1190,14 +1036,14 @@ Changes in 1.2.0 (9 March 2003)
|
||||
- Add contrib/puff/ simple inflate for deflate format description
|
||||
|
||||
Changes in 1.1.4 (11 March 2002)
|
||||
- ZFREE was repeated on same allocation on some error conditions
|
||||
- ZFREE was repeated on same allocation on some error conditions.
|
||||
This creates a security problem described in
|
||||
http://www.zlib.org/advisory-2002-03-11.txt
|
||||
- Returned incorrect error (Z_MEM_ERROR) on some invalid data
|
||||
- Avoid accesses before window for invalid distances with inflate window
|
||||
less than 32K
|
||||
less than 32K.
|
||||
- force windowBits > 8 to avoid a bug in the encoder for a window size
|
||||
of 256 bytes. (A complete fix will be available in 1.1.5)
|
||||
of 256 bytes. (A complete fix will be available in 1.1.5).
|
||||
|
||||
Changes in 1.1.3 (9 July 1998)
|
||||
- fix "an inflate input buffer bug that shows up on rare but persistent
|
||||
@@ -1271,7 +1117,7 @@ Changes in 1.1.1 (27 Feb 98)
|
||||
- remove block truncation heuristic which had very marginal effect for zlib
|
||||
(smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
|
||||
compression ratio on some files. This also allows inlining _tr_tally for
|
||||
matches in deflate_slow
|
||||
matches in deflate_slow.
|
||||
- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
|
||||
|
||||
Changes in 1.1.0 (24 Feb 98)
|
||||
@@ -1302,7 +1148,7 @@ Changes in 1.0.9 (17 Feb 1998)
|
||||
- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
|
||||
- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
|
||||
- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
|
||||
the declaration of FAR (Gilles Vollant)
|
||||
the declaration of FAR (Gilles VOllant)
|
||||
- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
|
||||
- read_buf buf parameter of type Bytef* instead of charf*
|
||||
- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
|
||||
@@ -1316,7 +1162,7 @@ Changes in 1.0.8 (27 Jan 1998)
|
||||
- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
|
||||
- use constant arrays for the static trees in trees.c instead of computing
|
||||
them at run time (thanks to Ken Raeburn for this suggestion). To create
|
||||
trees.h, compile with GEN_TREES_H and run "make test"
|
||||
trees.h, compile with GEN_TREES_H and run "make test".
|
||||
- check return code of example in "make test" and display result
|
||||
- pass minigzip command line options to file_compress
|
||||
- simplifying code of inflateSync to avoid gcc 2.8 bug
|
||||
@@ -1355,12 +1201,12 @@ Changes in 1.0.6 (19 Jan 1998)
|
||||
- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
|
||||
gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
|
||||
- Fix a deflate bug occurring only with compression level 0 (thanks to
|
||||
Andy Buckler for finding this one)
|
||||
- In minigzip, pass transparently also the first byte for .Z files
|
||||
Andy Buckler for finding this one).
|
||||
- In minigzip, pass transparently also the first byte for .Z files.
|
||||
- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
|
||||
- check Z_FINISH in inflate (thanks to Marc Schluper)
|
||||
- Implement deflateCopy (thanks to Adam Costello)
|
||||
- make static libraries by default in configure, add --shared option
|
||||
- make static libraries by default in configure, add --shared option.
|
||||
- move MSDOS or Windows specific files to directory msdos
|
||||
- suppress the notion of partial flush to simplify the interface
|
||||
(but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
|
||||
@@ -1372,7 +1218,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
||||
- added Makefile.nt (thanks to Stephen Williams)
|
||||
- added the unsupported "contrib" directory:
|
||||
contrib/asm386/ by Gilles Vollant <info@winimage.com>
|
||||
386 asm code replacing longest_match()
|
||||
386 asm code replacing longest_match().
|
||||
contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
||||
A C++ I/O streams interface to the zlib gz* functions
|
||||
contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
|
||||
@@ -1380,7 +1226,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
||||
contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
|
||||
A very simple tar.gz file extractor using zlib
|
||||
contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
|
||||
How to use compress(), uncompress() and the gz* functions from VB
|
||||
How to use compress(), uncompress() and the gz* functions from VB.
|
||||
- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
|
||||
level) in minigzip (thanks to Tom Lane)
|
||||
|
||||
@@ -1389,8 +1235,8 @@ Changes in 1.0.6 (19 Jan 1998)
|
||||
- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
|
||||
- add undocumented function zError to convert error code to string
|
||||
(for Tim Smithers)
|
||||
- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code
|
||||
- Use default memcpy for Symantec MSDOS compiler
|
||||
- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
|
||||
- Use default memcpy for Symantec MSDOS compiler.
|
||||
- Add EXPORT keyword for check_func (needed for Windows DLL)
|
||||
- add current directory to LD_LIBRARY_PATH for "make test"
|
||||
- create also a link for libz.so.1
|
||||
@@ -1403,7 +1249,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
||||
- allow compilation with ANSI keywords only enabled for TurboC in large model
|
||||
- avoid "versionString"[0] (Borland bug)
|
||||
- add NEED_DUMMY_RETURN for Borland
|
||||
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch)
|
||||
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
|
||||
- allow compilation with CC
|
||||
- defined STDC for OS/2 (David Charlap)
|
||||
- limit external names to 8 chars for MVS (Thomas Lund)
|
||||
@@ -1413,7 +1259,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
||||
- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
|
||||
- added makelcc.bat for lcc-win32 (Tom St Denis)
|
||||
- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
|
||||
- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion
|
||||
- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
|
||||
- check for unistd.h in configure (for off_t)
|
||||
- remove useless check parameter in inflate_blocks_free
|
||||
- avoid useless assignment of s->check to itself in inflate_blocks_new
|
||||
@@ -1434,7 +1280,7 @@ Changes in 1.0.5 (3 Jan 98)
|
||||
Changes in 1.0.4 (24 Jul 96)
|
||||
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
|
||||
bit, so the decompressor could decompress all the correct data but went
|
||||
on to attempt decompressing extra garbage data. This affected minigzip too
|
||||
on to attempt decompressing extra garbage data. This affected minigzip too.
|
||||
- zlibVersion and gzerror return const char* (needed for DLL)
|
||||
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
|
||||
- use z_error only for DEBUG (avoid problem with DLLs)
|
||||
@@ -1464,7 +1310,7 @@ Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
|
||||
- fix array overlay in deflate.c which sometimes caused bad compressed data
|
||||
- fix inflate bug with empty stored block
|
||||
- fix MSDOS medium model which was broken in 0.99
|
||||
- fix deflateParams() which could generate bad compressed data
|
||||
- fix deflateParams() which could generate bad compressed data.
|
||||
- Bytef is define'd instead of typedef'ed (work around Borland bug)
|
||||
- added an INDEX file
|
||||
- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
|
||||
@@ -1485,7 +1331,7 @@ Changes in 0.99 (27 Jan 96)
|
||||
- allow preset dictionary shared between compressor and decompressor
|
||||
- allow compression level 0 (no compression)
|
||||
- add deflateParams in zlib.h: allow dynamic change of compression level
|
||||
and compression strategy
|
||||
and compression strategy.
|
||||
- test large buffers and deflateParams in example.c
|
||||
- add optional "configure" to build zlib as a shared library
|
||||
- suppress Makefile.qnx, use configure instead
|
||||
@@ -1524,33 +1370,33 @@ Changes in 0.99 (27 Jan 96)
|
||||
- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
|
||||
- in fcalloc, normalize pointer if size > 65520 bytes
|
||||
- don't use special fcalloc for 32 bit Borland C++
|
||||
- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc.
|
||||
- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
|
||||
- use Z_BINARY instead of BINARY
|
||||
- document that gzclose after gzdopen will close the file
|
||||
- allow "a" as mode in gzopen
|
||||
- allow "a" as mode in gzopen.
|
||||
- fix error checking in gzread
|
||||
- allow skipping .gz extra-field on pipes
|
||||
- added reference to Perl interface in README
|
||||
- put the crc table in FAR data (I dislike more and more the medium model :)
|
||||
- added get_crc_table
|
||||
- added a dimension to all arrays (Borland C can't count)
|
||||
- added a dimension to all arrays (Borland C can't count).
|
||||
- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
|
||||
- guard against multiple inclusion of *.h (for precompiled header on Mac)
|
||||
- Watcom C pretends to be Microsoft C small model even in 32 bit mode
|
||||
- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
|
||||
- don't use unsized arrays to avoid silly warnings by Visual C++:
|
||||
warning C4746: 'inflate_mask' : unsized array treated as '__far'
|
||||
(what's wrong with far data in far model?)
|
||||
(what's wrong with far data in far model?).
|
||||
- define enum out of inflate_blocks_state to allow compilation with C++
|
||||
|
||||
Changes in 0.95 (16 Aug 95)
|
||||
- fix MSDOS small and medium model (now easier to adapt to any compiler)
|
||||
- inlined send_bits
|
||||
- fix the final (:-) bug for deflate with flush (output was correct but
|
||||
not completely flushed in rare occasions)
|
||||
not completely flushed in rare occasions).
|
||||
- default window size is same for compression and decompression
|
||||
(it's now sufficient to set MAX_WBITS in zconf.h)
|
||||
(it's now sufficient to set MAX_WBITS in zconf.h).
|
||||
- voidp -> voidpf and voidnp -> voidp (for consistency with other
|
||||
typedefs and because voidnp was not near in large model)
|
||||
typedefs and because voidnp was not near in large model).
|
||||
|
||||
Changes in 0.94 (13 Aug 95)
|
||||
- support MSDOS medium model
|
||||
@@ -1559,12 +1405,12 @@ Changes in 0.94 (13 Aug 95)
|
||||
- added support for VMS
|
||||
- allow a compression level in gzopen()
|
||||
- gzflush now calls fflush
|
||||
- For deflate with flush, flush even if no more input is provided
|
||||
- For deflate with flush, flush even if no more input is provided.
|
||||
- rename libgz.a as libz.a
|
||||
- avoid complex expression in infcodes.c triggering Turbo C bug
|
||||
- work around a problem with gcc on Alpha (in INSERT_STRING)
|
||||
- don't use inline functions (problem with some gcc versions)
|
||||
- allow renaming of Byte, uInt, etc... with #define
|
||||
- allow renaming of Byte, uInt, etc... with #define.
|
||||
- avoid warning about (unused) pointer before start of array in deflate.c
|
||||
- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
|
||||
- avoid reserved word 'new' in trees.c
|
||||
@@ -1583,7 +1429,7 @@ Changes in 0.92 (3 May 95)
|
||||
- no memcpy on Pyramid
|
||||
- suppressed inftest.c
|
||||
- optimized fill_window, put longest_match inline for gcc
|
||||
- optimized inflate on stored blocks
|
||||
- optimized inflate on stored blocks.
|
||||
- untabify all sources to simplify patches
|
||||
|
||||
Changes in 0.91 (2 May 95)
|
||||
@@ -1601,7 +1447,7 @@ Changes in 0.9 (1 May 95)
|
||||
- let again gzread copy uncompressed data unchanged (was working in 0.71)
|
||||
- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
|
||||
- added a test of inflateSync in example.c
|
||||
- moved MAX_WBITS to zconf.h because users might want to change that
|
||||
- moved MAX_WBITS to zconf.h because users might want to change that.
|
||||
- document explicitly that zalloc(64K) on MSDOS must return a normalized
|
||||
pointer (zero offset)
|
||||
- added Makefiles for Microsoft C, Turbo C, Borland C++
|
||||
@@ -1610,7 +1456,7 @@ Changes in 0.9 (1 May 95)
|
||||
Changes in 0.8 (29 April 95)
|
||||
- added fast inflate (inffast.c)
|
||||
- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
|
||||
is incompatible with previous versions of zlib which returned Z_OK
|
||||
is incompatible with previous versions of zlib which returned Z_OK.
|
||||
- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
|
||||
(actually that was not a compiler bug, see 0.81 above)
|
||||
- gzread no longer reads one extra byte in certain cases
|
||||
@@ -1620,50 +1466,50 @@ Changes in 0.8 (29 April 95)
|
||||
|
||||
Changes in 0.71 (14 April 95)
|
||||
- Fixed more MSDOS compilation problems :( There is still a bug with
|
||||
TurboC large model
|
||||
TurboC large model.
|
||||
|
||||
Changes in 0.7 (14 April 95)
|
||||
- Added full inflate support
|
||||
- Added full inflate support.
|
||||
- Simplified the crc32() interface. The pre- and post-conditioning
|
||||
(one's complement) is now done inside crc32(). WARNING: this is
|
||||
incompatible with previous versions; see zlib.h for the new usage
|
||||
incompatible with previous versions; see zlib.h for the new usage.
|
||||
|
||||
Changes in 0.61 (12 April 95)
|
||||
- workaround for a bug in TurboC. example and minigzip now work on MSDOS
|
||||
- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
|
||||
|
||||
Changes in 0.6 (11 April 95)
|
||||
- added minigzip.c
|
||||
- added gzdopen to reopen a file descriptor as gzFile
|
||||
- added transparent reading of non-gziped files in gzread
|
||||
- added transparent reading of non-gziped files in gzread.
|
||||
- fixed bug in gzread (don't read crc as data)
|
||||
- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose)
|
||||
- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
|
||||
- don't allocate big arrays in the stack (for MSDOS)
|
||||
- fix some MSDOS compilation problems
|
||||
|
||||
Changes in 0.5:
|
||||
- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
|
||||
not yet Z_FULL_FLUSH
|
||||
not yet Z_FULL_FLUSH.
|
||||
- support decompression but only in a single step (forced Z_FINISH)
|
||||
- added opaque object for zalloc and zfree
|
||||
- added opaque object for zalloc and zfree.
|
||||
- added deflateReset and inflateReset
|
||||
- added a variable zlib_version for consistency checking
|
||||
- renamed the 'filter' parameter of deflateInit2 as 'strategy'
|
||||
Added Z_FILTERED and Z_HUFFMAN_ONLY constants
|
||||
- added a variable zlib_version for consistency checking.
|
||||
- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
|
||||
Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
|
||||
|
||||
Changes in 0.4:
|
||||
- avoid "zip" everywhere, use zlib instead of ziplib
|
||||
- avoid "zip" everywhere, use zlib instead of ziplib.
|
||||
- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
|
||||
if compression method == 8
|
||||
if compression method == 8.
|
||||
- added adler32 and crc32
|
||||
- renamed deflateOptions as deflateInit2, call one or the other but not both
|
||||
- added the method parameter for deflateInit2
|
||||
- added the method parameter for deflateInit2.
|
||||
- added inflateInit2
|
||||
- simplified considerably deflateInit and inflateInit by not supporting
|
||||
- simplied considerably deflateInit and inflateInit by not supporting
|
||||
user-provided history buffer. This is supported only in deflateInit2
|
||||
and inflateInit2
|
||||
and inflateInit2.
|
||||
|
||||
Changes in 0.3:
|
||||
- prefix all macro names with Z_
|
||||
- use Z_FINISH instead of deflateEnd to finish compression
|
||||
- use Z_FINISH instead of deflateEnd to finish compression.
|
||||
- added Z_HUFFMAN_ONLY
|
||||
- added gzerror()
|
||||
|
||||
+23
-26
@@ -3,8 +3,8 @@
|
||||
|
||||
|
||||
If your question is not there, please check the zlib home page
|
||||
https://zlib.net/ which may have more recent information.
|
||||
The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
http://zlib.net/ which may have more recent information.
|
||||
The lastest zlib FAQ is at http://zlib.net/zlib_faq.html
|
||||
|
||||
|
||||
1. Is zlib Y2K-compliant?
|
||||
@@ -14,12 +14,13 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
2. Where can I get a Windows DLL version?
|
||||
|
||||
The zlib sources can be compiled without change to produce a DLL. See the
|
||||
file win32/DLL_FAQ.txt in the zlib distribution.
|
||||
file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
|
||||
precompiled DLL are found in the zlib web site at http://zlib.net/ .
|
||||
|
||||
3. Where can I get a Visual Basic interface to zlib?
|
||||
|
||||
See
|
||||
* https://zlib.net/nelson/
|
||||
* http://marknelson.us/1997/01/01/zlib-engine/
|
||||
* win32/DLL_FAQ.txt in the zlib distribution
|
||||
|
||||
4. compress() returns Z_BUF_ERROR.
|
||||
@@ -38,7 +39,7 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
made with more input or output space. A Z_BUF_ERROR may in fact be
|
||||
unavoidable depending on how the functions are used, since it is not
|
||||
possible to tell whether or not there is more output pending when
|
||||
strm.avail_out returns with zero. See https://zlib.net/zlib_how.html for a
|
||||
strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a
|
||||
heavily annotated example.
|
||||
|
||||
6. Where's the zlib documentation (man pages, etc.)?
|
||||
@@ -109,8 +110,8 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
|
||||
16. Can zlib decode Flate data in an Adobe PDF file?
|
||||
|
||||
Yes. See https://www.pdflib.com/ . To modify PDF forms, see
|
||||
https://sourceforge.net/projects/acroformtool/ .
|
||||
Yes. See http://www.pdflib.com/ . To modify PDF forms, see
|
||||
http://sourceforge.net/projects/acroformtool/ .
|
||||
|
||||
17. Why am I getting this "register_frame_info not found" error on Solaris?
|
||||
|
||||
@@ -156,10 +157,6 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
library memory allocation routines by default. zlib's *Init* functions
|
||||
allow for the application to provide custom memory allocation routines.
|
||||
|
||||
If the non-default BUILDFIXED or DYNAMIC_CRC_TABLE defines are used on a
|
||||
system without atomics (e.g. pre-C11), then inflate() and crc32() will not
|
||||
be thread safe.
|
||||
|
||||
Of course, you should only operate on any given zlib or gzip stream from a
|
||||
single thread at a time.
|
||||
|
||||
@@ -239,7 +236,7 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
As far as we know, no. In fact, that was originally the whole point behind
|
||||
zlib. Look here for some more information:
|
||||
|
||||
https://web.archive.org/web/20180729212847/http://www.gzip.org/#faq11
|
||||
http://www.gzip.org/#faq11
|
||||
|
||||
32. Can zlib work with greater than 4 GB of data?
|
||||
|
||||
@@ -262,20 +259,20 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
33. Does zlib have any security vulnerabilities?
|
||||
|
||||
The only one that we are aware of is potentially in gzprintf(). If zlib is
|
||||
compiled to use sprintf() or vsprintf(), which requires that ZLIB_INSECURE
|
||||
be defined, then there is no protection against a buffer overflow of an 8K
|
||||
string space (or other value as set by gzbuffer()), other than the caller
|
||||
of gzprintf() assuring that the output will not exceed 8K. On the other
|
||||
hand, if zlib is compiled to use snprintf() or vsnprintf(), which should
|
||||
normally be the case, then there is no vulnerability. The ./configure
|
||||
script will display warnings if an insecure variation of sprintf() will be
|
||||
used by gzprintf(). Also the zlibCompileFlags() function will return
|
||||
information on what variant of sprintf() is used by gzprintf().
|
||||
compiled to use sprintf() or vsprintf(), then there is no protection
|
||||
against a buffer overflow of an 8K string space (or other value as set by
|
||||
gzbuffer()), other than the caller of gzprintf() assuring that the output
|
||||
will not exceed 8K. On the other hand, if zlib is compiled to use
|
||||
snprintf() or vsnprintf(), which should normally be the case, then there is
|
||||
no vulnerability. The ./configure script will display warnings if an
|
||||
insecure variation of sprintf() will be used by gzprintf(). Also the
|
||||
zlibCompileFlags() function will return information on what variant of
|
||||
sprintf() is used by gzprintf().
|
||||
|
||||
If you don't have snprintf() or vsnprintf() and would like one, you can
|
||||
find a good portable implementation in stb_sprintf.h here:
|
||||
find a portable implementation here:
|
||||
|
||||
https://github.com/nothings/stb
|
||||
http://www.ijs.si/software/snprintf/
|
||||
|
||||
Note that you should be using the most recent version of zlib. Versions
|
||||
1.1.3 and before were subject to a double-free vulnerability, and versions
|
||||
@@ -287,7 +284,7 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
Probably what you want is to use zlib in Java. zlib is already included
|
||||
as part of the Java SDK in the java.util.zip package. If you really want
|
||||
a version of zlib written in the Java language, look on the zlib home
|
||||
page for links: https://zlib.net/ .
|
||||
page for links: http://zlib.net/ .
|
||||
|
||||
35. I get this or that compiler or source-code scanner warning when I crank it
|
||||
up to maximally-pedantic. Can't you guys write proper code?
|
||||
@@ -318,9 +315,9 @@ The latest zlib FAQ is at https://zlib.net/zlib_faq.html
|
||||
|
||||
zlib doesn't support encryption. The original PKZIP encryption is very
|
||||
weak and can be broken with freely available programs. To get strong
|
||||
encryption, use GnuPG, https://www.gnupg.org/ , which already includes zlib
|
||||
encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib
|
||||
compression. For PKZIP compatible "encryption", look at
|
||||
https://infozip.sourceforge.net/
|
||||
http://www.info-zip.org/
|
||||
|
||||
39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
|
||||
|
||||
|
||||
+2
-1
@@ -21,11 +21,12 @@ zlib.pc.cmakein zlib.pc template for cmake
|
||||
zlib2ansi perl script to convert source files for C++ compilation
|
||||
|
||||
amiga/ makefiles for Amiga SAS C
|
||||
as400/ makefiles for AS/400
|
||||
doc/ documentation for formats and algorithms
|
||||
msdos/ makefiles for MSDOS
|
||||
nintendods/ makefile for Nintendo DS
|
||||
old/ makefiles for various architectures and zlib documentation
|
||||
files that have not yet been updated for zlib 1.2.x
|
||||
os400/ makefiles for OS/400
|
||||
qnx/ makefiles for QNX
|
||||
watcom/ makefiles for OpenWatcom
|
||||
win32/ makefiles for Windows
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
Copyright notice:
|
||||
|
||||
(C) 1995-2026 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
|
||||
@@ -1,9 +0,0 @@
|
||||
module(
|
||||
name = "zlib",
|
||||
version = "0.0.0",
|
||||
compatibility_level = 1,
|
||||
)
|
||||
|
||||
bazel_dep(name = "platforms", version = "0.0.10")
|
||||
bazel_dep(name = "rules_cc", version = "0.0.16")
|
||||
bazel_dep(name = "rules_license", version = "1.0.0")
|
||||
+42
-58
@@ -1,5 +1,5 @@
|
||||
# Makefile for zlib
|
||||
# Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler
|
||||
# Copyright (C) 1995-2017 Jean-loup Gailly, Mark Adler
|
||||
# For conditions of distribution and use, see copyright notice in zlib.h
|
||||
|
||||
# To compile and test, type:
|
||||
@@ -7,14 +7,16 @@
|
||||
# Normally configure builds both a static and a shared library.
|
||||
# If you want to build just a static library, use: ./configure --static
|
||||
|
||||
# To use the asm code, type:
|
||||
# cp contrib/asm?86/match.S ./match.S
|
||||
# make LOC=-DASMV OBJA=match.o
|
||||
|
||||
# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
|
||||
# make install
|
||||
# To install in $HOME instead of /usr/local, use:
|
||||
# make install prefix=$HOME
|
||||
|
||||
CC=cc
|
||||
GCOV=GCOV
|
||||
LLVM_GCOV_FLAG=LLMV_GCOV_FLAG
|
||||
|
||||
CFLAGS=-O
|
||||
#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
|
||||
@@ -24,14 +26,13 @@ CFLAGS=-O
|
||||
|
||||
SFLAGS=-O
|
||||
LDFLAGS=
|
||||
TEST_LIBS=-L. libz.a
|
||||
TEST_LDFLAGS=-L. libz.a
|
||||
LDSHARED=$(CC)
|
||||
CPP=$(CC) -E
|
||||
VGFMAFLAG=
|
||||
|
||||
STATICLIB=libz.a
|
||||
SHAREDLIB=libz.so
|
||||
SHAREDLIBV=libz.so.1.3.2
|
||||
SHAREDLIBV=libz.so.1.2.11
|
||||
SHAREDLIBM=libz.so.1
|
||||
LIBS=$(STATICLIB) $(SHAREDLIBV)
|
||||
|
||||
@@ -86,12 +87,12 @@ test: all teststatic testshared
|
||||
|
||||
teststatic: static
|
||||
@TMPST=tmpst_$$; \
|
||||
if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST ; then \
|
||||
if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \
|
||||
echo ' *** zlib test OK ***'; \
|
||||
else \
|
||||
echo ' *** zlib test FAILED ***'; false; \
|
||||
fi
|
||||
@rm -f tmpst_$$
|
||||
fi; \
|
||||
rm -f $$TMPST
|
||||
|
||||
testshared: shared
|
||||
@LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
|
||||
@@ -99,32 +100,32 @@ testshared: shared
|
||||
DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \
|
||||
SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \
|
||||
TMPSH=tmpsh_$$; \
|
||||
if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH; then \
|
||||
if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \
|
||||
echo ' *** zlib shared test OK ***'; \
|
||||
else \
|
||||
echo ' *** zlib shared test FAILED ***'; false; \
|
||||
fi
|
||||
@rm -f tmpsh_$$
|
||||
fi; \
|
||||
rm -f $$TMPSH
|
||||
|
||||
test64: all64
|
||||
@TMP64=tmp64_$$; \
|
||||
if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64; then \
|
||||
if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \
|
||||
echo ' *** zlib 64-bit test OK ***'; \
|
||||
else \
|
||||
echo ' *** zlib 64-bit test FAILED ***'; false; \
|
||||
fi
|
||||
@rm -f tmp64_$$
|
||||
fi; \
|
||||
rm -f $$TMP64
|
||||
|
||||
infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h $(SRCDIR)inflate.h $(SRCDIR)inftrees.h
|
||||
$(CC) $(CFLAGS) $(ZINCOUT) -c -coverage -o $@ $(SRCDIR)test/infcover.c
|
||||
infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h
|
||||
$(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c
|
||||
|
||||
infcover: infcover.o libz.a
|
||||
$(CC) $(CFLAGS) -coverage -o $@ infcover.o libz.a
|
||||
$(CC) $(CFLAGS) -o $@ infcover.o libz.a
|
||||
|
||||
cover: infcover
|
||||
rm -f *.gcda
|
||||
${QEMU_RUN} ./infcover
|
||||
${GCOV} ${LLVM_GCOV_FLAG} inf*.c -o ./infcover.gcda
|
||||
./infcover
|
||||
gcov inf*.c
|
||||
|
||||
libz.a: $(OBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||
@@ -161,9 +162,6 @@ adler32.o: $(SRCDIR)adler32.c
|
||||
crc32.o: $(SRCDIR)crc32.c
|
||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c
|
||||
|
||||
crc32_vx.o: $(SRCDIR)contrib/crc32vx/crc32_vx.c
|
||||
$(CC) $(CFLAGS) $(VGFMAFLAG) $(ZINC) -c -o $@ $(SRCDIR)contrib/crc32vx/crc32_vx.c
|
||||
|
||||
deflate.o: $(SRCDIR)deflate.c
|
||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c
|
||||
|
||||
@@ -182,7 +180,7 @@ inftrees.o: $(SRCDIR)inftrees.c
|
||||
trees.o: $(SRCDIR)trees.c
|
||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c
|
||||
|
||||
zutil.o: $(SRCDIR)zutil.c $(SRCDIR)gzguts.h
|
||||
zutil.o: $(SRCDIR)zutil.c
|
||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c
|
||||
|
||||
compress.o: $(SRCDIR)compress.c
|
||||
@@ -214,11 +212,6 @@ crc32.lo: $(SRCDIR)crc32.c
|
||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c
|
||||
-@mv objs/crc32.o $@
|
||||
|
||||
crc32_vx.lo: $(SRCDIR)contrib/crc32vx/crc32_vx.c
|
||||
-@mkdir objs 2>/dev/null || test -d objs
|
||||
$(CC) $(SFLAGS) $(VGFMAFLAG) $(ZINC) -DPIC -c -o objs/crc32_vx.o $(SRCDIR)contrib/crc32vx/crc32_vx.c
|
||||
-@mv objs/crc32_vx.o $@
|
||||
|
||||
deflate.lo: $(SRCDIR)deflate.c
|
||||
-@mkdir objs 2>/dev/null || test -d objs
|
||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c
|
||||
@@ -249,7 +242,7 @@ trees.lo: $(SRCDIR)trees.c
|
||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c
|
||||
-@mv objs/trees.o $@
|
||||
|
||||
zutil.lo: $(SRCDIR)zutil.c $(SRCDIR)gzguts.h
|
||||
zutil.lo: $(SRCDIR)zutil.c
|
||||
-@mkdir objs 2>/dev/null || test -d objs
|
||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/zutil.o $(SRCDIR)zutil.c
|
||||
-@mv objs/zutil.o $@
|
||||
@@ -285,7 +278,7 @@ gzwrite.lo: $(SRCDIR)gzwrite.c
|
||||
-@mv objs/gzwrite.o $@
|
||||
|
||||
|
||||
placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a $(SRCDIR)zlib.map
|
||||
placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a
|
||||
$(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS)
|
||||
rm -f $(SHAREDLIB) $(SHAREDLIBM)
|
||||
ln -s $@ $(SHAREDLIB)
|
||||
@@ -293,22 +286,22 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a $(SRCDIR)zlib.map
|
||||
-@rmdir objs
|
||||
|
||||
example$(EXE): example.o $(STATICLIB)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(TEST_LIBS)
|
||||
$(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS)
|
||||
|
||||
minigzip$(EXE): minigzip.o $(STATICLIB)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(TEST_LIBS)
|
||||
$(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS)
|
||||
|
||||
examplesh$(EXE): example.o $(SHAREDLIBV)
|
||||
$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV)
|
||||
$(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV)
|
||||
|
||||
minigzipsh$(EXE): minigzip.o $(SHAREDLIBV)
|
||||
$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV)
|
||||
$(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV)
|
||||
|
||||
example64$(EXE): example64.o $(STATICLIB)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ example64.o $(TEST_LIBS)
|
||||
$(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS)
|
||||
|
||||
minigzip64$(EXE): minigzip64.o $(STATICLIB)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip64.o $(TEST_LIBS)
|
||||
$(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS)
|
||||
|
||||
install-libs: $(LIBS)
|
||||
-@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi
|
||||
@@ -360,25 +353,18 @@ docs: zlib.3.pdf
|
||||
zlib.3.pdf: $(SRCDIR)zlib.3
|
||||
groff -mandoc -f H -T ps $(SRCDIR)zlib.3 | ps2pdf - $@
|
||||
|
||||
# zconf.h.cmakein: $(SRCDIR)zconf.h.in
|
||||
# -@ TEMPFILE=zconfh_$$; \
|
||||
# echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\
|
||||
# sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\
|
||||
# touch -r $(SRCDIR)zconf.h.in $@ &&\
|
||||
# rm $$TEMPFILE
|
||||
#
|
||||
zconf.h.cmakein: $(SRCDIR)zconf.h.in
|
||||
-@ TEMPFILE=zconfh_$$; \
|
||||
echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\
|
||||
sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\
|
||||
touch -r $(SRCDIR)zconf.h.in $@ &&\
|
||||
rm $$TEMPFILE
|
||||
|
||||
zconf: $(SRCDIR)zconf.h.in
|
||||
cp -p $(SRCDIR)zconf.h.in zconf.h
|
||||
|
||||
minizip-test: static
|
||||
cd contrib/minizip && { CC="$(CC)" CFLAGS="$(CFLAGS)" $(MAKE) test ; cd ../.. ; }
|
||||
|
||||
minizip-clean:
|
||||
cd contrib/minizip && { $(MAKE) clean ; cd ../.. ; }
|
||||
|
||||
mostlyclean: clean
|
||||
clean: minizip-clean
|
||||
clean:
|
||||
rm -f *.o *.lo *~ \
|
||||
example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \
|
||||
example64$(EXE) minigzip64$(EXE) \
|
||||
@@ -390,19 +376,20 @@ clean: minizip-clean
|
||||
rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov
|
||||
|
||||
maintainer-clean: distclean
|
||||
distclean: clean zconf # zconf.h.cmakein
|
||||
distclean: clean zconf zconf.h.cmakein docs
|
||||
rm -f Makefile zlib.pc configure.log
|
||||
-@rm -f .DS_Store
|
||||
@if [ -f Makefile.in ]; then \
|
||||
printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \
|
||||
printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \
|
||||
touch -r $(SRCDIR)Makefile.in Makefile ; fi
|
||||
@if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi
|
||||
@if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi
|
||||
|
||||
tags:
|
||||
etags $(SRCDIR)*.[ch]
|
||||
|
||||
adler32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
|
||||
zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h
|
||||
adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
|
||||
gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h
|
||||
compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h
|
||||
crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h
|
||||
@@ -411,10 +398,8 @@ infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.
|
||||
inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h
|
||||
inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h
|
||||
trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h
|
||||
crc32_vx.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)contrib/crc32vx/crc32_vx_hooks.h
|
||||
|
||||
adler32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
|
||||
zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h
|
||||
adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
|
||||
gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h
|
||||
compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h
|
||||
crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h
|
||||
@@ -423,4 +408,3 @@ infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftree
|
||||
inffast.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h
|
||||
inftrees.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h
|
||||
trees.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h
|
||||
crc32_vx.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)contrib/crc32vx/crc32_vx_hooks.h
|
||||
+22
-22
@@ -1,10 +1,10 @@
|
||||
ZLIB DATA COMPRESSION LIBRARY
|
||||
|
||||
zlib 1.3.2 is a general purpose data compression library. All the code is
|
||||
thread safe (though see the FAQ for caveats). The data format used by the zlib
|
||||
library is described by RFCs (Request for Comments) 1950 to 1952 at
|
||||
https://datatracker.ietf.org/doc/html/rfc1950 (zlib format), rfc1951 (deflate
|
||||
format) and rfc1952 (gzip format).
|
||||
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://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
||||
rfc1952 (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). A usage example
|
||||
@@ -21,31 +21,32 @@ make_vms.com.
|
||||
|
||||
Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
|
||||
<info@winimage.com> for the Windows DLL version. The zlib home page is
|
||||
https://zlib.net/ . Before reporting a problem, please check this site to
|
||||
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 the zlib FAQ https://zlib.net/zlib_faq.html before asking for help.
|
||||
PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
|
||||
|
||||
Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
||||
issue of Dr. Dobb's Journal; a copy of the article is available at
|
||||
https://zlib.net/nelson/ .
|
||||
http://marknelson.us/1997/01/01/zlib-engine/ .
|
||||
|
||||
The changes made in version 1.3.2 are documented in the file ChangeLog.
|
||||
The changes made in version 1.2.11 are documented in the file ChangeLog.
|
||||
|
||||
Unsupported third party contributions are provided in directory contrib/ .
|
||||
|
||||
zlib is available in Java using the java.util.zip package. Follow the API
|
||||
Documentation link at: https://docs.oracle.com/search/?q=java.util.zip .
|
||||
zlib is available in Java using the java.util.zip package, documented at
|
||||
http://java.sun.com/developer/technicalArticles/Programming/compression/ .
|
||||
|
||||
A Perl interface to zlib and bzip2 written by Paul Marquess <pmqs@cpan.org>
|
||||
can be found at https://github.com/pmqs/IO-Compress .
|
||||
A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available
|
||||
at CPAN (Comprehensive Perl Archive Network) sites, including
|
||||
http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
|
||||
|
||||
A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
|
||||
available in Python 1.5 and later versions, see
|
||||
https://docs.python.org/3/library/zlib.html .
|
||||
http://docs.python.org/library/zlib.html .
|
||||
|
||||
zlib is built into tcl: https://wiki.tcl-lang.org/page/zlib .
|
||||
zlib is built into tcl: http://wiki.tcl.tk/4610 .
|
||||
|
||||
An experimental package to read and write files in .zip format, written on top
|
||||
of zlib by Gilles Vollant <info@winimage.com>, is available in the
|
||||
@@ -63,13 +64,15 @@ Notes for some targets:
|
||||
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
|
||||
when compiled with cc.
|
||||
|
||||
- On Digital Unix 4.0D (formerly OSF/1) on AlphaServer, the cc option -std1 is
|
||||
- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
|
||||
necessary to get gzprintf working correctly. This is done by configure.
|
||||
|
||||
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
|
||||
other compilers. Use "make test" to check your compiler.
|
||||
|
||||
- For PalmOs, see https://palmzlib.sourceforge.net/
|
||||
- gzdopen is not supported on RISCOS or BEOS.
|
||||
|
||||
- For PalmOs, see http://palmzlib.sourceforge.net/
|
||||
|
||||
|
||||
Acknowledgments:
|
||||
@@ -81,7 +84,7 @@ Acknowledgments:
|
||||
|
||||
Copyright notice:
|
||||
|
||||
(C) 1995-2026 Jean-loup Gailly and Mark Adler
|
||||
(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
|
||||
@@ -105,10 +108,7 @@ Copyright notice:
|
||||
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. We make all
|
||||
contributions to and distributions of this project solely in our personal
|
||||
capacity, and are not conveying any rights to any intellectual property of
|
||||
any third parties.
|
||||
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
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
# For building with cmake at least version 3.12 (minizip 3.12) is needed
|
||||
|
||||
In most cases the usual
|
||||
|
||||
cmake -S . -B build -D CMAKE_BUILD_TYPE=Release
|
||||
|
||||
will create everything you need, however if you want something off default you can adjust several options fit your needs.
|
||||
Every option is list below (excluding the cmake-standard options), they can be set via cmake-gui or on cmdline with
|
||||
|
||||
-D<option>=ON/OFF
|
||||
|
||||
## ZLIB-options with defaults ##
|
||||
|
||||
ZLIB_BUILD_TESTING=ON -- Enable Zlib Examples as tests
|
||||
|
||||
ZLIB_BUILD_SHARED=ON -- Enable building zlib shared library
|
||||
|
||||
ZLIB_BUILD_STATIC=ON -- Enable building zlib static library
|
||||
|
||||
ZLIB_BUILD_MINIZIP=ON -- Enable building libminizip contrib library
|
||||
|
||||
If this option is turned on, additional options are available from minizip (see below)
|
||||
|
||||
ZLIB_INSTALL=ON -- Enable installation of zlib
|
||||
|
||||
ZLIB_PREFIX=OFF -- prefix for all types and library functions, see zconf.h.in
|
||||
|
||||
This option is only on windows available and may/will be turned off and removed somewhen in the future.
|
||||
If you rely cmake for finding and using zlib, this can be turned off, as `zlib1.dll` will never be used.
|
||||
|
||||
## minizip-options with defaults ##
|
||||
|
||||
MINIZIP_BUILD_SHARED=ON -- Enable building minizip shared library
|
||||
|
||||
MINIZIP_BUILD_STATIC=ON -- Enable building minizip static library
|
||||
|
||||
MINIZIP_BUILD_TESTING=ON -- Enable testing of minizip
|
||||
|
||||
MINIZIP_ENABLE_BZIP2=ON -- Build minizip withj bzip2 support
|
||||
|
||||
A usable installation of bzip2 is needed or config will fail. Turn this option of in this case.
|
||||
|
||||
MINIZIP_INSTALL=ON -- Enable installation of minizip
|
||||
|
||||
This option is only available on mingw as they tend to name this lib different. Maybe this will also be
|
||||
removed in the future as. If you rely cmake for finding and using zlib, this can be turned off, as
|
||||
the other file will never be used.
|
||||
|
||||
## Using the libs ##
|
||||
|
||||
To pull in what you need it's enough to just write
|
||||
|
||||
find_package(ZLIB CONFIG)
|
||||
|
||||
or
|
||||
|
||||
find_package(minizip CONFIG)
|
||||
|
||||
in your CMakeLists.txt, however it is advised to specify what you really want via:
|
||||
|
||||
find_package(ZLIB CONFIG COMPONENTS shared static REQUIRED)
|
||||
|
||||
or
|
||||
|
||||
find_package(minizip CONFIG COMPONENTS shared static REQUIRED)
|
||||
|
||||
As it's possible to only build the shared or the static lib, you can make sure that everything you need
|
||||
is found. If no COMPONENTS are requested, everything needs to be found to satisfy your request. If the
|
||||
libraries are optional in you project, you can omit the REQUIRED and check yourself if the targets you
|
||||
want to link against are created.
|
||||
|
||||
When you search for minizip, it will search zlib for you, so only one of both is needed.
|
||||
|
||||
## Imported targets ##
|
||||
|
||||
When found the following targets are created for you:
|
||||
|
||||
ZLIB::ZLIB and ZLIB::ZLIBSTATIC -- for zlib
|
||||
MINIZIP::minizip and MINIZIP::minizipstatic -- for minizip
|
||||
+27
-5
@@ -7,6 +7,8 @@
|
||||
|
||||
#include "zutil.h"
|
||||
|
||||
local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
|
||||
|
||||
#define BASE 65521U /* largest prime smaller than 65536 */
|
||||
#define NMAX 5552
|
||||
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
|
||||
@@ -58,7 +60,11 @@
|
||||
#endif
|
||||
|
||||
/* ========================================================================= */
|
||||
uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
|
||||
uLong ZEXPORT adler32_z(adler, buf, len)
|
||||
uLong adler;
|
||||
const Bytef *buf;
|
||||
z_size_t len;
|
||||
{
|
||||
unsigned long sum2;
|
||||
unsigned n;
|
||||
|
||||
@@ -125,12 +131,20 @@ uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) {
|
||||
uLong ZEXPORT adler32(adler, buf, len)
|
||||
uLong adler;
|
||||
const Bytef *buf;
|
||||
uInt len;
|
||||
{
|
||||
return adler32_z(adler, buf, len);
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) {
|
||||
local uLong adler32_combine_(adler1, adler2, len2)
|
||||
uLong adler1;
|
||||
uLong adler2;
|
||||
z_off64_t len2;
|
||||
{
|
||||
unsigned long sum1;
|
||||
unsigned long sum2;
|
||||
unsigned rem;
|
||||
@@ -155,10 +169,18 @@ local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) {
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) {
|
||||
uLong ZEXPORT adler32_combine(adler1, adler2, len2)
|
||||
uLong adler1;
|
||||
uLong adler2;
|
||||
z_off_t len2;
|
||||
{
|
||||
return adler32_combine_(adler1, adler2, len2);
|
||||
}
|
||||
|
||||
uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) {
|
||||
uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
|
||||
uLong adler1;
|
||||
uLong adler2;
|
||||
z_off64_t len2;
|
||||
{
|
||||
return adler32_combine_(adler1, adler2, len2);
|
||||
}
|
||||
|
||||
+24
-37
@@ -1,5 +1,5 @@
|
||||
/* compress.c -- compress a memory buffer
|
||||
* Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler
|
||||
* Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -18,19 +18,18 @@
|
||||
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.
|
||||
|
||||
The _z versions of the functions take size_t length arguments.
|
||||
*/
|
||||
int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
|
||||
z_size_t sourceLen, int level) {
|
||||
int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
|
||||
Bytef *dest;
|
||||
uLongf *destLen;
|
||||
const Bytef *source;
|
||||
uLong sourceLen;
|
||||
int level;
|
||||
{
|
||||
z_stream stream;
|
||||
int err;
|
||||
const uInt max = (uInt)-1;
|
||||
z_size_t left;
|
||||
|
||||
if ((sourceLen > 0 && source == NULL) ||
|
||||
destLen == NULL || (*destLen > 0 && dest == NULL))
|
||||
return Z_STREAM_ERROR;
|
||||
uLong left;
|
||||
|
||||
left = *destLen;
|
||||
*destLen = 0;
|
||||
@@ -49,38 +48,29 @@ int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
|
||||
|
||||
do {
|
||||
if (stream.avail_out == 0) {
|
||||
stream.avail_out = left > (z_size_t)max ? max : (uInt)left;
|
||||
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
||||
left -= stream.avail_out;
|
||||
}
|
||||
if (stream.avail_in == 0) {
|
||||
stream.avail_in = sourceLen > (z_size_t)max ? max :
|
||||
(uInt)sourceLen;
|
||||
stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
|
||||
sourceLen -= stream.avail_in;
|
||||
}
|
||||
err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
|
||||
} while (err == Z_OK);
|
||||
|
||||
*destLen = (z_size_t)(stream.next_out - dest);
|
||||
*destLen = stream.total_out;
|
||||
deflateEnd(&stream);
|
||||
return err == Z_STREAM_END ? Z_OK : err;
|
||||
}
|
||||
int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||
uLong sourceLen, int level) {
|
||||
int ret;
|
||||
z_size_t got = *destLen;
|
||||
ret = compress2_z(dest, &got, source, sourceLen, level);
|
||||
*destLen = (uLong)got;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
*/
|
||||
int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen, const Bytef *source,
|
||||
z_size_t sourceLen) {
|
||||
return compress2_z(dest, destLen, source, sourceLen,
|
||||
Z_DEFAULT_COMPRESSION);
|
||||
}
|
||||
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||
uLong sourceLen) {
|
||||
int ZEXPORT compress (dest, destLen, source, sourceLen)
|
||||
Bytef *dest;
|
||||
uLongf *destLen;
|
||||
const Bytef *source;
|
||||
uLong sourceLen;
|
||||
{
|
||||
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
||||
}
|
||||
|
||||
@@ -88,12 +78,9 @@ int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||
If the default memLevel or windowBits for deflateInit() is changed, then
|
||||
this function needs to be updated.
|
||||
*/
|
||||
z_size_t ZEXPORT compressBound_z(z_size_t sourceLen) {
|
||||
z_size_t bound = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
||||
(sourceLen >> 25) + 13;
|
||||
return bound < sourceLen ? (z_size_t)-1 : bound;
|
||||
}
|
||||
uLong ZEXPORT compressBound(uLong sourceLen) {
|
||||
z_size_t bound = compressBound_z(sourceLen);
|
||||
return (uLong)bound != bound ? (uLong)-1 : (uLong)bound;
|
||||
uLong ZEXPORT compressBound (sourceLen)
|
||||
uLong sourceLen;
|
||||
{
|
||||
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
||||
(sourceLen >> 25) + 13;
|
||||
}
|
||||
|
||||
Vendored
+114
-271
@@ -25,18 +25,15 @@ if test $SRCDIR = "."; then
|
||||
ZINCOUT="-I."
|
||||
SRCDIR=""
|
||||
else
|
||||
ZINC='-I. -include zconf.h'
|
||||
ZINC='-include zconf.h'
|
||||
ZINCOUT='-I. -I$(SRCDIR)'
|
||||
SRCDIR="$SRCDIR/"
|
||||
fi
|
||||
|
||||
# set command prefix for cross-compilation
|
||||
if [ -n "${CHOST}" ]; then
|
||||
uname=${CHOST}
|
||||
mname=${CHOST}
|
||||
uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`"
|
||||
CROSS_PREFIX="${CHOST}-"
|
||||
else
|
||||
mname=`(uname -a || echo unknown) 2>/dev/null`
|
||||
fi
|
||||
|
||||
# destination name for static library
|
||||
@@ -44,8 +41,9 @@ STATICLIB=libz.a
|
||||
|
||||
# extract zlib version numbers from zlib.h
|
||||
VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}zlib.h`
|
||||
VER3=`echo ${VER}|sed -n -e 's/\([0-9]\{1,\}\(\\.[0-9]\{1,\}\)\{1,2\}\).*/\1/p'`
|
||||
VER1=`echo ${VER}|sed -n -e 's/\([0-9]\{1,\}\)\\..*/\1/p'`
|
||||
VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < ${SRCDIR}zlib.h`
|
||||
VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h`
|
||||
VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h`
|
||||
|
||||
# establish commands for library building
|
||||
if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then
|
||||
@@ -87,15 +85,8 @@ zprefix=0
|
||||
zconst=0
|
||||
build64=0
|
||||
gcc=0
|
||||
clang=0
|
||||
warn=0
|
||||
debug=0
|
||||
address=0
|
||||
memory=0
|
||||
undefined=0
|
||||
insecure=0
|
||||
unknown=0
|
||||
enable_crcvx=1
|
||||
old_cc="$CC"
|
||||
old_cflags="$CFLAGS"
|
||||
OBJC='$(OBJZ) $(OBJG)'
|
||||
@@ -107,7 +98,7 @@ leave()
|
||||
if test "$*" != "0"; then
|
||||
echo "** $0 aborting." | tee -a configure.log
|
||||
fi
|
||||
rm -rf $test.[co] $test $test$shared_ext $test.gcno $test.dSYM ./--version
|
||||
rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version
|
||||
echo -------------------- >> configure.log
|
||||
echo >> configure.log
|
||||
echo >> configure.log
|
||||
@@ -121,49 +112,37 @@ case "$1" in
|
||||
-h* | --help)
|
||||
echo 'usage:' | tee -a configure.log
|
||||
echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log
|
||||
echo ' [--insecure] [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log
|
||||
echo ' [--includedir=INCLUDEDIR] [--mandir=MANDIR]' | tee -a configure.log
|
||||
echo ' [--archs="-arch i386 -arch x86_64"] [--disable-crcvx]' | tee -a configure.log
|
||||
echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log
|
||||
echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log
|
||||
exit 0 ;;
|
||||
-p*=* | --prefix=*) prefix=`echo $1 | sed 's/[^=]*=//'`; shift ;;
|
||||
-e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/[^=]*=//'`; shift ;;
|
||||
-l*=* | --libdir=*) libdir=`echo $1 | sed 's/[^=]*=//'`; shift ;;
|
||||
--sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/[^=]*=//'`; shift ;;
|
||||
-i*=* | --includedir=*) includedir=`echo $1 | sed 's/[^=]*=//'`;shift ;;
|
||||
-m*=* | --mandir=*) mandir=`echo $1 | sed 's/[^=]*=//'`;shift ;;
|
||||
-u*=* | --uname=*) uname=`echo $1 | sed 's/[^=]*=//'`;shift ;;
|
||||
-p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;;
|
||||
-e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;;
|
||||
-l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;;
|
||||
--sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;;
|
||||
-i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;;
|
||||
-u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;;
|
||||
-p* | --prefix) prefix="$2"; shift; shift ;;
|
||||
-e* | --eprefix) exec_prefix="$2"; shift; shift ;;
|
||||
-l* | --libdir) libdir="$2"; shift; shift ;;
|
||||
--sharedlibdir) sharedlibdir="$2"; shift; shift ;;
|
||||
-i* | --includedir) includedir="$2"; shift; shift ;;
|
||||
-m* | --mandir) mandir="$2"; shift; shift ;;
|
||||
-u* | --uname) uname="$2"; shift; shift ;;
|
||||
-s* | --shared | --enable-shared) shared=1; shift ;;
|
||||
-t | --static | --disable-shared) shared=0; shift ;;
|
||||
-t | --static) shared=0; shift ;;
|
||||
--solo) solo=1; shift ;;
|
||||
--cover) cover=1; shift ;;
|
||||
-z* | --zprefix) zprefix=1; shift ;;
|
||||
-6* | --64) build64=1; shift ;;
|
||||
-a*=* | --archs=*) ARCHS=`echo $1 | sed 's/[^=]*=//'`; shift ;;
|
||||
-a* | --archs) ARCHS="$2"; shift; shift ;;
|
||||
-a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;;
|
||||
--sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;;
|
||||
--localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;;
|
||||
-c* | --const) zconst=1; shift ;;
|
||||
-w* | --warn) warn=$((warn + 1)); shift ;;
|
||||
-w* | --warn) warn=1; shift ;;
|
||||
-d* | --debug) debug=1; shift ;;
|
||||
--sanitize) address=1; shift ;;
|
||||
--address) address=1; shift ;;
|
||||
--memory) memory=1; shift ;;
|
||||
--undefined) undefined=1; shift ;;
|
||||
--insecure) insecure=1; shift ;;
|
||||
--disable-crcvx) enable_crcvx=0; shift ;;
|
||||
*) unknown=1; echo "unknown option ignored: $1" | tee -a configure.log; shift;;
|
||||
*)
|
||||
echo "unknown option: $1" | tee -a configure.log
|
||||
echo "$0 --help for help" | tee -a configure.log
|
||||
leave 1;;
|
||||
esac
|
||||
done
|
||||
if test $unknown -eq 1; then
|
||||
echo "$0 --help for help" | tee -a configure.log
|
||||
fi
|
||||
|
||||
# temporary file name
|
||||
test=ztest$$
|
||||
@@ -186,101 +165,40 @@ extern int getchar();
|
||||
int hello() {return getchar();}
|
||||
EOF
|
||||
|
||||
if test -z "$CC"; then
|
||||
echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
|
||||
if ${CROSS_PREFIX}gcc -v >/dev/null 2>&1; then
|
||||
cc=${CROSS_PREFIX}gcc
|
||||
else
|
||||
cc=${CROSS_PREFIX}cc
|
||||
fi
|
||||
else
|
||||
cc=${CC}
|
||||
fi
|
||||
|
||||
test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
|
||||
cc=${CC-${CROSS_PREFIX}gcc}
|
||||
cflags=${CFLAGS-"-O3"}
|
||||
# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
|
||||
case "$cc" in
|
||||
*gcc*) gcc=1
|
||||
GCOV="gcov" ;;
|
||||
*clang*) gcc=1
|
||||
clang=1 ;;
|
||||
*gcc*) gcc=1 ;;
|
||||
*clang*) gcc=1 ;;
|
||||
esac
|
||||
case `$cc -v 2>&1` in
|
||||
*gcc*) gcc=1
|
||||
GCOV="gcov" ;;
|
||||
*clang*) gcc=1
|
||||
clang=1 ;;
|
||||
*gcc*) gcc=1 ;;
|
||||
*clang*) gcc=1 ;;
|
||||
esac
|
||||
|
||||
if test $cover -eq 1; then
|
||||
if test "$clang" -eq 1; then
|
||||
if test "$cc" = "clang"; then
|
||||
if command -v llvm-cov >/dev/null 2>&1; then
|
||||
GCOV="llvm-cov"
|
||||
LLVM_GCOV_FLAG="gcov"
|
||||
GCOV="llvm-cov"
|
||||
LLVM_GCOV_FLAG="gcov"
|
||||
echo "Using ${GCOV} for coverage"
|
||||
else
|
||||
cover=0
|
||||
GCOV=""
|
||||
LLVM_GCOV_FLAG=""
|
||||
echo "Deactivating cover as no suitable gcov can be found"
|
||||
fi
|
||||
else
|
||||
clangV=`echo "$cc" | sed -e 's/^.*-//'`
|
||||
if command -v llvm-cov-${clangV} >/dev/null 2>&1; then
|
||||
GCOV="llvm-cov-${clangV}"
|
||||
LLVM_GCOV_FLAG="gcov"
|
||||
echo "Using ${GCOV} for coverage"
|
||||
else
|
||||
cover=0
|
||||
GCOV=""
|
||||
LLVM_GCOV_FLAG=""
|
||||
echo "Deactivating cover as no suitable gcov can be found"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
show $cc -c $test.c
|
||||
if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then
|
||||
echo ... using gcc >> configure.log
|
||||
CC="$cc"
|
||||
CFLAGS="${CFLAGS--O3} -fPIC"
|
||||
SFLAGS="${CFLAGS--O3}"
|
||||
CFLAGS="${CFLAGS--O3}"
|
||||
SFLAGS="${CFLAGS--O3} -fPIC"
|
||||
if test "$ARCHS"; then
|
||||
CFLAGS="${CFLAGS} ${ARCHS}"
|
||||
SFLAGS="${SFLAGS} ${ARCHS}"
|
||||
LDFLAGS="${LDFLAGS} ${ARCHS}"
|
||||
fi
|
||||
if test $build64 -eq 1; then
|
||||
CFLAGS="${CFLAGS} -m64"
|
||||
SFLAGS="${SFLAGS} -m64"
|
||||
fi
|
||||
if test "$warn" -ge 1; then
|
||||
CFLAGS="${CFLAGS} -Wall -Wextra"
|
||||
if test "$warn" -ge 2; then
|
||||
CFLAGS="${CFLAGS} -Wconversion -Wshadow -Wundef"
|
||||
if test "$warn" -eq 1; then
|
||||
if test "$zconst" -eq 1; then
|
||||
CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST"
|
||||
else
|
||||
CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"
|
||||
fi
|
||||
fi
|
||||
if test "$zconst" -eq 1; then
|
||||
if test "$warn" -ge 1; then
|
||||
CFLAGS="${CFLAGS} -Wcast-qual"
|
||||
fi
|
||||
CFLAGS="${CFLAGS} -DZLIB_CONST"
|
||||
fi
|
||||
if test $address -eq 1; then
|
||||
CFLAGS="${CFLAGS} -g -fsanitize=address -fno-omit-frame-pointer"
|
||||
fi
|
||||
if test $memory -eq 1; then
|
||||
CFLAGS="${CFLAGS} -g -fsanitize=memory -fno-omit-frame-pointer"
|
||||
fi
|
||||
if test $undefined -eq 1; then
|
||||
CFLAGS="${CFLAGS} -g -fsanitize=undefined -fno-omit-frame-pointer"
|
||||
fi
|
||||
if test $insecure -eq 1; then
|
||||
CFLAGS="${CFLAGS} -DZLIB_INSECURE"
|
||||
SFLAGS="${SFLAGS} -DZLIB_INSECURE"
|
||||
fi
|
||||
if test $debug -eq 1; then
|
||||
CFLAGS="${CFLAGS} -DZLIB_DEBUG"
|
||||
SFLAGS="${SFLAGS} -DZLIB_DEBUG"
|
||||
@@ -289,55 +207,47 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then
|
||||
uname=`(uname -s || echo unknown) 2>/dev/null`
|
||||
fi
|
||||
case "$uname" in
|
||||
Linux* | linux* | *-linux* | GNU | GNU/* | solaris* | Haiku)
|
||||
case "$mname" in
|
||||
*sparc*)
|
||||
LDFLAGS="${LDFLAGS} -Wl,--no-warn-rwx-segments" ;;
|
||||
esac
|
||||
Linux* | linux* | GNU | GNU/* | solaris*)
|
||||
LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} ;;
|
||||
*BSD | *bsd* | DragonFly)
|
||||
LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"}
|
||||
LDCONFIG="ldconfig -m" ;;
|
||||
CYGWIN* | Cygwin* | cygwin* | *-cygwin* | OS/2*)
|
||||
CYGWIN* | Cygwin* | cygwin* | OS/2*)
|
||||
EXE='.exe' ;;
|
||||
MINGW* | mingw* | *-mingw*)
|
||||
MINGW* | mingw*)
|
||||
# temporary bypass
|
||||
rm -f $test.[co] $test $test$shared_ext
|
||||
echo "If this doesn't work for you, try win32/Makefile.gcc." | tee -a configure.log
|
||||
echo "Please use win32/Makefile.gcc instead." | tee -a configure.log
|
||||
leave 1
|
||||
LDSHARED=${LDSHARED-"$cc -shared"}
|
||||
LDSHAREDLIBC=""
|
||||
EXE='.exe' ;;
|
||||
QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4
|
||||
# (alain.bonnefoy@icbt.com)
|
||||
LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;;
|
||||
QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4
|
||||
# (alain.bonnefoy@icbt.com)
|
||||
LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;;
|
||||
HP-UX*)
|
||||
LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"}
|
||||
case `(uname -m || echo unknown) 2>/dev/null` in
|
||||
ia64)
|
||||
shared_ext='.so'
|
||||
SHAREDLIB='libz.so' ;;
|
||||
*)
|
||||
shared_ext='.sl'
|
||||
SHAREDLIB='libz.sl' ;;
|
||||
esac ;;
|
||||
AIX*)
|
||||
LDSHARED=${LDSHARED-"$cc -shared"}
|
||||
LDFLAGS="${LDFLAGS} -Wl,-brtl" ;;
|
||||
Darwin* | darwin* | *-darwin*)
|
||||
shared_ext='.dylib'
|
||||
SHAREDLIB=libz$shared_ext
|
||||
SHAREDLIBV=libz.$VER$shared_ext
|
||||
SHAREDLIBM=libz.$VER1$shared_ext
|
||||
LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"}
|
||||
if "${CROSS_PREFIX}libtool" -V 2>&1 | grep Apple > /dev/null; then
|
||||
AR="${CROSS_PREFIX}libtool"
|
||||
elif libtool -V 2>&1 | grep Apple > /dev/null; then
|
||||
AR="libtool"
|
||||
else
|
||||
AR="/usr/bin/libtool"
|
||||
fi
|
||||
ARFLAGS="-o" ;;
|
||||
*)
|
||||
LDSHARED=${LDSHARED-"$cc -shared"} ;;
|
||||
LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"}
|
||||
case `(uname -m || echo unknown) 2>/dev/null` in
|
||||
ia64)
|
||||
shared_ext='.so'
|
||||
SHAREDLIB='libz.so' ;;
|
||||
*)
|
||||
shared_ext='.sl'
|
||||
SHAREDLIB='libz.sl' ;;
|
||||
esac ;;
|
||||
Darwin* | darwin*)
|
||||
shared_ext='.dylib'
|
||||
SHAREDLIB=libz$shared_ext
|
||||
SHAREDLIBV=libz.$VER$shared_ext
|
||||
SHAREDLIBM=libz.$VER1$shared_ext
|
||||
LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"}
|
||||
if libtool -V 2>&1 | grep Apple > /dev/null; then
|
||||
AR="libtool"
|
||||
else
|
||||
AR="/usr/bin/libtool"
|
||||
fi
|
||||
ARFLAGS="-o" ;;
|
||||
*) LDSHARED=${LDSHARED-"$cc -shared"} ;;
|
||||
esac
|
||||
else
|
||||
# find system name and corresponding cc options
|
||||
@@ -426,12 +336,7 @@ else
|
||||
AIX*) # Courtesy of dbakker@arrayasolutions.com
|
||||
SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
|
||||
CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
|
||||
LDSHARED=${LDSHARED-"xlc -G"}
|
||||
if test $build64 -eq 1; then
|
||||
CFLAGS="${CFLAGS} -q64"
|
||||
SFLAGS="${SFLAGS} -q64"
|
||||
ARFLAGS="-X64 ${ARFLAGS}"
|
||||
fi ;;
|
||||
LDSHARED=${LDSHARED-"xlc -G"} ;;
|
||||
# send working options for other systems to zlib@gzip.org
|
||||
*) SFLAGS=${CFLAGS-"-O"}
|
||||
CFLAGS=${CFLAGS-"-O"}
|
||||
@@ -462,11 +367,8 @@ else
|
||||
try()
|
||||
{
|
||||
show $*
|
||||
got=`( $* ) 2>&1`
|
||||
( $* ) >> configure.log 2>&1
|
||||
ret=$?
|
||||
if test "$got" != ""; then
|
||||
printf "%s\n" "$got" >> configure.log
|
||||
fi
|
||||
if test $ret -ne 0; then
|
||||
echo "(exit code "$ret")" >> configure.log
|
||||
fi
|
||||
@@ -479,11 +381,8 @@ tryboth()
|
||||
show $*
|
||||
got=`( $* ) 2>&1`
|
||||
ret=$?
|
||||
if test "$got" != ""; then
|
||||
printf "%s\n" "$got" >> configure.log
|
||||
fi
|
||||
printf %s "$got" >> configure.log
|
||||
if test $ret -ne 0; then
|
||||
echo "(exit code "$ret")" >> configure.log
|
||||
return $ret
|
||||
fi
|
||||
test "$got" = ""
|
||||
@@ -492,13 +391,6 @@ tryboth()
|
||||
cat > $test.c << EOF
|
||||
int foo() { return 0; }
|
||||
EOF
|
||||
echo "Checking for compiler..." >> configure.log
|
||||
if try $CC -c $test.c; then
|
||||
:
|
||||
else
|
||||
echo "Missing or broken C compiler." | tee -a configure.log
|
||||
leave 1
|
||||
fi
|
||||
echo "Checking for obsessive-compulsive compiler options..." >> configure.log
|
||||
if try $CC -c $CFLAGS $test.c; then
|
||||
:
|
||||
@@ -517,8 +409,8 @@ EOF
|
||||
if test $shared -eq 1; then
|
||||
echo Checking for shared library support... | tee -a configure.log
|
||||
# we must test in two steps (cc then ld), required at least on SunOS 4.x
|
||||
if try $CC -c $SFLAGS $test.c &&
|
||||
try $LDSHARED $SFLAGS $LDFLAGS -o $test$shared_ext $test.o; then
|
||||
if try $CC -w -c $SFLAGS $test.c &&
|
||||
try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then
|
||||
echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log
|
||||
elif test -z "$old_cc" -a -z "$old_cflags"; then
|
||||
echo No shared library support. | tee -a configure.log
|
||||
@@ -541,6 +433,20 @@ else
|
||||
TEST="all teststatic testshared"
|
||||
fi
|
||||
|
||||
# check for underscores in external names for use by assembler code
|
||||
CPP=${CPP-"$CC -E"}
|
||||
case $CFLAGS in
|
||||
*ASMV*)
|
||||
echo >> configure.log
|
||||
show "$NM $test.o | grep _hello"
|
||||
if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then
|
||||
CPP="$CPP -DNO_UNDERLINE"
|
||||
echo Checking for underline in external names... No. | tee -a configure.log
|
||||
else
|
||||
echo Checking for underline in external names... Yes. | tee -a configure.log
|
||||
fi ;;
|
||||
esac
|
||||
|
||||
echo >> configure.log
|
||||
|
||||
# check for size_t
|
||||
@@ -551,11 +457,17 @@ size_t dummy = 0;
|
||||
EOF
|
||||
if try $CC -c $CFLAGS $test.c; then
|
||||
echo "Checking for size_t... Yes." | tee -a configure.log
|
||||
need_sizet=0
|
||||
else
|
||||
echo "Checking for size_t... No." | tee -a configure.log
|
||||
# find a size_t integer type
|
||||
# check for long long
|
||||
cat > $test.c << EOF
|
||||
need_sizet=1
|
||||
fi
|
||||
|
||||
echo >> configure.log
|
||||
|
||||
# find the size_t integer type, if needed
|
||||
if test $need_sizet -eq 1; then
|
||||
cat > $test.c <<EOF
|
||||
long long dummy = 0;
|
||||
EOF
|
||||
if try $CC -c $CFLAGS $test.c; then
|
||||
@@ -580,16 +492,20 @@ int main(void) {
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
|
||||
if try $CC $CFLAGS -o $test $test.c; then
|
||||
sizet=`./$test`
|
||||
echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log
|
||||
CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
|
||||
SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
|
||||
else
|
||||
echo "Checking for a pointer-size integer type... not found." | tee -a configure.log
|
||||
echo "Failed to find a pointer-size integer type." | tee -a configure.log
|
||||
leave 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if test $need_sizet -eq 1; then
|
||||
CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
|
||||
SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
|
||||
fi
|
||||
|
||||
echo >> configure.log
|
||||
|
||||
# check for large file support, and if none, check for fseeko()
|
||||
@@ -614,7 +530,7 @@ int main(void) {
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
|
||||
if try $CC $CFLAGS -o $test $test.c; then
|
||||
echo "Checking for fseeko... Yes." | tee -a configure.log
|
||||
else
|
||||
CFLAGS="${CFLAGS} -DNO_FSEEKO"
|
||||
@@ -631,7 +547,7 @@ cat > $test.c <<EOF
|
||||
#include <errno.h>
|
||||
int main() { return strlen(strerror(errno)); }
|
||||
EOF
|
||||
if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
|
||||
if try $CC $CFLAGS -o $test $test.c; then
|
||||
echo "Checking for strerror... Yes." | tee -a configure.log
|
||||
else
|
||||
CFLAGS="${CFLAGS} -DNO_STRERROR"
|
||||
@@ -650,7 +566,7 @@ cat > $test.c <<EOF
|
||||
int main() { return 0; }
|
||||
EOF
|
||||
if try $CC -c $CFLAGS $test.c; then
|
||||
sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/ HAVE_UNISTD_H-0\(.*\) may be/ 1\1 was/" > zconf.temp.h
|
||||
sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h
|
||||
mv zconf.temp.h zconf.h
|
||||
echo "Checking for unistd.h... Yes." | tee -a configure.log
|
||||
else
|
||||
@@ -665,7 +581,7 @@ cat > $test.c <<EOF
|
||||
int main() { return 0; }
|
||||
EOF
|
||||
if try $CC -c $CFLAGS $test.c; then
|
||||
sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/ HAVE_STDARG_H-0\(.*\) may be/ 1\1 was/" > zconf.temp.h
|
||||
sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h
|
||||
mv zconf.temp.h zconf.h
|
||||
echo "Checking for stdarg.h... Yes." | tee -a configure.log
|
||||
else
|
||||
@@ -693,6 +609,7 @@ fi
|
||||
|
||||
# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X
|
||||
if test $cover -eq 1; then
|
||||
CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
|
||||
if test -n "$GCC_CLASSIC"; then
|
||||
CC=$GCC_CLASSIC
|
||||
fi
|
||||
@@ -737,7 +654,7 @@ int main()
|
||||
return (mytest("Hello%d\n", 1));
|
||||
}
|
||||
EOF
|
||||
if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
|
||||
if try $CC $CFLAGS -o $test $test.c; then
|
||||
echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log
|
||||
|
||||
echo >> configure.log
|
||||
@@ -777,10 +694,7 @@ EOF
|
||||
echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log
|
||||
echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log
|
||||
echo " vulnerabilities." | tee -a configure.log
|
||||
if test $insecure -ne 1; then
|
||||
echo " The --insecure option must be provided to ./configure in order to" | tee -a configure.log
|
||||
echo " compile using the insecure vsprintf() function." | tee -a configure.log
|
||||
fi
|
||||
|
||||
echo >> configure.log
|
||||
cat >$test.c <<EOF
|
||||
#include <stdio.h>
|
||||
@@ -830,7 +744,7 @@ int main()
|
||||
}
|
||||
EOF
|
||||
|
||||
if try $CC $CFLAGS $LDFLAGS -o $test $test.c; then
|
||||
if try $CC $CFLAGS -o $test $test.c; then
|
||||
echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log
|
||||
|
||||
echo >> configure.log
|
||||
@@ -864,10 +778,7 @@ EOF
|
||||
echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log
|
||||
echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log
|
||||
echo " vulnerabilities." | tee -a configure.log
|
||||
if test $insecure -ne 1; then
|
||||
echo " The --insecure option must be provided to ./configure in order to" | tee -a configure.log
|
||||
echo " compile using the insecure sprintf() function." | tee -a configure.log
|
||||
fi
|
||||
|
||||
echo >> configure.log
|
||||
cat >$test.c <<EOF
|
||||
#include <stdio.h>
|
||||
@@ -915,70 +826,6 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
# check for ibm s390x build
|
||||
HAVE_S390X=0
|
||||
cat > $test.c << EOF
|
||||
#ifndef __s390x__
|
||||
#error
|
||||
#endif
|
||||
EOF
|
||||
if try $CC -c $CFLAGS $test.c; then
|
||||
echo "Checking for s390x build ... Yes." | tee -a configure.log
|
||||
HAVE_S390X=1
|
||||
else
|
||||
echo "Checking for s390x build ... No." | tee -a configure.log
|
||||
fi
|
||||
|
||||
# check for ibm s390x vx vector extensions
|
||||
HAVE_S390X_VX=0
|
||||
if test $HAVE_S390X -eq 1 && test $enable_crcvx -eq 1 ; then
|
||||
# preset the compiler specific flags
|
||||
if test $clang -eq 1; then
|
||||
VGFMAFLAG=-fzvector
|
||||
else
|
||||
VGFMAFLAG=-mzarch
|
||||
fi
|
||||
|
||||
cat > $test.c <<EOF
|
||||
#ifndef __s390x__
|
||||
#error
|
||||
#endif
|
||||
#include <vecintrin.h>
|
||||
int main(void) {
|
||||
unsigned long long a __attribute__((vector_size(16))) = { 0 };
|
||||
unsigned long long b __attribute__((vector_size(16))) = { 0 };
|
||||
unsigned char c __attribute__((vector_size(16))) = { 0 };
|
||||
c = vec_gfmsum_accum_128(a, b, c);
|
||||
return c[0];
|
||||
}
|
||||
EOF
|
||||
|
||||
# cflags already contains a valid march
|
||||
if try $CC -c $CFLAGS $VGFMAFLAG $test.c; then
|
||||
echo "Checking for s390x vx vector extension ... Yes." | tee -a configure.log
|
||||
HAVE_S390X_VX=1
|
||||
# or set march for our compile units
|
||||
elif try $CC -c $CFLAGS $VGFMAFLAG -march=z13 $test.c; then
|
||||
echo "Checking for s390x vx vector extension (march=z13) ... Yes." | tee -a configure.log
|
||||
HAVE_S390X_VX=1
|
||||
VGFMAFLAG="$VGFMAFLAG -march=z13"
|
||||
# else we are not on s390x
|
||||
else
|
||||
echo "Checking for s390x vx vector extension ... No." | tee -a configure.log
|
||||
fi
|
||||
|
||||
# prepare compiling for s390x
|
||||
if test $HAVE_S390X_VX -eq 1; then
|
||||
CFLAGS="$CFLAGS -DHAVE_S390X_VX"
|
||||
SFLAGS="$SFLAGS -DHAVE_S390X_VX"
|
||||
OBJC="$OBJC crc32_vx.o"
|
||||
PIC_OBJC="$PIC_OBJC crc32_vx.lo"
|
||||
else
|
||||
# target has no vx extension
|
||||
VGFMAFLAG=""
|
||||
fi
|
||||
fi
|
||||
|
||||
# show the results in the log
|
||||
echo >> configure.log
|
||||
echo ALL = $ALL >> configure.log
|
||||
@@ -1002,6 +849,7 @@ echo SHAREDLIBV = $SHAREDLIBV >> configure.log
|
||||
echo STATICLIB = $STATICLIB >> configure.log
|
||||
echo TEST = $TEST >> configure.log
|
||||
echo VER = $VER >> configure.log
|
||||
echo Z_U4 = $Z_U4 >> configure.log
|
||||
echo SRCDIR = $SRCDIR >> configure.log
|
||||
echo exec_prefix = $exec_prefix >> configure.log
|
||||
echo includedir = $includedir >> configure.log
|
||||
@@ -1010,15 +858,10 @@ echo mandir = $mandir >> configure.log
|
||||
echo prefix = $prefix >> configure.log
|
||||
echo sharedlibdir = $sharedlibdir >> configure.log
|
||||
echo uname = $uname >> configure.log
|
||||
echo HAVE_S390X = $HAVE_S390X >> configure.log
|
||||
echo HAVE_S390X_VX = $HAVE_S390X_VX >> configure.log
|
||||
echo VGFMAFLAG = $VGFMAFLAG >> configure.log
|
||||
|
||||
# update Makefile with the configure results
|
||||
# udpate Makefile with the configure results
|
||||
sed < ${SRCDIR}Makefile.in "
|
||||
/^CC *=/s#=.*#=$CC#
|
||||
/^GCOV *=/s#=.*#=$GCOV#
|
||||
/^LLVM_GCOV_FLAG *=/s#=.*#=$LLVM_GCOV_FLAG#
|
||||
/^CFLAGS *=/s#=.*#=$CFLAGS#
|
||||
/^SFLAGS *=/s#=.*#=$SFLAGS#
|
||||
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
function(zlib_add_contrib_lib name description dir)
|
||||
option(ZLIB_BUILD_${name} "Enable building of ${description}" OFF)
|
||||
|
||||
if(ZLIB_BUILD_${name})
|
||||
if(NOT DEFINED ZLIB_${name}_BUILD_SHARED)
|
||||
set(ZLIB_${name}_BUILD_SHARED ${ZLIB_BUILD_SHARED} CACHE BOOL "")
|
||||
endif(NOT DEFINED ZLIB_${name}_BUILD_SHARED)
|
||||
|
||||
if(NOT DEFINED ZLIB_${name}_BUILD_STATIC)
|
||||
set(ZLIB_${name}_BUILD_STATIC ${ZLIB_BUILD_STATIC} CACHE BOOL "")
|
||||
endif(NOT DEFINED ZLIB_${name}_BUILD_STATIC)
|
||||
|
||||
if(NOT DEFINED ZLIB_${name}_BUILD_TESTING)
|
||||
set(ZLIB_${name}_BUILD_TESTING ${ZLIB_BUILD_TESTING} CACHE BOOL "")
|
||||
endif(NOT DEFINED ZLIB_${name}_BUILD_TESTING)
|
||||
|
||||
if(NOT DEFINED ZLIB_${name}_INSTALL)
|
||||
set(ZLIB_${name}_INSTALL ${ZLIB_INSTALL} CACHE BOOL "")
|
||||
endif(NOT DEFINED ZLIB_${name}_INSTALL)
|
||||
|
||||
add_subdirectory(${dir}/)
|
||||
endif(ZLIB_BUILD_${name})
|
||||
endfunction(zlib_add_contrib_lib name description dir)
|
||||
|
||||
function(zlib_add_contrib_feature name description dir)
|
||||
if(ARGC EQUAL 4)
|
||||
set(default_on ${ARGV3})
|
||||
else()
|
||||
set(default_on Off)
|
||||
endif()
|
||||
|
||||
option(ZLIB_WITH_${name}
|
||||
"Enable build ${description}"
|
||||
${default_on})
|
||||
|
||||
if(ZLIB_WITH_${name})
|
||||
add_subdirectory(${dir}/)
|
||||
endif(ZLIB_WITH_${name})
|
||||
endfunction(zlib_add_contrib_feature name description dir)
|
||||
|
||||
zlib_add_contrib_feature("GVMAT64"
|
||||
"of an optimized longest_match for 32 bits x86_64"
|
||||
gcc_gvmat64)
|
||||
|
||||
zlib_add_contrib_feature(INFBACK9 "with support for method 9 deflate" infback9)
|
||||
zlib_add_contrib_feature(CRC32VX "with S390X-CRC32VX implementation" crc32vx)
|
||||
zlib_add_contrib_lib(ADA "Ada bindings" ada)
|
||||
zlib_add_contrib_lib(BLAST "blast binary" blast)
|
||||
zlib_add_contrib_lib(IOSTREAM3 "IOStream C++ bindings V3" iostream3)
|
||||
zlib_add_contrib_lib(MINIZIP "minizip library" minizip)
|
||||
zlib_add_contrib_lib(PUFF "puff decompress library" puff)
|
||||
|
||||
if(WIN32)
|
||||
zlib_add_contrib_lib(TESTZLIB "testzlib binary" testzlib)
|
||||
|
||||
if (ZLIB_BUILD_ZLIB1_DLL)
|
||||
add_subdirectory(zlib1-dll/)
|
||||
endif (ZLIB_BUILD_ZLIB1_DLL)
|
||||
|
||||
option(ZLIB_BUILD_ZLIB1_DLL "Build the legacy zlib + minizip DLL" OFF)
|
||||
endif(WIN32)
|
||||
@@ -1,4 +1,4 @@
|
||||
All files under this contrib directory are UNSUPPORTED. They were
|
||||
All files under this contrib directory are UNSUPPORTED. There were
|
||||
provided by users of zlib and were not tested by the authors of zlib.
|
||||
Use at your own risk. Please contact the authors of the contributions
|
||||
for help about these, not the zlib authors. Thanks.
|
||||
@@ -6,7 +6,15 @@ for help about these, not the zlib authors. Thanks.
|
||||
|
||||
ada/ by Dmitriy Anisimkov <anisimkov@yahoo.com>
|
||||
Support for Ada
|
||||
See https://zlib-ada.sourceforge.net/
|
||||
See http://zlib-ada.sourceforge.net/
|
||||
|
||||
amd64/ by Mikhail Teterin <mi@ALDAN.algebra.com>
|
||||
asm code for AMD64
|
||||
See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393
|
||||
|
||||
asm686/ by Brian Raiter <breadbox@muppetlabs.com>
|
||||
asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax
|
||||
See http://www.muppetlabs.com/~breadbox/software/assembly.html
|
||||
|
||||
blast/ by Mark Adler <madler@alumni.caltech.edu>
|
||||
Decompressor for output of PKWare Data Compression Library (DCL)
|
||||
@@ -24,6 +32,9 @@ gcc_gvmat64/by Gilles Vollant <info@winimage.com>
|
||||
infback9/ by Mark Adler <madler@alumni.caltech.edu>
|
||||
Unsupported diffs to infback to decode the deflate64 format
|
||||
|
||||
inflate86/ by Chris Anderson <christop@charm.net>
|
||||
Tuned x86 gcc asm code to replace inflate_fast()
|
||||
|
||||
iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
||||
A C++ I/O streams interface to the zlib gz* functions
|
||||
|
||||
@@ -34,10 +45,20 @@ iostream3/ by Ludwig Schwardt <schwardt@sun.ac.za>
|
||||
and Kevin Ruland <kevin@rodin.wustl.edu>
|
||||
Yet another C++ I/O streams interface
|
||||
|
||||
masmx64/ by Gilles Vollant <info@winimage.com>
|
||||
x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to
|
||||
replace longest_match() and inflate_fast(), also masm x86
|
||||
64-bits translation of Chris Anderson inflate_fast()
|
||||
|
||||
masmx86/ by Gilles Vollant <info@winimage.com>
|
||||
x86 asm code to replace longest_match() and inflate_fast(),
|
||||
for Visual C++ and MASM (32 bits).
|
||||
Based on Brian Raiter (asm686) and Chris Anderson (inflate86)
|
||||
|
||||
minizip/ by Gilles Vollant <info@winimage.com>
|
||||
Mini zip and unzip based on zlib
|
||||
Includes Zip64 support by Mathias Svensson <mathias@result42.com>
|
||||
See https://www.winimage.com/zLibDll/minizip.html
|
||||
See http://www.winimage.com/zLibDll/minizip.html
|
||||
|
||||
pascal/ by Bob Dellaca <bobdl@xtra.co.nz> et al.
|
||||
Support for Pascal
|
||||
@@ -46,12 +67,12 @@ puff/ by Mark Adler <madler@alumni.caltech.edu>
|
||||
Small, low memory usage inflate. Also serves to provide an
|
||||
unambiguous description of the deflate format.
|
||||
|
||||
crc32vx/ by Ilya Leoshkevich <iii@linux.ibm.com>
|
||||
Hardware-accelerated CRC32 on IBM Z with Z13 VX extension.
|
||||
|
||||
testzlib/ by Gilles Vollant <info@winimage.com>
|
||||
Example of the use of zlib
|
||||
|
||||
zlib1-dll/
|
||||
by @Vollstrecker on github.com
|
||||
Build the legacy zlib1.dll with zlib and minizip.
|
||||
untgz/ by Pedro A. Aranda Gutierrez <paag@tid.es>
|
||||
A very simple tar.gz file extractor using zlib
|
||||
|
||||
vstudio/ by Gilles Vollant <info@winimage.com>
|
||||
Building a minizip-enhanced zlib with Microsoft Visual Studio
|
||||
Includes vc11 from kreuzerkrieg and vc12 from davispuh
|
||||
|
||||
@@ -1,217 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
|
||||
|
||||
project(
|
||||
zlibAda
|
||||
VERSION 1.0.0
|
||||
LANGUAGES C ADA
|
||||
DESCRIPTION "A library for creating zipfiles based in zlib"
|
||||
HOMEPAGE_URL "https://www.zlib.net")
|
||||
|
||||
option(ZLIB_ADA_BUILD_SHARED "Enable building ada bindings shared library" ON)
|
||||
option(ZLIB_ADA_BUILD_STATIC "Enable building ada bindings static library" ON)
|
||||
option(ZLIB_ADA_BUILD_TESTING "Enable building tests for ada bindings library" ON)
|
||||
|
||||
if(WIN32 OR CYGWIN)
|
||||
set(zlib_Ada_static_suffix "s")
|
||||
set(CMAKE_DEBUG_POSTFIX "d")
|
||||
endif(WIN32 OR CYGWIN)
|
||||
|
||||
if(NOT DEFINED ZLIB_BUILD_ADA)
|
||||
if(ZLIB_ADA_BUILD_SHARED)
|
||||
list(APPEND REQUIRED_COMPONENTS "shared")
|
||||
endif(ZLIB_ADA_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_ADA_BUILD_STATIC)
|
||||
list(APPEND REQUIRED_COMPONENTS "static")
|
||||
endif(ZLIB_ADA_BUILD_STATIC)
|
||||
|
||||
find_package(ZLIB REQUIRED COMPONENTS ${REQUIRED_COMPONENTS} CONFIG)
|
||||
endif(NOT DEFINED ZLIB_BUILD_ADA)
|
||||
|
||||
function(ZLIB_ADA_findTestEnv testName)
|
||||
set(testEnv "PATH=")
|
||||
|
||||
if(MSVC OR MINGW)
|
||||
set(separator "\\\;")
|
||||
else()
|
||||
set(separator ":")
|
||||
endif()
|
||||
|
||||
string(APPEND testEnv "$<TARGET_FILE_DIR:ZLIB::ZLIB>${separator}")
|
||||
string(APPEND testEnv "$ENV{PATH}")
|
||||
|
||||
set_tests_properties(${testName} PROPERTIES ENVIRONMENT "${testEnv}")
|
||||
endfunction(ZLIB_ADA_findTestEnv testName)
|
||||
|
||||
if(ZLIB_ADA_BUILD_SHARED)
|
||||
ada_add_library(zlib_ada_Ada SHARED
|
||||
zlib-thin.adb
|
||||
zlib.adb)
|
||||
|
||||
set_target_properties(zlib_ada_Ada
|
||||
PROPERTIES OUTPUT_NAME zlib-ada)
|
||||
|
||||
target_link_libraries(zlib_ada_Ada
|
||||
INTERFACE ZLIB::ZLIB)
|
||||
|
||||
ada_add_library(zlib_ada_streams SHARED
|
||||
zlib-streams.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_streams
|
||||
PUBLIC
|
||||
zlib_ada_Ada)
|
||||
|
||||
ada_find_ali(zlib_ada_streams)
|
||||
|
||||
if(ZLIB_ADA_BUILD_TESTING)
|
||||
enable_testing()
|
||||
ada_add_executable(zlib_ada_test test.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_test
|
||||
PRIVATE
|
||||
zlib_ada_Ada
|
||||
zlib_ada_streams)
|
||||
|
||||
ada_find_ali(zlib_ada_test)
|
||||
|
||||
add_test(NAME zlib_ada_ada-test COMMAND zlib_ada_test)
|
||||
set_tests_properties(zlib_ada_ada-test PROPERTIES FIXTURES_REQUIRED zlib_ada_cleanup)
|
||||
|
||||
if(MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
zlib_ada_findtestenv(zlib_ada_ada-test)
|
||||
endif(
|
||||
MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
|
||||
ada_add_executable(zlib_ada_buffer_demo buffer_demo.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_buffer_demo
|
||||
PRIVATE
|
||||
zlib_ada_Ada)
|
||||
|
||||
ada_find_ali(zlib_ada_buffer_demo)
|
||||
|
||||
add_test(NAME zlib_ada_buffer-demo COMMAND zlib_ada_buffer_demo)
|
||||
|
||||
if(MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
zlib_ada_findtestenv(zlib_ada_buffer-demo)
|
||||
endif(
|
||||
MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
|
||||
ada_add_executable(zlib_ada_mtest mtest.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_mtest
|
||||
PRIVATE
|
||||
zlib_ada_Ada)
|
||||
|
||||
ada_find_ali(zlib_ada_mtest)
|
||||
|
||||
#Not adding test as this is an endless-loop
|
||||
|
||||
ada_add_executable(zlib_ada_read read.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_read
|
||||
PRIVATE
|
||||
zlib_ada_Ada)
|
||||
|
||||
ada_find_ali(zlib_ada_read)
|
||||
|
||||
add_test(NAME zlib_ada_read COMMAND zlib_ada_read)
|
||||
|
||||
if(MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
zlib_ada_findtestenv(zlib_ada_read)
|
||||
endif(
|
||||
MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
endif(ZLIB_ADA_BUILD_TESTING)
|
||||
endif(ZLIB_ADA_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_ADA_BUILD_STATIC)
|
||||
ada_add_library(zlib_ada_AdaStatic STATIC
|
||||
zlib-thin.adb
|
||||
zlib.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_AdaStatic
|
||||
INTERFACE ZLIB::ZLIBSTATIC)
|
||||
|
||||
set_target_properties(zlib_ada_AdaStatic
|
||||
PROPERTIES OUTPUT_NAME zlib-ada${zlib_Ada_static_suffix})
|
||||
|
||||
ada_add_library(zlib_ada_streamsStatic STATIC
|
||||
zlib-streams.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_streamsStatic
|
||||
PUBLIC
|
||||
zlib_ada_AdaStatic)
|
||||
|
||||
ada_find_ali(zlib_ada_streamsStatic)
|
||||
|
||||
if(ZLIB_ADA_BUILD_TESTING)
|
||||
enable_testing()
|
||||
ada_add_executable(zlib_ada_testStatic test.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_testStatic
|
||||
PRIVATE
|
||||
zlib_ada_AdaStatic
|
||||
zlib_ada_streamsStatic)
|
||||
|
||||
ada_find_ali(zlib_ada_testStatic)
|
||||
|
||||
add_test(NAME zlib_ada_testStatic COMMAND zlib_ada_testStatic)
|
||||
set_tests_properties(zlib_ada_testStatic PROPERTIES FIXTURES_REQUIRED zlib_ada_cleanup)
|
||||
|
||||
ada_add_executable(zlib_ada_buffer-demoStatic buffer_demo.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_buffer-demoStatic
|
||||
PRIVATE
|
||||
zlib_ada_AdaStatic)
|
||||
|
||||
ada_find_ali(zlib_ada_buffer-demoStatic)
|
||||
|
||||
add_test(NAME zlib_ada_buffer-demoStatic COMMAND zlib_ada_buffer-demoStatic)
|
||||
|
||||
ada_add_executable(zlib_ada_mtestStatic mtest.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_mtestStatic
|
||||
PRIVATE
|
||||
zlib_ada_AdaStatic)
|
||||
|
||||
ada_find_ali(zlib_ada_mtestStatic)
|
||||
|
||||
# Not adding test as this is an endless-loop
|
||||
|
||||
ada_add_executable(zlib_ada_readStatic read.adb)
|
||||
|
||||
target_link_libraries(zlib_ada_readStatic
|
||||
PRIVATE
|
||||
zlib_ada_AdaStatic)
|
||||
|
||||
ada_find_ali(zlib_ada_readStatic)
|
||||
|
||||
add_test(NAME zlib_ada_readStatic COMMAND zlib_ada_readStatic)
|
||||
endif(ZLIB_ADA_BUILD_TESTING)
|
||||
endif(ZLIB_ADA_BUILD_STATIC)
|
||||
|
||||
if(ZLIB_ADA_BUILD_TESTING)
|
||||
add_test(NAME zlib_ada_cleanup COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_BINARY_DIR}/testzlib.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/testzlib.out ${CMAKE_CURRENT_BINARY_DIR}/testzlib.zlb)
|
||||
set_tests_properties(zlib_ada_cleanup PROPERTIES FIXTURES_CLEANUP zlib_ada_cleanup)
|
||||
endif(ZLIB_ADA_BUILD_TESTING)
|
||||
@@ -1,23 +0,0 @@
|
||||
set(CMAKE_ADA_COMPILER "@CMAKE_ADA_COMPILER@")
|
||||
set(CMAKE_ADA_COMPILER_ARG1 "@CMAKE_ADA_COMPILER_ARG1@")
|
||||
set(CMAKE_ADA_COMPILER_ID "@CMAKE_ADA_COMPILER_ID@")
|
||||
set(CMAKE_ADA_COMPILER_VERSION "@CMAKE_ADA_COMPILER_VERSION@")
|
||||
set(CMAKE_ADA_PLATFORM_ID "@CMAKE_ADA_PLATFORM_ID@")
|
||||
set(CMAKE_AR "@CMAKE_AR@")
|
||||
#set(CMAKE_RANLIB "@CMAKE_RANLIB@")
|
||||
#set(CMAKE_LINKER "@CMAKE_LINKER@")
|
||||
set(CMAKE_ADA_COMPILER_LOADED TRUE)
|
||||
set(CMAKE_ADA_COMPILER_WORKS @CMAKE_ADA_COMPILER_WORKS@)
|
||||
#set(CMAKE_ADA_ABI_COMPILED @CMAKE_ADA_ABI_COMPILED@)
|
||||
|
||||
set(CMAKE_ADA_COMPILER_ENV_VAR "ADA")
|
||||
|
||||
set(CMAKE_ADA_COMPILER_ID_RUN TRUE)
|
||||
set(CMAKE_ADA_SOURCE_FILE_EXTENSIONS adb;ADB)
|
||||
set(CMAKE_ADA_IGNORE_EXTENSIONS ;o;O;obj;OBJ;ali)
|
||||
|
||||
set(CMAKE_ADA_BINDER_HELPER "@CMAKE_ADA_BINDER_HELPER@")
|
||||
set(CMAKE_ADA_COMPILER_HELPER "@CMAKE_ADA_COMPILER_HELPER@")
|
||||
set(CMAKE_ADA_EXE_LINK_HELPER "@CMAKE_ADA_EXE_LINK_HELPER@")
|
||||
set(CMAKE_ADA_SHARED_LINK_HELPER "@CMAKE_ADA_SHARED_LINK_HELPER@")
|
||||
set(CMAKE_ADA_STATIC_LINK_HELPER "@CMAKE_ADA_STATIC_LINK_HELPER@")
|
||||
@@ -1,133 +0,0 @@
|
||||
include(CMakeLanguageInformation)
|
||||
|
||||
set(CMAKE_ADA_OUTPUT_EXTENSION .o)
|
||||
set(CMAKE_ADA_OUTPUT_EXTENSION_REPLACE TRUE)
|
||||
|
||||
if(CMAKE_USER_MAKE_RULES_OVERRIDE)
|
||||
include(${CMAKE_USER_MAKE_RULES_OVERRIDE} RESULT_VARIABLE _override)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${_override}")
|
||||
endif(CMAKE_USER_MAKE_RULES_OVERRIDE)
|
||||
|
||||
|
||||
if(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA)
|
||||
include(${CMAKE_USER_MAKE_RULES_OVERRIDE_ADA} RESULT_VARIABLE _override)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA "${_override}")
|
||||
endif(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA)
|
||||
|
||||
set(CMAKE_ADA_FLAGS_INIT "$ENV{ADAFLAGS} ${CMAKE_ADA_FLAGS_INIT}")
|
||||
|
||||
string(APPEND CMAKE_ADA_FLAGS_INIT " ")
|
||||
string(APPEND CMAKE_ADA_FLAGS_DEBUG_INIT " -g")
|
||||
string(APPEND CMAKE_ADA_FLAGS_MINSIZEREL_INIT " -Os")
|
||||
string(APPEND CMAKE_ADA_FLAGS_RELEASE_INIT " -O3")
|
||||
string(APPEND CMAKE_ADA_FLAGS_RELWITHDEBINFO_INIT " -O2 -g")
|
||||
|
||||
cmake_initialize_per_config_variable(CMAKE_ADA_FLAGS "Flags used by the Ada compiler")
|
||||
|
||||
if(CMAKE_ADA_STANDARD_LIBRARIES_INIT)
|
||||
set(CMAKE_ADA_STANDARD_LIBRARIES
|
||||
"${CMAKE_ADA_STANDARD_LIBRARIES_INIT}"
|
||||
CACHE
|
||||
STRING "Libraries linked by default with all Ada applications.")
|
||||
mark_as_advanced(CMAKE_ADA_STANDARD_LIBRARIES)
|
||||
endif(CMAKE_ADA_STANDARD_LIBRARIES_INIT)
|
||||
|
||||
if(NOT CMAKE_ADA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_COMPILER_LAUNCHER})
|
||||
set(CMAKE_ADA_COMPILER_LAUNCHER
|
||||
"$ENV{CMAKE_ADA_COMPILER_LAUNCHER}"
|
||||
CACHE
|
||||
STRING "Compiler launcher for Ada.")
|
||||
endif(NOT CMAKE_ADA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_COMPILER_LAUNCHER})
|
||||
|
||||
if(NOT CMAKE_ADA_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_LINKER_LAUNCHER})
|
||||
set(CMAKE_ADA_LINKER_LAUNCHER
|
||||
"$ENV{CMAKE_ADA_LINKER_LAUNCHER}"
|
||||
CACHE
|
||||
STRING "Linker launcher for Ada.")
|
||||
endif(NOT CMAKE_ADA_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_LINKER_LAUNCHER})
|
||||
|
||||
include(CMakeCommonLanguageInclude)
|
||||
_cmake_common_language_platform_flags(ADA)
|
||||
|
||||
if(NOT CMAKE_ADA_CREATE_SHARED_LIBRARY)
|
||||
set(CMAKE_ADA_CREATE_SHARED_LIBRARY
|
||||
"${CMAKE_ADA_BINDER_HELPER} <CMAKE_ADA_COMPILER> <OBJECTS> FLAGS <FLAGS> <LINK_FLAGS>"
|
||||
"${CMAKE_ADA_SHARED_LINK_HELPER} <CMAKE_ADA_COMPILER> <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||
endif(NOT CMAKE_ADA_CREATE_SHARED_LIBRARY)
|
||||
|
||||
if(NOT CMAKE_ADA_CREATE_STATIC_LIBRARY)
|
||||
set(CMAKE_ADA_CREATE_STATIC_LIBRARY
|
||||
"${CMAKE_ADA_STATIC_LINK_HELPER} ${CMAKE_AR} <TARGET> <OBJECTS>")
|
||||
endif(NOT CMAKE_ADA_CREATE_STATIC_LIBRARY)
|
||||
|
||||
if(NOT CMAKE_ADA_COMPILE_OBJECT)
|
||||
set(CMAKE_ADA_COMPILE_OBJECT
|
||||
"${CMAKE_ADA_COMPILER_HELPER} <CMAKE_ADA_COMPILER> <OBJECT_DIR> <SOURCE> <FLAGS>")
|
||||
endif(NOT CMAKE_ADA_COMPILE_OBJECT)
|
||||
|
||||
if(NOT CMAKE_ADA_LINK_EXECUTABLE)
|
||||
set(CMAKE_ADA_LINK_EXECUTABLE
|
||||
"${CMAKE_ADA_BINDER_HELPER} <CMAKE_ADA_COMPILER> <OBJECTS> FLAGS <FLAGS> <LINK_FLAGS>"
|
||||
"${CMAKE_ADA_EXE_LINK_HELPER} <CMAKE_ADA_COMPILER> <TARGET> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> OBJ <OBJECTS> LIBS <LINK_LIBRARIES>")
|
||||
endif(NOT CMAKE_ADA_LINK_EXECUTABLE)
|
||||
|
||||
function(ada_add_executable)
|
||||
if(ARGC GREATER 1)
|
||||
math(EXPR last_index "${ARGC} - 1")
|
||||
foreach(source RANGE 1 ${last_index})
|
||||
list(APPEND SOURCES ${ARGV${source}})
|
||||
string(REPLACE ".adb" "" ali "${ARGV${source}}")
|
||||
set(clean_file "CMakeFiles/${ARGV0}.dir/${ali}.ali")
|
||||
list(APPEND CLEAN_FILES ${clean_file})
|
||||
list(APPEND CLEAN_FILES b~${ali}.adb)
|
||||
list(APPEND CLEAN_FILES b~${ali}.ads)
|
||||
list(APPEND CLEAN_FILES b~${ali}.ali)
|
||||
list(APPEND CLEAN_FILES b~${ali}.o)
|
||||
endforeach(source RANGE 1 ${ARGC})
|
||||
|
||||
add_executable(${ARGV0} ${ARGV1} ${SOURCES})
|
||||
|
||||
set_target_properties(${ARGV0}
|
||||
PROPERTIES
|
||||
ADDITIONAL_CLEAN_FILES "${CLEAN_FILES}")
|
||||
endif(ARGC GREATER 1)
|
||||
endfunction(ada_add_executable)
|
||||
|
||||
function(ada_add_library)
|
||||
if(ARGC GREATER 2)
|
||||
math(EXPR last_index "${ARGC} - 1")
|
||||
foreach(source RANGE 2 ${last_index})
|
||||
list(APPEND SOURCES ${ARGV${source}})
|
||||
string(REPLACE ".adb" "" ali "${ARGV${source}}")
|
||||
set(clean_file "CMakeFiles/${ARGV0}.dir/${ali}.ali")
|
||||
list(APPEND CLEAN_FILES ${clean_file})
|
||||
list(APPEND CLEAN_FILES b~${ali}.adb)
|
||||
list(APPEND CLEAN_FILES b~${ali}.ads)
|
||||
list(APPEND CLEAN_FILES b~${ali}.ali)
|
||||
list(APPEND CLEAN_FILES b~${ali}.o)
|
||||
endforeach(source RANGE 2 ${ARGC})
|
||||
|
||||
add_library(${ARGV0} ${ARGV1} ${SOURCES})
|
||||
|
||||
set_target_properties(${ARGV0}
|
||||
PROPERTIES
|
||||
ADDITIONAL_CLEAN_FILES "${CLEAN_FILES};dummylib.adb;dummylib.ali;dummylib.o"
|
||||
ALI_FLAG "-aO${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${ARGV0}.dir/")
|
||||
endif(ARGC GREATER 2)
|
||||
endfunction(ada_add_library)
|
||||
|
||||
function(ada_find_ali)
|
||||
get_target_property(link_libs ${ARGV0} LINK_LIBRARIES)
|
||||
|
||||
foreach(lib IN LISTS link_libs)
|
||||
get_target_property(ali ${lib} ALI_FLAG)
|
||||
string(APPEND FLAGS ${ali} " ")
|
||||
unset(ali)
|
||||
endforeach(lib IN LISTS link_libs)
|
||||
|
||||
set_target_properties(${ARGV0}
|
||||
PROPERTIES
|
||||
LINK_FLAGS ${FLAGS})
|
||||
endfunction(ada_find_ali)
|
||||
|
||||
set(CMAKE_ADA_INFORMATION_LOADED TRUE)
|
||||
@@ -1,33 +0,0 @@
|
||||
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake)
|
||||
|
||||
# Load system-specific compiler preferences for this language.
|
||||
include(Platform/${CMAKE_SYSTEM_NAME}-Determine-Ada OPTIONAL)
|
||||
include(Platform/${CMAKE_SYSTEM_NAME}-Ada OPTIONAL)
|
||||
|
||||
if(NOT CMAKE_ADA_COMPILER_NAMES)
|
||||
set(CMAKE_ADA_COMPILER_NAMES gnat)
|
||||
|
||||
foreach(ver RANGE 11 99)
|
||||
list(APPEND CMAKE_ADA_COMPILER_NAMES gnat-${ver})
|
||||
endforeach(ver RANGE 11 99)
|
||||
endif(NOT CMAKE_ADA_COMPILER_NAMES)
|
||||
|
||||
if(NOT CMAKE_ADA_COMPILER)
|
||||
set(CMAKE_ADA_COMPILER_INIT NOTFOUND)
|
||||
_cmake_find_compiler(ADA)
|
||||
else(NOT CMAKE_REAL_ADA_COMPILER)
|
||||
_cmake_find_compiler_path(ADA)
|
||||
endif(NOT CMAKE_ADA_COMPILER)
|
||||
|
||||
mark_as_advanced(CMAKE_ADA_COMPILER)
|
||||
set(CMAKE_ADA_COMPILER_ID "GNU")
|
||||
set(CMAKE_ADA_BINDER_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/binder_helper.cmake")
|
||||
set(CMAKE_ADA_COMPILER_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compile_helper.cmake")
|
||||
set(CMAKE_ADA_EXE_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/exe_link_helper.cmake")
|
||||
set(CMAKE_ADA_SHARED_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/shared_link_helper.cmake")
|
||||
set(CMAKE_ADA_STATIC_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/static_link_helper.cmake")
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CMakeADACompiler.cmake.in
|
||||
${CMAKE_PLATFORM_INFO_DIR}/CMakeADACompiler.cmake
|
||||
@ONLY)
|
||||
@@ -1,46 +0,0 @@
|
||||
include(CMakeTestCompilerCommon)
|
||||
unset(CMAKE_ADA_COMPILER_WORKS CACHE)
|
||||
|
||||
if(NOT CMAKE_ADA_COMPILER_WORKS)
|
||||
PrintTestCompilerStatus("ADA" "")
|
||||
set(_ADA_TEST_FILE "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CMakeTmp/main.adb")
|
||||
|
||||
file(WRITE ${_ADA_TEST_FILE}
|
||||
"with Ada.Text_IO; use Ada.Text_IO;\n"
|
||||
"\n"
|
||||
"procedure main is\n"
|
||||
"begin\n"
|
||||
"Put_Line(\"Hello, World!\");\n"
|
||||
"end Main;\n")
|
||||
|
||||
try_compile(CMAKE_ADA_COMPILER_WORKS ${CMAKE_BINARY_DIR}
|
||||
${_ADA_TEST_FILE}
|
||||
OUTPUT_VARIABLE __CMAKE_ADA_COMPILER_OUTPUT)
|
||||
|
||||
set(CMAKE_ADA_COMPILER_WORKS ${CMAKE_ADA_COMPILER_WORKS})
|
||||
unset(CMAKE_ADA_COMPILER_WORKS CACHE)
|
||||
set(ADA_TEST_WAS_RUN TRUE)
|
||||
endif(NOT CMAKE_ADA_COMPILER_WORKS)
|
||||
|
||||
if(NOT CMAKE_ADA_COMPILER_WORKS)
|
||||
PrintTestCompilerStatus("ADA" " -- broken")
|
||||
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Determining if the Ada compiler works failed with "
|
||||
"the following output:\n${__CMAKE_ADA_COMPILER_OUTPUT}\n\n")
|
||||
|
||||
message(FATAL_ERROR "The Ada compiler \"${CMAKE_ADA_COMPILER}\" "
|
||||
"is not able to compile a simple test program.\nIt fails "
|
||||
"with the following output:\n ${__CMAKE_ADA_COMPILER_OUTPUT}\n\n"
|
||||
"CMake will not be able to correctly generate this project.")
|
||||
else(NOT CMAKE_ADA_COMPILER_WORKS)
|
||||
if(ADA_TEST_WAS_RUN)
|
||||
PrintTestCompilerStatus("ADA" " -- works")
|
||||
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Determining if the Ada compiler works passed with "
|
||||
"the following output:\n${__CMAKE_ADA_COMPILER_OUTPUT}\n\n")
|
||||
endif(ADA_TEST_WAS_RUN)
|
||||
endif(NOT CMAKE_ADA_COMPILER_WORKS)
|
||||
|
||||
unset(__CMAKE_ADA_COMPILER_OUTPUT)
|
||||
@@ -1,47 +0,0 @@
|
||||
#CMAKE_ARGV0 = /path/to/cmake
|
||||
#CMAKE_ARGV1 = -P
|
||||
#CMAKE_ARGV2 = path/to/this/file
|
||||
#CMAKE_ARGV3 = binder
|
||||
#CMAKE_ARGV4 = ali
|
||||
|
||||
if(NOT CMAKE_ARGV3)
|
||||
message(FATAL_ERROR "binder not set")
|
||||
endif(NOT CMAKE_ARGV3)
|
||||
|
||||
string(REPLACE ".o" ".ali" ALI ${CMAKE_ARGV4})
|
||||
|
||||
set (REACHED_FLAGS FALSE)
|
||||
#iterate over additional objects, only the main one is needed
|
||||
foreach(arg RANGE 5 ${CMAKE_ARGC})
|
||||
if(CMAKE_ARGV${arg} STREQUAL FLAGS)
|
||||
set(REACHED_FLAGS TRUE)
|
||||
continue()
|
||||
endif(CMAKE_ARGV${arg} STREQUAL FLAGS)
|
||||
|
||||
string(SUBSTRING "${CMAKE_ARGV${arg}}" 0 2 start)
|
||||
|
||||
if(start STREQUAL "-O")
|
||||
continue()
|
||||
endif(start STREQUAL "-O")
|
||||
|
||||
if(REACHED_FLAGS)
|
||||
list(APPEND FLAGS ${CMAKE_ARGV${arg}})
|
||||
endif(REACHED_FLAGS)
|
||||
endforeach(arg RANGE 5 CMAKE_ARGC)
|
||||
|
||||
#first see if there is a main function
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} bind ${ALI} ${FLAGS}
|
||||
RESULT_VARIABLE MAIN_RESULT
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
|
||||
if(MAIN_RESULT)
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} bind -n ${ALI} ${FLAGS}
|
||||
RESULT_VARIABLE RESULT
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
endif(MAIN_RESULT)
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR ${RESULT} ${ERROR})
|
||||
endif(RESULT)
|
||||
@@ -1,32 +0,0 @@
|
||||
#CMAKE_ARGV0 = /path/to/cmake
|
||||
#CMAKE_ARGV1 = -P
|
||||
#CMAKE_ARGV2 = path/to/this/file
|
||||
#CMAKE_ARGV3 = compiler
|
||||
#CMAKE_ARGV4 = OBJECT-DIR
|
||||
#CMAKE_ARGV5 = source-file
|
||||
|
||||
if(NOT CMAKE_ARGV3)
|
||||
message(FATAL_ERROR "compiler not set")
|
||||
endif(NOT CMAKE_ARGV3)
|
||||
|
||||
if(NOT CMAKE_ARGV4)
|
||||
message(FATAL_ERROR "object dir not set")
|
||||
endif(NOT CMAKE_ARGV4)
|
||||
|
||||
if(NOT CMAKE_ARGV5)
|
||||
message(FATAL_ERROR "source not set")
|
||||
endif(NOT CMAKE_ARGV5)
|
||||
|
||||
foreach(arg RANGE 6 ${CMAKE_ARGC})
|
||||
list(APPEND FLAGS "${CMAKE_ARGV${arg}}")
|
||||
endforeach(arg RANGE 6 ${CMAKE_ARGC})
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} compile ${FLAGS} ${CMAKE_ARGV5}
|
||||
WORKING_DIRECTORY ${CMAKE_ARGV4}
|
||||
RESULT_VARIABLE RESULT
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR ${RESULT} ${ERROR})
|
||||
endif(RESULT)
|
||||
@@ -1,53 +0,0 @@
|
||||
#CMAKE_ARGV0 = /path/to/cmake
|
||||
#CMAKE_ARGV1 = -P
|
||||
#CMAKE_ARGV2 = path/to/this/file
|
||||
#CMAKE_ARGV3 = linker
|
||||
#CMAKE_ARGV4 = output-name
|
||||
#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
|
||||
#CMAKE_ARGVN+1 = LIBS
|
||||
#CMAKE_ARGVN+2...CMAKE_ARGVM libraries
|
||||
|
||||
if(NOT CMAKE_ARGV3)
|
||||
message(FATAL_ERROR "linker not set")
|
||||
endif(NOT CMAKE_ARGV3)
|
||||
|
||||
set(REACHED_LIBS FALSE)
|
||||
set(REACHED_OBJ FALSE)
|
||||
foreach(arg RANGE 5 ${CMAKE_ARGC})
|
||||
if(CMAKE_ARGV${arg} STREQUAL LIBS)
|
||||
set(REACHED_LIBS TRUE)
|
||||
set(REACHED_OBJ FALSE)
|
||||
continue()
|
||||
endif(CMAKE_ARGV${arg} STREQUAL LIBS)
|
||||
|
||||
if(CMAKE_ARGV${arg} STREQUAL OBJ)
|
||||
set(REACHED_LIBS FALSE)
|
||||
set(REACHED_OBJ TRUE)
|
||||
continue()
|
||||
endif(CMAKE_ARGV${arg} STREQUAL OBJ)
|
||||
|
||||
if(CMAKE_ARGC EQUAL arg)
|
||||
continue()
|
||||
endif(CMAKE_ARGC EQUAL arg)
|
||||
|
||||
if(REACHED_LIBS)
|
||||
list(APPEND LIBS "${CMAKE_ARGV${arg}}")
|
||||
elseif(REACHED_OBJ AND NOT ALI)
|
||||
string(REPLACE ".o" ".ali" ALI "${CMAKE_ARGV${arg}}")
|
||||
else(REACHED_LIBS)
|
||||
string(SUBSTRING "${CMAKE_ARGV${arg}}" 0 3 start)
|
||||
|
||||
if(NOT start STREQUAL -aO)
|
||||
list(APPEND FLAGS "${CMAKE_ARGV${arg}}")
|
||||
endif(NOT start STREQUAL -aO)
|
||||
endif(REACHED_LIBS)
|
||||
endforeach(arg RANGE 5 ${CMAKE_ARGC})
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} link ${ALI} -o ${CMAKE_ARGV4} ${FLAGS} ${OTHER_OBJECTS} ${LIBS}
|
||||
RESULT_VARIABLE RESULT
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR ${RESULT} ${ERROR})
|
||||
endif(RESULT)
|
||||
@@ -1,52 +0,0 @@
|
||||
#CMAKE_ARGV0 = /path/to/cmake
|
||||
#CMAKE_ARGV1 = -P
|
||||
#CMAKE_ARGV2 = path/to/this/file
|
||||
#CMAKE_ARGV3 = linker
|
||||
#CMAKE_ARGV4 = output-name
|
||||
#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
|
||||
#CMAKE_ARGVN+1 = LIBS
|
||||
#CMAKE_ARGVN+2...CMAKE_ARGVM libraries
|
||||
|
||||
if(NOT CMAKE_ARGV3)
|
||||
message(FATAL_ERROR "linker not set")
|
||||
endif(NOT CMAKE_ARGV3)
|
||||
|
||||
set(REACHED_FILES FALSE)
|
||||
foreach(arg RANGE 5 ${CMAKE_ARGC})
|
||||
if(CMAKE_ARGV${arg} STREQUAL "LIBS")
|
||||
set(REACHED_FILES TRUE)
|
||||
continue()
|
||||
endif(CMAKE_ARGV${arg} STREQUAL "LIBS")
|
||||
|
||||
if(CMAKE_ARGC EQUAL arg)
|
||||
continue()
|
||||
endif(CMAKE_ARGC EQUAL arg)
|
||||
|
||||
if(REACHED_LIBS)
|
||||
list(APPEND LIBS "${CMAKE_ARGV${arg}} ")
|
||||
else(REACHED_LIBS)
|
||||
list(APPEND OBJECT_FILES "${CMAKE_ARGV${arg}}")
|
||||
endif(REACHED_LIBS)
|
||||
endforeach(arg RANGE 5 ${CMAKE_ARGC})
|
||||
|
||||
file(WRITE dummylib.adb
|
||||
"procedure dummylib is\n"
|
||||
"begin\n"
|
||||
" null;\n"
|
||||
"end;\n")
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} compile -fPIC dummylib.adb
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} bind -n dummylib.ali
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} link -shared dummylib.ali -o ${CMAKE_ARGV4} ${OBJECT_FILES} ${LIBS}
|
||||
RESULT_VARIABLE RESULT
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR ${RESULT} ${ERROR})
|
||||
endif(RESULT)
|
||||
@@ -1,25 +0,0 @@
|
||||
#CMAKE_ARGV0 = /path/to/cmake
|
||||
#CMAKE_ARGV1 = -P
|
||||
#CMAKE_ARGV2 = path/to/this/file
|
||||
#CMAKE_ARGV3 = path/to/ar
|
||||
#CMAKE_ARGV4 = output-name
|
||||
#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
|
||||
|
||||
if(NOT CMAKE_ARGV3)
|
||||
message(FATAL_ERROR "linker not set")
|
||||
endif(NOT CMAKE_ARGV3)
|
||||
|
||||
foreach(arg RANGE 5 ${CMAKE_ARGC})
|
||||
if(NOT CMAKE_ARGC EQUAL arg)
|
||||
list(APPEND OBJECT_FILES "${CMAKE_ARGV${arg}}")
|
||||
endif(NOT CMAKE_ARGC EQUAL arg)
|
||||
endforeach(arg RANGE 6 ${CMAKE_ARGC})
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV3} rcs ${CMAKE_ARGV4} ${OBJECT_FILES}
|
||||
RESULT_VARIABLE RESULT
|
||||
OUTPUT_VARIABLE dont_care
|
||||
ERROR_VARIABLE ERROR)
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR ${RESULT} ${ERROR})
|
||||
endif(RESULT)
|
||||
@@ -2,14 +2,14 @@
|
||||
Release 1.3
|
||||
|
||||
ZLib.Ada is a thick binding interface to the popular ZLib data
|
||||
compression library, available at https://zlib.net/.
|
||||
compression library, available at http://www.gzip.org/zlib/.
|
||||
It provides Ada-style access to the ZLib C library.
|
||||
|
||||
|
||||
Here are the main changes since ZLib.Ada 1.2:
|
||||
|
||||
- Attention: ZLib.Read generic routine have a initialization requirement
|
||||
for Read_Last parameter now. It is a bit incompatible with previous version,
|
||||
- Attension: ZLib.Read generic routine have a initialization requirement
|
||||
for Read_Last parameter now. It is a bit incompartible with previous version,
|
||||
but extends functionality, we could use new parameters Allow_Read_Some and
|
||||
Flush now.
|
||||
|
||||
@@ -59,7 +59,7 @@ the main functionality of ZLib.Ada.
|
||||
The routines from the package specifications are commented.
|
||||
|
||||
|
||||
Homepage: https://zlib-ada.sourceforge.net/
|
||||
Homepage: http://zlib-ada.sourceforge.net/
|
||||
Author: Dmitriy Anisimkov <anisimkov@yahoo.com>
|
||||
|
||||
Contributors: Pascal Obry <pascal@obry.org>, Steve Sangwine <sjs@essex.ac.uk>
|
||||
|
||||
@@ -65,12 +65,12 @@ procedure Test is
|
||||
Time_Stamp : Ada.Calendar.Time;
|
||||
|
||||
procedure Generate_File;
|
||||
-- Generate file of specified size with some random data.
|
||||
-- Generate file of spetsified size with some random data.
|
||||
-- The random data is repeatable, for the good compression.
|
||||
|
||||
procedure Compare_Streams
|
||||
(Left, Right : in out Root_Stream_Type'Class);
|
||||
-- The procedure comparing data in 2 streams.
|
||||
-- The procedure compearing data in 2 streams.
|
||||
-- It is for compare data before and after compression/decompression.
|
||||
|
||||
procedure Compare_Files (Left, Right : String);
|
||||
|
||||
@@ -62,7 +62,7 @@ package ZLib.Streams is
|
||||
:= Default_Buffer_Size;
|
||||
Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
|
||||
:= Default_Buffer_Size);
|
||||
-- Create the Compression/Decompression stream.
|
||||
-- Create the Comression/Decompression stream.
|
||||
-- If mode is In_Stream then Write operation is disabled.
|
||||
-- If mode is Out_Stream then Read operation is disabled.
|
||||
|
||||
|
||||
@@ -12,8 +12,7 @@ package body ZLib.Thin is
|
||||
|
||||
ZLIB_VERSION : constant Chars_Ptr := zlibVersion;
|
||||
|
||||
Dummy : Z_Stream;
|
||||
Z_Stream_Size : constant Int := Dummy'Size / System.Storage_Unit;
|
||||
Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit;
|
||||
|
||||
--------------
|
||||
-- Avail_In --
|
||||
|
||||
@@ -204,7 +204,7 @@ package body ZLib is
|
||||
end if;
|
||||
|
||||
-- We allow ZLib to make header only in case of default header type.
|
||||
-- Otherwise we would either do header by ourselves, or do not do
|
||||
-- Otherwise we would either do header by ourselfs, or do not do
|
||||
-- header at all.
|
||||
|
||||
if Header = None or else Header = GZip then
|
||||
|
||||
@@ -114,7 +114,7 @@ package ZLib is
|
||||
-- Compression strategy constants --
|
||||
------------------------------------
|
||||
|
||||
-- RLE strategy could be used only in version 1.2.0 and later.
|
||||
-- RLE stategy could be used only in version 1.2.0 and later.
|
||||
|
||||
Filtered : constant Strategy_Type;
|
||||
Huffman_Only : constant Strategy_Type;
|
||||
|
||||
@@ -0,0 +1,452 @@
|
||||
/*
|
||||
* match.S -- optimized version of longest_match()
|
||||
* based on the similar work by Gilles Vollant, and Brian Raiter, written 1998
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the BSD License. Use by owners of Che Guevarra
|
||||
* parafernalia is prohibited, where possible, and highly discouraged
|
||||
* elsewhere.
|
||||
*/
|
||||
|
||||
#ifndef NO_UNDERLINE
|
||||
# define match_init _match_init
|
||||
# define longest_match _longest_match
|
||||
#endif
|
||||
|
||||
#define scanend ebx
|
||||
#define scanendw bx
|
||||
#define chainlenwmask edx /* high word: current chain len low word: s->wmask */
|
||||
#define curmatch rsi
|
||||
#define curmatchd esi
|
||||
#define windowbestlen r8
|
||||
#define scanalign r9
|
||||
#define scanalignd r9d
|
||||
#define window r10
|
||||
#define bestlen r11
|
||||
#define bestlend r11d
|
||||
#define scanstart r12d
|
||||
#define scanstartw r12w
|
||||
#define scan r13
|
||||
#define nicematch r14d
|
||||
#define limit r15
|
||||
#define limitd r15d
|
||||
#define prev rcx
|
||||
|
||||
/*
|
||||
* The 258 is a "magic number, not a parameter -- changing it
|
||||
* breaks the hell loose
|
||||
*/
|
||||
#define MAX_MATCH (258)
|
||||
#define MIN_MATCH (3)
|
||||
#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
|
||||
#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
|
||||
|
||||
/* stack frame offsets */
|
||||
#define LocalVarsSize (112)
|
||||
#define _chainlenwmask ( 8-LocalVarsSize)(%rsp)
|
||||
#define _windowbestlen (16-LocalVarsSize)(%rsp)
|
||||
#define save_r14 (24-LocalVarsSize)(%rsp)
|
||||
#define save_rsi (32-LocalVarsSize)(%rsp)
|
||||
#define save_rbx (40-LocalVarsSize)(%rsp)
|
||||
#define save_r12 (56-LocalVarsSize)(%rsp)
|
||||
#define save_r13 (64-LocalVarsSize)(%rsp)
|
||||
#define save_r15 (80-LocalVarsSize)(%rsp)
|
||||
|
||||
|
||||
.globl match_init, longest_match
|
||||
|
||||
/*
|
||||
* On AMD64 the first argument of a function (in our case -- the pointer to
|
||||
* deflate_state structure) is passed in %rdi, hence our offsets below are
|
||||
* all off of that.
|
||||
*/
|
||||
|
||||
/* you can check the structure offset by running
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "deflate.h"
|
||||
|
||||
void print_depl()
|
||||
{
|
||||
deflate_state ds;
|
||||
deflate_state *s=&ds;
|
||||
printf("size pointer=%u\n",(int)sizeof(void*));
|
||||
|
||||
printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s)));
|
||||
printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s)));
|
||||
printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s)));
|
||||
printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s)));
|
||||
printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s)));
|
||||
printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s)));
|
||||
printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s)));
|
||||
printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s)));
|
||||
printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s)));
|
||||
printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s)));
|
||||
printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s)));
|
||||
printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s)));
|
||||
printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s)));
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
to compile for XCode 3.2 on MacOSX x86_64
|
||||
- run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S"
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE
|
||||
#define dsWSize ( 68)(%rdi)
|
||||
#define dsWMask ( 76)(%rdi)
|
||||
#define dsWindow ( 80)(%rdi)
|
||||
#define dsPrev ( 96)(%rdi)
|
||||
#define dsMatchLen (144)(%rdi)
|
||||
#define dsPrevMatch (148)(%rdi)
|
||||
#define dsStrStart (156)(%rdi)
|
||||
#define dsMatchStart (160)(%rdi)
|
||||
#define dsLookahead (164)(%rdi)
|
||||
#define dsPrevLen (168)(%rdi)
|
||||
#define dsMaxChainLen (172)(%rdi)
|
||||
#define dsGoodMatch (188)(%rdi)
|
||||
#define dsNiceMatch (192)(%rdi)
|
||||
|
||||
#else
|
||||
|
||||
#ifndef STRUCT_OFFSET
|
||||
# define STRUCT_OFFSET (0)
|
||||
#endif
|
||||
|
||||
|
||||
#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsStrStart (148 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsLookahead (156 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi)
|
||||
#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
.text
|
||||
|
||||
/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
|
||||
|
||||
longest_match:
|
||||
/*
|
||||
* Retrieve the function arguments. %curmatch will hold cur_match
|
||||
* throughout the entire function (passed via rsi on amd64).
|
||||
* rdi will hold the pointer to the deflate_state (first arg on amd64)
|
||||
*/
|
||||
mov %rsi, save_rsi
|
||||
mov %rbx, save_rbx
|
||||
mov %r12, save_r12
|
||||
mov %r13, save_r13
|
||||
mov %r14, save_r14
|
||||
mov %r15, save_r15
|
||||
|
||||
/* uInt wmask = s->w_mask; */
|
||||
/* unsigned chain_length = s->max_chain_length; */
|
||||
/* if (s->prev_length >= s->good_match) { */
|
||||
/* chain_length >>= 2; */
|
||||
/* } */
|
||||
|
||||
movl dsPrevLen, %eax
|
||||
movl dsGoodMatch, %ebx
|
||||
cmpl %ebx, %eax
|
||||
movl dsWMask, %eax
|
||||
movl dsMaxChainLen, %chainlenwmask
|
||||
jl LastMatchGood
|
||||
shrl $2, %chainlenwmask
|
||||
LastMatchGood:
|
||||
|
||||
/* chainlen is decremented once beforehand so that the function can */
|
||||
/* use the sign flag instead of the zero flag for the exit test. */
|
||||
/* It is then shifted into the high word, to make room for the wmask */
|
||||
/* value, which it will always accompany. */
|
||||
|
||||
decl %chainlenwmask
|
||||
shll $16, %chainlenwmask
|
||||
orl %eax, %chainlenwmask
|
||||
|
||||
/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
|
||||
|
||||
movl dsNiceMatch, %eax
|
||||
movl dsLookahead, %ebx
|
||||
cmpl %eax, %ebx
|
||||
jl LookaheadLess
|
||||
movl %eax, %ebx
|
||||
LookaheadLess: movl %ebx, %nicematch
|
||||
|
||||
/* register Bytef *scan = s->window + s->strstart; */
|
||||
|
||||
mov dsWindow, %window
|
||||
movl dsStrStart, %limitd
|
||||
lea (%limit, %window), %scan
|
||||
|
||||
/* Determine how many bytes the scan ptr is off from being */
|
||||
/* dword-aligned. */
|
||||
|
||||
mov %scan, %scanalign
|
||||
negl %scanalignd
|
||||
andl $3, %scanalignd
|
||||
|
||||
/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
|
||||
/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
|
||||
|
||||
movl dsWSize, %eax
|
||||
subl $MIN_LOOKAHEAD, %eax
|
||||
xorl %ecx, %ecx
|
||||
subl %eax, %limitd
|
||||
cmovng %ecx, %limitd
|
||||
|
||||
/* int best_len = s->prev_length; */
|
||||
|
||||
movl dsPrevLen, %bestlend
|
||||
|
||||
/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */
|
||||
|
||||
lea (%window, %bestlen), %windowbestlen
|
||||
mov %windowbestlen, _windowbestlen
|
||||
|
||||
/* register ush scan_start = *(ushf*)scan; */
|
||||
/* register ush scan_end = *(ushf*)(scan+best_len-1); */
|
||||
/* Posf *prev = s->prev; */
|
||||
|
||||
movzwl (%scan), %scanstart
|
||||
movzwl -1(%scan, %bestlen), %scanend
|
||||
mov dsPrev, %prev
|
||||
|
||||
/* Jump into the main loop. */
|
||||
|
||||
movl %chainlenwmask, _chainlenwmask
|
||||
jmp LoopEntry
|
||||
|
||||
.balign 16
|
||||
|
||||
/* do {
|
||||
* match = s->window + cur_match;
|
||||
* if (*(ushf*)(match+best_len-1) != scan_end ||
|
||||
* *(ushf*)match != scan_start) continue;
|
||||
* [...]
|
||||
* } while ((cur_match = prev[cur_match & wmask]) > limit
|
||||
* && --chain_length != 0);
|
||||
*
|
||||
* Here is the inner loop of the function. The function will spend the
|
||||
* majority of its time in this loop, and majority of that time will
|
||||
* be spent in the first ten instructions.
|
||||
*/
|
||||
LookupLoop:
|
||||
andl %chainlenwmask, %curmatchd
|
||||
movzwl (%prev, %curmatch, 2), %curmatchd
|
||||
cmpl %limitd, %curmatchd
|
||||
jbe LeaveNow
|
||||
subl $0x00010000, %chainlenwmask
|
||||
js LeaveNow
|
||||
LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw
|
||||
jne LookupLoop
|
||||
cmpw %scanstartw, (%window, %curmatch)
|
||||
jne LookupLoop
|
||||
|
||||
/* Store the current value of chainlen. */
|
||||
movl %chainlenwmask, _chainlenwmask
|
||||
|
||||
/* %scan is the string under scrutiny, and %prev 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 $(-MAX_MATCH_8), %rdx
|
||||
lea (%curmatch, %window), %windowbestlen
|
||||
lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen
|
||||
lea MAX_MATCH_8(%scan, %scanalign), %prev
|
||||
|
||||
/* the prefetching below makes very little difference... */
|
||||
prefetcht1 (%windowbestlen, %rdx)
|
||||
prefetcht1 (%prev, %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.
|
||||
*
|
||||
* 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 -- unrolling it, for example, makes no difference.
|
||||
*/
|
||||
|
||||
#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */
|
||||
|
||||
LoopCmps:
|
||||
#ifdef USE_SSE
|
||||
/* Preload the SSE registers */
|
||||
movdqu (%windowbestlen, %rdx), %xmm1
|
||||
movdqu (%prev, %rdx), %xmm2
|
||||
pcmpeqb %xmm2, %xmm1
|
||||
movdqu 16(%windowbestlen, %rdx), %xmm3
|
||||
movdqu 16(%prev, %rdx), %xmm4
|
||||
pcmpeqb %xmm4, %xmm3
|
||||
movdqu 32(%windowbestlen, %rdx), %xmm5
|
||||
movdqu 32(%prev, %rdx), %xmm6
|
||||
pcmpeqb %xmm6, %xmm5
|
||||
movdqu 48(%windowbestlen, %rdx), %xmm7
|
||||
movdqu 48(%prev, %rdx), %xmm8
|
||||
pcmpeqb %xmm8, %xmm7
|
||||
|
||||
/* Check the comparisions' results */
|
||||
pmovmskb %xmm1, %rax
|
||||
notw %ax
|
||||
bsfw %ax, %ax
|
||||
jnz LeaveLoopCmps
|
||||
|
||||
/* this is the only iteration of the loop with a possibility of having
|
||||
incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40
|
||||
and (0x40*4)+8=0x108 */
|
||||
add $8, %rdx
|
||||
jz LenMaximum
|
||||
add $8, %rdx
|
||||
|
||||
|
||||
pmovmskb %xmm3, %rax
|
||||
notw %ax
|
||||
bsfw %ax, %ax
|
||||
jnz LeaveLoopCmps
|
||||
|
||||
|
||||
add $16, %rdx
|
||||
|
||||
|
||||
pmovmskb %xmm5, %rax
|
||||
notw %ax
|
||||
bsfw %ax, %ax
|
||||
jnz LeaveLoopCmps
|
||||
|
||||
add $16, %rdx
|
||||
|
||||
|
||||
pmovmskb %xmm7, %rax
|
||||
notw %ax
|
||||
bsfw %ax, %ax
|
||||
jnz LeaveLoopCmps
|
||||
|
||||
add $16, %rdx
|
||||
|
||||
jmp LoopCmps
|
||||
LeaveLoopCmps: add %rax, %rdx
|
||||
#else
|
||||
mov (%windowbestlen, %rdx), %rax
|
||||
xor (%prev, %rdx), %rax
|
||||
jnz LeaveLoopCmps
|
||||
|
||||
mov 8(%windowbestlen, %rdx), %rax
|
||||
xor 8(%prev, %rdx), %rax
|
||||
jnz LeaveLoopCmps8
|
||||
|
||||
mov 16(%windowbestlen, %rdx), %rax
|
||||
xor 16(%prev, %rdx), %rax
|
||||
jnz LeaveLoopCmps16
|
||||
|
||||
add $24, %rdx
|
||||
jnz LoopCmps
|
||||
jmp LenMaximum
|
||||
# if 0
|
||||
/*
|
||||
* This three-liner is tantalizingly simple, but bsf is a slow instruction,
|
||||
* and the complicated alternative down below is quite a bit faster. Sad...
|
||||
*/
|
||||
|
||||
LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */
|
||||
shrl $3, %eax /* divide by 8 to get the byte */
|
||||
add %rax, %rdx
|
||||
# else
|
||||
LeaveLoopCmps16:
|
||||
add $8, %rdx
|
||||
LeaveLoopCmps8:
|
||||
add $8, %rdx
|
||||
LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */
|
||||
jnz Check16
|
||||
add $4, %rdx
|
||||
shr $32, %rax
|
||||
Check16: testw $0xFFFF, %ax
|
||||
jnz LenLower
|
||||
add $2, %rdx
|
||||
shrl $16, %eax
|
||||
LenLower: subb $1, %al
|
||||
adc $0, %rdx
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* 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 (%prev, %rdx), %rax
|
||||
sub %scan, %rax
|
||||
cmpl $MAX_MATCH, %eax
|
||||
jge LenMaximum
|
||||
|
||||
/* If the length of the match is not longer than the best match we */
|
||||
/* have so far, then forget it and return to the lookup loop. */
|
||||
|
||||
cmpl %bestlend, %eax
|
||||
jg LongerMatch
|
||||
mov _windowbestlen, %windowbestlen
|
||||
mov dsPrev, %prev
|
||||
movl _chainlenwmask, %edx
|
||||
jmp LookupLoop
|
||||
|
||||
/* s->match_start = cur_match; */
|
||||
/* best_len = len; */
|
||||
/* if (len >= nice_match) break; */
|
||||
/* scan_end = *(ushf*)(scan+best_len-1); */
|
||||
|
||||
LongerMatch:
|
||||
movl %eax, %bestlend
|
||||
movl %curmatchd, dsMatchStart
|
||||
cmpl %nicematch, %eax
|
||||
jge LeaveNow
|
||||
|
||||
lea (%window, %bestlen), %windowbestlen
|
||||
mov %windowbestlen, _windowbestlen
|
||||
|
||||
movzwl -1(%scan, %rax), %scanend
|
||||
mov dsPrev, %prev
|
||||
movl _chainlenwmask, %chainlenwmask
|
||||
jmp LookupLoop
|
||||
|
||||
/* Accept the current string, with the maximum possible length. */
|
||||
|
||||
LenMaximum:
|
||||
movl $MAX_MATCH, %bestlend
|
||||
movl %curmatchd, dsMatchStart
|
||||
|
||||
/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
|
||||
/* return s->lookahead; */
|
||||
|
||||
LeaveNow:
|
||||
movl dsLookahead, %eax
|
||||
cmpl %eax, %bestlend
|
||||
cmovngl %bestlend, %eax
|
||||
LookaheadRet:
|
||||
|
||||
/* Restore the registers and return from whence we came. */
|
||||
|
||||
mov save_rsi, %rsi
|
||||
mov save_rbx, %rbx
|
||||
mov save_r12, %r12
|
||||
mov save_r13, %r13
|
||||
mov save_r14, %r14
|
||||
mov save_r15, %r15
|
||||
|
||||
ret
|
||||
|
||||
match_init: ret
|
||||
@@ -0,0 +1,51 @@
|
||||
This is a patched version of zlib, modified to use
|
||||
Pentium-Pro-optimized assembly code in the deflation algorithm. The
|
||||
files changed/added by this patch are:
|
||||
|
||||
README.686
|
||||
match.S
|
||||
|
||||
The speedup that this patch provides varies, depending on whether the
|
||||
compiler used to build the original version of zlib falls afoul of the
|
||||
PPro's speed traps. My own tests show a speedup of around 10-20% at
|
||||
the default compression level, and 20-30% using -9, against a version
|
||||
compiled using gcc 2.7.2.3. Your mileage may vary.
|
||||
|
||||
Note that this code has been tailored for the PPro/PII in particular,
|
||||
and will not perform particuarly well on a Pentium.
|
||||
|
||||
If you are using an assembler other than GNU as, you will have to
|
||||
translate match.S to use your assembler's syntax. (Have fun.)
|
||||
|
||||
Brian Raiter
|
||||
breadbox@muppetlabs.com
|
||||
April, 1998
|
||||
|
||||
|
||||
Added for zlib 1.1.3:
|
||||
|
||||
The patches come from
|
||||
http://www.muppetlabs.com/~breadbox/software/assembly.html
|
||||
|
||||
To compile zlib with this asm file, copy match.S to the zlib directory
|
||||
then do:
|
||||
|
||||
CFLAGS="-O3 -DASMV" ./configure
|
||||
make OBJA=match.o
|
||||
|
||||
|
||||
Update:
|
||||
|
||||
I've been ignoring these assembly routines for years, believing that
|
||||
gcc's generated code had caught up with it sometime around gcc 2.95
|
||||
and the major rearchitecting of the Pentium 4. However, I recently
|
||||
learned that, despite what I believed, this code still has some life
|
||||
in it. On the Pentium 4 and AMD64 chips, it continues to run about 8%
|
||||
faster than the code produced by gcc 4.1.
|
||||
|
||||
In acknowledgement of its continuing usefulness, I've altered the
|
||||
license to match that of the rest of zlib. Share and Enjoy!
|
||||
|
||||
Brian Raiter
|
||||
breadbox@muppetlabs.com
|
||||
April, 2007
|
||||
@@ -145,7 +145,7 @@ LastMatchGood:
|
||||
movl %eax, %ebx
|
||||
LookaheadLess: movl %ebx, nicematch(%esp)
|
||||
|
||||
/* Bytef *scan = s->window + s->strstart; */
|
||||
/* register Bytef *scan = s->window + s->strstart; */
|
||||
|
||||
movl dsWindow(%edx), %esi
|
||||
movl %esi, window(%esp)
|
||||
@@ -181,8 +181,8 @@ LimitPositive:
|
||||
addl %eax, %esi
|
||||
movl %esi, windowbestlen(%esp)
|
||||
|
||||
/* ush scan_start = *(ushf*)scan; */
|
||||
/* ush scan_end = *(ushf*)(scan+best_len-1); */
|
||||
/* register ush scan_start = *(ushf*)scan; */
|
||||
/* register ush scan_end = *(ushf*)(scan+best_len-1); */
|
||||
/* Posf *prev = s->prev; */
|
||||
|
||||
movzwl (%edi), %ebx
|
||||
|
||||
@@ -1,166 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
project(
|
||||
blast
|
||||
VERSION 1.3.0
|
||||
LANGUAGES C
|
||||
DESCRIPTION "A library for creating zipfiles based in zlib"
|
||||
HOMEPAGE_URL "https://www.zlib.net")
|
||||
|
||||
option(ZLIB_BLAST_BUILD_SHARED "Enable building blast shared library" ON)
|
||||
option(ZLIB_BLAST_BUILD_STATIC "Enable building blast static library" ON)
|
||||
option(ZLIB_BLAST_BUILD_TESTING "Enable building tests for blast" ON)
|
||||
option(ZLIB_BLAST_INSTALL "Enable installation of blast" ON)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
if(WIN32 OR CYGWIN)
|
||||
set(zlibblast_static_suffix "s")
|
||||
set(CMAKE_DEBUG_POSTFIX "d")
|
||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||
endif(WIN32 OR CYGWIN)
|
||||
|
||||
function(blast_findTestEnv testName)
|
||||
set(testEnv "PATH=")
|
||||
|
||||
if(MSVC OR MINGW)
|
||||
set(separator "\\\;")
|
||||
else()
|
||||
set(separator ":")
|
||||
endif()
|
||||
|
||||
string(APPEND testEnv "$<TARGET_FILE_DIR:BLAST::BLAST>${separator}")
|
||||
string(APPEND testEnv "$ENV{PATH}")
|
||||
|
||||
set_tests_properties(${testName} PROPERTIES ENVIRONMENT "${testEnv}")
|
||||
endfunction(blast_findTestEnv testName)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
add_library(zlib_blast_blast SHARED
|
||||
blast.c
|
||||
blast.h)
|
||||
|
||||
add_library(BLAST::BLAST ALIAS zlib_blast_blast)
|
||||
|
||||
if(NOT CYGWIN)
|
||||
set_target_properties(zlib_blast_blast
|
||||
PROPERTIES
|
||||
SOVERSION ${blast_VERSION_MAJOR}
|
||||
VERSION ${blast_VERSION})
|
||||
endif(NOT CYGWIN)
|
||||
|
||||
set_target_properties(zlib_blast_blast
|
||||
PROPERTIES
|
||||
EXPORT_NAME BLAST
|
||||
OUTPUT_NAME blast)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_TESTING)
|
||||
enable_testing()
|
||||
add_executable(zlib_blast_blast-test blast-test.c)
|
||||
target_link_libraries(zlib_blast_blast-test PRIVATE zlib_blast_blast)
|
||||
|
||||
add_test(NAME zlib_blast_blast-test
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
|
||||
"$<TARGET_FILE:zlib_blast_blast-test>"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
if(MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
blast_findtestenv(zlib_blast_blast-test)
|
||||
endif(
|
||||
MSVC
|
||||
OR MSYS
|
||||
OR MINGW
|
||||
OR CYGWIN)
|
||||
endif(ZLIB_BLAST_BUILD_TESTING)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
add_library(zlib_blast_blastStatic STATIC
|
||||
blast.c
|
||||
blast.h)
|
||||
|
||||
add_library(BLAST::BLASTSTATIC ALIAS zlib_blast_blastStatic)
|
||||
|
||||
set_target_properties(zlib_blast_blastStatic
|
||||
PROPERTIES
|
||||
EXPORT_NAME BLASTSTATIC
|
||||
OUTPUT_NAME blast${zlibblast_static_suffix})
|
||||
|
||||
if(ZLIB_BLAST_BUILD_TESTING)
|
||||
enable_testing()
|
||||
add_executable(zlib_blast_testStatic blast-test.c)
|
||||
target_link_libraries(zlib_blast_testStatic
|
||||
PRIVATE zlib_blast_blastStatic)
|
||||
|
||||
add_test(NAME zlib_blast_testStatic
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
|
||||
"$<TARGET_FILE:zlib_blast_testStatic>"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}")
|
||||
endif(ZLIB_BLAST_BUILD_TESTING)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_TESTING)
|
||||
add_subdirectory(test)
|
||||
endif(ZLIB_BLAST_BUILD_TESTING)
|
||||
|
||||
if(ZLIB_BLAST_INSTALL)
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
install(
|
||||
TARGETS zlib_blast_blast
|
||||
COMPONENT Runtime
|
||||
EXPORT zlibBlastSharedExport
|
||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||
install(
|
||||
EXPORT zlibBlastSharedExport
|
||||
FILE blast-shared.cmake
|
||||
NAMESPACE BLAST::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/blast)
|
||||
|
||||
if(MSVC)
|
||||
install(
|
||||
FILES $<TARGET_PDB_FILE:zlib_blast_blast>
|
||||
COMPONENT Development
|
||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
CONFIGURATIONS Debug OR RelWithDebInfo
|
||||
OPTIONAL)
|
||||
endif(MSVC)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
install(
|
||||
TARGETS zlib_blast_blastStatic
|
||||
COMPONENT Development
|
||||
EXPORT zlibBlastStaticExport
|
||||
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
||||
install(
|
||||
EXPORT zlibBlastStaticExport
|
||||
FILE blast-static.cmake
|
||||
NAMESPACE BLAST::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/blast)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
|
||||
configure_package_config_file(
|
||||
${blast_SOURCE_DIR}/blastConfig.cmake.in
|
||||
${blast_BINARY_DIR}/blastConfig.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/blast)
|
||||
|
||||
write_basic_package_version_file(
|
||||
"${blast_BINARY_DIR}/blastConfigVersion.cmake"
|
||||
VERSION "${blast_VERSION}"
|
||||
COMPATIBILITY AnyNewerVersion)
|
||||
|
||||
install(FILES ${blast_BINARY_DIR}/blastConfig.cmake
|
||||
${blast_BINARY_DIR}/blastConfigVersion.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/blast)
|
||||
install(
|
||||
FILES blast.h
|
||||
COMPONENT Development
|
||||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
endif(ZLIB_BLAST_INSTALL)
|
||||
@@ -1,14 +1,8 @@
|
||||
all: test
|
||||
blast: blast.c blast.h
|
||||
cc -DTEST -o blast blast.c
|
||||
|
||||
libblast.so: blast.c blast.h
|
||||
cc -o libblast.so -shared blast.c
|
||||
|
||||
blast-test: libblast.so
|
||||
cc -o blast-test.o -c blast-test.c
|
||||
cc -o blast-test blast-test.o libblast.so
|
||||
|
||||
test: blast-test
|
||||
LD_LIBRARY_PATH=./ ./blast-test < test.pk | cmp - test.txt
|
||||
test: blast
|
||||
blast < test.pk | cmp - test.txt
|
||||
|
||||
clean:
|
||||
rm -f libblast.so blast-test blast-test.o
|
||||
rm -f blast blast.o
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
#include "blast.h" /* prototype for blast() */
|
||||
|
||||
/* Example of how to use blast() */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define CHUNK 16384
|
||||
|
||||
local unsigned inf(void *how, unsigned char **buf)
|
||||
{
|
||||
static unsigned char hold[CHUNK];
|
||||
|
||||
*buf = hold;
|
||||
return fread(hold, 1, CHUNK, (FILE *)how);
|
||||
}
|
||||
|
||||
local int outf(void *how, unsigned char *buf, unsigned len)
|
||||
{
|
||||
return fwrite(buf, 1, len, (FILE *)how) != len;
|
||||
}
|
||||
|
||||
/* Decompress a PKWare Compression Library stream from stdin to stdout */
|
||||
int main(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned left;
|
||||
|
||||
/* decompress to stdout */
|
||||
left = 0;
|
||||
ret = blast(inf, stdin, outf, stdout, &left, NULL);
|
||||
if (ret != 0)
|
||||
fprintf(stderr, "blast error: %d\n", ret);
|
||||
|
||||
/* count any leftover bytes */
|
||||
while (getchar() != EOF)
|
||||
left++;
|
||||
if (left)
|
||||
fprintf(stderr, "blast warning: %u unused bytes of input\n", left);
|
||||
|
||||
/* return blast() error code */
|
||||
return ret;
|
||||
}
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */
|
||||
#include "blast.h" /* prototype for blast() */
|
||||
|
||||
#define local static /* for local function definitions */
|
||||
#define MAXBITS 13 /* maximum code length */
|
||||
#define MAXWIN 4096 /* maximum window size */
|
||||
|
||||
@@ -420,3 +421,46 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
|
||||
err = 1;
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
/* Example of how to use blast() */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define CHUNK 16384
|
||||
|
||||
local unsigned inf(void *how, unsigned char **buf)
|
||||
{
|
||||
static unsigned char hold[CHUNK];
|
||||
|
||||
*buf = hold;
|
||||
return fread(hold, 1, CHUNK, (FILE *)how);
|
||||
}
|
||||
|
||||
local int outf(void *how, unsigned char *buf, unsigned len)
|
||||
{
|
||||
return fwrite(buf, 1, len, (FILE *)how) != len;
|
||||
}
|
||||
|
||||
/* Decompress a PKWare Compression Library stream from stdin to stdout */
|
||||
int main(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned left;
|
||||
|
||||
/* decompress to stdout */
|
||||
left = 0;
|
||||
ret = blast(inf, stdin, outf, stdout, &left, NULL);
|
||||
if (ret != 0)
|
||||
fprintf(stderr, "blast error: %d\n", ret);
|
||||
|
||||
/* count any leftover bytes */
|
||||
while (getchar() != EOF)
|
||||
left++;
|
||||
if (left)
|
||||
fprintf(stderr, "blast warning: %u unused bytes of input\n", left);
|
||||
|
||||
/* return blast() error code */
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
Mark Adler madler@alumni.caltech.edu
|
||||
*/
|
||||
|
||||
#define local static /* for local function definitions */
|
||||
|
||||
/*
|
||||
* blast() decompresses the PKWare Data Compression Library (DCL) compressed
|
||||
@@ -58,7 +57,7 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
|
||||
* use by the application to pass an input descriptor to infun(), if desired.
|
||||
*
|
||||
* If left and in are not NULL and *left is not zero when blast() is called,
|
||||
* then the *left bytes at *in are consumed for input before infun() is used.
|
||||
* then the *left bytes are *in are consumed for input before infun() is used.
|
||||
*
|
||||
* The output function is invoked: err = outfun(how, buf, len), where the bytes
|
||||
* to be written are buf[0..len-1]. If err is not zero, then blast() returns
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
set(_blast_supported_components "shared" "static")
|
||||
|
||||
if(blast_FIND_COMPONENTS)
|
||||
foreach(_comp ${blast_FIND_COMPONENTS})
|
||||
if(NOT _comp IN_LIST _blast_supported_components)
|
||||
set(blast_FOUND False)
|
||||
set(blast_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}")
|
||||
endif(NOT _comp IN_LIST _blast_supported_components)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/blast-${_comp}.cmake")
|
||||
endforeach(_comp ${blast_FIND_COMPONENTS})
|
||||
else(blast_FIND_COMPONENTS)
|
||||
foreach(_component_config IN LISTS _blast_supported_components)
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/blast-${_component_config}.cmake")
|
||||
endforeach(_component_config IN LISTS _blast_supported_components)
|
||||
endif(blast_FIND_COMPONENTS)
|
||||
@@ -1,193 +0,0 @@
|
||||
# if we are built from with zlib, use this path's)
|
||||
if(DEFINED ZLIB_BUILD_BLAST)
|
||||
set(WORK_DIR ${zlib_BINARY_DIR})
|
||||
set(inst_setup zlib_install)
|
||||
else(DEFINED ZLIB_BUILD_BLAST)
|
||||
set(WORK_DIR ${blast_BINARY_DIR})
|
||||
set(inst_setup zlib_blast_install)
|
||||
set(ZLIB_ARG "-DZLIB_DIR=${ZLIB_DIR}")
|
||||
|
||||
add_test(
|
||||
NAME zlib_blast_install
|
||||
COMMAND ${CMAKE_COMMAND} --install ${blast_BINARY_DIR} --prefix
|
||||
${CMAKE_CURRENT_BINARY_DIR}/test_install --config $<CONFIG>
|
||||
WORKING_DIRECTORY ${blast_BINARY_DIR})
|
||||
|
||||
set_tests_properties(zlib_blast_install
|
||||
PROPERTIES
|
||||
FIXTURES_SETUP zlib_blast_install)
|
||||
endif(DEFINED ZLIB_BUILD_BLAST)
|
||||
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/findpackage_test)
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test)
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/find_package_test.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/findpackage_test/CMakeLists.txt @ONLY)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/add_subdirectory_test.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test/CMakeLists.txt @ONLY)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/add_subdirectory_exclude_test.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test/CMakeLists.txt
|
||||
@ONLY)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/find_package_no_components_test.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/findpackage_no_components_test/CMakeLists.txt
|
||||
@ONLY)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/find_package_wrong_components_test.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/findpackage_wrong_components_test/CMakeLists.txt
|
||||
@ONLY)
|
||||
|
||||
# CMAKE_GENERATOR_PLATFORM doesn't work in the if
|
||||
set(GENERATOR ${CMAKE_GENERATOR_PLATFORM})
|
||||
|
||||
if(GENERATOR)
|
||||
set(PLATFORM "-A ${GENERATOR}")
|
||||
endif(GENERATOR)
|
||||
|
||||
#
|
||||
# findpackage_test
|
||||
#
|
||||
add_test(
|
||||
NAME zlib_blast_find_package_configure
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${PLATFORM}
|
||||
-B${CMAKE_CURRENT_BINARY_DIR}/findpackage_test_build
|
||||
-DCMAKE_BUILD_TYPE=$<CONFIG>
|
||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-DCMAKE_INSTALL_PREFIX=${WORK_DIR}/test/test_install ${ZLIB_ARG}
|
||||
--fresh
|
||||
-G "${CMAKE_GENERATOR}"
|
||||
-S${CMAKE_CURRENT_BINARY_DIR}/findpackage_test)
|
||||
|
||||
add_test(
|
||||
NAME zlib_blast_find_package_build
|
||||
COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG>
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/findpackage_test_build)
|
||||
|
||||
set_tests_properties(
|
||||
zlib_blast_find_package_configure
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED ${inst_setup}
|
||||
FIXTURES_SETUP blast_fp_config)
|
||||
|
||||
set_tests_properties(zlib_blast_find_package_build
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED blast_fp_config)
|
||||
|
||||
#
|
||||
# add_subdirectory_test
|
||||
#
|
||||
add_test(
|
||||
NAME zlib_blast_add_subdirectory_configure
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${PLATFORM}
|
||||
-B${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_build
|
||||
-DCMAKE_BUILD_TYPE=$<CONFIG>
|
||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-DCMAKE_INSTALL_PREFIX=${WORK_DIR}/test/test_install ${ZLIB_ARG}
|
||||
--fresh
|
||||
-G "${CMAKE_GENERATOR}"
|
||||
-S${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test)
|
||||
|
||||
add_test(
|
||||
NAME zlib_blast_add_subdirectory_build
|
||||
COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG>
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_build)
|
||||
|
||||
set_tests_properties(
|
||||
zlib_blast_add_subdirectory_configure
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED ${inst_setup}
|
||||
FIXTURES_SETUP blast_as_config)
|
||||
|
||||
set_tests_properties(zlib_blast_add_subdirectory_build
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED blast_as_config)
|
||||
|
||||
#
|
||||
# add_subdirectory_exclude_test
|
||||
#
|
||||
add_test(
|
||||
NAME zlib_blast_add_subdirectory_exclude_configure
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${PLATFORM}
|
||||
-B${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_build
|
||||
-DCMAKE_BUILD_TYPE=$<CONFIG>
|
||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-DCMAKE_INSTALL_PREFIX=${WORK_DIR}/test/test_install ${ZLIB_ARG}
|
||||
--fresh
|
||||
-G "${CMAKE_GENERATOR}"
|
||||
-S${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test)
|
||||
|
||||
add_test(
|
||||
NAME zlib_blast_add_subdirectory_exclude_build
|
||||
COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG>
|
||||
WORKING_DIRECTORY
|
||||
${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_build)
|
||||
|
||||
set_tests_properties(zlib_blast_add_subdirectory_exclude_configure
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED ${inst_setup}
|
||||
FIXTURES_SETUP blast_asx_config)
|
||||
|
||||
set_tests_properties(zlib_blast_add_subdirectory_exclude_build
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED blast_asx_config)
|
||||
|
||||
#
|
||||
# findpackage_no_components_test
|
||||
#
|
||||
add_test(
|
||||
NAME zlib_blast_find_package_no_components_configure
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${PLATFORM}
|
||||
-B${CMAKE_CURRENT_BINARY_DIR}/findpackage_no_components_test_build
|
||||
-DCMAKE_BUILD_TYPE=$<CONFIG> -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-DCMAKE_INSTALL_PREFIX=${WORK_DIR}/test/test_install ${ZLIB_ARG}
|
||||
--fresh
|
||||
-G "${CMAKE_GENERATOR}"
|
||||
-S${CMAKE_CURRENT_BINARY_DIR}/findpackage_no_components_test)
|
||||
|
||||
set_tests_properties(
|
||||
zlib_blast_find_package_no_components_configure
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED ${inst_setup})
|
||||
|
||||
if(NOT ZLIB_BLAST_BUILD_SHARED OR NOT ZLIB_BLAST_BUILD_STATIC)
|
||||
set_tests_properties(zlib_blast_find_package_no_components_configure
|
||||
PROPERTIES
|
||||
WILL_FAIL TRUE)
|
||||
endif(NOT ZLIB_BLAST_BUILD_SHARED OR NOT ZLIB_BLAST_BUILD_STATIC)
|
||||
|
||||
#
|
||||
# findpackage_wrong_components_test
|
||||
#
|
||||
add_test(
|
||||
NAME zlib_blast_find_package_wrong_components_configure
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${PLATFORM}
|
||||
-B${CMAKE_CURRENT_BINARY_DIR}/findpackage_wrong_components_test_build
|
||||
-DCMAKE_BUILD_TYPE=$<CONFIG> -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
|
||||
-DCMAKE_INSTALL_PREFIX=${WORK_DIR}/test/test_install ${ZLIB_ARG}
|
||||
--fresh
|
||||
-G "${CMAKE_GENERATOR}"
|
||||
-S${CMAKE_CURRENT_BINARY_DIR}/findpackage_wrong_components_test)
|
||||
|
||||
set_tests_properties(zlib_blast_find_package_wrong_components_configure
|
||||
PROPERTIES
|
||||
FIXTURES_REQUIRED ${inst_setup}
|
||||
WILL_FAIL TRUE)
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
project(
|
||||
blast_find_package
|
||||
LANGUAGES C
|
||||
VERSION @blast_VERSION@)
|
||||
|
||||
option(ZLIB_BLAST_BUILD_SHARED "" @ZLIB_BLAST_BUILD_SHARED@)
|
||||
option(ZLIB_BLAST_BUILD_STATIC "" @ZLIB_BLAST_BUILD_STATIC@)
|
||||
option(ZLIB_BLAST_BUILD_TESTING "" @ZLIB_BLAST_BUILD_TESTING@)
|
||||
|
||||
add_subdirectory(@blast_SOURCE_DIR@
|
||||
${CMAKE_CURRENT_BINARY_DIR}/blast
|
||||
EXCLUDE_FROM_ALL)
|
||||
|
||||
set(BLAST_SRCS
|
||||
@blast_SOURCE_DIR@/blast-test.c)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
add_executable(test_example ${BLAST_SRCS})
|
||||
target_link_libraries(test_example BLAST::BLAST)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
add_executable(test_example_static ${BLAST_SRCS})
|
||||
target_link_libraries(test_example_static BLAST::BLASTSTATIC)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
@@ -1,25 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
project(
|
||||
blast_find_package
|
||||
LANGUAGES C
|
||||
VERSION @blast_VERSION@)
|
||||
|
||||
option(ZLIB_BLAST_BUILD_SHARED "" @ZLIB_BLAST_BUILD_SHARED@)
|
||||
option(ZLIB_BLAST_BUILD_STATIC "" @ZLIB_BLAST_BUILD_STATIC@)
|
||||
option(ZLIB_BLAST_BUILD_TESTING "" @ZLIB_BLAST_BUILD_TESTING@)
|
||||
|
||||
add_subdirectory(@blast_SOURCE_DIR@ ${CMAKE_CURRENT_BINARY_DIR}/blast)
|
||||
|
||||
set(BLAST_SRCS
|
||||
@blast_SOURCE_DIR@/blast-test.c)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
add_executable(test_example ${BLAST_SRCS})
|
||||
target_link_libraries(test_example BLAST::BLAST)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
add_executable(test_example_static ${BLAST_SRCS})
|
||||
target_link_libraries(test_example_static BLAST::BLASTSTATIC)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
@@ -1,24 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
project(
|
||||
blast_find_package
|
||||
LANGUAGES C
|
||||
VERSION @blast_VERSION@)
|
||||
|
||||
option(ZLIB_BLAST_BUILD_SHARED "" @ZLIB_BLAST_BUILD_SHARED@)
|
||||
option(ZLIB_BLAST_BUILD_STATIC "" @ZLIB_BLAST_BUILD_STATIC@)
|
||||
|
||||
find_package(blast REQUIRED CONFIG)
|
||||
|
||||
set(BLAST_SRCS
|
||||
@blast_SOURCE_DIR@/blast-test.c)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
add_executable(test_example ${BLAST_SRCS})
|
||||
target_link_libraries(test_example BLAST::BLAST)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
add_executable(test_example_static ${BLAST_SRCS})
|
||||
target_link_libraries(test_example_static BLAST::BLASTSTATIC)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
@@ -1,24 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
project(
|
||||
blast_find_package
|
||||
LANGUAGES C
|
||||
VERSION @blast_VERSION@)
|
||||
|
||||
option(ZLIB_BLAST_BUILD_SHARED "" @ZLIB_BLAST_BUILD_SHARED@)
|
||||
option(ZLIB_BLAST_BUILD_STATIC "" @ZLIB_BLAST_BUILD_STATIC@)
|
||||
|
||||
set(BLAST_SRCS
|
||||
@blast_SOURCE_DIR@/blast-test.c)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
find_package(blast REQUIRED COMPONENTS shared CONFIG)
|
||||
add_executable(test_example ${BLAST_SRCS})
|
||||
target_link_libraries(test_example BLAST::BLAST)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
find_package(blast REQUIRED COMPONENTS static CONFIG)
|
||||
add_executable(test_example_static ${BLAST_SRCS})
|
||||
target_link_libraries(test_example_static BLAST::BLASTSTATIC)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
@@ -1,24 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
project(
|
||||
blast_find_package
|
||||
LANGUAGES C
|
||||
VERSION @blast_VERSION@)
|
||||
|
||||
option(ZLIB_BLAST_BUILD_SHARED "" @ZLIB_BLAST_BUILD_SHARED@)
|
||||
option(ZLIB_BLAST_BUILD_STATIC "" @ZLIB_BLAST_BUILD_STATIC@)
|
||||
|
||||
find_package(blast REQUIRED COMPONENTS wrong CONFIG)
|
||||
|
||||
set(BLAST_SRCS
|
||||
@blast_SOURCE_DIR@/blast-test.c)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_SHARED)
|
||||
add_executable(test_example ${BLAST_SRCS})
|
||||
target_link_libraries(test_example BLAST::BLAST)
|
||||
endif(ZLIB_BLAST_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BLAST_BUILD_STATIC)
|
||||
add_executable(test_example_static ${BLAST_SRCS})
|
||||
target_link_libraries(test_example_static BLAST::BLASTSTATIC)
|
||||
endif(ZLIB_BLAST_BUILD_STATIC)
|
||||
@@ -1,28 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.12...3.31)
|
||||
|
||||
#CMAKE_ARGV0 = ${CMAKE_COMMAND}
|
||||
#CMAKE_ARGV1 = -P
|
||||
#CMAKE_ARGV2 = ${CMAKE_CURRENT_SOURCE_DIR}/tester.cmake
|
||||
#CMAKE_ARGV3 = "$<TARGET_FILE:blast-test>"
|
||||
#CMAKE_ARGV4 = "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
#CMAKE_ARGV5 = "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV3}
|
||||
INPUT_FILE "${CMAKE_ARGV4}/test.pk"
|
||||
OUTPUT_FILE "${CMAKE_ARGV5}/output.txt"
|
||||
RESULT_VARIABLE RESULT)
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR "Command exitited with: ${RESULT}")
|
||||
endif(RESULT)
|
||||
|
||||
execute_process(COMMAND ${CMAKE_ARGV0} -E compare_files
|
||||
"${CMAKE_ARGV4}/test.txt"
|
||||
"${CMAKE_ARGV5}/output.txt"
|
||||
RESULT_VARIABLE RESULT)
|
||||
|
||||
file(REMOVE "${CMAKE_ARGV5}/output.txt")
|
||||
|
||||
if(RESULT)
|
||||
message(FATAL_ERROR "Files differ")
|
||||
endif(RESULT)
|
||||
@@ -1,67 +0,0 @@
|
||||
# check if we compile for IBM s390x
|
||||
#
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
#ifndef __s390x__
|
||||
#error
|
||||
#endif
|
||||
int main() {return 0;}
|
||||
" HAS_S390X_SUPPORT)
|
||||
|
||||
#
|
||||
# Check for IBM S390X - VX extensions
|
||||
#
|
||||
if(ZLIB_WITH_CRC32VX AND HAS_S390X_SUPPORT)
|
||||
# preset the compiler specific flags
|
||||
if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||
set(VGFMAFLAG "-fzvector")
|
||||
else()
|
||||
set(VGFMAFLAG "-mzarch")
|
||||
endif(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||
|
||||
set(S390X_VX_TEST
|
||||
"#ifndef __s390x__ \n\
|
||||
#error \n\
|
||||
#endif \n\
|
||||
#include <vecintrin.h> \n\
|
||||
int main(void) { \
|
||||
unsigned long long a __attribute__((vector_size(16))) = { 0 }; \
|
||||
unsigned long long b __attribute__((vector_size(16))) = { 0 }; \
|
||||
unsigned char c __attribute__((vector_size(16))) = { 0 }; \
|
||||
c = vec_gfmsum_accum_128(a, b, c); \
|
||||
return c[0]; \
|
||||
}")
|
||||
|
||||
# cflags already contains a valid march
|
||||
set(CMAKE_REQUIRED_FLAGS "${VGFMAFLAG}")
|
||||
check_c_source_compiles("${S390X_VX_TEST}" HAS_S390X_VX_SUPPORT)
|
||||
unset(CMAKE_REQUIRED_FLAGS)
|
||||
|
||||
# or set march for our compile units
|
||||
if(NOT HAS_S390X_VX_SUPPORT)
|
||||
set(CMAKE_REQUIRED_FLAGS "${VGFMAFLAG} -march=z13")
|
||||
check_c_source_compiles("${S390X_VX_TEST}" HAS_Z13_S390X_VX_SUPPORT)
|
||||
unset(CMAKE_REQUIRED_FLAGS )
|
||||
list(APPEND VGFMAFLAG "-march=z13")
|
||||
endif(NOT HAS_S390X_VX_SUPPORT)
|
||||
|
||||
# prepare compiling for s390x
|
||||
if(HAS_S390X_VX_SUPPORT OR HAS_Z13_S390X_VX_SUPPORT)
|
||||
if(ZLIB_BUILD_SHARED)
|
||||
target_sources(zlib
|
||||
PRIVATE
|
||||
crc32_vx.c
|
||||
crc32_vx_hooks.h)
|
||||
target_compile_definitions(zlib PUBLIC -DHAVE_S390X_VX=1)
|
||||
endif(ZLIB_BUILD_SHARED)
|
||||
if(ZLIB_BUILD_STATIC)
|
||||
target_sources(zlibstatic
|
||||
PRIVATE
|
||||
crc32_vx.c
|
||||
crc32_vx_hooks.h)
|
||||
target_compile_definitions(zlibstatic PUBLIC -DHAVE_S390X_VX=1)
|
||||
endif(ZLIB_BUILD_STATIC)
|
||||
set_source_files_properties(
|
||||
crc32_vx.c
|
||||
PROPERTIES COMPILE_OPTIONS "${VGFMAFLAG}")
|
||||
endif(HAS_S390X_VX_SUPPORT OR HAS_Z13_S390X_VX_SUPPORT)
|
||||
endif(ZLIB_WITH_CRC32VX AND HAS_S390X_SUPPORT)
|
||||
@@ -1,9 +0,0 @@
|
||||
IBM Z mainframes starting from version z13 provide vector instructions, which
|
||||
allows vectorization of crc32. This extension is build by default when targeting
|
||||
ibm s390x. However this extension can disabled if desired:
|
||||
|
||||
# for configure build
|
||||
$ ./configure --disable-crcvx
|
||||
|
||||
# for cmake build
|
||||
$ cmake .. -DZLIB_CRC32VX=off
|
||||
@@ -1,254 +0,0 @@
|
||||
/*
|
||||
* Hardware-accelerated CRC-32 variants for Linux on z Systems
|
||||
*
|
||||
* Use the z/Architecture Vector Extension Facility to accelerate the
|
||||
* computing of bitreflected CRC-32 checksums.
|
||||
*
|
||||
* This CRC-32 implementation algorithm is bitreflected and processes
|
||||
* the least-significant bit first (Little-Endian).
|
||||
*
|
||||
* This code was originally written by Hendrik Brueckner
|
||||
* <brueckner@linux.vnet.ibm.com> for use in the Linux kernel and has been
|
||||
* relicensed under the zlib license.
|
||||
*/
|
||||
#define Z_ONCE
|
||||
#include "../../zutil.h"
|
||||
#include "crc32_vx_hooks.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <vecintrin.h>
|
||||
#include <sys/auxv.h>
|
||||
|
||||
#ifdef __clang__
|
||||
# if ((__clang_major__ == 18) || (__clang_major__ == 19 && (__clang_minor__ < 1 || (__clang_minor__ == 1 && __clang_patchlevel__ < 2))))
|
||||
# error crc32_vx optimizations are broken due to compiler bug in Clang versions: 18.0.0 <= clang_version < 19.1.2. \
|
||||
Either disable the zlib crc32_vx optimization, or switch to another compiler/compiler version.
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define VX_MIN_LEN 64
|
||||
#define VX_ALIGNMENT 16L
|
||||
#define VX_ALIGN_MASK (VX_ALIGNMENT - 1)
|
||||
|
||||
typedef unsigned char uv16qi __attribute__((vector_size(16)));
|
||||
typedef unsigned int uv4si __attribute__((vector_size(16)));
|
||||
typedef unsigned long long uv2di __attribute__((vector_size(16)));
|
||||
|
||||
local uint32_t crc32_le_vgfm_16(uint32_t crc, const unsigned char *buf, size_t len) {
|
||||
/*
|
||||
* The CRC-32 constant block contains reduction constants to fold and
|
||||
* process particular chunks of the input data stream in parallel.
|
||||
*
|
||||
* For the CRC-32 variants, the constants are precomputed according to
|
||||
* these definitions:
|
||||
*
|
||||
* R1 = [(x4*128+32 mod P'(x) << 32)]' << 1
|
||||
* R2 = [(x4*128-32 mod P'(x) << 32)]' << 1
|
||||
* R3 = [(x128+32 mod P'(x) << 32)]' << 1
|
||||
* R4 = [(x128-32 mod P'(x) << 32)]' << 1
|
||||
* R5 = [(x64 mod P'(x) << 32)]' << 1
|
||||
* R6 = [(x32 mod P'(x) << 32)]' << 1
|
||||
*
|
||||
* The bitreflected Barret reduction constant, u', is defined as
|
||||
* the bit reversal of floor(x**64 / P(x)).
|
||||
*
|
||||
* where P(x) is the polynomial in the normal domain and the P'(x) is the
|
||||
* polynomial in the reversed (bitreflected) domain.
|
||||
*
|
||||
* CRC-32 (IEEE 802.3 Ethernet, ...) polynomials:
|
||||
*
|
||||
* P(x) = 0x04C11DB7
|
||||
* P'(x) = 0xEDB88320
|
||||
*/
|
||||
const uv16qi perm_le2be = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; /* BE->LE mask */
|
||||
const uv2di r2r1 = {0x1C6E41596, 0x154442BD4}; /* R2, R1 */
|
||||
const uv2di r4r3 = {0x0CCAA009E, 0x1751997D0}; /* R4, R3 */
|
||||
const uv2di r5 = {0, 0x163CD6124}; /* R5 */
|
||||
const uv2di ru_poly = {0, 0x1F7011641}; /* u' */
|
||||
const uv2di crc_poly = {0, 0x1DB710641}; /* P'(x) << 1 */
|
||||
|
||||
/*
|
||||
* Load the initial CRC value.
|
||||
*
|
||||
* The CRC value is loaded into the rightmost word of the
|
||||
* vector register and is later XORed with the LSB portion
|
||||
* of the loaded input data.
|
||||
*/
|
||||
uv2di v0 = {0, 0};
|
||||
v0 = (uv2di)vec_insert(crc, (uv4si)v0, 3);
|
||||
|
||||
/* Load a 64-byte data chunk and XOR with CRC */
|
||||
uv2di v1 = vec_perm(((uv2di *)buf)[0], ((uv2di *)buf)[0], perm_le2be);
|
||||
uv2di v2 = vec_perm(((uv2di *)buf)[1], ((uv2di *)buf)[1], perm_le2be);
|
||||
uv2di v3 = vec_perm(((uv2di *)buf)[2], ((uv2di *)buf)[2], perm_le2be);
|
||||
uv2di v4 = vec_perm(((uv2di *)buf)[3], ((uv2di *)buf)[3], perm_le2be);
|
||||
|
||||
v1 ^= v0;
|
||||
buf += 64;
|
||||
len -= 64;
|
||||
|
||||
while (len >= 64) {
|
||||
/* Load the next 64-byte data chunk */
|
||||
uv16qi part1 = vec_perm(((uv16qi *)buf)[0], ((uv16qi *)buf)[0], perm_le2be);
|
||||
uv16qi part2 = vec_perm(((uv16qi *)buf)[1], ((uv16qi *)buf)[1], perm_le2be);
|
||||
uv16qi part3 = vec_perm(((uv16qi *)buf)[2], ((uv16qi *)buf)[2], perm_le2be);
|
||||
uv16qi part4 = vec_perm(((uv16qi *)buf)[3], ((uv16qi *)buf)[3], perm_le2be);
|
||||
|
||||
/*
|
||||
* Perform a GF(2) multiplication of the doublewords in V1 with
|
||||
* the R1 and R2 reduction constants in V0. The intermediate result
|
||||
* is then folded (accumulated) with the next data chunk in PART1 and
|
||||
* stored in V1. Repeat this step for the register contents
|
||||
* in V2, V3, and V4 respectively.
|
||||
*/
|
||||
v1 = (uv2di)vec_gfmsum_accum_128(r2r1, v1, part1);
|
||||
v2 = (uv2di)vec_gfmsum_accum_128(r2r1, v2, part2);
|
||||
v3 = (uv2di)vec_gfmsum_accum_128(r2r1, v3, part3);
|
||||
v4 = (uv2di)vec_gfmsum_accum_128(r2r1, v4, part4);
|
||||
|
||||
buf += 64;
|
||||
len -= 64;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fold V1 to V4 into a single 128-bit value in V1. Multiply V1 with R3
|
||||
* and R4 and accumulating the next 128-bit chunk until a single 128-bit
|
||||
* value remains.
|
||||
*/
|
||||
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v2);
|
||||
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v3);
|
||||
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v4);
|
||||
|
||||
while (len >= 16) {
|
||||
/* Load next data chunk */
|
||||
v2 = vec_perm(*(uv2di *)buf, *(uv2di *)buf, perm_le2be);
|
||||
|
||||
/* Fold next data chunk */
|
||||
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v2);
|
||||
|
||||
buf += 16;
|
||||
len -= 16;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up a vector register for byte shifts. The shift value must
|
||||
* be loaded in bits 1-4 in byte element 7 of a vector register.
|
||||
* Shift by 8 bytes: 0x40
|
||||
* Shift by 4 bytes: 0x20
|
||||
*/
|
||||
uv16qi v9 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
v9 = vec_insert((unsigned char)0x40, v9, 7);
|
||||
|
||||
/*
|
||||
* Prepare V0 for the next GF(2) multiplication: shift V0 by 8 bytes
|
||||
* to move R4 into the rightmost doubleword and set the leftmost
|
||||
* doubleword to 0x1.
|
||||
*/
|
||||
v0 = vec_srb(r4r3, (uv2di)v9);
|
||||
v0[0] = 1;
|
||||
|
||||
/*
|
||||
* Compute GF(2) product of V1 and V0. The rightmost doubleword
|
||||
* of V1 is multiplied with R4. The leftmost doubleword of V1 is
|
||||
* multiplied by 0x1 and is then XORed with rightmost product.
|
||||
* Implicitly, the intermediate leftmost product becomes padded
|
||||
*/
|
||||
v1 = (uv2di)vec_gfmsum_128(v0, v1);
|
||||
|
||||
/*
|
||||
* Now do the final 32-bit fold by multiplying the rightmost word
|
||||
* in V1 with R5 and XOR the result with the remaining bits in V1.
|
||||
*
|
||||
* To achieve this by a single VGFMAG, right shift V1 by a word
|
||||
* and store the result in V2 which is then accumulated. Use the
|
||||
* vector unpack instruction to load the rightmost half of the
|
||||
* doubleword into the rightmost doubleword element of V1; the other
|
||||
* half is loaded in the leftmost doubleword.
|
||||
* The vector register with CONST_R5 contains the R5 constant in the
|
||||
* rightmost doubleword and the leftmost doubleword is zero to ignore
|
||||
* the leftmost product of V1.
|
||||
*/
|
||||
v9 = vec_insert((unsigned char)0x20, v9, 7);
|
||||
v2 = vec_srb(v1, (uv2di)v9);
|
||||
v1 = vec_unpackl((uv4si)v1); /* Split rightmost doubleword */
|
||||
v1 = (uv2di)vec_gfmsum_accum_128(r5, v1, (uv16qi)v2);
|
||||
|
||||
/*
|
||||
* Apply a Barret reduction to compute the final 32-bit CRC value.
|
||||
*
|
||||
* The input values to the Barret reduction are the degree-63 polynomial
|
||||
* in V1 (R(x)), degree-32 generator polynomial, and the reduction
|
||||
* constant u. The Barret reduction result is the CRC value of R(x) mod
|
||||
* P(x).
|
||||
*
|
||||
* The Barret reduction algorithm is defined as:
|
||||
*
|
||||
* 1. T1(x) = floor( R(x) / x^32 ) GF2MUL u
|
||||
* 2. T2(x) = floor( T1(x) / x^32 ) GF2MUL P(x)
|
||||
* 3. C(x) = R(x) XOR T2(x) mod x^32
|
||||
*
|
||||
* Note: The leftmost doubleword of vector register containing
|
||||
* CONST_RU_POLY is zero and, thus, the intermediate GF(2) product
|
||||
* is zero and does not contribute to the final result.
|
||||
*/
|
||||
|
||||
/* T1(x) = floor( R(x) / x^32 ) GF2MUL u */
|
||||
v2 = vec_unpackl((uv4si)v1);
|
||||
v2 = (uv2di)vec_gfmsum_128(ru_poly, v2);
|
||||
|
||||
/*
|
||||
* Compute the GF(2) product of the CRC polynomial with T1(x) in
|
||||
* V2 and XOR the intermediate result, T2(x), with the value in V1.
|
||||
* The final result is stored in word element 2 of V2.
|
||||
*/
|
||||
v2 = vec_unpackl((uv4si)v2);
|
||||
v2 = (uv2di)vec_gfmsum_accum_128(crc_poly, v2, (uv16qi)v1);
|
||||
|
||||
return ((uv4si)v2)[2];
|
||||
}
|
||||
|
||||
|
||||
local unsigned long s390_crc32_vx(unsigned long crc, const unsigned char FAR *buf, z_size_t len)
|
||||
{
|
||||
uintptr_t prealign, aligned, remaining;
|
||||
|
||||
if (buf == Z_NULL) return 0UL;
|
||||
|
||||
if (len < VX_MIN_LEN + VX_ALIGN_MASK)
|
||||
return crc32_z(crc, buf, len);
|
||||
|
||||
if ((uintptr_t)buf & VX_ALIGN_MASK) {
|
||||
prealign = VX_ALIGNMENT - ((uintptr_t)buf & VX_ALIGN_MASK);
|
||||
len -= prealign;
|
||||
crc = crc32_z(crc, buf, prealign);
|
||||
buf += prealign;
|
||||
}
|
||||
aligned = len & ~VX_ALIGN_MASK;
|
||||
remaining = len & VX_ALIGN_MASK;
|
||||
|
||||
crc = crc32_le_vgfm_16(crc ^ 0xffffffff, buf, (size_t)aligned) ^ 0xffffffff;
|
||||
|
||||
if (remaining)
|
||||
crc = crc32_z(crc, buf + aligned, remaining);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
local z_once_t s390_crc32_made = Z_ONCE_INIT;
|
||||
local void s390_crc32_setup() {
|
||||
unsigned long hwcap = getauxval(AT_HWCAP);
|
||||
|
||||
if (hwcap & HWCAP_S390_VX)
|
||||
crc32_z_hook = s390_crc32_vx;
|
||||
else
|
||||
crc32_z_hook = crc32_z;
|
||||
}
|
||||
|
||||
local unsigned long s390_crc32_init(unsigned long crc, const unsigned char FAR *buf, z_size_t len)
|
||||
{
|
||||
z_once(&s390_crc32_made,s390_crc32_setup);
|
||||
return crc32_z_hook(crc, buf, len);
|
||||
}
|
||||
|
||||
ZLIB_INTERNAL unsigned long (*crc32_z_hook)(unsigned long crc, const unsigned char FAR *buf, z_size_t len) = s390_crc32_init;
|
||||
@@ -1,9 +0,0 @@
|
||||
#ifndef CRC32_VX_HOOKS_H
|
||||
#define CRC32_VX_HOOKS_H
|
||||
|
||||
/**
|
||||
* CRC HOOKS
|
||||
*/
|
||||
ZLIB_INTERNAL extern unsigned long (*crc32_z_hook)(unsigned long crc, const unsigned char FAR *buf, z_size_t len);
|
||||
|
||||
#endif /* CRC32_VX_HOOKS_H */
|
||||
@@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
|
||||
const OutBuf: Pointer; BufSize: Integer);
|
||||
|
||||
const
|
||||
zlib_version = '1.3.2';
|
||||
zlib_version = '1.2.11';
|
||||
|
||||
type
|
||||
EZlibError = class(Exception);
|
||||
|
||||
@@ -1,202 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
#region ChecksumGeneratorBase
|
||||
/// <summary>
|
||||
/// Implements the common functionality needed for all <see cref="ChecksumGenerator"/>s
|
||||
/// </summary>
|
||||
/// <example></example>
|
||||
public abstract class ChecksumGeneratorBase : ChecksumGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// The value of the current checksum
|
||||
/// </summary>
|
||||
protected uint _current;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the checksum generator base - the current checksum is
|
||||
/// set to zero
|
||||
/// </summary>
|
||||
public ChecksumGeneratorBase()
|
||||
{
|
||||
_current = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the checksum generator base with a specified value
|
||||
/// </summary>
|
||||
/// <param name="initialValue">The value to set the current checksum to</param>
|
||||
public ChecksumGeneratorBase(uint initialValue)
|
||||
{
|
||||
_current = initialValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the current checksum to zero
|
||||
/// </summary>
|
||||
public void Reset() { _current = 0; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current checksum value
|
||||
/// </summary>
|
||||
public uint Value { get { return _current; } }
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
/// <remarks>All the other <c>Update</c> methods are implemented in terms of this one.
|
||||
/// This is therefore the only method a derived class has to implement</remarks>
|
||||
public abstract void Update(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with an array of bytes.
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
public void Update(byte[] data)
|
||||
{
|
||||
Update(data, 0, data.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
|
||||
public void Update(string data)
|
||||
{
|
||||
Update(Encoding.UTF8.GetBytes(data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string, using a specific encoding
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <param name="encoding">The encoding to use</param>
|
||||
public void Update(string data, Encoding encoding)
|
||||
{
|
||||
Update(encoding.GetBytes(data));
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region CRC32
|
||||
/// <summary>
|
||||
/// Implements a CRC32 checksum generator
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CRC32 checksum generator
|
||||
/// </summary>
|
||||
public CRC32Checksum() : base() {}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CRC32 checksum generator with a specified value
|
||||
/// </summary>
|
||||
/// <param name="initialValue">The value to set the current checksum to</param>
|
||||
public CRC32Checksum(uint initialValue) : base(initialValue) {}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
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
|
||||
/// <summary>
|
||||
/// Implements a checksum generator that computes the Adler checksum on data
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the Adler checksum generator
|
||||
/// </summary>
|
||||
public AdlerChecksum() : base() {}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the Adler checksum generator with a specified value
|
||||
/// </summary>
|
||||
/// <param name="initialValue">The value to set the current checksum to</param>
|
||||
public AdlerChecksum(uint initialValue) : base(initialValue) {}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
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
|
||||
|
||||
//
|
||||
// © 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
|
||||
/// <summary>
|
||||
/// Implements the common functionality needed for all <see cref="ChecksumGenerator"/>s
|
||||
/// </summary>
|
||||
/// <example></example>
|
||||
public abstract class ChecksumGeneratorBase : ChecksumGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// The value of the current checksum
|
||||
/// </summary>
|
||||
protected uint _current;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the checksum generator base - the current checksum is
|
||||
/// set to zero
|
||||
/// </summary>
|
||||
public ChecksumGeneratorBase()
|
||||
{
|
||||
_current = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the checksum generator basewith a specified value
|
||||
/// </summary>
|
||||
/// <param name="initialValue">The value to set the current checksum to</param>
|
||||
public ChecksumGeneratorBase(uint initialValue)
|
||||
{
|
||||
_current = initialValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the current checksum to zero
|
||||
/// </summary>
|
||||
public void Reset() { _current = 0; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current checksum value
|
||||
/// </summary>
|
||||
public uint Value { get { return _current; } }
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
/// <remarks>All the other <c>Update</c> methods are implmeneted in terms of this one.
|
||||
/// This is therefore the only method a derived class has to implement</remarks>
|
||||
public abstract void Update(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with an array of bytes.
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
public void Update(byte[] data)
|
||||
{
|
||||
Update(data, 0, data.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
|
||||
public void Update(string data)
|
||||
{
|
||||
Update(Encoding.UTF8.GetBytes(data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string, using a specific encoding
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <param name="encoding">The encoding to use</param>
|
||||
public void Update(string data, Encoding encoding)
|
||||
{
|
||||
Update(encoding.GetBytes(data));
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region CRC32
|
||||
/// <summary>
|
||||
/// Implements a CRC32 checksum generator
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CRC32 checksum generator
|
||||
/// </summary>
|
||||
public CRC32Checksum() : base() {}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CRC32 checksum generator with a specified value
|
||||
/// </summary>
|
||||
/// <param name="initialValue">The value to set the current checksum to</param>
|
||||
public CRC32Checksum(uint initialValue) : base(initialValue) {}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
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
|
||||
/// <summary>
|
||||
/// Implements a checksum generator that computes the Adler checksum on data
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the Adler checksum generator
|
||||
/// </summary>
|
||||
public AdlerChecksum() : base() {}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the Adler checksum generator with a specified value
|
||||
/// </summary>
|
||||
/// <param name="initialValue">The value to set the current checksum to</param>
|
||||
public AdlerChecksum(uint initialValue) : base(initialValue) {}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
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
|
||||
|
||||
}
|
||||
@@ -1,83 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// This class implements a circular buffer
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
//
|
||||
// © 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
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// This class implements a circular buffer
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,198 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the common functionality needed for all <see cref="Codec"/>s
|
||||
/// </summary>
|
||||
public abstract class CodecBase : Codec, IDisposable
|
||||
{
|
||||
|
||||
#region Data members
|
||||
|
||||
/// <summary>
|
||||
/// Instance of the internal zlib buffer structure that is
|
||||
/// passed to all functions in the zlib dll
|
||||
/// </summary>
|
||||
internal ZStream _ztream = new ZStream();
|
||||
|
||||
/// <summary>
|
||||
/// True if the object instance has been disposed, false otherwise
|
||||
/// </summary>
|
||||
protected bool _isDisposed = false;
|
||||
|
||||
/// <summary>
|
||||
/// The size of the internal buffers
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <c>CodeBase</c> class.
|
||||
/// </summary>
|
||||
public CodecBase()
|
||||
{
|
||||
try
|
||||
{
|
||||
_hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned);
|
||||
_hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
CleanUp(false);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region Codec Members
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when more processed data are available.
|
||||
/// </summary>
|
||||
public event DataAvailableHandler DataAvailable;
|
||||
|
||||
/// <summary>
|
||||
/// Fires the <see cref="DataAvailable"/> event
|
||||
/// </summary>
|
||||
protected void OnDataAvailable()
|
||||
{
|
||||
if (_ztream.total_out > 0)
|
||||
{
|
||||
if (DataAvailable != null)
|
||||
DataAvailable( _outBuffer, 0, (int)_ztream.total_out);
|
||||
resetOutput();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
public void Add(byte[] data)
|
||||
{
|
||||
Add(data,0,data.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
/// <remarks>This must be implemented by a derived class</remarks>
|
||||
public abstract void Add(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
/// <remarks>This must be implemented by a derived class</remarks>
|
||||
public abstract void Finish();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the checksum of the data that has been added so far
|
||||
/// </summary>
|
||||
public uint Checksum { get { return _checksum; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Destructor & IDisposable stuff
|
||||
|
||||
/// <summary>
|
||||
/// Destroys this instance
|
||||
/// </summary>
|
||||
~CodecBase()
|
||||
{
|
||||
CleanUp(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases any unmanaged resources and calls the <see cref="CleanUp()"/> method of the derived class
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
CleanUp(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs any codec specific cleanup
|
||||
/// </summary>
|
||||
/// <remarks>This must be implemented by a derived class</remarks>
|
||||
protected abstract void CleanUp();
|
||||
|
||||
// performs the release of the handles and calls the derived 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
|
||||
|
||||
/// <summary>
|
||||
/// Copies a number of bytes to the internal codec buffer - ready for processing
|
||||
/// </summary>
|
||||
/// <param name="data">The byte array that contains the data to copy</param>
|
||||
/// <param name="startIndex">The index of the first byte to copy</param>
|
||||
/// <param name="count">The number of bytes to copy from <c>data</c></param>
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the internal output buffers to a known state - ready for processing
|
||||
/// </summary>
|
||||
protected void resetOutput()
|
||||
{
|
||||
_ztream.total_out = 0;
|
||||
_ztream.avail_out = kBufferSize;
|
||||
_ztream.next_out = _hOutput.AddrOfPinnedObject();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the running checksum property
|
||||
/// </summary>
|
||||
/// <param name="newSum">The new checksum value</param>
|
||||
protected void setChecksum(uint newSum)
|
||||
{
|
||||
_checksum = newSum;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
//
|
||||
// © 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
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the common functionality needed for all <see cref="Codec"/>s
|
||||
/// </summary>
|
||||
public abstract class CodecBase : Codec, IDisposable
|
||||
{
|
||||
|
||||
#region Data members
|
||||
|
||||
/// <summary>
|
||||
/// Instance of the internal zlib buffer structure that is
|
||||
/// passed to all functions in the zlib dll
|
||||
/// </summary>
|
||||
internal ZStream _ztream = new ZStream();
|
||||
|
||||
/// <summary>
|
||||
/// True if the object instance has been disposed, false otherwise
|
||||
/// </summary>
|
||||
protected bool _isDisposed = false;
|
||||
|
||||
/// <summary>
|
||||
/// The size of the internal buffers
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <c>CodeBase</c> class.
|
||||
/// </summary>
|
||||
public CodecBase()
|
||||
{
|
||||
try
|
||||
{
|
||||
_hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned);
|
||||
_hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
CleanUp(false);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region Codec Members
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when more processed data are available.
|
||||
/// </summary>
|
||||
public event DataAvailableHandler DataAvailable;
|
||||
|
||||
/// <summary>
|
||||
/// Fires the <see cref="DataAvailable"/> event
|
||||
/// </summary>
|
||||
protected void OnDataAvailable()
|
||||
{
|
||||
if (_ztream.total_out > 0)
|
||||
{
|
||||
if (DataAvailable != null)
|
||||
DataAvailable( _outBuffer, 0, (int)_ztream.total_out);
|
||||
resetOutput();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
public void Add(byte[] data)
|
||||
{
|
||||
Add(data,0,data.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
/// <remarks>This must be implemented by a derived class</remarks>
|
||||
public abstract void Add(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
/// <remarks>This must be implemented by a derived class</remarks>
|
||||
public abstract void Finish();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the checksum of the data that has been added so far
|
||||
/// </summary>
|
||||
public uint Checksum { get { return _checksum; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Destructor & IDisposable stuff
|
||||
|
||||
/// <summary>
|
||||
/// Destroys this instance
|
||||
/// </summary>
|
||||
~CodecBase()
|
||||
{
|
||||
CleanUp(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases any unmanaged resources and calls the <see cref="CleanUp()"/> method of the derived class
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
CleanUp(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs any codec specific cleanup
|
||||
/// </summary>
|
||||
/// <remarks>This must be implemented by a derived class</remarks>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Copies a number of bytes to the internal codec buffer - ready for proccesing
|
||||
/// </summary>
|
||||
/// <param name="data">The byte array that contains the data to copy</param>
|
||||
/// <param name="startIndex">The index of the first byte to copy</param>
|
||||
/// <param name="count">The number of bytes to copy from <c>data</c></param>
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the internal output buffers to a known state - ready for processing
|
||||
/// </summary>
|
||||
protected void resetOutput()
|
||||
{
|
||||
_ztream.total_out = 0;
|
||||
_ztream.avail_out = kBufferSize;
|
||||
_ztream.next_out = _hOutput.AddrOfPinnedObject();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the running checksum property
|
||||
/// </summary>
|
||||
/// <param name="newSum">The new checksum value</param>
|
||||
protected void setChecksum(uint newSum)
|
||||
{
|
||||
_checksum = newSum;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,106 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Implements a data compressor, using the deflate algorithm in the ZLib dll
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an new instance of the <c>Deflater</c>
|
||||
/// </summary>
|
||||
/// <param name="level">The compression level to use for this <c>Deflater</c></param>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
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 );
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the internal zlib deflate stream
|
||||
/// </summary>
|
||||
protected override void CleanUp() { deflateEnd(ref _ztream); }
|
||||
|
||||
}
|
||||
}
|
||||
//
|
||||
// © 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
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Implements a data compressor, using the deflate algorithm in the ZLib dll
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an new instance of the <c>Deflater</c>
|
||||
/// </summary>
|
||||
/// <param name="level">The compression level to use for this <c>Deflater</c></param>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
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 );
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the internal zlib deflate stream
|
||||
/// </summary>
|
||||
protected override void CleanUp() { deflateEnd(ref _ztream); }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,288 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
|
||||
#region Internal types
|
||||
|
||||
/// <summary>
|
||||
/// Defines constants for the various flush types used with zlib
|
||||
/// </summary>
|
||||
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
|
||||
/// <summary>
|
||||
/// Defines constants for the available compression levels in zlib
|
||||
/// </summary>
|
||||
public enum CompressLevel : int
|
||||
{
|
||||
/// <summary>
|
||||
/// The default compression level with a reasonable compromise between compression and speed
|
||||
/// </summary>
|
||||
Default = -1,
|
||||
/// <summary>
|
||||
/// No compression at all. The data are passed straight through.
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// The maximum compression rate available.
|
||||
/// </summary>
|
||||
Best = 9,
|
||||
/// <summary>
|
||||
/// The fastest available compression level.
|
||||
/// </summary>
|
||||
Fastest = 1
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Exception classes
|
||||
/// <summary>
|
||||
/// The exception that is thrown when an error occurs on the zlib dll
|
||||
/// </summary>
|
||||
public class ZLibException : ApplicationException
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
|
||||
/// error message and error code
|
||||
/// </summary>
|
||||
/// <param name="errorCode">The zlib error code that caused the exception</param>
|
||||
/// <param name="msg">A message that (hopefully) describes the error</param>
|
||||
public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg))
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
|
||||
/// error code
|
||||
/// </summary>
|
||||
/// <param name="errorCode">The zlib error code that caused the exception</param>
|
||||
public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode))
|
||||
{
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Interfaces
|
||||
|
||||
/// <summary>
|
||||
/// Declares methods and properties that enables a running checksum to be calculated
|
||||
/// </summary>
|
||||
public interface ChecksumGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the current value of the checksum
|
||||
/// </summary>
|
||||
uint Value { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Clears the current checksum to 0
|
||||
/// </summary>
|
||||
void Reset();
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
void Update(byte[] data);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="ArgumentNullException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
void Update(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
|
||||
void Update(string data);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string, using a specific encoding
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <param name="encoding">The encoding to use</param>
|
||||
void Update(string data, Encoding encoding);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Represents the method that will be called from a codec when new data
|
||||
/// are available.
|
||||
/// </summary>
|
||||
/// <paramref name="data">The byte array containing the processed data</paramref>
|
||||
/// <paramref name="startIndex">The index of the first processed byte in <c>data</c></paramref>
|
||||
/// <paramref name="count">The number of processed bytes available</paramref>
|
||||
/// <remarks>On return from this method, the data may be overwritten, so grab it while you can.
|
||||
/// You cannot assume that startIndex will be zero.
|
||||
/// </remarks>
|
||||
public delegate void DataAvailableHandler(byte[] data, int startIndex, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Declares methods and events for implementing compressors/decompressors
|
||||
/// </summary>
|
||||
public interface Codec
|
||||
{
|
||||
/// <summary>
|
||||
/// Occurs when more processed data are available.
|
||||
/// </summary>
|
||||
event DataAvailableHandler DataAvailable;
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
void Add(byte[] data);
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
void Add(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
void Finish();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the checksum of the data that has been added so far
|
||||
/// </summary>
|
||||
uint Checksum { get; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Classes
|
||||
/// <summary>
|
||||
/// Encapsulates general information about the ZLib library
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an instance of the <c>Info</c> class.
|
||||
/// </summary>
|
||||
public Info()
|
||||
{
|
||||
_flags = zlibCompileFlags();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// True if the library is compiled with debug info
|
||||
/// </summary>
|
||||
public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } }
|
||||
|
||||
/// <summary>
|
||||
/// True if the library is compiled with assembly optimizations
|
||||
/// </summary>
|
||||
public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the unsigned int that was compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfUInt { get { return bitSize(_flags & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the unsigned long that was compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the pointers that were compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the z_off_t type that was compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the version of ZLib as a string, e.g. "1.2.1"
|
||||
/// </summary>
|
||||
public static string Version { get { return zlibVersion(); } }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
//
|
||||
// © 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
|
||||
|
||||
/// <summary>
|
||||
/// Defines constants for the various flush types used with zlib
|
||||
/// </summary>
|
||||
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
|
||||
/// <summary>
|
||||
/// Defines constants for the available compression levels in zlib
|
||||
/// </summary>
|
||||
public enum CompressLevel : int
|
||||
{
|
||||
/// <summary>
|
||||
/// The default compression level with a reasonable compromise between compression and speed
|
||||
/// </summary>
|
||||
Default = -1,
|
||||
/// <summary>
|
||||
/// No compression at all. The data are passed straight through.
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// The maximum compression rate available.
|
||||
/// </summary>
|
||||
Best = 9,
|
||||
/// <summary>
|
||||
/// The fastest available compression level.
|
||||
/// </summary>
|
||||
Fastest = 1
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Exception classes
|
||||
/// <summary>
|
||||
/// The exception that is thrown when an error occurs on the zlib dll
|
||||
/// </summary>
|
||||
public class ZLibException : ApplicationException
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
|
||||
/// error message and error code
|
||||
/// </summary>
|
||||
/// <param name="errorCode">The zlib error code that caused the exception</param>
|
||||
/// <param name="msg">A message that (hopefully) describes the error</param>
|
||||
public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg))
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
|
||||
/// error code
|
||||
/// </summary>
|
||||
/// <param name="errorCode">The zlib error code that caused the exception</param>
|
||||
public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode))
|
||||
{
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Interfaces
|
||||
|
||||
/// <summary>
|
||||
/// Declares methods and properties that enables a running checksum to be calculated
|
||||
/// </summary>
|
||||
public interface ChecksumGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the current value of the checksum
|
||||
/// </summary>
|
||||
uint Value { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Clears the current checksum to 0
|
||||
/// </summary>
|
||||
void Reset();
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
void Update(byte[] data);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with part of an array of bytes
|
||||
/// </summary>
|
||||
/// <param name="data">The data to update the checksum with</param>
|
||||
/// <param name="offset">Where in <c>data</c> to start updating</param>
|
||||
/// <param name="count">The number of bytes from <c>data</c> to use</param>
|
||||
/// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
|
||||
/// <exception cref="ArgumentNullException"><c>data</c> is a null reference</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
|
||||
void Update(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
|
||||
void Update(string data);
|
||||
|
||||
/// <summary>
|
||||
/// Updates the current checksum with the data from a string, using a specific encoding
|
||||
/// </summary>
|
||||
/// <param name="data">The string to update the checksum with</param>
|
||||
/// <param name="encoding">The encoding to use</param>
|
||||
void Update(string data, Encoding encoding);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Represents the method that will be called from a codec when new data
|
||||
/// are available.
|
||||
/// </summary>
|
||||
/// <paramref name="data">The byte array containing the processed data</paramref>
|
||||
/// <paramref name="startIndex">The index of the first processed byte in <c>data</c></paramref>
|
||||
/// <paramref name="count">The number of processed bytes available</paramref>
|
||||
/// <remarks>On return from this method, the data may be overwritten, so grab it while you can.
|
||||
/// You cannot assume that startIndex will be zero.
|
||||
/// </remarks>
|
||||
public delegate void DataAvailableHandler(byte[] data, int startIndex, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Declares methods and events for implementing compressors/decompressors
|
||||
/// </summary>
|
||||
public interface Codec
|
||||
{
|
||||
/// <summary>
|
||||
/// Occurs when more processed data are available.
|
||||
/// </summary>
|
||||
event DataAvailableHandler DataAvailable;
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
void Add(byte[] data);
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
void Add(byte[] data, int offset, int count);
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
void Finish();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the checksum of the data that has been added so far
|
||||
/// </summary>
|
||||
uint Checksum { get; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Classes
|
||||
/// <summary>
|
||||
/// Encapsulates general information about the ZLib library
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an instance of the <c>Info</c> class.
|
||||
/// </summary>
|
||||
public Info()
|
||||
{
|
||||
_flags = zlibCompileFlags();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// True if the library is compiled with debug info
|
||||
/// </summary>
|
||||
public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } }
|
||||
|
||||
/// <summary>
|
||||
/// True if the library is compiled with assembly optimizations
|
||||
/// </summary>
|
||||
public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the unsigned int that was compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfUInt { get { return bitSize(_flags & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the unsigned long that was compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the pointers that were compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the z_off_t type that was compiled into Zlib
|
||||
/// </summary>
|
||||
public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the version of ZLib as a string, e.g. "1.2.1"
|
||||
/// </summary>
|
||||
public static string Version { get { return zlibVersion(); } }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
@@ -1,301 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements a compressed <see cref="Stream"/>, in GZip (.gz) format.
|
||||
/// </summary>
|
||||
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
|
||||
/// <summary>
|
||||
/// Creates a new file as a writeable GZipStream
|
||||
/// </summary>
|
||||
/// <param name="fileName">The name of the compressed file to create</param>
|
||||
/// <param name="level">The compression level to use when adding data</param>
|
||||
/// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Opens an existing file as a readable GZipStream
|
||||
/// </summary>
|
||||
/// <param name="fileName">The name of the file to open</param>
|
||||
/// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>
|
||||
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
|
||||
/// <summary>
|
||||
/// Returns true of this stream can be read from, false otherwise
|
||||
/// </summary>
|
||||
public override bool CanRead
|
||||
{
|
||||
get
|
||||
{
|
||||
return !_isWriting;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns false.
|
||||
/// </summary>
|
||||
public override bool CanSeek
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if this tsream is writeable, false otherwise
|
||||
/// </summary>
|
||||
public override bool CanWrite
|
||||
{
|
||||
get
|
||||
{
|
||||
return _isWriting;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Destructor & IDispose stuff
|
||||
|
||||
/// <summary>
|
||||
/// Destroys this instance
|
||||
/// </summary>
|
||||
~GZipStream()
|
||||
{
|
||||
cleanUp(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the external file handle
|
||||
/// </summary>
|
||||
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
|
||||
/// <summary>
|
||||
/// Attempts to read a number of bytes from the stream.
|
||||
/// </summary>
|
||||
/// <param name="buffer">The destination data buffer</param>
|
||||
/// <param name="offset">The index of the first destination byte in <c>buffer</c></param>
|
||||
/// <param name="count">The number of bytes requested</param>
|
||||
/// <returns>The number of bytes read</returns>
|
||||
/// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>
|
||||
/// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is > buffer.Length</exception>
|
||||
/// <exception cref="NotSupportedException">If this stream is not readable.</exception>
|
||||
/// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to read a single byte from the stream.
|
||||
/// </summary>
|
||||
/// <returns>The byte that was read, or -1 in case of error or End-Of-File</returns>
|
||||
public override int ReadByte()
|
||||
{
|
||||
if (!CanRead) throw new NotSupportedException();
|
||||
if (_isDisposed) throw new ObjectDisposedException("GZipStream");
|
||||
return gzgetc(_gzFile);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a number of bytes to the stream
|
||||
/// </summary>
|
||||
/// <param name="buffer"></param>
|
||||
/// <param name="offset"></param>
|
||||
/// <param name="count"></param>
|
||||
/// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>
|
||||
/// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is > buffer.Length</exception>
|
||||
/// <exception cref="NotSupportedException">If this stream is not writeable.</exception>
|
||||
/// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a single byte to the stream
|
||||
/// </summary>
|
||||
/// <param name="value">The byte to add to the stream.</param>
|
||||
/// <exception cref="NotSupportedException">If this stream is not writeable.</exception>
|
||||
/// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
|
||||
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
|
||||
/// <summary>
|
||||
/// Not supported.
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override void SetLength(long value)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Not supported.
|
||||
/// </summary>
|
||||
/// <param name="offset"></param>
|
||||
/// <param name="origin"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override long Seek(long offset, SeekOrigin origin)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flushes the <c>GZipStream</c>.
|
||||
/// </summary>
|
||||
/// <remarks>In this implementation, this method does nothing. This is because excessive
|
||||
/// flushing may degrade the achievable compression rates.</remarks>
|
||||
public override void Flush()
|
||||
{
|
||||
// left empty on purpose
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets/sets the current position in the <c>GZipStream</c>. Not supported.
|
||||
/// </summary>
|
||||
/// <remarks>In this implementation this property is not supported</remarks>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override long Position
|
||||
{
|
||||
get
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the stream. Not supported.
|
||||
/// </summary>
|
||||
/// <remarks>In this implementation this property is not supported</remarks>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override long Length
|
||||
{
|
||||
get
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
//
|
||||
// © 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
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements a compressed <see cref="Stream"/>, in GZip (.gz) format.
|
||||
/// </summary>
|
||||
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
|
||||
/// <summary>
|
||||
/// Creates a new file as a writeable GZipStream
|
||||
/// </summary>
|
||||
/// <param name="fileName">The name of the compressed file to create</param>
|
||||
/// <param name="level">The compression level to use when adding data</param>
|
||||
/// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Opens an existing file as a readable GZipStream
|
||||
/// </summary>
|
||||
/// <param name="fileName">The name of the file to open</param>
|
||||
/// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>
|
||||
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
|
||||
/// <summary>
|
||||
/// Returns true of this stream can be read from, false otherwise
|
||||
/// </summary>
|
||||
public override bool CanRead
|
||||
{
|
||||
get
|
||||
{
|
||||
return !_isWriting;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns false.
|
||||
/// </summary>
|
||||
public override bool CanSeek
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if this tsream is writeable, false otherwise
|
||||
/// </summary>
|
||||
public override bool CanWrite
|
||||
{
|
||||
get
|
||||
{
|
||||
return _isWriting;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Destructor & IDispose stuff
|
||||
|
||||
/// <summary>
|
||||
/// Destroys this instance
|
||||
/// </summary>
|
||||
~GZipStream()
|
||||
{
|
||||
cleanUp(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the external file handle
|
||||
/// </summary>
|
||||
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
|
||||
/// <summary>
|
||||
/// Attempts to read a number of bytes from the stream.
|
||||
/// </summary>
|
||||
/// <param name="buffer">The destination data buffer</param>
|
||||
/// <param name="offset">The index of the first destination byte in <c>buffer</c></param>
|
||||
/// <param name="count">The number of bytes requested</param>
|
||||
/// <returns>The number of bytes read</returns>
|
||||
/// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>
|
||||
/// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is > buffer.Length</exception>
|
||||
/// <exception cref="NotSupportedException">If this stream is not readable.</exception>
|
||||
/// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to read a single byte from the stream.
|
||||
/// </summary>
|
||||
/// <returns>The byte that was read, or -1 in case of error or End-Of-File</returns>
|
||||
public override int ReadByte()
|
||||
{
|
||||
if (!CanRead) throw new NotSupportedException();
|
||||
if (_isDisposed) throw new ObjectDisposedException("GZipStream");
|
||||
return gzgetc(_gzFile);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a number of bytes to the stream
|
||||
/// </summary>
|
||||
/// <param name="buffer"></param>
|
||||
/// <param name="offset"></param>
|
||||
/// <param name="count"></param>
|
||||
/// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>
|
||||
/// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is > buffer.Length</exception>
|
||||
/// <exception cref="NotSupportedException">If this stream is not writeable.</exception>
|
||||
/// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a single byte to the stream
|
||||
/// </summary>
|
||||
/// <param name="value">The byte to add to the stream.</param>
|
||||
/// <exception cref="NotSupportedException">If this stream is not writeable.</exception>
|
||||
/// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
|
||||
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
|
||||
/// <summary>
|
||||
/// Not supported.
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override void SetLength(long value)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Not suppported.
|
||||
/// </summary>
|
||||
/// <param name="offset"></param>
|
||||
/// <param name="origin"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override long Seek(long offset, SeekOrigin origin)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flushes the <c>GZipStream</c>.
|
||||
/// </summary>
|
||||
/// <remarks>In this implementation, this method does nothing. This is because excessive
|
||||
/// flushing may degrade the achievable compression rates.</remarks>
|
||||
public override void Flush()
|
||||
{
|
||||
// left empty on purpose
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets/sets the current position in the <c>GZipStream</c>. Not suppported.
|
||||
/// </summary>
|
||||
/// <remarks>In this implementation this property is not supported</remarks>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override long Position
|
||||
{
|
||||
get
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
set
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the stream. Not suppported.
|
||||
/// </summary>
|
||||
/// <remarks>In this implementation this property is not supported</remarks>
|
||||
/// <exception cref="NotSupportedException">Always thrown</exception>
|
||||
public override long Length
|
||||
{
|
||||
get
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,105 +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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace DotZLib
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Implements a data decompressor, using the inflate algorithm in the ZLib dll
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an new instance of the <c>Inflater</c>
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
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 );
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the internal zlib inflate stream
|
||||
/// </summary>
|
||||
protected override void CleanUp() { inflateEnd(ref _ztream); }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
//
|
||||
// © 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
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Implements a data decompressor, using the inflate algorithm in the ZLib dll
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an new instance of the <c>Inflater</c>
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds more data to the codec to be processed.
|
||||
/// </summary>
|
||||
/// <param name="data">Byte array containing the data to be added to the codec</param>
|
||||
/// <param name="offset">The index of the first byte to add from <c>data</c></param>
|
||||
/// <param name="count">The number of bytes to add</param>
|
||||
/// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
|
||||
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 );
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Finishes up any pending data that needs to be processed and handled.
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the internal zlib inflate stream
|
||||
/// </summary>
|
||||
protected override void CleanUp() { inflateEnd(ref _ztream); }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// © 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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
using System;
|
||||
@@ -17,7 +17,7 @@ using NUnit.Framework;
|
||||
// Unit tests for the DotZLib class library
|
||||
// ----------------------------------------
|
||||
//
|
||||
// Use this with NUnit 2 from https://www.nunit.org
|
||||
// Use this with NUnit 2 from http://www.nunit.org
|
||||
//
|
||||
|
||||
namespace DotZLibTests
|
||||
@@ -156,7 +156,7 @@ namespace DotZLibTests
|
||||
public void Info_Version()
|
||||
{
|
||||
Info info = new Info();
|
||||
Assert.AreEqual("1.3.2", Info.Version);
|
||||
Assert.AreEqual("1.2.11", Info.Version);
|
||||
Assert.AreEqual(32, info.SizeOfUInt);
|
||||
Assert.AreEqual(32, info.SizeOfULong);
|
||||
Assert.AreEqual(32, info.SizeOfPointer);
|
||||
|
||||
@@ -36,7 +36,7 @@ Build instructions:
|
||||
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 exclude unit tests (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
|
||||
@@ -55,4 +55,4 @@ Build instructions:
|
||||
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 https://www.boost.org/LICENSE_1_0.txt)
|
||||
(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
enable_language(ASM)
|
||||
|
||||
# Need to push CMAKE_ASM_COMPILE_OBJECT to cache as otherwise it's not
|
||||
# available in top-level
|
||||
|
||||
set(CMAKE_ASM_COMPILE_OBJECT ${CMAKE_ASM_COMPILE_OBJECT} CACHE INTERNAL "" FORCE)
|
||||
|
||||
if(MSVC)
|
||||
#cmake 4.1 doesn't consider cl an asm compiler
|
||||
cmake_policy(SET CMP0194 NEW)
|
||||
endif(MSVC)
|
||||
|
||||
if(ZLIB_BUILD_SHARED)
|
||||
target_sources(zlib PRIVATE gvmat64.S)
|
||||
endif(ZLIB_BUILD_SHARED)
|
||||
|
||||
if(ZLIB_BUILD_STATIC)
|
||||
target_sources(zlibstatic PRIVATE gvmat64.S)
|
||||
endif(ZLIB_BUILD_STATIC)
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user