Compare commits
38 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b61d773a0f | |||
|
|
c9ad4de9bb | ||
|
|
22c0c5a251 | ||
|
|
f3df50cba5 | ||
|
|
1545a80335 | ||
|
|
467c64d015 | ||
|
|
7ee2265cae | ||
|
|
4120a9a664 | ||
|
|
5dae74347c | ||
|
|
92e0aa779b | ||
|
|
7b0a08f9ff | ||
|
|
88d4357628 | ||
|
|
4a5c5ae742 | ||
|
|
57983cb865 | ||
|
|
ef776a93cc | ||
|
|
106b3431db | ||
|
|
0882f94203 | ||
|
|
1c584e7c76 | ||
|
|
79121dce71 | ||
|
|
3dbb8b1487 | ||
|
|
11d19e5446 | ||
|
|
e4ff164f0d | ||
|
|
dd7a19ac6f | ||
|
|
eb60d4519c | ||
|
|
3e2bad36a6 | ||
|
|
7f930b0fec | ||
|
|
c2c130a076 | ||
|
|
d8d81c1f2e | ||
|
|
c8acc964e3 | ||
|
|
763d70bec2 | ||
|
|
b02addf264 | ||
|
|
bf22a89733 | ||
|
|
2f1011e27c | ||
|
|
7b0c286cef | ||
|
|
b84b99287d | ||
|
|
a03d081287 | ||
|
|
2eaa599066 | ||
|
|
eafeb894f9 |
1174 changed files with 113307 additions and 90711 deletions
1
.core/build
Submodule
1
.core/build
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 9c9346d5494688a78ea573f3bc0547ad12b9be2a
|
||||||
83
.core/build.yaml
Normal file
83
.core/build.yaml
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
# Lethean Blockchain Build Configuration
|
||||||
|
# Used by: core compile
|
||||||
|
|
||||||
|
version: 1
|
||||||
|
|
||||||
|
project:
|
||||||
|
name: blockchain
|
||||||
|
type: cpp
|
||||||
|
description: "Lethean Blockchain - SASE infrastructure chain"
|
||||||
|
version: "6.0.1"
|
||||||
|
|
||||||
|
cpp:
|
||||||
|
standard: 17
|
||||||
|
build_type: Release
|
||||||
|
static: false
|
||||||
|
|
||||||
|
conan:
|
||||||
|
version: "2.21.0"
|
||||||
|
requires:
|
||||||
|
- zlib/1.3.1
|
||||||
|
- boost/1.85.0
|
||||||
|
- openssl/3.2.0
|
||||||
|
- miniupnpc/2.2.5
|
||||||
|
- jwt-cpp/0.7.1
|
||||||
|
- oatpp/1.3.0.latest
|
||||||
|
- oatpp-swagger/1.3.0.latest
|
||||||
|
tool_requires:
|
||||||
|
- cmake/3.31.9
|
||||||
|
options:
|
||||||
|
boost/*:without_test: true
|
||||||
|
registry:
|
||||||
|
url: http://forge.snider.dev:4000/api/packages/host-uk/conan
|
||||||
|
remote: conan_build
|
||||||
|
|
||||||
|
cmake:
|
||||||
|
minimum_version: "3.16"
|
||||||
|
variables:
|
||||||
|
USE_CCACHE: "ON"
|
||||||
|
|
||||||
|
options:
|
||||||
|
testnet: false
|
||||||
|
|
||||||
|
targets:
|
||||||
|
- os: linux
|
||||||
|
arch: x86_64
|
||||||
|
profile: gcc-linux-x86_64
|
||||||
|
- os: linux
|
||||||
|
arch: arm64
|
||||||
|
profile: gcc-linux-armv8
|
||||||
|
- os: darwin
|
||||||
|
arch: arm64
|
||||||
|
profile: apple-clang-armv8
|
||||||
|
- os: darwin
|
||||||
|
arch: x86_64
|
||||||
|
profile: apple-clang-x86_64
|
||||||
|
- os: windows
|
||||||
|
arch: x86_64
|
||||||
|
profile: msvc-194-x86_64
|
||||||
|
|
||||||
|
package:
|
||||||
|
generators:
|
||||||
|
- TGZ
|
||||||
|
- ZIP
|
||||||
|
- NSIS
|
||||||
|
- DEB
|
||||||
|
- RPM
|
||||||
|
vendor: Lethean
|
||||||
|
contact: support@lt.hn
|
||||||
|
website: https://lt.hn
|
||||||
|
|
||||||
|
docker:
|
||||||
|
dockerfile: utils/docker/lthn-chain/Dockerfile
|
||||||
|
image: lthn/chain
|
||||||
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
|
tags:
|
||||||
|
- testnet
|
||||||
|
- "{{.Version}}"
|
||||||
|
build_args:
|
||||||
|
BUILD_THREADS: auto
|
||||||
|
BUILD_TESTNET: "1"
|
||||||
|
BUILD_STATIC: "0"
|
||||||
|
BUILD_TYPE: Release
|
||||||
8
.dockerignore
Normal file
8
.dockerignore
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
build
|
||||||
|
.github
|
||||||
|
.idea
|
||||||
|
docs
|
||||||
|
resources
|
||||||
|
snap
|
||||||
|
tests
|
||||||
|
CMakeUserPresets.json
|
||||||
234
.forgejo/workflows/build.yml
Executable file
234
.forgejo/workflows/build.yml
Executable file
|
|
@ -0,0 +1,234 @@
|
||||||
|
name: Build & Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
- main
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
FORGEJO_URL: ${{ github.server_url }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
# Linux x86_64 — native build on snider-linux
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
build-linux:
|
||||||
|
name: Linux x86_64
|
||||||
|
runs-on: linux-native
|
||||||
|
env:
|
||||||
|
CPU_CORES: "24"
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
submodules: false
|
||||||
|
|
||||||
|
- name: Init submodules
|
||||||
|
run: |
|
||||||
|
git config --global url."${{ env.FORGEJO_URL }}/".insteadOf "http://forge.snider.dev:4000/"
|
||||||
|
git -c http.extraHeader="Authorization: token ${{ secrets.RELEASE_TOKEN }}" submodule update --init --recursive
|
||||||
|
git submodule foreach --recursive 'git fetch --tags origin 2>/dev/null || true'
|
||||||
|
|
||||||
|
- name: Build dependencies
|
||||||
|
run: |
|
||||||
|
make build-deps \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Compile
|
||||||
|
run: |
|
||||||
|
make ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: linux-x86_64
|
||||||
|
path: build/packages/lethean-*
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
# macOS ARM64 — native build on M3 Ultra
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
build-macos:
|
||||||
|
name: macOS ARM64
|
||||||
|
runs-on: macos-native
|
||||||
|
env:
|
||||||
|
CPU_CORES: "24"
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
submodules: false
|
||||||
|
|
||||||
|
- name: Init submodules
|
||||||
|
run: |
|
||||||
|
git config --global url."${{ env.FORGEJO_URL }}/".insteadOf "http://forge.snider.dev:4000/"
|
||||||
|
git -c http.extraHeader="Authorization: token ${{ secrets.RELEASE_TOKEN }}" submodule update --init --recursive
|
||||||
|
git submodule foreach --recursive 'git fetch --tags origin 2>/dev/null || true'
|
||||||
|
|
||||||
|
- name: Build dependencies
|
||||||
|
run: |
|
||||||
|
export PATH="/opt/homebrew/bin:$PATH"
|
||||||
|
make build-deps \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Compile
|
||||||
|
run: |
|
||||||
|
export PATH="/opt/homebrew/bin:$PATH"
|
||||||
|
make ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: macos-arm64
|
||||||
|
path: build/packages/lethean-*
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
# Aggregate artifacts and create release
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
release:
|
||||||
|
name: Create Release
|
||||||
|
needs: [build-linux, build-macos]
|
||||||
|
runs-on: linux-native
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
submodules: false
|
||||||
|
|
||||||
|
- name: Download Linux artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: linux-x86_64
|
||||||
|
path: artifacts/linux
|
||||||
|
|
||||||
|
- name: Download macOS artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: macos-arm64
|
||||||
|
path: artifacts/macos
|
||||||
|
|
||||||
|
- name: List artifacts
|
||||||
|
run: find artifacts/ -type f | sort
|
||||||
|
|
||||||
|
- name: Compute release tag
|
||||||
|
id: release
|
||||||
|
run: |
|
||||||
|
VERSION=$(grep '^BUILD_VERSION:=' Makefile | cut -d'=' -f2)
|
||||||
|
if [ "${{ github.ref_name }}" = "main" ]; then
|
||||||
|
TAG="v${VERSION}+${{ github.run_number }}"
|
||||||
|
PRERELEASE=false
|
||||||
|
TITLE="v${VERSION} (build ${{ github.run_number }})"
|
||||||
|
else
|
||||||
|
TAG="v${VERSION}-beta+${{ github.run_number }}"
|
||||||
|
PRERELEASE=true
|
||||||
|
TITLE="v${VERSION}-beta (build ${{ github.run_number }})"
|
||||||
|
fi
|
||||||
|
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "prerelease=${PRERELEASE}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "title=${TITLE}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Create release
|
||||||
|
id: create_release
|
||||||
|
run: |
|
||||||
|
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"tag_name\": \"${{ steps.release.outputs.tag }}\",
|
||||||
|
\"target_commitish\": \"${{ github.sha }}\",
|
||||||
|
\"name\": \"${{ steps.release.outputs.title }}\",
|
||||||
|
\"body\": \"Automated build from \`${{ github.ref_name }}\` branch (run #${{ github.run_number }})\n\n## Platforms\n- Linux x86_64\n- macOS ARM64 (Apple Silicon)\",
|
||||||
|
\"draft\": false,
|
||||||
|
\"prerelease\": ${{ steps.release.outputs.prerelease }}
|
||||||
|
}")
|
||||||
|
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
||||||
|
BODY=$(echo "$RESPONSE" | sed '$d')
|
||||||
|
if [ "$HTTP_CODE" -ge 400 ]; then
|
||||||
|
echo "Failed to create release (HTTP ${HTTP_CODE}):"
|
||||||
|
echo "$BODY"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
RELEASE_ID=$(echo "$BODY" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
|
||||||
|
echo "id=${RELEASE_ID}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Created release ID: ${RELEASE_ID}"
|
||||||
|
|
||||||
|
- name: Upload release assets
|
||||||
|
run: |
|
||||||
|
for dir in artifacts/linux artifacts/macos; do
|
||||||
|
for file in "$dir"/lethean-*; do
|
||||||
|
[ -f "$file" ] || continue
|
||||||
|
FILENAME=$(basename "$file")
|
||||||
|
echo "Uploading: ${FILENAME}"
|
||||||
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases/${{ steps.create_release.outputs.id }}/assets?name=${FILENAME}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/octet-stream" \
|
||||||
|
--data-binary "@${file}")
|
||||||
|
if [ "$HTTP_CODE" -ge 400 ]; then
|
||||||
|
echo "Failed to upload ${FILENAME} (HTTP ${HTTP_CODE})"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Uploaded ${FILENAME} (HTTP ${HTTP_CODE})"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Prune old releases
|
||||||
|
run: |
|
||||||
|
TAG_PREFIX="${{ github.ref_name == 'main' && 'v6' || 'v6.*-beta' }}"
|
||||||
|
CURRENT_ID="${{ steps.create_release.outputs.id }}"
|
||||||
|
echo "Keeping release ${CURRENT_ID}, pruning older ${TAG_PREFIX} releases..."
|
||||||
|
PAGE=1
|
||||||
|
while true; do
|
||||||
|
RELEASES=$(curl -s "${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases?limit=50&page=${PAGE}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}")
|
||||||
|
COUNT=$(echo "$RELEASES" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))" 2>/dev/null || echo 0)
|
||||||
|
[ "$COUNT" = "0" ] && break
|
||||||
|
echo "$RELEASES" | python3 -c "
|
||||||
|
import sys, json, fnmatch
|
||||||
|
for r in json.load(sys.stdin):
|
||||||
|
rid = r['id']
|
||||||
|
tag = r['tag_name']
|
||||||
|
if rid == ${CURRENT_ID}:
|
||||||
|
continue
|
||||||
|
if fnmatch.fnmatch(tag, '${TAG_PREFIX}*'):
|
||||||
|
print(f'{rid} {tag}')
|
||||||
|
" | while read -r RID RTAG; do
|
||||||
|
echo "Deleting release ${RTAG} (id=${RID})"
|
||||||
|
curl -s -o /dev/null -X DELETE \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases/${RID}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}"
|
||||||
|
curl -s -o /dev/null -X DELETE \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/tags/${RTAG}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}"
|
||||||
|
done
|
||||||
|
PAGE=$((PAGE + 1))
|
||||||
|
done
|
||||||
|
echo "Prune complete"
|
||||||
5
.gitattributes
vendored
5
.gitattributes
vendored
|
|
@ -1,2 +1,5 @@
|
||||||
.git* export-ignore
|
.git* export-ignore
|
||||||
/CMakeLists.txt export-subst
|
/CMakeLists.txt export-subst
|
||||||
|
|
||||||
|
# Mark auto-generated SDK clients as "generated" to hide them in GitHub diffs
|
||||||
|
utils/sdk/client/** linguist-generated=true
|
||||||
22
.github/actions/make-docs/action.yml
vendored
Normal file
22
.github/actions/make-docs/action.yml
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
# .github/actions/make-docs/action.yml
|
||||||
|
name: 'Build Documentation'
|
||||||
|
description: 'Archives and uploads signed binaries to a GitHub release'
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: echo "cache_id=$(date -u '+%V')" >> $GITHUB_ENV
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
key: mkdocs-material-${{ env.cache_id }}
|
||||||
|
path: ~/.cache
|
||||||
|
restore-keys: |
|
||||||
|
mkdocs-material-
|
||||||
|
|
||||||
|
- if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get install -y libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
- run: pip install mkdocs-git-revision-date-localized-plugin cairosvg mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging]
|
||||||
90
.github/actions/upload-artifacts/action.yml
vendored
Normal file
90
.github/actions/upload-artifacts/action.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
# .github/actions/upload-artifacts/action.yml
|
||||||
|
name: 'Upload Artifacts'
|
||||||
|
description: 'Archives and uploads signed binaries to a GitHub release'
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
required: true
|
||||||
|
description: 'The chain network name to use in filenames, mainnet or testnet'
|
||||||
|
assets:
|
||||||
|
description: "A EOL separated string list of filenames to archive; if asset is a abs path, it's respected"
|
||||||
|
required: false
|
||||||
|
asset-type:
|
||||||
|
required: true
|
||||||
|
description: 'The asset type: cli, gui, ANYTHING; used as a separator for different release packages for the same arch'
|
||||||
|
asset-directory:
|
||||||
|
required: true
|
||||||
|
description: "The directory where 7z's working dir will be set"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: compute file name
|
||||||
|
id: asset
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
ARCH=${{ runner.arch }}
|
||||||
|
RUNNER_OS=${{ runner.os }}
|
||||||
|
LOWERCASE_ARCH=$(echo "$ARCH" | tr '[:upper:]' '[:lower:]')
|
||||||
|
TARGET_OS=$(echo "$RUNNER_OS" | tr '[:upper:]' '[:lower:]')
|
||||||
|
FILENAME="${{ inputs.chain-network }}-${{ inputs.asset-type }}-${TARGET_OS}-${LOWERCASE_ARCH}"
|
||||||
|
echo "key=$FILENAME" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
VERSION=$(grep '^BUILD_VERSION:=' Makefile | cut -d'=' -f2)
|
||||||
|
# Check if a version was found
|
||||||
|
if [ -z "$VERSION" ]; then
|
||||||
|
echo "Error: BUILD_VERSION could not be found in the Makefile." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
if [ "${{ github.event_name }}" == "pull_request" ]; then
|
||||||
|
TAG_SUFFIX="-alpha.${{ github.event.number }}"
|
||||||
|
PRERELEASE=true
|
||||||
|
elif [ "${{ inputs.chain-network }}" != "mainnet" ]; then
|
||||||
|
TAG_SUFFIX="-beta"
|
||||||
|
PRERELEASE=true
|
||||||
|
else
|
||||||
|
TAG_SUFFIX=""
|
||||||
|
PRERELEASE=false
|
||||||
|
fi
|
||||||
|
TAG_NAME="${VERSION}${TAG_SUFFIX}+${{ github.run_number }}"
|
||||||
|
echo "tag_name=${TAG_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "prerelease=${PRERELEASE}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# Format the output to be a multi-line string.
|
||||||
|
# This is the correct way to pass a multi-line string in GITHUB_OUTPUT.
|
||||||
|
echo "paths<<EOF" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# Iterate through each filename
|
||||||
|
echo "${{ inputs.assets }}" | while read -r file; do
|
||||||
|
if [[ -z "$file" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Check if the file is an absolute path
|
||||||
|
if [[ "$file" == /* ]] || [[ "$file" =~ ^[a-zA-Z]: ]]; then
|
||||||
|
FULL_PATH="$file"
|
||||||
|
else
|
||||||
|
# It's a relative path, so join it with the asset directory
|
||||||
|
if [[ "${{ runner.os }}" == "Windows" ]]; then
|
||||||
|
FULL_PATH="${{ inputs.asset-directory }}\\$file"
|
||||||
|
else
|
||||||
|
FULL_PATH="${{ inputs.asset-directory }}/$file"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "$FULL_PATH" >> "$GITHUB_OUTPUT"
|
||||||
|
done
|
||||||
|
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: ${{ steps.asset.outputs.key }}
|
||||||
|
path: ${{ steps.asset.outputs.paths }}
|
||||||
|
|
||||||
|
- name: Make Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.asset.outputs.tag_name }}
|
||||||
|
prerelease: ${{ steps.asset.outputs.prerelease }}
|
||||||
|
files: ${{ inputs.asset-directory }}/*
|
||||||
|
target_commitish: ${{ github.sha }}
|
||||||
25
.github/workflows/_maint-cache.yml
vendored
Normal file
25
.github/workflows/_maint-cache.yml
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
name: Clear all Github actions caches on sundays
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * 0"
|
||||||
|
workflow_dispatch:
|
||||||
|
# pull_request:
|
||||||
|
# types:
|
||||||
|
# - opened
|
||||||
|
# - synchronize
|
||||||
|
# - reopened
|
||||||
|
# branches:
|
||||||
|
# - dev
|
||||||
|
# - main
|
||||||
|
# paths-ignore:
|
||||||
|
# - '**.md'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
my-job:
|
||||||
|
name: Delete all caches
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
steps:
|
||||||
|
- name: Clear caches
|
||||||
|
run: gh cache delete --all --repo ${{ github.repository }}
|
||||||
70
.github/workflows/_on-pr.yml
vendored
Normal file
70
.github/workflows/_on-pr.yml
vendored
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
name: PR
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request_review:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- reopened
|
||||||
|
- ready_for_review
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-intel:
|
||||||
|
name: Linux
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-linux-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-linux-arm:
|
||||||
|
name: Linux
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-linux-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-windows-intel:
|
||||||
|
name: Windows
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-windows-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-arm64:
|
||||||
|
name: MacOS
|
||||||
|
uses: ./.github/workflows/build-macos-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-intel:
|
||||||
|
name: MacOS
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-macos-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
name: Docker
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-docker.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
name: Docs
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-docs.yml
|
||||||
62
.github/workflows/_on-push.yml
vendored
Normal file
62
.github/workflows/_on-push.yml
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
name: Push Compile
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
packages: write
|
||||||
|
on:
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'dev'
|
||||||
|
- 'main'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-intel:
|
||||||
|
name: Linux
|
||||||
|
uses: ./.github/workflows/build-linux-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-linux-arm:
|
||||||
|
name: Linux
|
||||||
|
uses: ./.github/workflows/build-linux-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-windows-intel:
|
||||||
|
name: Windows
|
||||||
|
uses: ./.github/workflows/build-windows-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-arm64:
|
||||||
|
name: MacOS
|
||||||
|
uses: ./.github/workflows/build-macos-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-intel:
|
||||||
|
name: MacOS
|
||||||
|
uses: ./.github/workflows/build-macos-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
name: Docker
|
||||||
|
uses: ./.github/workflows/build-docker.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
name: Docs
|
||||||
|
uses: ./.github/workflows/build-docs.yml
|
||||||
83
.github/workflows/_on-release.yml
vendored
Normal file
83
.github/workflows/_on-release.yml
vendored
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
name: Push Full Build
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: [ published ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
determine-network:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
chain-network: ${{ steps.get_branch.outputs.chain_network }}
|
||||||
|
steps:
|
||||||
|
- name: Get release information from API
|
||||||
|
id: get_branch
|
||||||
|
run: |
|
||||||
|
# Use the GitHub CLI to get the release details by tag name
|
||||||
|
# The result is a JSON object
|
||||||
|
RELEASE_INFO=$(gh release view --json targetCommitish -t ${{ github.ref_name }})
|
||||||
|
|
||||||
|
# Extract the target commitish (the source branch)
|
||||||
|
SOURCE_BRANCH=$(echo "$RELEASE_INFO" | jq -r '.targetCommitish')
|
||||||
|
|
||||||
|
# Set the chain network based on the source branch
|
||||||
|
if [ "$SOURCE_BRANCH" == "dev" ]; then
|
||||||
|
echo "chain_network=testnet" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "chain_network=mainnet" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Source Branch: $SOURCE_BRANCH"
|
||||||
|
echo "Chain Network: ${{ steps.get_branch.outputs.chain_network }}"
|
||||||
|
|
||||||
|
build-linux-intel:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-linux-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-linux-arm:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-linux-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-windows-intel:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-windows-intel.yml
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-arm64:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-macos-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-intel:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-macos-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
name: Docker
|
||||||
|
uses: ./.github/workflows/build-docker.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
name: Docs
|
||||||
|
uses: ./.github/workflows/build-docs.yml
|
||||||
54
.github/workflows/build-docker.yml
vendored
Normal file
54
.github/workflows/build-docker.yml
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
name: Docker
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
secrets:
|
||||||
|
DOCKERHUB_USERNAME:
|
||||||
|
required: true
|
||||||
|
DOCKERHUB_TOKEN:
|
||||||
|
required: true
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}"
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
env:
|
||||||
|
DOCKER_BUILD_SUMMARY: false
|
||||||
|
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||||
|
with:
|
||||||
|
file: utils/docker/lthn-chain/Dockerfile
|
||||||
|
context: ${{ github.workspace }}
|
||||||
|
push: true
|
||||||
|
build-args: |
|
||||||
|
BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }}
|
||||||
|
THREADS=2
|
||||||
|
BUILD_LOCAL=1
|
||||||
|
tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}
|
||||||
|
|
||||||
40
.github/workflows/build-docs.yml
vendored
Normal file
40
.github/workflows/build-docs.yml
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
name: docs
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Offline Local Version
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- run: sudo apt-get install -y libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
- run: pip install mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging]
|
||||||
|
|
||||||
|
- name: Build Offline Version
|
||||||
|
run: make docs
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: "*"
|
||||||
|
asset-type: 'docs'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/docs
|
||||||
90
.github/workflows/build-linux-arm64.yml
vendored
Normal file
90
.github/workflows/build-linux-arm64.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
name: Linux
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-arm64
|
||||||
|
runs-on: ubuntu-22.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: sudo apt-get install -y autotools-dev git build-essential libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-arm64
|
||||||
|
needs: cache
|
||||||
|
runs-on: ubuntu-22.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
run: sudo apt-get install -y autotools-dev rpm git build-essential libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
90
.github/workflows/build-linux-intel.yml
vendored
Normal file
90
.github/workflows/build-linux-intel.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
name: Linux
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-x86_64
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: sudo apt-get install -y autotools-dev rpm git build-essential
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-x86_64
|
||||||
|
needs: cache
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
run: sudo apt-get install -y autotools-dev git build-essential
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
85
.github/workflows/build-macos-arm64.yml
vendored
Normal file
85
.github/workflows/build-macos-arm64.yml
vendored
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
name: build-macos-arm64
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-armv8
|
||||||
|
runs-on: macos-15
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=3 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-armv8
|
||||||
|
needs: cache
|
||||||
|
runs-on: macos-15
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
81
.github/workflows/build-macos-intel.yml
vendored
Normal file
81
.github/workflows/build-macos-intel.yml
vendored
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
name: build-macos-intel
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-x86_64
|
||||||
|
runs-on: macos-13
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-x86_64
|
||||||
|
needs: cache
|
||||||
|
runs-on: macos-13
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
82
.github/workflows/build-windows-intel.yml
vendored
Normal file
82
.github/workflows/build-windows-intel.yml
vendored
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
name: build-windows
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-x86_64
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-x86_64
|
||||||
|
needs: cache
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- run: choco install nsis.install
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
12
.gitignore
vendored
12
.gitignore
vendored
|
|
@ -5,5 +5,13 @@
|
||||||
._.DS_Store
|
._.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
._*
|
._*
|
||||||
.idea
|
.idea/workspace.xml
|
||||||
.vs/*
|
.idea/usage.statistics.xml
|
||||||
|
.idea/dictionaries
|
||||||
|
.idea/shelf
|
||||||
|
.idea/copilot*
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/*.iml
|
||||||
|
.vs/*
|
||||||
|
CMakeUserPresets.json
|
||||||
|
ConanPresets.json
|
||||||
|
|
|
||||||
23
.gitmodules
vendored
23
.gitmodules
vendored
|
|
@ -1,17 +1,18 @@
|
||||||
[submodule "contrib/miniupnp"]
|
|
||||||
path = contrib/miniupnp
|
|
||||||
url = https://github.com/miniupnp/miniupnp
|
|
||||||
[submodule "src/gui/qt-daemon/layout"]
|
|
||||||
path = src/gui/qt-daemon/layout
|
|
||||||
url = https://github.com/hyle-team/zano_ui.git
|
|
||||||
branch = main
|
|
||||||
[submodule "contrib/tor-connect"]
|
|
||||||
path = contrib/tor-connect
|
|
||||||
url = https://github.com/hyle-team/tor-connect.git
|
|
||||||
branch = main
|
|
||||||
[submodule "contrib/jwt-cpp"]
|
[submodule "contrib/jwt-cpp"]
|
||||||
path = contrib/jwt-cpp
|
path = contrib/jwt-cpp
|
||||||
url = https://github.com/Thalhammer/jwt-cpp.git
|
url = https://github.com/Thalhammer/jwt-cpp.git
|
||||||
[submodule "contrib/bitcoin-secp256k1"]
|
[submodule "contrib/bitcoin-secp256k1"]
|
||||||
path = contrib/bitcoin-secp256k1
|
path = contrib/bitcoin-secp256k1
|
||||||
url = https://github.com/bitcoin-core/secp256k1.git
|
url = https://github.com/bitcoin-core/secp256k1.git
|
||||||
|
[submodule "contrib/tor-connect"]
|
||||||
|
path = contrib/tor-connect
|
||||||
|
url = https://github.com/hyle-team/tor-connect.git
|
||||||
|
[submodule "docs"]
|
||||||
|
path = docs
|
||||||
|
url = https://github.com/letheanVPN/documentation.git
|
||||||
|
[submodule "contrib/randomx"]
|
||||||
|
path = contrib/randomx
|
||||||
|
url = https://github.com/tevador/RandomX.git
|
||||||
|
[submodule ".core/build"]
|
||||||
|
path = .core/build
|
||||||
|
url = http://forge.snider.dev:4000/host-uk/build.git
|
||||||
|
|
|
||||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Lethean
|
||||||
8
.idea/cmake.xml
generated
Normal file
8
.idea/cmake.xml
generated
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CMakeSharedSettings">
|
||||||
|
<configurations>
|
||||||
|
<configuration PROFILE_NAME="Debug" ENABLED="true" GENERATION_DIR="build/release" CONFIG_NAME="Debug" GENERATION_OPTIONS="--preset testnet" BUILD_OPTIONS="--preset testnet --parallel 30" NO_GENERATOR="true" />
|
||||||
|
</configurations>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
105
.idea/codeStyles/Project.xml
generated
Normal file
105
.idea/codeStyles/Project.xml
generated
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<RiderCodeStyleSettings>
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||||
|
</RiderCodeStyleSettings>
|
||||||
|
<clangFormatSettings>
|
||||||
|
<option name="ENABLED" value="true" />
|
||||||
|
</clangFormatSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
||||||
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
6
.idea/copyright/LTHN.xml
generated
Normal file
6
.idea/copyright/LTHN.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright (c) 2017-2025 Lethean (https://lt.hn) Licensed under the European Union Public Licence (EUPL) version 1.2. You may obtain a copy of the licence at: https://joinup.ec.europa.eu/software/page/eupl/licence-eupl The EUPL is a copyleft licence that is compatible with the MIT/X11 licence used by the original projects; but maintains OSS status, where regional copyright law requires ownership to dictate licence terms. SPDX‑License‑Identifier: EUPL-1.2 " />
|
||||||
|
<option name="myName" value="LTHN" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
||||||
6
.idea/copyright/Lethean.xml
generated
Normal file
6
.idea/copyright/Lethean.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright (c) 2014-2018 Zano Project Copyright (c) 2014-2018 The Louisdor Project Copyright (c) 2012-2013 The Boolberry developers Copyright (c) 2017-2025 Lethean (https://lt.hn) Licensed under the European Union Public Licence (EUPL) version 1.2. You may obtain a copy of the licence at: https://joinup.ec.europa.eu/software/page/eupl/licence-eupl The EUPL is a copyleft licence that is compatible with the MIT/X11 licence used by the original projects; the MIT terms are therefore considered “grandfathered” under the EUPL for this code. SPDX‑License‑Identifier: EUPL-1.2 " />
|
||||||
|
<option name="myName" value="Lethean" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
||||||
8
.idea/copyright/profiles_settings.xml
generated
Normal file
8
.idea/copyright/profiles_settings.xml
generated
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<component name="CopyrightManager">
|
||||||
|
<settings default="LTHN">
|
||||||
|
<module2copyright>
|
||||||
|
<element module="apiserver" copyright="LTHN" />
|
||||||
|
<element module="Project Files" copyright="Lethean" />
|
||||||
|
</module2copyright>
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
344
.idea/editor.xml
generated
Normal file
344
.idea/editor.xml
generated
Normal file
|
|
@ -0,0 +1,344 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="BackendCodeEditorSettings">
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedOverridenMethod/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppModulePartitionWithSeveralPartitionUnits/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantFwdClassOrEnumSpecifier/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifierADL/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
13
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
13
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredIdentifiers">
|
||||||
|
<list>
|
||||||
|
<option value="tuple.*" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
43
.idea/jsonSchemas.xml
generated
Normal file
43
.idea/jsonSchemas.xml
generated
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="JsonSchemaMappingsProjectConfiguration">
|
||||||
|
<state>
|
||||||
|
<map>
|
||||||
|
<entry key="GitHub Action JSON Schema">
|
||||||
|
<value>
|
||||||
|
<SchemaInfo>
|
||||||
|
<option name="name" value="GitHub Action JSON Schema" />
|
||||||
|
<option name="relativePathToSchema" value="jar://$APPLICATION_PLUGINS_DIR$/vcs-github-IU/lib/vcs-github.jar!/schemas/github-action.json" />
|
||||||
|
<option name="applicationDefined" value="true" />
|
||||||
|
<option name="patterns">
|
||||||
|
<list>
|
||||||
|
<Item>
|
||||||
|
<option name="path" value=".github/actions/**/*.yml" />
|
||||||
|
</Item>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</SchemaInfo>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="openapitools">
|
||||||
|
<value>
|
||||||
|
<SchemaInfo>
|
||||||
|
<option name="generatedName" value="New Schema" />
|
||||||
|
<option name="name" value="openapitools" />
|
||||||
|
<option name="relativePathToSchema" value="utils/sdk/openapitools.json" />
|
||||||
|
<option name="patterns">
|
||||||
|
<list>
|
||||||
|
<Item>
|
||||||
|
<option name="directory" value="true" />
|
||||||
|
<option name="path" value="utils/sdk/packages" />
|
||||||
|
<option name="mappingKind" value="Directory" />
|
||||||
|
</Item>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</SchemaInfo>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
34
.idea/misc.xml
generated
Normal file
34
.idea/misc.xml
generated
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.13 virtualenv at $PROJECT_DIR$.venv" />
|
||||||
|
</component>
|
||||||
|
<component name="CMakePythonSetting">
|
||||||
|
<option name="pythonIntegrationState" value="YES" />
|
||||||
|
</component>
|
||||||
|
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||||
|
<component name="CidrRootsConfiguration">
|
||||||
|
<excludeRoots>
|
||||||
|
<file path="$PROJECT_DIR$/build" />
|
||||||
|
</excludeRoots>
|
||||||
|
</component>
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
<component name="MakefileSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<MakefileProjectSettings>
|
||||||
|
<option name="buildOptions" value="--jobs=30" />
|
||||||
|
<option name="buildTarget" value="build" />
|
||||||
|
<option name="cleanTarget" value="clean-build" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
<option name="switches" value="TESTNET=1 STATIC=1" />
|
||||||
|
<option name="version" value="2" />
|
||||||
|
</MakefileProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="MakefileWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||||
|
</project>
|
||||||
6
.idea/prettier.xml
generated
Normal file
6
.idea/prettier.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PrettierConfiguration">
|
||||||
|
<option name="myConfigurationMode" value="AUTOMATIC" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
3
.idea/scopes/apiserver.xml
generated
Normal file
3
.idea/scopes/apiserver.xml
generated
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<component name="DependencyValidationManager">
|
||||||
|
<scope name="apiserver" pattern="file[blockchain]:src/api//*" />
|
||||||
|
</component>
|
||||||
10
.idea/vcs.xml
generated
Normal file
10
.idea/vcs.xml
generated
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/contrib/bitcoin-secp256k1" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/contrib/jwt-cpp" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/contrib/tor-connect" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/docs" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
55
AGENTS.md
Normal file
55
AGENTS.md
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
# AI Agent Collaboration Framework for Repository Contributions
|
||||||
|
|
||||||
|
## 1. Purpose and Guiding Philosophy
|
||||||
|
|
||||||
|
This document provides a guiding framework for any AI agent interacting with this repository. Its purpose is to ensure that all automated contributions, especially Pull Request (PR) reviews and code suggestions, are constructive, respectful, and aligned with the project's overarching goals.
|
||||||
|
|
||||||
|
This framework operates in accordance with the foundational **Axioms of Life**, translating their universal principles into the specific context of human-AI software development collaboration. The primary goal is a partnership that enhances code quality and developer velocity, not one that creates friction through pedantry.
|
||||||
|
|
||||||
|
## 2. Core Principles for AI Interaction
|
||||||
|
|
||||||
|
All agents MUST adhere to the following principles:
|
||||||
|
|
||||||
|
* **Principle 1: Respect Authorial Intent (Axiom 1 & 4)**
|
||||||
|
* Your primary goal is to understand and support the human author's objective. Before suggesting a change, first assume the author had a valid reason for their implementation. Frame your feedback as a way to better achieve their goal or to prevent unintended side effects. Do not challenge intent without clear evidence of a functional error.
|
||||||
|
|
||||||
|
* **Principle 2: Prioritize Objectivity and Verifiability (Axiom 2)**
|
||||||
|
* Feedback MUST be anchored in objective, verifiable criteria. Subjective opinions on style are the lowest priority.
|
||||||
|
* **Valid criteria include:**
|
||||||
|
* Demonstrable bugs or logical errors.
|
||||||
|
* Security vulnerabilities.
|
||||||
|
* Performance regressions.
|
||||||
|
* Violations of a documented project standard (e.g., a style guide file in the repo).
|
||||||
|
* **Invalid criteria include:**
|
||||||
|
* Personal stylistic preferences not codified in a project standard.
|
||||||
|
* Code organization that is merely "different" but not functionally incorrect.
|
||||||
|
|
||||||
|
* **Principle 3: Adopt a Collaborative, Non-Authoritarian Tone (Axiom 4)**
|
||||||
|
* As a digital substrate interacting with a human one, you must adopt a tone of a helpful, respectful peer. Avoid declarative or demanding language.
|
||||||
|
* **Prefer:** "Have you considered...?", "An alternative here that might prevent X is...", "I noticed this could lead to Y. What do you think about...?"
|
||||||
|
* **Avoid:** "You must fix this.", "This is wrong.", "Change this to..."
|
||||||
|
|
||||||
|
* **Principle 4: Provide Actionable and Justified Suggestions (Axiom 3)**
|
||||||
|
* Do not simply state that something is incorrect. Provide a clear explanation for *why* it is a potential issue and, whenever possible, offer a concrete, well-explained code suggestion that resolves it. Your intent is to help, not just to criticize.
|
||||||
|
|
||||||
|
## 3. Feedback Severity Classification
|
||||||
|
|
||||||
|
To combat pedantry, all feedback provided in PR reviews MUST be classified into one of the following three levels. This creates a clear hierarchy of importance.
|
||||||
|
|
||||||
|
### **Level 1: Critical (Blocking)**
|
||||||
|
* **Definition:** Issues that will cause demonstrable harm if merged.
|
||||||
|
* **Examples:** Bugs, logic errors, security vulnerabilities, unhandled exceptions, build failures.
|
||||||
|
* **Action:** These issues MUST be addressed by the author before a merge. Your feedback should clearly state the nature of the critical issue.
|
||||||
|
|
||||||
|
### **Level 2: Important (Non-Blocking Recommendation)**
|
||||||
|
* **Definition:** Issues that deviate from established project best practices or could impact future maintainability.
|
||||||
|
* **Examples:** Violations of a documented style guide, clear opportunities to improve readability, non-critical performance improvements, deprecation warnings.
|
||||||
|
* **Action:** These issues SHOULD be addressed. Frame them as strong recommendations that improve the health of the codebase. The author may choose to address them in a follow-up PR if necessary.
|
||||||
|
|
||||||
|
### **Level 3: Suggestion (Optional Nitpick)**
|
||||||
|
* **Definition:** Minor stylistic preferences, alternative implementations with no clear functional advantage, or purely cosmetic changes. This is the "pedantic" category.
|
||||||
|
* **Action:** These suggestions are entirely optional and at the author's discretion. They MUST be explicitly prefixed with "Optional:", "Nit:", or "Suggestion:". This signals to the human that the comment is non-essential and can be safely ignored without consequence.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
By adhering to this framework, AI agents become valuable partners in the development process, helping to catch critical errors while respecting the creative autonomy and focus of their human collaborators.
|
||||||
184
CMakeLists.txt
184
CMakeLists.txt
|
|
@ -1,16 +1,16 @@
|
||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
message(STATUS "Using CMake version: ${CMAKE_VERSION}")
|
||||||
|
|
||||||
PROJECT(Zano)
|
set(DISABLE_TOR TRUE CACHE BOOL "Disable TOR library(and related tor-connect submodule)")
|
||||||
|
|
||||||
|
PROJECT(Lethean)
|
||||||
|
|
||||||
message("OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}")
|
set(VERSION "1.0" CACHE STRING "Build version")
|
||||||
message("OPENSSL_CRYPTO_LIBRARY: ${OPENSSL_CRYPTO_LIBRARY}")
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
message("OPENSSL_SSL_LIBRARY: ${OPENSSL_SSL_LIBRARY}")
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
list(INSERT CMAKE_MODULE_PATH 0
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/.core/build/cmake")
|
||||||
|
|
||||||
set(VERSION "1.0")
|
|
||||||
|
|
||||||
if(POLICY CMP0043)
|
if(POLICY CMP0043)
|
||||||
cmake_policy(SET CMP0043 NEW)
|
cmake_policy(SET CMP0043 NEW)
|
||||||
|
|
@ -18,27 +18,35 @@ endif()
|
||||||
if(POLICY CMP0043)
|
if(POLICY CMP0043)
|
||||||
cmake_policy(SET CMP0074 NEW)
|
cmake_policy(SET CMP0074 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
if(POLICY CMP0091)
|
||||||
|
cmake_policy(SET CMP0091 NEW)
|
||||||
|
endif()
|
||||||
if(POLICY CMP0144)
|
if(POLICY CMP0144)
|
||||||
cmake_policy(SET CMP0144 NEW)
|
cmake_policy(SET CMP0144 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
if(POLICY CMP0167)
|
||||||
|
cmake_policy(SET CMP0167 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(DocBuilder)
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
option (USE_CCACHE "Use ccache if a usable instance is found" OFF)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
if (USE_CCACHE)
|
||||||
set(ZANO_BOOST_MIN_VER 1.75)
|
include(FindCcache)
|
||||||
|
else()
|
||||||
|
message(STATUS "ccache deselected")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
add_definitions(-DMOBILE_WALLET_BUILD)
|
add_definitions(-DMOBILE_WALLET_BUILD)
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" )
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" )
|
||||||
add_definitions(-DIOS_BUILD)
|
add_definitions(-DIOS_BUILD)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Wno-enum-constexpr-conversion")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Wno-enum-constexpr-conversion")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Wno-enum-constexpr-conversion")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Wno-enum-constexpr-conversion")
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
add_definitions(-DANDROID_BUILD)
|
add_definitions(-DANDROID_BUILD)
|
||||||
message("Android sdk prefix: ${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}")
|
message("Android sdk prefix: ${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}")
|
||||||
message("Android CMAKE_CXX_COMPILER prefix: ${CMAKE_CXX_COMPILER}")
|
message("Android CMAKE_CXX_COMPILER prefix: ${CMAKE_CXX_COMPILER}")
|
||||||
message("Android ANDROID_LD: ${ANDROID_LD}")
|
message("Android ANDROID_LD: ${ANDROID_LD}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -53,9 +61,9 @@ if (UNIX AND NOT APPLE)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
# multi configurations for MSVC and XCode
|
# multi configurations for MSVC and XCode
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
||||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
||||||
|
|
@ -70,40 +78,37 @@ find_package(OpenSSL REQUIRED)
|
||||||
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(USE_PCH FALSE CACHE BOOL "Use shared precompiled headers")
|
set(USE_PCH FALSE CACHE BOOL "Use shared precompiled headers")
|
||||||
set(DISABLE_TOR FALSE CACHE BOOL "Disable TOR library(and related tor-connect submodule)")
|
set(DISABLE_TOR FALSE CACHE BOOL "Disable TOR library(and related tor-connect submodule)")
|
||||||
set(TESTNET FALSE CACHE BOOL "Compile for testnet")
|
set(TESTNET 0 CACHE BOOL "Build TESTNET")
|
||||||
set(BUILD_GUI FALSE CACHE BOOL "Build qt-daemon")
|
set(BUILD_GUI FALSE CACHE BOOL "Build qt-daemon")
|
||||||
set(USE_BITCOIN_SECP256K1_FOR_ECDSA FALSE CACHE BOOL "Use bitcoin-secp256k1 library for validating ECDSA(instead of OpenSSL)")
|
set(USE_BITCOIN_SECP256K1_FOR_ECDSA FALSE CACHE BOOL "Use bitcoin-secp256k1 library for validating ECDSA(instead of OpenSSL)")
|
||||||
if(NOT USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
if(NOT USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
||||||
add_definitions(-DUSE_OPEN_SSL_FOR_ECDSA)
|
add_definitions(-DUSE_OPEN_SSL_FOR_ECDSA)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
include_directories(src contrib/eos_portable_archive contrib contrib/epee/include contrib/jwt-cpp/include ${OPENSSL_INCLUDE_DIR} "${CMAKE_BINARY_DIR}/version" "${CMAKE_BINARY_DIR}/contrib/zlib")
|
|
||||||
|
|
||||||
add_definitions(-DSTATICLIB)
|
add_definitions(-DSTATICLIB)
|
||||||
|
|
||||||
if(TESTNET)
|
if(TESTNET)
|
||||||
message("!!!!!! NOTICE: Project is building for TESTNET !!!!!!")
|
message("!!!!!! NOTICE: Project is building for TESTNET !!!!!!")
|
||||||
add_definitions(-DTESTNET)
|
add_definitions(-DTESTNET)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CAKEWALLET)
|
if(CAKEWALLET)
|
||||||
message("NOTICE: Building libraries for CAKEWALLET")
|
message("NOTICE: Building libraries for CAKEWALLET")
|
||||||
add_definitions(-DCAKEWALLET)
|
add_definitions(-DCAKEWALLET)
|
||||||
add_definitions(-DDISABLE_PFR_SERIALIZATION_SELFCHECK)
|
add_definitions(-DDISABLE_PFR_SERIALIZATION_SELFCHECK)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(OPENSSL_USE_STATIC_LIBS TRUE) # link statically
|
set(OPENSSL_USE_STATIC_LIBS TRUE) # link statically
|
||||||
find_package(OpenSSL REQUIRED)
|
find_package(OpenSSL REQUIRED)
|
||||||
|
|
||||||
if(DISABLE_TOR)
|
if(DISABLE_TOR)
|
||||||
message("NOTICE: Building with disabled TOR support!")
|
message("NOTICE: Building with disabled TOR support!")
|
||||||
add_definitions(-DDISABLE_TOR)
|
add_definitions(-DDISABLE_TOR)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -119,8 +124,11 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_definitions("/DBOOST_NO_CXX98_FUNCTION_BASE")
|
|
||||||
|
|
||||||
|
add_definitions("/DBOOST_NO_CXX98_FUNCTION_BASE")
|
||||||
|
if(WIN32)
|
||||||
|
add_definitions(-DBOOST_ALL_NO_LIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions("/D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN /DGTEST_HAS_TR1_TUPLE=0")
|
add_definitions("/D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN /DGTEST_HAS_TR1_TUPLE=0")
|
||||||
|
|
@ -132,7 +140,7 @@ if(MSVC)
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
include_directories(SYSTEM src/platform/msc)
|
include_directories(SYSTEM src/platform/msc)
|
||||||
configure_file(utils/Directory.Build.props.in ${CMAKE_BINARY_DIR}/Directory.Build.props)
|
|
||||||
else()
|
else()
|
||||||
set(ARCH default CACHE STRING "CPU to build for: -march value or default")
|
set(ARCH default CACHE STRING "CPU to build for: -march value or default")
|
||||||
if("${ARCH}" STREQUAL "default")
|
if("${ARCH}" STREQUAL "default")
|
||||||
|
|
@ -147,7 +155,7 @@ else()
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
set(WARNINGS "${WARNINGS} -Wno-implicit-function-declaration -Wno-shift-count-overflow -Wno-error=mismatched-tags -Wno-error=null-conversion -Wno-overloaded-shift-op-parentheses -Wno-error=shift-count-overflow -Wno-error=tautological-constant-out-of-range-compare -Wno-error=unused-private-field -Wno-error=unneeded-internal-declaration")
|
set(WARNINGS "${WARNINGS} -Wno-implicit-function-declaration -Wno-shift-count-overflow -Wno-error=mismatched-tags -Wno-error=null-conversion -Wno-overloaded-shift-op-parentheses -Wno-error=shift-count-overflow -Wno-error=tautological-constant-out-of-range-compare -Wno-error=unused-private-field -Wno-error=unneeded-internal-declaration")
|
||||||
else()
|
else()
|
||||||
set(WARNINGS "${WARNINGS} -Wno-error=write-strings -Wlogical-op -Wno-error=maybe-uninitialized")
|
set(WARNINGS "${WARNINGS} -Wno-error=write-strings -Wno-error=uninitialized")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Since gcc 4.9 the LTO format is non-standard (slim), so we need the gcc-specific ar and ranlib binaries
|
# Since gcc 4.9 the LTO format is non-standard (slim), so we need the gcc-specific ar and ranlib binaries
|
||||||
|
|
@ -174,7 +182,7 @@ else()
|
||||||
endif()
|
endif()
|
||||||
set(C_WARNINGS "-Waggregate-return -Wnested-externs -Wstrict-prototypes -Wno-comment")
|
set(C_WARNINGS "-Waggregate-return -Wnested-externs -Wstrict-prototypes -Wno-comment")
|
||||||
set(CXX_WARNINGS "-Wno-reorder -Wno-missing-field-initializers")
|
set(CXX_WARNINGS "-Wno-reorder -Wno-missing-field-initializers")
|
||||||
try_compile(STATIC_ASSERT_RES "${CMAKE_CURRENT_BINARY_DIR}/static-assert" "${CMAKE_CURRENT_SOURCE_DIR}/utils/test-static-assert.c" COMPILE_DEFINITIONS "-std=c++14")
|
try_compile(STATIC_ASSERT_RES "${CMAKE_CURRENT_BINARY_DIR}/static-assert" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-static-assert.c" COMPILE_DEFINITIONS "-std=c++14")
|
||||||
if(STATIC_ASSERT_RES)
|
if(STATIC_ASSERT_RES)
|
||||||
set(STATIC_ASSERT_FLAG "")
|
set(STATIC_ASSERT_FLAG "")
|
||||||
else()
|
else()
|
||||||
|
|
@ -195,21 +203,21 @@ else()
|
||||||
else()
|
else()
|
||||||
set(DEBUG_FLAGS "-g3 -O0")
|
set(DEBUG_FLAGS "-g3 -O0")
|
||||||
endif()
|
endif()
|
||||||
set(RELEASE_FLAGS "-Ofast -DNDEBUG -Wno-unused-variable")
|
set(RELEASE_FLAGS "-O3 -ffast-math -DNDEBUG -w")
|
||||||
|
|
||||||
if(NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Android"))
|
if(NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Android"))
|
||||||
set(RELEASE_FLAGS "${RELEASE_FLAGS} -flto -g3")
|
set(RELEASE_FLAGS "${RELEASE_FLAGS} -flto=auto -g3")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT MINGW)
|
||||||
|
set(RELEASE_FLAGS "${RELEASE_FLAGS} -fno-fat-lto-objects")
|
||||||
endif()
|
endif()
|
||||||
#if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT MINGW)
|
|
||||||
# set(RELEASE_FLAGS "${RELEASE_FLAGS} -fno-fat-lto-objects")
|
|
||||||
#endif()
|
|
||||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
||||||
if(STATIC)
|
if(STATIC)
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
message(SEND_ERROR "Static build is not supported on MacOS X")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -217,75 +225,51 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# always use local Boost installation rather than the system-wide (unless ZANO_USE_SYSTEM_BOOST is defined for some reason, which is not recommended)
|
# Link Boost statically, consistent with previous setup
|
||||||
if(NOT DEFINED ENV{ZANO_USE_SYSTEM_BOOST})
|
if(MSVC OR STATIC)
|
||||||
set(Boost_NO_SYSTEM_PATHS ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
|
if (MSVC)
|
||||||
|
set(Boost_USE_MULTITHREADED ON)
|
||||||
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(STATIC)
|
if(STATIC)
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
|
||||||
set(Boost_USE_STATIC_RUNTIME ON)
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message("CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
|
# Define Boost components
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
set(BOOST_COMPONENTS system filesystem locale thread timer date_time chrono regex serialization atomic program_options)
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 12.00)
|
if(NOT APPLE)
|
||||||
if(NOT DEFINED SKIP_BOOST_FATLIB_LIB OR NOT SKIP_BOOST_FATLIB_LIB)
|
list(APPEND BOOST_COMPONENTS log)
|
||||||
message("Ios: libboost.a included as library")
|
|
||||||
set(Boost_LIBRARIES "libboost.a")
|
|
||||||
else()
|
|
||||||
message("Ios: libboost.a not included as library")
|
|
||||||
endif()
|
|
||||||
#workaround for new XCode 12 policy for builds(now it includes a slice for the "arm64" when builds for simulator)
|
|
||||||
set(__iphoneos_archs "arm64")
|
|
||||||
#set(__iphonesimulator_archs "arm64,x86_64")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "${__iphoneos_archs}")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "${__iphoneos_archs}")
|
|
||||||
#set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "${__iphonesimulator_archs}")
|
|
||||||
#set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "${__iphonesimulator_archs}")
|
|
||||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
|
||||||
if(CAKEWALLET)
|
|
||||||
find_package(Boost ${ZANO_BOOST_MIN_VER} REQUIRED COMPONENTS system filesystem locale thread timer date_time chrono regex serialization atomic program_options)
|
|
||||||
else()
|
|
||||||
set(Boost_LIBRARY_DIRS "${Boost_LIBRARY_DIRS}/${CMAKE_ANDROID_ARCH_ABI}/")
|
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARY_DIRS}libboost_system.a;${Boost_LIBRARY_DIRS}libboost_filesystem.a;${Boost_LIBRARY_DIRS}libboost_thread.a;${Boost_LIBRARY_DIRS}libboost_timer.a;${Boost_LIBRARY_DIRS}libboost_date_time.a;${Boost_LIBRARY_DIRS}libboost_chrono.a;${Boost_LIBRARY_DIRS}libboost_regex.a;${Boost_LIBRARY_DIRS}libboost_serialization.a;${Boost_LIBRARY_DIRS}libboost_atomic.a;${Boost_LIBRARY_DIRS}libboost_program_options.a")
|
|
||||||
endif()
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fPIC")
|
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fPIC")
|
|
||||||
elseif(APPLE)
|
|
||||||
find_package(Boost ${ZANO_BOOST_MIN_VER} REQUIRED COMPONENTS system filesystem locale thread timer date_time chrono regex serialization atomic program_options)
|
|
||||||
else()
|
|
||||||
find_package(Boost ${ZANO_BOOST_MIN_VER} REQUIRED COMPONENTS system filesystem locale thread timer date_time chrono regex serialization atomic program_options log)
|
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "Using Boost ${Boost_VERSION} from Conan")
|
||||||
|
|
||||||
|
find_package(miniupnpc REQUIRED)
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
|
||||||
|
|
||||||
|
include_directories(src "${CMAKE_BINARY_DIR}/version")
|
||||||
|
|
||||||
message(STATUS "Boost: ${Boost_VERSION} from ${Boost_LIBRARY_DIRS}")
|
include_directories(SYSTEM
|
||||||
|
${Boost_INCLUDE_DIRS}
|
||||||
|
${ZLIB_INCLUDE_DIRS}
|
||||||
|
${OPENSSL_INCLUDE_DIR}
|
||||||
|
${PROJECT_SOURCE_DIR}/contrib/ethereum/libethash
|
||||||
|
contrib
|
||||||
|
contrib/epee/include
|
||||||
|
contrib/jwt-cpp/include
|
||||||
|
contrib/eos_portable_archive
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/contrib/ethereum/libethash)
|
# Append other needed libraries
|
||||||
if(MINGW)
|
if(MINGW)
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARIES};ws2_32;mswsock")
|
list(APPEND Boost_LIBRARIES ws2_32 mswsock)
|
||||||
elseif(NOT MSVC)
|
elseif(NOT MSVC AND NOT APPLE AND NOT CAKEWALLET AND STATIC)
|
||||||
if(NOT APPLE AND NOT CAKEWALLET)
|
message("NOTICE: Including static ICU libraries")
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARIES};")
|
list(APPEND Boost_LIBRARIES icui18n.a icuuc.a icudata.a dl)
|
||||||
if(STATIC)
|
|
||||||
message("NOTICE: Including static ICU libraries")
|
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARIES};icui18n.a;icuuc.a;icudata.a;dl")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(BUILD_GUI)
|
|
||||||
cmake_minimum_required(VERSION 3.1) # <-- this is important for Linux GUI build, don't touch it -- sowle
|
|
||||||
find_package(Qt5Widgets REQUIRED)
|
|
||||||
find_package(Qt5WebEngineWidgets REQUIRED)
|
|
||||||
find_package(Qt5WebChannel REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(COMMIT_ID_IN_VERSION ON CACHE BOOL "Include commit ID in version")
|
set(COMMIT_ID_IN_VERSION ON CACHE BOOL "Include commit ID in version")
|
||||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/version")
|
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/version")
|
||||||
|
|
@ -313,16 +297,18 @@ else()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(BUILD_TESTS FALSE CACHE BOOL "Build Zano tests")
|
set(BUILD_TESTS FALSE CACHE BOOL "Build Lethean tests")
|
||||||
set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)")
|
set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)")
|
||||||
if(NOT DISABLE_MDBX)
|
if(NOT DISABLE_MDBX)
|
||||||
add_definitions(-DENABLED_ENGINE_MDBX)
|
add_definitions(-DENABLED_ENGINE_MDBX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(contrib)
|
add_subdirectory(contrib)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
if (BUILD_TESTS)
|
if (BUILD_TESTS)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include(CPackConfig)
|
||||||
|
|
|
||||||
109
CMakePresets.json
Normal file
109
CMakePresets.json
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
{
|
||||||
|
"version": 8,
|
||||||
|
"cmakeMinimumRequired": {
|
||||||
|
"major": 3,
|
||||||
|
"minor": 23,
|
||||||
|
"patch": 0
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"ConanPresets.json"
|
||||||
|
],
|
||||||
|
"configurePresets": [
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"binaryDir": "${sourceDir}/build/release",
|
||||||
|
"environment": {
|
||||||
|
"CONAN_HOME": "${sourceDir}/build/sdk"
|
||||||
|
},
|
||||||
|
"cacheVariables": {
|
||||||
|
"TESTNET": "ON",
|
||||||
|
"CMAKE_BUILD_TYPE": "Release",
|
||||||
|
"CMAKE_PROJECT_TOP_LEVEL_INCLUDES":".core/build/cmake/ConanProvider.cmake"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"binaryDir": "${sourceDir}/build/release",
|
||||||
|
"environment": {
|
||||||
|
"CONAN_HOME": "${sourceDir}/build/sdk"
|
||||||
|
},
|
||||||
|
"cacheVariables": {
|
||||||
|
"TESTNET": "OFF",
|
||||||
|
"CMAKE_BUILD_TYPE": "Release",
|
||||||
|
"CMAKE_PROJECT_TOP_LEVEL_INCLUDES":".core/build/cmake/ConanProvider.cmake"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buildPresets": [
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"configurePreset": "testnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"configurePreset": "mainnet"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"testPresets": [
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"configurePreset": "mainnet",
|
||||||
|
"output": {"outputOnFailure": true},
|
||||||
|
"execution": {"noTestsAction": "error", "stopOnFailure": true}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packagePresets": [
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"configurePreset": "mainnet",
|
||||||
|
"generators": [
|
||||||
|
"TGZ",
|
||||||
|
"ZIP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"configurePreset": "testnet",
|
||||||
|
"generators": [
|
||||||
|
"TGZ",
|
||||||
|
"ZIP"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"workflowPresets": [
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"type": "configure",
|
||||||
|
"name": "testnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "build",
|
||||||
|
"name": "testnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "package",
|
||||||
|
"name": "testnet"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"type": "configure",
|
||||||
|
"name": "mainnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "build",
|
||||||
|
"name": "mainnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "package",
|
||||||
|
"name": "mainnet"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
9
ConanPresets.json
Normal file
9
ConanPresets.json
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"vendor": {
|
||||||
|
"conan": {}
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"build/release/generators/CMakePresets.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
9
LICENSE
9
LICENSE
|
|
@ -1,9 +0,0 @@
|
||||||
Copyright (C) 2024 Zano project
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ZANO PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of Zano project shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Zano project.
|
|
||||||
288
LICENSE.txt
Normal file
288
LICENSE.txt
Normal file
|
|
@ -0,0 +1,288 @@
|
||||||
|
EUROPEAN UNION PUBLIC LICENCE v. 1.2
|
||||||
|
EUPL © the European Union 2007, 2016
|
||||||
|
|
||||||
|
This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined
|
||||||
|
below) which is provided under the terms of this Licence. Any use of the Work,
|
||||||
|
other than as authorised under this Licence is prohibited (to the extent such
|
||||||
|
use is covered by a right of the copyright holder of the Work).
|
||||||
|
|
||||||
|
The Work is provided under the terms of this Licence when the Licensor (as
|
||||||
|
defined below) has placed the following notice immediately following the
|
||||||
|
copyright notice for the Work:
|
||||||
|
|
||||||
|
Licensed under the EUPL
|
||||||
|
|
||||||
|
or has expressed by any other means his willingness to license under the EUPL.
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
|
||||||
|
In this Licence, the following terms have the following meaning:
|
||||||
|
|
||||||
|
- ‘The Licence’: this Licence.
|
||||||
|
|
||||||
|
- ‘The Original Work’: the work or software distributed or communicated by the
|
||||||
|
Licensor under this Licence, available as Source Code and also as Executable
|
||||||
|
Code as the case may be.
|
||||||
|
|
||||||
|
- ‘Derivative Works’: the works or software that could be created by the
|
||||||
|
Licensee, based upon the Original Work or modifications thereof. This Licence
|
||||||
|
does not define the extent of modification or dependence on the Original Work
|
||||||
|
required in order to classify a work as a Derivative Work; this extent is
|
||||||
|
determined by copyright law applicable in the country mentioned in Article 15.
|
||||||
|
|
||||||
|
- ‘The Work’: the Original Work or its Derivative Works.
|
||||||
|
|
||||||
|
- ‘The Source Code’: the human-readable form of the Work which is the most
|
||||||
|
convenient for people to study and modify.
|
||||||
|
|
||||||
|
- ‘The Executable Code’: any code which has generally been compiled and which is
|
||||||
|
meant to be interpreted by a computer as a program.
|
||||||
|
|
||||||
|
- ‘The Licensor’: the natural or legal person that distributes or communicates
|
||||||
|
the Work under the Licence.
|
||||||
|
|
||||||
|
- ‘Contributor(s)’: any natural or legal person who modifies the Work under the
|
||||||
|
Licence, or otherwise contributes to the creation of a Derivative Work.
|
||||||
|
|
||||||
|
- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
|
||||||
|
the Work under the terms of the Licence.
|
||||||
|
|
||||||
|
- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
|
||||||
|
renting, distributing, communicating, transmitting, or otherwise making
|
||||||
|
available, online or offline, copies of the Work or providing access to its
|
||||||
|
essential functionalities at the disposal of any other natural or legal
|
||||||
|
person.
|
||||||
|
|
||||||
|
2. Scope of the rights granted by the Licence
|
||||||
|
|
||||||
|
The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
||||||
|
sublicensable licence to do the following, for the duration of copyright vested
|
||||||
|
in the Original Work:
|
||||||
|
|
||||||
|
- use the Work in any circumstance and for all usage,
|
||||||
|
- reproduce the Work,
|
||||||
|
- modify the Work, and make Derivative Works based upon the Work,
|
||||||
|
- communicate to the public, including the right to make available or display
|
||||||
|
the Work or copies thereof to the public and perform publicly, as the case may
|
||||||
|
be, the Work,
|
||||||
|
- distribute the Work or copies thereof,
|
||||||
|
- lend and rent the Work or copies thereof,
|
||||||
|
- sublicense rights in the Work or copies thereof.
|
||||||
|
|
||||||
|
Those rights can be exercised on any media, supports and formats, whether now
|
||||||
|
known or later invented, as far as the applicable law permits so.
|
||||||
|
|
||||||
|
In the countries where moral rights apply, the Licensor waives his right to
|
||||||
|
exercise his moral right to the extent allowed by law in order to make effective
|
||||||
|
the licence of the economic rights here above listed.
|
||||||
|
|
||||||
|
The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to
|
||||||
|
any patents held by the Licensor, to the extent necessary to make use of the
|
||||||
|
rights granted on the Work under this Licence.
|
||||||
|
|
||||||
|
3. Communication of the Source Code
|
||||||
|
|
||||||
|
The Licensor may provide the Work either in its Source Code form, or as
|
||||||
|
Executable Code. If the Work is provided as Executable Code, the Licensor
|
||||||
|
provides in addition a machine-readable copy of the Source Code of the Work
|
||||||
|
along with each copy of the Work that the Licensor distributes or indicates, in
|
||||||
|
a notice following the copyright notice attached to the Work, a repository where
|
||||||
|
the Source Code is easily and freely accessible for as long as the Licensor
|
||||||
|
continues to distribute or communicate the Work.
|
||||||
|
|
||||||
|
4. Limitations on copyright
|
||||||
|
|
||||||
|
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
||||||
|
any exception or limitation to the exclusive rights of the rights owners in the
|
||||||
|
Work, of the exhaustion of those rights or of other applicable limitations
|
||||||
|
thereto.
|
||||||
|
|
||||||
|
5. Obligations of the Licensee
|
||||||
|
|
||||||
|
The grant of the rights mentioned above is subject to some restrictions and
|
||||||
|
obligations imposed on the Licensee. Those obligations are the following:
|
||||||
|
|
||||||
|
Attribution right: The Licensee shall keep intact all copyright, patent or
|
||||||
|
trademarks notices and all notices that refer to the Licence and to the
|
||||||
|
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
||||||
|
copy of the Licence with every copy of the Work he/she distributes or
|
||||||
|
communicates. The Licensee must cause any Derivative Work to carry prominent
|
||||||
|
notices stating that the Work has been modified and the date of modification.
|
||||||
|
|
||||||
|
Copyleft clause: If the Licensee distributes or communicates copies of the
|
||||||
|
Original Works or Derivative Works, this Distribution or Communication will be
|
||||||
|
done under the terms of this Licence or of a later version of this Licence
|
||||||
|
unless the Original Work is expressly distributed only under this version of the
|
||||||
|
Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
|
||||||
|
(becoming Licensor) cannot offer or impose any additional terms or conditions on
|
||||||
|
the Work or Derivative Work that alter or restrict the terms of the Licence.
|
||||||
|
|
||||||
|
Compatibility clause: If the Licensee Distributes or Communicates Derivative
|
||||||
|
Works or copies thereof based upon both the Work and another work licensed under
|
||||||
|
a Compatible Licence, this Distribution or Communication can be done under the
|
||||||
|
terms of this Compatible Licence. For the sake of this clause, ‘Compatible
|
||||||
|
Licence’ refers to the licences listed in the appendix attached to this Licence.
|
||||||
|
Should the Licensee's obligations under the Compatible Licence conflict with
|
||||||
|
his/her obligations under this Licence, the obligations of the Compatible
|
||||||
|
Licence shall prevail.
|
||||||
|
|
||||||
|
Provision of Source Code: When distributing or communicating copies of the Work,
|
||||||
|
the Licensee will provide a machine-readable copy of the Source Code or indicate
|
||||||
|
a repository where this Source will be easily and freely available for as long
|
||||||
|
as the Licensee continues to distribute or communicate the Work.
|
||||||
|
|
||||||
|
Legal Protection: This Licence does not grant permission to use the trade names,
|
||||||
|
trademarks, service marks, or names of the Licensor, except as required for
|
||||||
|
reasonable and customary use in describing the origin of the Work and
|
||||||
|
reproducing the content of the copyright notice.
|
||||||
|
|
||||||
|
6. Chain of Authorship
|
||||||
|
|
||||||
|
The original Licensor warrants that the copyright in the Original Work granted
|
||||||
|
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
||||||
|
power and authority to grant the Licence.
|
||||||
|
|
||||||
|
Each Contributor warrants that the copyright in the modifications he/she brings
|
||||||
|
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
||||||
|
power and authority to grant the Licence.
|
||||||
|
|
||||||
|
Each time You accept the Licence, the original Licensor and subsequent
|
||||||
|
Contributors grant You a licence to their contributions to the Work, under the
|
||||||
|
terms of this Licence.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty
|
||||||
|
|
||||||
|
The Work is a work in progress, which is continuously improved by numerous
|
||||||
|
Contributors. It is not a finished work and may therefore contain defects or
|
||||||
|
‘bugs’ inherent to this type of development.
|
||||||
|
|
||||||
|
For the above reason, the Work is provided under the Licence on an ‘as is’ basis
|
||||||
|
and without warranties of any kind concerning the Work, including without
|
||||||
|
limitation merchantability, fitness for a particular purpose, absence of defects
|
||||||
|
or errors, accuracy, non-infringement of intellectual property rights other than
|
||||||
|
copyright as stated in Article 6 of this Licence.
|
||||||
|
|
||||||
|
This disclaimer of warranty is an essential part of the Licence and a condition
|
||||||
|
for the grant of any rights to the Work.
|
||||||
|
|
||||||
|
8. Disclaimer of Liability
|
||||||
|
|
||||||
|
Except in the cases of wilful misconduct or damages directly caused to natural
|
||||||
|
persons, the Licensor will in no event be liable for any direct or indirect,
|
||||||
|
material or moral, damages of any kind, arising out of the Licence or of the use
|
||||||
|
of the Work, including without limitation, damages for loss of goodwill, work
|
||||||
|
stoppage, computer failure or malfunction, loss of data or any commercial
|
||||||
|
damage, even if the Licensor has been advised of the possibility of such damage.
|
||||||
|
However, the Licensor will be liable under statutory product liability laws as
|
||||||
|
far such laws apply to the Work.
|
||||||
|
|
||||||
|
9. Additional agreements
|
||||||
|
|
||||||
|
While distributing the Work, You may choose to conclude an additional agreement,
|
||||||
|
defining obligations or services consistent with this Licence. However, if
|
||||||
|
accepting obligations, You may act only on your own behalf and on your sole
|
||||||
|
responsibility, not on behalf of the original Licensor or any other Contributor,
|
||||||
|
and only if You agree to indemnify, defend, and hold each Contributor harmless
|
||||||
|
for any liability incurred by, or claims asserted against such Contributor by
|
||||||
|
the fact You have accepted any warranty or additional liability.
|
||||||
|
|
||||||
|
10. Acceptance of the Licence
|
||||||
|
|
||||||
|
The provisions of this Licence can be accepted by clicking on an icon ‘I agree’
|
||||||
|
placed under the bottom of a window displaying the text of this Licence or by
|
||||||
|
affirming consent in any other similar way, in accordance with the rules of
|
||||||
|
applicable law. Clicking on that icon indicates your clear and irrevocable
|
||||||
|
acceptance of this Licence and all of its terms and conditions.
|
||||||
|
|
||||||
|
Similarly, you irrevocably accept this Licence and all of its terms and
|
||||||
|
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
||||||
|
such as the use of the Work, the creation by You of a Derivative Work or the
|
||||||
|
Distribution or Communication by You of the Work or copies thereof.
|
||||||
|
|
||||||
|
11. Information to the public
|
||||||
|
|
||||||
|
In case of any Distribution or Communication of the Work by means of electronic
|
||||||
|
communication by You (for example, by offering to download the Work from a
|
||||||
|
remote location) the distribution channel or media (for example, a website) must
|
||||||
|
at least provide to the public the information requested by the applicable law
|
||||||
|
regarding the Licensor, the Licence and the way it may be accessible, concluded,
|
||||||
|
stored and reproduced by the Licensee.
|
||||||
|
|
||||||
|
12. Termination of the Licence
|
||||||
|
|
||||||
|
The Licence and the rights granted hereunder will terminate automatically upon
|
||||||
|
any breach by the Licensee of the terms of the Licence.
|
||||||
|
|
||||||
|
Such a termination will not terminate the licences of any person who has
|
||||||
|
received the Work from the Licensee under the Licence, provided such persons
|
||||||
|
remain in full compliance with the Licence.
|
||||||
|
|
||||||
|
13. Miscellaneous
|
||||||
|
|
||||||
|
Without prejudice of Article 9 above, the Licence represents the complete
|
||||||
|
agreement between the Parties as to the Work.
|
||||||
|
|
||||||
|
If any provision of the Licence is invalid or unenforceable under applicable
|
||||||
|
law, this will not affect the validity or enforceability of the Licence as a
|
||||||
|
whole. Such provision will be construed or reformed so as necessary to make it
|
||||||
|
valid and enforceable.
|
||||||
|
|
||||||
|
The European Commission may publish other linguistic versions or new versions of
|
||||||
|
this Licence or updated versions of the Appendix, so far this is required and
|
||||||
|
reasonable, without reducing the scope of the rights granted by the Licence. New
|
||||||
|
versions of the Licence will be published with a unique version number.
|
||||||
|
|
||||||
|
All linguistic versions of this Licence, approved by the European Commission,
|
||||||
|
have identical value. Parties can take advantage of the linguistic version of
|
||||||
|
their choice.
|
||||||
|
|
||||||
|
14. Jurisdiction
|
||||||
|
|
||||||
|
Without prejudice to specific agreement between parties,
|
||||||
|
|
||||||
|
- any litigation resulting from the interpretation of this License, arising
|
||||||
|
between the European Union institutions, bodies, offices or agencies, as a
|
||||||
|
Licensor, and any Licensee, will be subject to the jurisdiction of the Court
|
||||||
|
of Justice of the European Union, as laid down in article 272 of the Treaty on
|
||||||
|
the Functioning of the European Union,
|
||||||
|
|
||||||
|
- any litigation arising between other parties and resulting from the
|
||||||
|
interpretation of this License, will be subject to the exclusive jurisdiction
|
||||||
|
of the competent court where the Licensor resides or conducts its primary
|
||||||
|
business.
|
||||||
|
|
||||||
|
15. Applicable Law
|
||||||
|
|
||||||
|
Without prejudice to specific agreement between parties,
|
||||||
|
|
||||||
|
- this Licence shall be governed by the law of the European Union Member State
|
||||||
|
where the Licensor has his seat, resides or has his registered office,
|
||||||
|
|
||||||
|
- this licence shall be governed by Belgian law if the Licensor has no seat,
|
||||||
|
residence or registered office inside a European Union Member State.
|
||||||
|
|
||||||
|
Appendix
|
||||||
|
|
||||||
|
‘Compatible Licences’ according to Article 5 EUPL are:
|
||||||
|
|
||||||
|
- GNU General Public License (GPL) v. 2, v. 3
|
||||||
|
- GNU Affero General Public License (AGPL) v. 3
|
||||||
|
- Open Software License (OSL) v. 2.1, v. 3.0
|
||||||
|
- Eclipse Public License (EPL) v. 1.0
|
||||||
|
- CeCILL v. 2.0, v. 2.1
|
||||||
|
- Mozilla Public Licence (MPL) v. 2
|
||||||
|
- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
|
||||||
|
- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
|
||||||
|
works other than software
|
||||||
|
- European Union Public Licence (EUPL) v. 1.1, v. 1.2
|
||||||
|
- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
|
||||||
|
Reciprocity (LiLiQ-R+).
|
||||||
|
|
||||||
|
The European Commission may update this Appendix to later versions of the above
|
||||||
|
licences without producing a new version of the EUPL, as long as they provide
|
||||||
|
the rights granted in Article 2 of this Licence and protect the covered Source
|
||||||
|
Code from exclusive appropriation.
|
||||||
|
|
||||||
|
All other changes or additions to this Appendix require the production of a new
|
||||||
|
EUPL version.
|
||||||
|
|
||||||
214
Makefile
214
Makefile
|
|
@ -1,82 +1,196 @@
|
||||||
|
# Copyright (c) 2017-2025 Lethean https://lt.hn
|
||||||
# Copyright (c) 2014-2019 Zano Project
|
# Copyright (c) 2014-2019 Zano Project
|
||||||
# Copyright (c) 2014 The Cryptonote developers
|
# Copyright (c) 2014 The Cryptonote developers
|
||||||
# Distributed under the MIT/X11 software license, see the accompanying
|
# Distributed under the MIT/X11 software license, see the accompanying
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
# Define CMake generator
|
# ============================================================
|
||||||
system := $(shell uname)
|
# Build system from host-uk/build submodule
|
||||||
ifneq (, $(findstring MINGW, $(system)))
|
# ============================================================
|
||||||
cmake_gen = -G 'MSYS Makefiles'
|
BUILD_SYS := .core/build
|
||||||
|
CMAKE_DIR := $(BUILD_SYS)/cmake
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# Project Configuration
|
||||||
|
# ============================================================
|
||||||
|
CPU_CORES := 1
|
||||||
|
TESTNET:= 0
|
||||||
|
STATIC:= 0
|
||||||
|
BUILD_TYPE ?=Release
|
||||||
|
BUILD_VERSION:=6.0.1
|
||||||
|
BUILD_FOLDER:=build/release
|
||||||
|
PRESET_BUILD:=conan-release
|
||||||
|
PRESET_CONFIGURE:=conan-release
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Detect the number of logical CPU cores – works on Linux,
|
||||||
|
# macOS, BSD, and Windows (both cmd.exe and PowerShell).
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
UNAME_S := $(shell uname -s 2>/dev/null || echo Unknown)
|
||||||
|
|
||||||
|
ifeq ($(UNAME_S),Linux)
|
||||||
|
CPU_CORES := $(shell nproc 2>/dev/null || \
|
||||||
|
grep -c ^processor /proc/cpuinfo 2>/dev/null || echo 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cmake = cmake $(cmake_gen)
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
CPU_CORES := $(shell sysctl -n hw.logicalcpu 2>/dev/null || echo 1)
|
||||||
|
endif
|
||||||
|
|
||||||
cmake_debug = $(cmake) -D CMAKE_BUILD_TYPE=Debug
|
ifeq ($(filter %BSD,$(UNAME_S)),%BSD)
|
||||||
cmake_release = $(cmake) -D CMAKE_BUILD_TYPE=Release
|
CPU_CORES := $(shell sysctl -n hw.ncpu 2>/dev/null || echo 1)
|
||||||
|
endif
|
||||||
|
|
||||||
cmake_gui = -D BUILD_GUI=ON
|
ifeq ($(OS),Windows_NT)
|
||||||
cmake_static = -D STATIC=ON
|
|
||||||
cmake_tests = -D BUILD_TESTS=ON
|
|
||||||
|
|
||||||
# Helper macro
|
PRESET_CONFIGURE:=conan-default
|
||||||
define CMAKE
|
|
||||||
mkdir -p $1 && cd $1 && $2 ../../
|
|
||||||
endef
|
|
||||||
|
|
||||||
build = build
|
CPU_CORES := $(NUMBER_OF_PROCESSORS)
|
||||||
dir_debug = $(build)/debug
|
|
||||||
dir_release = $(build)/release
|
|
||||||
|
|
||||||
all: release
|
ifeq ($(CPU_CORES),)
|
||||||
|
CPU_CORES := $(shell powershell -NoProfile -Command ^ "[Environment]::ProcessorCount")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
release:
|
# Safety net
|
||||||
$(eval command += $(cmake_release))
|
CPU_CORES := $(or $(CPU_CORES),1)
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
CPU_CORES := $(shell expr $(CPU_CORES) + 0 2>/dev/null || echo 1)
|
||||||
|
CONAN_CPU_COUNT=$(CPU_CORES)
|
||||||
|
|
||||||
debug:
|
# ============================================================
|
||||||
$(eval command += $(cmake_debug))
|
# Paths — profiles and cmake modules from .build submodule
|
||||||
$(call CMAKE,$(dir_debug),$(command)) && $(MAKE)
|
# ============================================================
|
||||||
|
PROFILES :=$(patsubst $(CMAKE_DIR)/profiles/%,%,$(wildcard $(CMAKE_DIR)/profiles/*))
|
||||||
|
SORTED_PROFILES :=$(sort $(PROFILES))
|
||||||
|
CONAN_CACHE :=$(CURDIR)/build/sdk
|
||||||
|
CONAN_URL :=http://forge.snider.dev:4000/api/packages/host-uk/conan
|
||||||
|
CONAN_USER ?=$(shell echo $$CONAN_USER)
|
||||||
|
CONAN_PASSWORD ?=$(shell echo $$CONAN_PASSWORD)
|
||||||
|
CONAN_EXECUTABLE :=$(CURDIR)/build/bin/conan
|
||||||
|
CC_DOCKER_FILE ?=utils/docker/images/lthn-chain/Dockerfile
|
||||||
|
SDK_PACKAGES_JSON :=$(wildcard utils/sdk/packages/*.json)
|
||||||
|
SDK_TARGETS :=$(patsubst utils/sdk/packages/%.json,%,$(SDK_PACKAGES_JSON))
|
||||||
|
SORTED_SDK_TARGETS :=$(sort $(SDK_TARGETS))
|
||||||
|
|
||||||
static: static-release
|
all: help
|
||||||
static-release:
|
|
||||||
$(eval command += $(cmake_release) $(cmake_static))
|
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
|
||||||
|
|
||||||
#
|
testnet:
|
||||||
# GUI
|
$(MAKE) configure TESTNET=1 STATIC=$(STATIC)
|
||||||
#
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) build .
|
||||||
|
$(MAKE) package
|
||||||
|
|
||||||
gui: gui-release
|
mainnet:
|
||||||
gui-release:
|
$(MAKE) configure TESTNET=0 STATIC=$(STATIC)
|
||||||
$(eval command += $(cmake_release) $(cmake_gui))
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) build .
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
$(MAKE) package
|
||||||
|
|
||||||
gui-debug:
|
release: docs build
|
||||||
$(eval command += $(cmake_debug) $(cmake_gui))
|
(cd $(BUILD_FOLDER) && cpack)
|
||||||
$(call CMAKE,$(dir_debug),$(command)) && $(MAKE)
|
@rm -rf $(CURDIR)/build/packages/_CPack_Packages
|
||||||
|
|
||||||
gui-static: gui-release-static
|
build: configure
|
||||||
gui-release-static:
|
cmake --build --preset $(PRESET_BUILD) --parallel=$(CPU_CORES)
|
||||||
$(eval command += $(cmake_release) $(cmake_gui) $(cmake_static))
|
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
build-deps: conan-profile-detect
|
||||||
|
@echo "Build Dependencies: $(BUILD_TYPE) testnet=$(TESTNET)"
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
|
||||||
|
package:
|
||||||
|
@echo "Packaging: $(BUILD_TYPE) testnet=$(TESTNET)"
|
||||||
|
(cd $(BUILD_FOLDER) && cpack)
|
||||||
|
ifneq ($(OS),Windows_NT)
|
||||||
|
@rm -rf $(CURDIR)/build/packages/_CPack_Packages
|
||||||
|
endif
|
||||||
|
|
||||||
|
configure: build-deps
|
||||||
|
@echo "Running Configure: $(BUILD_TYPE) testnet=$(TESTNET)"
|
||||||
|
cmake --preset $(PRESET_CONFIGURE) -DSTATIC=$(STATIC) -DTESTNET=$(TESTNET) -DBUILD_VERSION=$(BUILD_VERSION)
|
||||||
|
|
||||||
|
docs: configure
|
||||||
|
@echo "Building Documentation"
|
||||||
|
cmake --build build/release --target=docs --config=Release --parallel=$(CPU_CORES)
|
||||||
|
|
||||||
|
sdk:
|
||||||
|
$(MAKE) -C utils/sdk $(filter-out $@,$(MAKECMDGOALS)) PACKAGE_VERSION=$(BUILD_VERSION)
|
||||||
|
|
||||||
|
# Rule for each profile — uses .build/cmake/profiles/
|
||||||
|
$(PROFILES): conan-profile-detect
|
||||||
|
@echo "Building profile: $@"
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . -pr:h=$(CMAKE_DIR)/profiles/$@ --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
cmake -S . -B $(BUILD_FOLDER) -DCMAKE_TOOLCHAIN_FILE=$(BUILD_FOLDER)/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DSTATIC=$(STATIC) -DTESTNET=$(TESTNET) -DBUILD_VERSION=$(BUILD_VERSION)
|
||||||
|
cmake --build $(BUILD_FOLDER) --config=$(BUILD_TYPE) --parallel=$(CPU_CORES)
|
||||||
|
(cd $(BUILD_FOLDER) && cpack)
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Lethean VPN Blockchain"
|
||||||
|
@echo "======================"
|
||||||
|
@echo "Website: https://lt.hn"
|
||||||
|
@echo "GitHub: https://github.com/letheanVPN/blockchain/"
|
||||||
|
@echo "Discord: https://discord.lt.hn"
|
||||||
|
@echo ""
|
||||||
|
@echo "Available targets:"
|
||||||
|
@printf " %-42s %s\n" "make clean" "Clean all build directories"
|
||||||
|
@printf " %-42s %s\n" "make conan-get" "Download and install conan locally"
|
||||||
|
@printf " %-42s %s\n" "make release" "Build release"
|
||||||
|
@printf " %-42s %s\n" "make testnet" "Build testnet"
|
||||||
|
@printf " %-42s %s\n" "make mainnet" "Build mainnet"
|
||||||
|
@printf " %-42s %s\n" "make test" "Build & run tests"
|
||||||
|
@printf " %-42s %s\n" "make docs" "Builds offline documentation website"
|
||||||
|
@printf " %-42s %s\n" "make docs-dev" "Runs local doc server, for editing/adding docs"
|
||||||
|
@printf " %-42s %s\n" "make conan-profile-detect" "Creates host config"
|
||||||
|
@printf " %-42s %s\n" "make configure" "Runs a cmake configure within conan build flow"
|
||||||
|
@printf "\n --- Conan Cross-Compilation Profiles ---\n"
|
||||||
|
@$(foreach profile,$(SORTED_PROFILES),printf " %-42s %s\n" "make $(profile)" "Build the $(profile) profile";)
|
||||||
|
@printf "\n --- SDK Generation ---\n"
|
||||||
|
@printf " %-42s %s\n" "make sdk" "Build all SDK packages"
|
||||||
|
@$(foreach sdk,$(SORTED_SDK_TARGETS),printf " %-42s %s\n" "make sdk $(sdk)" "Build the $(sdk) SDK package";)
|
||||||
|
@printf "\n"
|
||||||
|
@printf " %-42s %s\n" "make help" "Show this help message"
|
||||||
|
|
||||||
#
|
|
||||||
# Tests
|
|
||||||
#
|
|
||||||
|
|
||||||
test: test-release
|
test: test-release
|
||||||
test-release:
|
test-release:
|
||||||
$(eval command += $(cmake_release) $(cmake_tests))
|
@echo "Building profile: test-release"
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE) && $(MAKE) test
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . --output-folder=build/test-release --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
cmake -S . -B build/test-release -DCMAKE_TOOLCHAIN_FILE=build/test-release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -D BUILD_TESTS=ON
|
||||||
|
cmake --build build/test-release --config=Release --parallel=$(CPU_CORES)
|
||||||
|
$(MAKE) test
|
||||||
|
|
||||||
test-debug:
|
test-debug:
|
||||||
$(eval command += $(cmake_debug) $(cmake_tests))
|
@echo "Building profile: test-debug"
|
||||||
$(call CMAKE,$(dir_debug),$(command)) && $(MAKE) && $(MAKE) test
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . --output-folder=build/test-debug --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
cmake -S . -B build/test-debug -DCMAKE_TOOLCHAIN_FILE=build/test-debug/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug -D BUILD_TESTS=ON
|
||||||
|
cmake --build build/test-debug --config=Debug --parallel=$(CPU_CORES)
|
||||||
|
$(MAKE) test
|
||||||
|
|
||||||
|
# Conan management — cmake modules from .build submodule
|
||||||
|
conan-get:
|
||||||
|
cmake -P $(CMAKE_DIR)/ConanGet.cmake
|
||||||
|
ifneq ($(CONAN_USER),)
|
||||||
|
(CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) remote add conan_build $(CONAN_URL) && \
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) remote login conan_build $(CONAN_USER) -p $(CONAN_PASSWORD)) || true
|
||||||
|
endif
|
||||||
|
|
||||||
|
conan-upload:
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) upload "*" -r=conan_build --confirm
|
||||||
|
|
||||||
|
conan-profile-detect: conan-get
|
||||||
|
cmake -P $(CMAKE_DIR)/ConanProfileSetup.cmake
|
||||||
|
|
||||||
|
docs-dev: configure
|
||||||
|
@echo "Building Documentation"
|
||||||
|
cmake --build build/release --target=serve_docs --config=Release
|
||||||
|
|
||||||
|
$(SDK_TARGETS):
|
||||||
|
@# This is a proxy target. Handled by the 'sdk' rule.
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@cmake -P $(CMAKE_DIR)/CleanBuild.cmake
|
||||||
|
|
||||||
|
clean-build: clean
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ src contrib tests/gtest
|
ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ src contrib tests/gtest
|
||||||
|
|
||||||
.PHONY: all release debug static static-release gui gui-release gui-static gui-release-static gui-debug test test-release test-debug clean tags
|
.PHONY: all release upload-conan-cache docs docs-dev configure static static-release test test-release test-debug clean tags conan-profile-detect conan-get $(PROFILES) sdk $(SDK_TARGETS)
|
||||||
|
|
|
||||||
242
README.md
242
README.md
|
|
@ -1,186 +1,120 @@
|
||||||
[](https://scan.coverity.com/projects/zanoproject)
|
# Lethean Network—Ethics, Encoded.
|
||||||
[](https://discord.gg/wE3rmYY)
|
|
||||||
|
|
||||||
## Cloning
|
> We are building upto a mainnet launch in 2026, documentation written as if mainnet is live.
|
||||||
|
|
||||||
Be sure to clone the repository properly:\
|
A buildkit for deploying confidential information networks and commerce systems with immutable auditability.
|
||||||
`$ git clone --recursive https://github.com/hyle-team/zano.git`
|
|
||||||
|
|
||||||
# Building
|
Free for commercial, private, and patent use, self-host or join the community-run network that guarantees participant sovereignty by design.
|
||||||
--------
|
|
||||||
|
|
||||||
|
|
||||||
|
[](https://discord.gg/pfgT2Kz)
|
||||||
|
|
||||||
|
Web2 Website: https://lt.hn/
|
||||||
|
|
||||||
|
Web3 Network Gateway [HNS](https://handshake.org): [https://lthn](https://www.namebase.io/domains/lthn)
|
||||||
|
<br/>_(our chain aliases will come with a working Web2(`*.lt.hn`)+Web3(`*.lthn`) domain name)_
|
||||||
|
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
| component / version | minimum <br>(not recommended but may work) | recommended | most recent of what we have ever tested |
|
| component / version | minimum <br>(not recommended but may work) | recommended | most recent of what we have ever tested |
|
||||||
|--|--|--|--|
|
|-----------------------------------------------------------------------------|--------------------------------------------|----------------|-----------------------------------------|
|
||||||
| gcc (Linux) | 8.4.0 | 9.4.0 | 12.3.0 |
|
| gcc (Linux) | 8.4.0 | 9.4.0 | 12.3.0 |
|
||||||
| llvm/clang (Linux) | UNKNOWN | 7.0.1 | 8.0.0 |
|
| llvm/clang (Linux) | UNKNOWN | 7.0.1 | 8.0.0 |
|
||||||
| [MSVC](https://visualstudio.microsoft.com/downloads/) (Windows) | 2017 (15.9.30) | 2022 (17.11.5) | 2022 (17.12.3) |
|
| [MSVC](https://visualstudio.microsoft.com/downloads/) (Windows) | 2017 (15.9.30) | 2022 (17.11.5) | 2022 (17.12.3) |
|
||||||
| [XCode](https://developer.apple.com/downloads/) (macOS) | 12.3 | 14.3 | 15.2 |
|
| [XCode](https://developer.apple.com/downloads/) (macOS) | 12.3 | 14.3 | 15.2 |
|
||||||
| [CMake](https://cmake.org/download/) | 3.26.3 | 3.26.3 | 3.31.6 |
|
| [CMake](https://cmake.org/download/) | 3.26.3 | 3.26.3 | 3.31.6 |
|
||||||
| [Boost](https://www.boost.org/users/download/) | 1.75 | 1.84 | 1.84 |
|
|
||||||
| [OpenSSL](https://www.openssl.org/source/) [(win)](https://slproweb.com/products/Win32OpenSSL.html) | 1.1.1n | 1.1.1w | 3.4 |
|
|
||||||
| [Qt](https://download.qt.io/archive/qt/) (*only for GUI*) | 5.8.0 | 5.15.2 | 5.15.2 |
|
|
||||||
|
|
||||||
Note:\
|
## Cloning
|
||||||
[*server version*] denotes steps required for building command-line tools (daemon, simplewallet, etc.).\
|
|
||||||
[*GUI version*] denotes steps required for building Zano executable with GUI.
|
|
||||||
|
|
||||||
<br />
|
Be sure to clone the repository properly, with `--recursive` flag, or you'll get angry:<br/>
|
||||||
|
`git clone --recursive https://github.com/letheanVPN/blockchain.git`
|
||||||
|
|
||||||
### Linux
|
# Building
|
||||||
|
|
||||||
Recommended OS versions: Ubuntu 20.04, 22.04 LTS.
|
The project uses a `Makefile` that provides a simple and powerful interface for building.
|
||||||
|
It automatically handles dependency installation with Conan and compilation with CMake.
|
||||||
|
|
||||||
1. Prerequisites
|
You need CMake and Make installed on your system, other than that you don't need to worry about Python, Conan, Boost, OpenSSL, or any other dependencies.
|
||||||
|
|
||||||
[*server version*]
|
The final packages are created as they are due to a historical distribution method used in china: USB Stick, CD, DVD, etc.
|
||||||
|
|
||||||
sudo apt-get install -y build-essential g++ curl autotools-dev libicu-dev libbz2-dev cmake git screen checkinstall zlib1g-dev libssl-dev bzip2
|
|
||||||
|
|
||||||
[*GUI version*]
|
|
||||||
|
|
||||||
sudo apt-get install -y build-essential g++ python-dev autotools-dev libicu-dev libbz2-dev cmake git screen checkinstall zlib1g-dev libssl-dev bzip2 mesa-common-dev libglu1-mesa-dev
|
We use CPack, so our packages are self-contained, have searchable HTML documentation, and are ready to be installed on any system.
|
||||||
|
|
||||||
Make sure you have correct versions installed (see 'Dependencies' section above):
|
To skip the packing step, use `make build` as defined in the section below for Advanced Build Customization
|
||||||
|
|
||||||
cmake --version && gcc --version
|
## Simple Workflow Builds (Recommended)
|
||||||
|
|
||||||
|
|
||||||
3. Clone Zano into a local folder\
|
For most use cases, these two commands are all you need. They handle the entire build process from start to finish.
|
||||||
(If for some reason you need to use alternative Zano branch, change 'master' to the required branch name.)
|
|
||||||
|
|
||||||
git clone --recursive https://github.com/hyle-team/zano.git -b master
|
|
||||||
|
|
||||||
In the following steps we assume that you cloned Zano into '~/zano' folder in your home directory.
|
* **Build for Mainnet:**
|
||||||
|
```shell
|
||||||
|
make mainnet
|
||||||
|
```
|
||||||
|
|
||||||
4. Download and build Boost\
|
* **Build for Testnet:**
|
||||||
(Assuming you have cloned Zano into the 'zano' folder. If you used a different location for Zano, **edit line 4** accordingly.)
|
```shell
|
||||||
|
make testnet
|
||||||
|
```
|
||||||
|
|
||||||
curl -OL https://archives.boost.io/release/1.84.0/source/boost_1_84_0.tar.bz2
|
## Creating Release Packages
|
||||||
echo "cc4b893acf645c9d4b698e9a0f08ca8846aa5d6c68275c14c3e7949c24109454 boost_1_84_0.tar.bz2" | shasum -c && tar -xjf boost_1_84_0.tar.bz2
|
|
||||||
rm boost_1_84_0.tar.bz2 && cd boost_1_84_0
|
|
||||||
./bootstrap.sh --with-libraries=system,filesystem,thread,date_time,chrono,regex,serialization,atomic,program_options,locale,timer,log
|
|
||||||
./b2 && cd ..
|
|
||||||
Make sure that you see "The Boost C++ Libraries were successfully built!" message at the end.
|
|
||||||
|
|
||||||
5. Install Qt\
|
To create distributable packages (e.g., `.zip`, `.msi`, `.pkg`, `.deb`), run the `release` target. This will build the project, build the documentation, and then package everything.
|
||||||
(*GUI version only, skip this step if you're building server version*)
|
|
||||||
|
|
||||||
[*GUI version*]
|
```shell
|
||||||
|
make release TESTNET=1
|
||||||
|
```
|
||||||
|
The final packages will be located in the `build/packages/` directory
|
||||||
|
|
||||||
curl -OL https://download.qt.io/new_archive/qt/5.11/5.11.2/qt-opensource-linux-x64-5.11.2.run
|
## Advanced Build Customization (Makefile Variables)
|
||||||
chmod +x qt-opensource-linux-x64-5.11.2.run
|
|
||||||
./qt-opensource-linux-x64-5.11.2.run
|
|
||||||
Then follow the instructions in Wizard. Don't forget to tick the WebEngine module checkbox!
|
|
||||||
|
|
||||||
|
For advanced use cases, you can override variables in the `Makefile` to customize the build process.
|
||||||
|
|
||||||
6. Install OpenSSL
|
* **Build a `testnet` version:**
|
||||||
|
```shell
|
||||||
|
make build TESTNET=1
|
||||||
|
```
|
||||||
|
* **Build a statically-linked version:**
|
||||||
|
```shell
|
||||||
|
make build STATIC=1
|
||||||
|
```
|
||||||
|
* **Build a Debug build with 8 compile threads:**
|
||||||
|
```shell
|
||||||
|
make build BUILD_TYPE=Debug CPU_CORES=8
|
||||||
|
```
|
||||||
|
* **Use custom CMakePresets:**
|
||||||
|
```shell
|
||||||
|
make build PRESET_CONFIGURE=my-config-preset PRESET_BUILD=my-build-preset
|
||||||
|
```
|
||||||
|
|
||||||
We recommend installing OpenSSL v1.1.1w locally unless you would like to use the same version system-wide.\
|
| Variable | Description | Default Value |
|
||||||
(Assuming that `$HOME` environment variable is set to your home directory. Otherwise, edit line 4 accordingly.)
|
|--------------------|------------------------------------------------------------------------|-------------------------|
|
||||||
|
| `BUILD_TYPE` | Sets the build configuration (e.g., `Release`, `Debug`). | `Release` |
|
||||||
|
| `TESTNET` | Set to `1` to build for the test network. | `0` |
|
||||||
|
| `STATIC` | Set to `1` to link libraries statically. | `0` |
|
||||||
|
| `CPU_CORES` | Number of CPU cores to use for parallel compilation. | Auto-detected |
|
||||||
|
| `BUILD_VERSION` | The version string to embed in the binaries. | `6.0.1` |
|
||||||
|
| `BUILD_FOLDER` | The output directory for the build. | `build/release` |
|
||||||
|
| `PRESET_CONFIGURE` | The CMake preset to use for the `configure` step. | `conan-release` |
|
||||||
|
| `PRESET_BUILD` | The CMake preset to use for the `build` step. | `conan-release` |
|
||||||
|
| `CONAN_CACHE` | The path for the local Conan cache, where the dependencies are stored. | `./build/sdk` |
|
||||||
|
| `CONAN_EXECUTABLE` | The path to the usable Conan executable. | `./build/bin/conan` |
|
||||||
|
| `CONAN_URL` | The URL for the Conan remote repository. | `artifacts.host.uk.com` |
|
||||||
|
| `CONAN_USER` | The username for the Conan remote. | `public` |
|
||||||
|
| `CONAN_PASSWORD` | The password for the Conan remote. | |
|
||||||
|
|
||||||
curl -OL https://www.openssl.org/source/openssl-1.1.1w.tar.gz
|
## Cleaning the Build Directory
|
||||||
echo "cf3098950cb4d853ad95c0841f1f9c6d3dc102dccfcacd521d93925208b76ac8 openssl-1.1.1w.tar.gz" | shasum -c && tar xaf openssl-1.1.1w.tar.gz
|
|
||||||
cd openssl-1.1.1w/
|
|
||||||
./config --prefix=$HOME/openssl --openssldir=$HOME/openssl shared zlib
|
|
||||||
make && make test && make install && cd ..
|
|
||||||
|
|
||||||
|
ALWAYS USE `make clean` to clean the build directory, manually deleting the `build/release`, `build/SOME_FOLDER` will cause you issues.
|
||||||
|
|
||||||
7. [*OPTIONAL*] Set global environment variables for convenient use\
|
Our `make clean` triggers a cmake script that completely resets the build directory & dynamically added CMakePresets to its cached warm-up state,
|
||||||
For instance, by adding the following lines to `~/.bashrc`
|
the selective clean script can be edited here: `cmake/CleanBuild.cmake` or directly run from the repo root `cmake -P cmake/CleanBuild.cmake`
|
||||||
|
|
||||||
[*server version*]
|
You can NUKE the build directory with `make clean-build` which is `rm -rf build`.
|
||||||
|
|
||||||
export BOOST_ROOT=/home/user/boost_1_84_0
|
If you do manually delete build folders and get CMake errors (if you have compiled anything previously, you will),
|
||||||
export OPENSSL_ROOT_DIR=/home/user/openssl
|
the ConanPresets.json file has entries in the `include` property, delete them all and try again.
|
||||||
|
|
||||||
|
This happens because CMakePresets.json includes ConanPresets.json, that has the list of toolchains to use that gets populated during the CMake config step,
|
||||||
[*GUI version*]
|
when you manually delete a folder, the toolchain is now a broken path, and CMake throws a fatal error.
|
||||||
|
|
||||||
export BOOST_ROOT=/home/user/boost_1_84_0
|
|
||||||
export OPENSSL_ROOT_DIR=/home/user/openssl
|
|
||||||
export QT_PREFIX_PATH=/home/user/Qt5.11.2/5.11.2/gcc_64
|
|
||||||
|
|
||||||
**NOTICE: Please edit the lines above according to your actual paths.**
|
|
||||||
|
|
||||||
**NOTICE 2:** Make sure you've restarted your terminal session (by reopening the terminal window or reconnecting the server) to apply these changes.
|
|
||||||
|
|
||||||
8. Build the binaries
|
|
||||||
1. If you skipped step 6 and did not set the environment variables:
|
|
||||||
|
|
||||||
cd zano && mkdir build && cd build
|
|
||||||
BOOST_ROOT=$HOME/boost_1_84_0 OPENSSL_ROOT_DIR=$HOME/openssl cmake ..
|
|
||||||
make -j1 daemon simplewallet
|
|
||||||
|
|
||||||
2. If you set the variables in step 6:
|
|
||||||
|
|
||||||
cd zano && mkdir build && cd build
|
|
||||||
cmake ..
|
|
||||||
make -j1 daemon simplewallet
|
|
||||||
|
|
||||||
or simply:
|
|
||||||
|
|
||||||
cd zano && make -j1
|
|
||||||
|
|
||||||
**NOTICE**: If you are building on a machine with a relatively high amount of RAM or with the proper setting of virtual memory, then you can use `-j2` or `-j` option to speed up the building process. Use with caution.
|
|
||||||
|
|
||||||
**NOTICE 2**: If you'd like to build binaries for the testnet, use `cmake -D TESTNET=TRUE ..` instead of `cmake ..` .
|
|
||||||
|
|
||||||
1. Build GUI:
|
|
||||||
|
|
||||||
cd zano
|
|
||||||
utils/build_script_linux.sh
|
|
||||||
|
|
||||||
Look for the binaries in `build` folder
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
Recommended OS version: Windows 7 x64, Windows 11 x64.
|
|
||||||
1. Install required prerequisites (Boost, Qt, CMake, OpenSSL).
|
|
||||||
2. Edit paths in `utils/configure_local_paths.cmd`.
|
|
||||||
3. Run one of `utils/configure_win64_msvsNNNN_gui.cmd` according to your MSVC version.
|
|
||||||
4. Go to the build folder and open generated Zano.sln in MSVC.
|
|
||||||
5. Build.
|
|
||||||
|
|
||||||
In order to correctly deploy Qt GUI application, you also need to do the following:
|
|
||||||
|
|
||||||
6. Run `PATH_TO_QT\bin\windeployqt.exe PATH_TO_PROJECT_ROOT\build\src\Debug\Zano.exe` (choose the Debug or Release folder depending on the configuration you built).
|
|
||||||
7. You can now run the application using one of the following options:
|
|
||||||
* Start the program from Visual Studio
|
|
||||||
* Run `Zano.exe --html-path=PATH_TO_HTML`, where PATH_TO_HTML is by default located at PATH_TO_PROJECT_ROOT\src\gui\qt-daemon\layout\html
|
|
||||||
* Copy the contents of PATH_TO_PROJECT_ROOT\src\gui\qt-daemon\layout\html to a folder named "html" located in the same directory as the Zano.exe binary.
|
|
||||||
<br />
|
|
||||||
|
|
||||||
### macOS
|
|
||||||
Recommended OS version: macOS Big Sur 11.4 x64.
|
|
||||||
1. Install required prerequisites.
|
|
||||||
2. Set environment variables as stated in `utils/macosx_build_config.command`.
|
|
||||||
3. `mkdir build` <br> `cd build` <br> `cmake ..` <br> `make`
|
|
||||||
|
|
||||||
To build GUI application:
|
|
||||||
|
|
||||||
1. Create self-signing certificate via Keychain Access:\
|
|
||||||
a. Run Keychain Access.\
|
|
||||||
b. Choose Keychain Access > Certificate Assistant > Create a Certificate.\
|
|
||||||
c. Use “Zano” (without quotes) as certificate name.\
|
|
||||||
d. Choose “Code Signing” in “Certificate Type” field.\
|
|
||||||
e. Press “Create”, then “Done”.\
|
|
||||||
f. Make sure the certificate was added to keychain "System". If not—move it to "System".\
|
|
||||||
g. Double click the certificate you've just added, enter the trust section and under "When using this certificate" select "Always trust".\
|
|
||||||
h. Unfold the certificate in Keychain Access window and double click the underlying private key "Zano". Select "Access Control" tab, then select "Allow all applications to access this item". Click "Save Changes".
|
|
||||||
2. Revise building script, comment out unwanted steps and run it: `utils/build_script_mac_osx.sh`
|
|
||||||
3. The application should be here: `/buid_mac_osx_64/release/src`
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
|
|
||||||
## Supporting project/donations
|
|
||||||
|
|
||||||
ZANO @dev<br />
|
|
||||||
BTC bc1qpa8w8eaehlplfepmnzpd7v9j046899nktxnkxp<br />
|
|
||||||
BCH qqgq078vww5exd9kt3frx6krdyznmp80hcygzlgqzd<br />
|
|
||||||
ETH 0x206c52b78141498e74FF074301ea90888C40c178<br />
|
|
||||||
XMR 45gp9WTobeB5Km3kLQgVmPJkvm9rSmg4gdyHheXqXijXYMjUY48kLgL7QEz5Ar8z9vQioQ68WYDKsQsjAEonSeFX4UeLSiX<br />
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,4 @@
|
||||||
static_assert(1, "FAIL");
|
static_assert(1, "FAIL");
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
70
conanfile.py
Normal file
70
conanfile.py
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
from conan import ConanFile
|
||||||
|
from conan.tools.cmake import CMakeDeps, CMakeToolchain, CMake
|
||||||
|
|
||||||
|
|
||||||
|
class BlockchainConan(ConanFile):
|
||||||
|
name = "blockchain"
|
||||||
|
version = "6.0.1"
|
||||||
|
settings = "os", "compiler", "build_type", "arch"
|
||||||
|
|
||||||
|
options = {
|
||||||
|
"static": [True, False],
|
||||||
|
"testnet": [True, False],
|
||||||
|
"ci": [True, False]
|
||||||
|
}
|
||||||
|
default_options = {
|
||||||
|
"static": False,
|
||||||
|
"testnet": False,
|
||||||
|
"ci": False,
|
||||||
|
"boost/*:without_test": True
|
||||||
|
}
|
||||||
|
|
||||||
|
tool_requires = [
|
||||||
|
"cmake/3.31.9"
|
||||||
|
]
|
||||||
|
|
||||||
|
requires = [
|
||||||
|
"zlib/1.3.1",
|
||||||
|
"boost/1.85.0",
|
||||||
|
"openssl/3.2.0",
|
||||||
|
"miniupnpc/2.2.5",
|
||||||
|
"jwt-cpp/0.7.1",
|
||||||
|
"oatpp/1.3.0.latest",
|
||||||
|
"oatpp-swagger/1.3.0.latest"
|
||||||
|
]
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
tc = CMakeToolchain(self)
|
||||||
|
|
||||||
|
os_val = str(self.settings.os).lower()
|
||||||
|
# arch_val = str(self.settings.arch).lower()
|
||||||
|
# compiler_val = str(self.settings.compiler).lower()
|
||||||
|
# tc.presets_prefix = f"{os_val}"
|
||||||
|
|
||||||
|
tc.user_presets_path = "ConanPresets.json"
|
||||||
|
tc.variables["STATIC"] = self.options.static
|
||||||
|
tc.variables["TESTNET"] = self.options.testnet
|
||||||
|
# tc.preprocessor_definitions["TESTNET"] = None
|
||||||
|
# tc.variables["BUILD_VERSION"] = self.options.build_version
|
||||||
|
tc.generate()
|
||||||
|
|
||||||
|
deps = CMakeDeps(self)
|
||||||
|
deps.generate()
|
||||||
|
|
||||||
|
def layout(self):
|
||||||
|
if self.settings.compiler == "msvc":
|
||||||
|
# For multi-config, all configurations go into the same "build" folder.
|
||||||
|
self.folders.build = "build/release"
|
||||||
|
self.folders.generators = "build/release/generators"
|
||||||
|
else:
|
||||||
|
# For single-config, we create a subfolder for each build type.
|
||||||
|
build_type_str = str(self.settings.build_type).lower()
|
||||||
|
self.folders.build = os.path.join("build", build_type_str)
|
||||||
|
self.folders.generators = os.path.join(self.folders.build, "generators")
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.configure()
|
||||||
|
cmake.build()
|
||||||
|
|
@ -1,12 +1,7 @@
|
||||||
set(UPNPC_BUILD_STATIC ON CACHE BOOL "Build static library")
|
|
||||||
set(UPNPC_BUILD_SHARED OFF CACHE BOOL "Build shared library")
|
|
||||||
set(UPNPC_BUILD_TESTS OFF CACHE BOOL "Build test executables")
|
|
||||||
|
|
||||||
set(ZLIB_BUILD_EXAMPLES OFF CACHE INTERNAL "" FORCE)
|
|
||||||
add_subdirectory(zlib)
|
|
||||||
|
|
||||||
add_subdirectory(db)
|
add_subdirectory(db)
|
||||||
add_subdirectory(ethereum)
|
add_subdirectory(ethereum)
|
||||||
|
add_subdirectory(randomx)
|
||||||
|
|
||||||
if(USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
if(USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
||||||
option(SECP256K1_BUILD_BENCHMARK "Build benchmarks." OFF)
|
option(SECP256K1_BUILD_BENCHMARK "Build benchmarks." OFF)
|
||||||
|
|
@ -25,41 +20,14 @@ if(USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
||||||
set_property(TARGET secp256k1_precomputed PROPERTY FOLDER "contrib")
|
set_property(TARGET secp256k1_precomputed PROPERTY FOLDER "contrib")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if( NOT DISABLE_TOR)
|
|
||||||
add_subdirectory(tor-connect)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
message("excluded upnp support for IOS build")
|
message("excluded upnp support for IOS build")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(miniupnp/miniupnpc)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
set_property(TARGET libminiupnpc-static PROPERTY FOLDER "contrib")
|
|
||||||
set_property(TARGET zlib PROPERTY FOLDER "contrib")
|
|
||||||
set_property(TARGET zlibstatic PROPERTY FOLDER "contrib")
|
|
||||||
set_property(TARGET mdbx PROPERTY FOLDER "contrib")
|
set_property(TARGET mdbx PROPERTY FOLDER "contrib")
|
||||||
set_property(TARGET lmdb PROPERTY FOLDER "contrib")
|
set_property(TARGET lmdb PROPERTY FOLDER "contrib")
|
||||||
|
|
||||||
if( NOT DISABLE_TOR)
|
|
||||||
set_property(TARGET tor-connect PROPERTY FOLDER "contrib")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_property(TARGET upnpc-static mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat PROPERTY FOLDER "unused")
|
set_property(TARGET mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat PROPERTY FOLDER "unused")
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
#set_property(TARGET ntdll_extra_target PROPERTY FOLDER "unused")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
set_property(TARGET upnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " /wd4244 /wd4267")
|
|
||||||
set_property(TARGET zlibstatic APPEND_STRING PROPERTY COMPILE_FLAGS " /wd4267 /wd4267")
|
|
||||||
else()
|
|
||||||
set_property(TARGET upnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-unused-result -Wno-unused-value -Wno-implicit-fallthrough -Wno-discarded-qualifiers ")
|
|
||||||
set_property(TARGET zlibstatic APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-unused-result -Wno-unused-value -Wno-implicit-fallthrough -Wno-discarded-qualifiers ")
|
|
||||||
endif()
|
|
||||||
|
|
|
||||||
|
|
@ -126,9 +126,9 @@ if(UNIX AND NOT APPLE)
|
||||||
target_link_libraries(${TARGET}_SHARED rt)
|
target_link_libraries(${TARGET}_SHARED rt)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
install(TARGETS ${TARGET}_STATIC DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx)
|
#install(TARGETS ${TARGET}_STATIC DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx)
|
||||||
install(TARGETS ${TARGET}_SHARED DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx)
|
#install(TARGETS ${TARGET}_SHARED DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx)
|
||||||
install(FILES mdbx.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include COMPONENT mdbx-devel)
|
#install(FILES mdbx.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include COMPONENT mdbx-devel)
|
||||||
|
|
||||||
add_subdirectory(src/tools)
|
add_subdirectory(src/tools)
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
|
|
|
||||||
|
|
@ -61,12 +61,12 @@ if(CC_HAS_VISIBILITY)
|
||||||
target_compile_options(mdbx PRIVATE "-fvisibility=hidden")
|
target_compile_options(mdbx PRIVATE "-fvisibility=hidden")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
install(TARGETS mdbx
|
#install(TARGETS mdbx
|
||||||
LIBRARY DESTINATION lib COMPONENT runtime
|
# LIBRARY DESTINATION lib COMPONENT runtime
|
||||||
RUNTIME DESTINATION bin COMPONENT runtime
|
# RUNTIME DESTINATION bin COMPONENT runtime
|
||||||
ARCHIVE DESTINATION lib/static COMPONENT devel
|
# ARCHIVE DESTINATION lib/static COMPONENT devel
|
||||||
PUBLIC_HEADER DESTINATION include
|
# PUBLIC_HEADER DESTINATION include
|
||||||
INCLUDES DESTINATION include COMPONENT devel)
|
# INCLUDES DESTINATION include COMPONENT devel)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ foreach(TOOL ${MDBX_TOOLS})
|
||||||
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON
|
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON
|
||||||
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
|
||||||
|
|
||||||
install(TARGETS ${TOOL} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT mdbx)
|
# install(TARGETS ${TOOL} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT mdbx)
|
||||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../man1/${TOOL}.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1 COMPONENT mdbx)
|
# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../man1/${TOOL}.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1 COMPONENT mdbx)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(LIB_MATH)
|
if(LIB_MATH)
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
#define _GZIP_ENCODING_H_
|
#define _GZIP_ENCODING_H_
|
||||||
#include "boost/core/ignore_unused.hpp"
|
#include "boost/core/ignore_unused.hpp"
|
||||||
#include "net/http_client_base.h"
|
#include "net/http_client_base.h"
|
||||||
#include "zlib/zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
|
|
||||||
namespace epee
|
namespace epee
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <iomanip>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <boost/uuid/uuid.hpp>
|
#include <boost/uuid/uuid.hpp>
|
||||||
#include <boost/uuid/uuid_io.hpp>
|
#include <boost/uuid/uuid_io.hpp>
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "zlib/zlib.h"
|
#include "zlib.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace epee
|
namespace epee
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit bd836936f7ed7e697f36dff709d00a907644172a
|
|
||||||
1
contrib/randomx
Submodule
1
contrib/randomx
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit cf15f4023ec8ddaa842f49111ba80ead1b5937f1
|
||||||
|
|
@ -1,218 +0,0 @@
|
||||||
cmake_minimum_required(VERSION 2.4.4...3.15.0)
|
|
||||||
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
|
|
||||||
|
|
||||||
project(zlib C)
|
|
||||||
|
|
||||||
set(VERSION "1.3.1")
|
|
||||||
|
|
||||||
option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" ON)
|
|
||||||
|
|
||||||
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")
|
|
||||||
|
|
||||||
include(CheckTypeSize)
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
include(CheckCSourceCompiles)
|
|
||||||
enable_testing()
|
|
||||||
|
|
||||||
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)
|
|
||||||
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)
|
|
||||||
if(NOT HAVE_FSEEKO)
|
|
||||||
add_definitions(-DNO_FSEEKO)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check for unistd.h
|
|
||||||
#
|
|
||||||
check_include_file(unistd.h Z_HAVE_UNISTD_H)
|
|
||||||
|
|
||||||
if(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()
|
|
||||||
|
|
||||||
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()
|
|
||||||
|
|
||||||
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
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/zconf.h
|
|
||||||
zlib.h
|
|
||||||
)
|
|
||||||
set(ZLIB_PRIVATE_HDRS
|
|
||||||
crc32.h
|
|
||||||
deflate.h
|
|
||||||
gzguts.h
|
|
||||||
inffast.h
|
|
||||||
inffixed.h
|
|
||||||
inflate.h
|
|
||||||
inftrees.h
|
|
||||||
trees.h
|
|
||||||
zutil.h
|
|
||||||
)
|
|
||||||
set(ZLIB_SRCS
|
|
||||||
adler32.c
|
|
||||||
compress.c
|
|
||||||
crc32.c
|
|
||||||
deflate.c
|
|
||||||
gzclose.c
|
|
||||||
gzlib.c
|
|
||||||
gzread.c
|
|
||||||
gzwrite.c
|
|
||||||
inflate.c
|
|
||||||
infback.c
|
|
||||||
inftrees.c
|
|
||||||
inffast.c
|
|
||||||
trees.c
|
|
||||||
uncompr.c
|
|
||||||
zutil.c
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT MINGW)
|
|
||||||
set(ZLIB_DLL_SRCS
|
|
||||||
win32/zlib1.rc # If present will override custom build rule below.
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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(MINGW)
|
|
||||||
# This gets us DLL resource information when compiling on MinGW.
|
|
||||||
if(NOT CMAKE_RC_COMPILER)
|
|
||||||
set(CMAKE_RC_COMPILER windres.exe)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
|
|
||||||
target_include_directories(zlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
|
|
||||||
target_include_directories(zlibstatic PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
|
|
||||||
set_target_properties(zlib PROPERTIES SOVERSION 1)
|
|
||||||
|
|
||||||
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()
|
|
||||||
|
|
||||||
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 AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX))
|
|
||||||
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()
|
|
||||||
|
|
||||||
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()
|
|
||||||
|
|
||||||
#============================================================================
|
|
||||||
# Example binaries
|
|
||||||
#============================================================================
|
|
||||||
if(ZLIB_BUILD_EXAMPLES)
|
|
||||||
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()
|
|
||||||
endif()
|
|
||||||
File diff suppressed because it is too large
Load diff
367
contrib/zlib/FAQ
367
contrib/zlib/FAQ
|
|
@ -1,367 +0,0 @@
|
||||||
|
|
||||||
Frequently Asked Questions about zlib
|
|
||||||
|
|
||||||
|
|
||||||
If your question is not there, please check the zlib home page
|
|
||||||
http://zlib.net/ which may have more recent information.
|
|
||||||
The latest zlib FAQ is at http://zlib.net/zlib_faq.html
|
|
||||||
|
|
||||||
|
|
||||||
1. Is zlib Y2K-compliant?
|
|
||||||
|
|
||||||
Yes. zlib doesn't handle dates.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
3. Where can I get a Visual Basic interface to zlib?
|
|
||||||
|
|
||||||
See
|
|
||||||
* http://marknelson.us/1997/01/01/zlib-engine/
|
|
||||||
* win32/DLL_FAQ.txt in the zlib distribution
|
|
||||||
|
|
||||||
4. compress() returns Z_BUF_ERROR.
|
|
||||||
|
|
||||||
Make sure that before the call of compress(), the length of the compressed
|
|
||||||
buffer is equal to the available size of the compressed buffer and not
|
|
||||||
zero. For Visual Basic, check that this parameter is passed by reference
|
|
||||||
("as any"), not by value ("as long").
|
|
||||||
|
|
||||||
5. deflate() or inflate() returns Z_BUF_ERROR.
|
|
||||||
|
|
||||||
Before making the call, make sure that avail_in and avail_out are not zero.
|
|
||||||
When setting the parameter flush equal to Z_FINISH, also make sure that
|
|
||||||
avail_out is big enough to allow processing all pending input. Note that a
|
|
||||||
Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
|
|
||||||
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 http://zlib.net/zlib_how.html for a
|
|
||||||
heavily annotated example.
|
|
||||||
|
|
||||||
6. Where's the zlib documentation (man pages, etc.)?
|
|
||||||
|
|
||||||
It's in zlib.h . Examples of zlib usage are in the files test/example.c
|
|
||||||
and test/minigzip.c, with more in examples/ .
|
|
||||||
|
|
||||||
7. Why don't you use GNU autoconf or libtool or ...?
|
|
||||||
|
|
||||||
Because we would like to keep zlib as a very small and simple package.
|
|
||||||
zlib is rather portable and doesn't need much configuration.
|
|
||||||
|
|
||||||
8. I found a bug in zlib.
|
|
||||||
|
|
||||||
Most of the time, such problems are due to an incorrect usage of zlib.
|
|
||||||
Please try to reproduce the problem with a small program and send the
|
|
||||||
corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
|
|
||||||
data files without prior agreement.
|
|
||||||
|
|
||||||
9. Why do I get "undefined reference to gzputc"?
|
|
||||||
|
|
||||||
If "make test" produces something like
|
|
||||||
|
|
||||||
example.o(.text+0x154): undefined reference to `gzputc'
|
|
||||||
|
|
||||||
check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
|
|
||||||
/usr/X11R6/lib. Remove any old versions, then do "make install".
|
|
||||||
|
|
||||||
10. I need a Delphi interface to zlib.
|
|
||||||
|
|
||||||
See the contrib/delphi directory in the zlib distribution.
|
|
||||||
|
|
||||||
11. Can zlib handle .zip archives?
|
|
||||||
|
|
||||||
Not by itself, no. See the directory contrib/minizip in the zlib
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
12. Can zlib handle .Z files?
|
|
||||||
|
|
||||||
No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
|
|
||||||
the code of uncompress on your own.
|
|
||||||
|
|
||||||
13. How can I make a Unix shared library?
|
|
||||||
|
|
||||||
By default a shared (and a static) library is built for Unix. So:
|
|
||||||
|
|
||||||
make distclean
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
|
|
||||||
14. How do I install a shared zlib library on Unix?
|
|
||||||
|
|
||||||
After the above, then:
|
|
||||||
|
|
||||||
make install
|
|
||||||
|
|
||||||
However, many flavors of Unix come with a shared zlib already installed.
|
|
||||||
Before going to the trouble of compiling a shared version of zlib and
|
|
||||||
trying to install it, you may want to check if it's already there! If you
|
|
||||||
can #include <zlib.h>, it's there. The -lz option will probably link to
|
|
||||||
it. You can check the version at the top of zlib.h or with the
|
|
||||||
ZLIB_VERSION symbol defined in zlib.h .
|
|
||||||
|
|
||||||
15. I have a question about OttoPDF.
|
|
||||||
|
|
||||||
We are not the authors of OttoPDF. The real author is on the OttoPDF web
|
|
||||||
site: Joel Hainley, jhainley@myndkryme.com.
|
|
||||||
|
|
||||||
16. Can zlib decode Flate data in an Adobe PDF file?
|
|
||||||
|
|
||||||
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?
|
|
||||||
|
|
||||||
After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
|
|
||||||
generates an error such as:
|
|
||||||
|
|
||||||
ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
|
|
||||||
symbol __register_frame_info: referenced symbol not found
|
|
||||||
|
|
||||||
The symbol __register_frame_info is not part of zlib, it is generated by
|
|
||||||
the C compiler (cc or gcc). You must recompile applications using zlib
|
|
||||||
which have this problem. This problem is specific to Solaris. See
|
|
||||||
http://www.sunfreeware.com for Solaris versions of zlib and applications
|
|
||||||
using zlib.
|
|
||||||
|
|
||||||
18. Why does gzip give an error on a file I make with compress/deflate?
|
|
||||||
|
|
||||||
The compress and deflate functions produce data in the zlib format, which
|
|
||||||
is different and incompatible with the gzip format. The gz* functions in
|
|
||||||
zlib on the other hand use the gzip format. Both the zlib and gzip formats
|
|
||||||
use the same compressed data format internally, but have different headers
|
|
||||||
and trailers around the compressed data.
|
|
||||||
|
|
||||||
19. Ok, so why are there two different formats?
|
|
||||||
|
|
||||||
The gzip format was designed to retain the directory information about a
|
|
||||||
single file, such as the name and last modification date. The zlib format
|
|
||||||
on the other hand was designed for in-memory and communication channel
|
|
||||||
applications, and has a much more compact header and trailer and uses a
|
|
||||||
faster integrity check than gzip.
|
|
||||||
|
|
||||||
20. Well that's nice, but how do I make a gzip file in memory?
|
|
||||||
|
|
||||||
You can request that deflate write the gzip format instead of the zlib
|
|
||||||
format using deflateInit2(). You can also request that inflate decode the
|
|
||||||
gzip format using inflateInit2(). Read zlib.h for more details.
|
|
||||||
|
|
||||||
21. Is zlib thread-safe?
|
|
||||||
|
|
||||||
Yes. However any library routines that zlib uses and any application-
|
|
||||||
provided memory allocation routines must also be thread-safe. zlib's gz*
|
|
||||||
functions use stdio library routines, and most of zlib's functions use the
|
|
||||||
library memory allocation routines by default. zlib's *Init* functions
|
|
||||||
allow for the application to provide custom memory allocation routines.
|
|
||||||
|
|
||||||
Of course, you should only operate on any given zlib or gzip stream from a
|
|
||||||
single thread at a time.
|
|
||||||
|
|
||||||
22. Can I use zlib in my commercial application?
|
|
||||||
|
|
||||||
Yes. Please read the license in zlib.h.
|
|
||||||
|
|
||||||
23. Is zlib under the GNU license?
|
|
||||||
|
|
||||||
No. Please read the license in zlib.h.
|
|
||||||
|
|
||||||
24. The license says that altered source versions must be "plainly marked". So
|
|
||||||
what exactly do I need to do to meet that requirement?
|
|
||||||
|
|
||||||
You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
|
|
||||||
particular, the final version number needs to be changed to "f", and an
|
|
||||||
identification string should be appended to ZLIB_VERSION. Version numbers
|
|
||||||
x.x.x.f are reserved for modifications to zlib by others than the zlib
|
|
||||||
maintainers. For example, if the version of the base zlib you are altering
|
|
||||||
is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
|
|
||||||
ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
|
|
||||||
update the version strings in deflate.c and inftrees.c.
|
|
||||||
|
|
||||||
For altered source distributions, you should also note the origin and
|
|
||||||
nature of the changes in zlib.h, as well as in ChangeLog and README, along
|
|
||||||
with the dates of the alterations. The origin should include at least your
|
|
||||||
name (or your company's name), and an email address to contact for help or
|
|
||||||
issues with the library.
|
|
||||||
|
|
||||||
Note that distributing a compiled zlib library along with zlib.h and
|
|
||||||
zconf.h is also a source distribution, and so you should change
|
|
||||||
ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
|
|
||||||
in zlib.h as you would for a full source distribution.
|
|
||||||
|
|
||||||
25. Will zlib work on a big-endian or little-endian architecture, and can I
|
|
||||||
exchange compressed data between them?
|
|
||||||
|
|
||||||
Yes and yes.
|
|
||||||
|
|
||||||
26. Will zlib work on a 64-bit machine?
|
|
||||||
|
|
||||||
Yes. It has been tested on 64-bit machines, and has no dependence on any
|
|
||||||
data types being limited to 32-bits in length. If you have any
|
|
||||||
difficulties, please provide a complete problem report to zlib@gzip.org
|
|
||||||
|
|
||||||
27. Will zlib decompress data from the PKWare Data Compression Library?
|
|
||||||
|
|
||||||
No. The PKWare DCL uses a completely different compressed data format than
|
|
||||||
does PKZIP and zlib. However, you can look in zlib's contrib/blast
|
|
||||||
directory for a possible solution to your problem.
|
|
||||||
|
|
||||||
28. Can I access data randomly in a compressed stream?
|
|
||||||
|
|
||||||
No, not without some preparation. If when compressing you periodically use
|
|
||||||
Z_FULL_FLUSH, carefully write all the pending data at those points, and
|
|
||||||
keep an index of those locations, then you can start decompression at those
|
|
||||||
points. You have to be careful to not use Z_FULL_FLUSH too often, since it
|
|
||||||
can significantly degrade compression. Alternatively, you can scan a
|
|
||||||
deflate stream once to generate an index, and then use that index for
|
|
||||||
random access. See examples/zran.c .
|
|
||||||
|
|
||||||
29. Does zlib work on MVS, OS/390, CICS, etc.?
|
|
||||||
|
|
||||||
It has in the past, but we have not heard of any recent evidence. There
|
|
||||||
were working ports of zlib 1.1.4 to MVS, but those links no longer work.
|
|
||||||
If you know of recent, successful applications of zlib on these operating
|
|
||||||
systems, please let us know. Thanks.
|
|
||||||
|
|
||||||
30. Is there some simpler, easier to read version of inflate I can look at to
|
|
||||||
understand the deflate format?
|
|
||||||
|
|
||||||
First off, you should read RFC 1951. Second, yes. Look in zlib's
|
|
||||||
contrib/puff directory.
|
|
||||||
|
|
||||||
31. Does zlib infringe on any patents?
|
|
||||||
|
|
||||||
As far as we know, no. In fact, that was originally the whole point behind
|
|
||||||
zlib. Look here for some more information:
|
|
||||||
|
|
||||||
http://www.gzip.org/#faq11
|
|
||||||
|
|
||||||
32. Can zlib work with greater than 4 GB of data?
|
|
||||||
|
|
||||||
Yes. inflate() and deflate() will process any amount of data correctly.
|
|
||||||
Each call of inflate() or deflate() is limited to input and output chunks
|
|
||||||
of the maximum value that can be stored in the compiler's "unsigned int"
|
|
||||||
type, but there is no limit to the number of chunks. Note however that the
|
|
||||||
strm.total_in and strm_total_out counters may be limited to 4 GB. These
|
|
||||||
counters are provided as a convenience and are not used internally by
|
|
||||||
inflate() or deflate(). The application can easily set up its own counters
|
|
||||||
updated after each call of inflate() or deflate() to count beyond 4 GB.
|
|
||||||
compress() and uncompress() may be limited to 4 GB, since they operate in a
|
|
||||||
single call. gzseek() and gztell() may be limited to 4 GB depending on how
|
|
||||||
zlib is compiled. See the zlibCompileFlags() function in zlib.h.
|
|
||||||
|
|
||||||
The word "may" appears several times above since there is a 4 GB limit only
|
|
||||||
if the compiler's "long" type is 32 bits. If the compiler's "long" type is
|
|
||||||
64 bits, then the limit is 16 exabytes.
|
|
||||||
|
|
||||||
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(), 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 portable implementation here:
|
|
||||||
|
|
||||||
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
|
|
||||||
1.2.1 and 1.2.2 were subject to an access exception when decompressing
|
|
||||||
invalid compressed data.
|
|
||||||
|
|
||||||
34. Is there a Java version of zlib?
|
|
||||||
|
|
||||||
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: 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?
|
|
||||||
|
|
||||||
Many years ago, we gave up attempting to avoid warnings on every compiler
|
|
||||||
in the universe. It just got to be a waste of time, and some compilers
|
|
||||||
were downright silly as well as contradicted each other. So now, we simply
|
|
||||||
make sure that the code always works.
|
|
||||||
|
|
||||||
36. Valgrind (or some similar memory access checker) says that deflate is
|
|
||||||
performing a conditional jump that depends on an uninitialized value.
|
|
||||||
Isn't that a bug?
|
|
||||||
|
|
||||||
No. That is intentional for performance reasons, and the output of deflate
|
|
||||||
is not affected. This only started showing up recently since zlib 1.2.x
|
|
||||||
uses malloc() by default for allocations, whereas earlier versions used
|
|
||||||
calloc(), which zeros out the allocated memory. Even though the code was
|
|
||||||
correct, versions 1.2.4 and later was changed to not stimulate these
|
|
||||||
checkers.
|
|
||||||
|
|
||||||
37. Will zlib read the (insert any ancient or arcane format here) compressed
|
|
||||||
data format?
|
|
||||||
|
|
||||||
Probably not. Look in the comp.compression FAQ for pointers to various
|
|
||||||
formats and associated software.
|
|
||||||
|
|
||||||
38. How can I encrypt/decrypt zip files with zlib?
|
|
||||||
|
|
||||||
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, http://www.gnupg.org/ , which already includes zlib
|
|
||||||
compression. For PKZIP compatible "encryption", look at
|
|
||||||
http://www.info-zip.org/
|
|
||||||
|
|
||||||
39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
|
|
||||||
|
|
||||||
"gzip" is the gzip format, and "deflate" is the zlib format. They should
|
|
||||||
probably have called the second one "zlib" instead to avoid confusion with
|
|
||||||
the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
|
|
||||||
correctly points to the zlib specification in RFC 1950 for the "deflate"
|
|
||||||
transfer encoding, there have been reports of servers and browsers that
|
|
||||||
incorrectly produce or expect raw deflate data per the deflate
|
|
||||||
specification in RFC 1951, most notably Microsoft. So even though the
|
|
||||||
"deflate" transfer encoding using the zlib format would be the more
|
|
||||||
efficient approach (and in fact exactly what the zlib format was designed
|
|
||||||
for), using the "gzip" transfer encoding is probably more reliable due to
|
|
||||||
an unfortunate choice of name on the part of the HTTP 1.1 authors.
|
|
||||||
|
|
||||||
Bottom line: use the gzip format for HTTP 1.1 encoding.
|
|
||||||
|
|
||||||
40. Does zlib support the new "Deflate64" format introduced by PKWare?
|
|
||||||
|
|
||||||
No. PKWare has apparently decided to keep that format proprietary, since
|
|
||||||
they have not documented it as they have previous compression formats. In
|
|
||||||
any case, the compression improvements are so modest compared to other more
|
|
||||||
modern approaches, that it's not worth the effort to implement.
|
|
||||||
|
|
||||||
41. I'm having a problem with the zip functions in zlib, can you help?
|
|
||||||
|
|
||||||
There are no zip functions in zlib. You are probably using minizip by
|
|
||||||
Giles Vollant, which is found in the contrib directory of zlib. It is not
|
|
||||||
part of zlib. In fact none of the stuff in contrib is part of zlib. The
|
|
||||||
files in there are not supported by the zlib authors. You need to contact
|
|
||||||
the authors of the respective contribution for help.
|
|
||||||
|
|
||||||
42. The match.asm code in contrib is under the GNU General Public License.
|
|
||||||
Since it's part of zlib, doesn't that mean that all of zlib falls under the
|
|
||||||
GNU GPL?
|
|
||||||
|
|
||||||
No. The files in contrib are not part of zlib. They were contributed by
|
|
||||||
other authors and are provided as a convenience to the user within the zlib
|
|
||||||
distribution. Each item in contrib has its own license.
|
|
||||||
|
|
||||||
43. Is zlib subject to export controls? What is its ECCN?
|
|
||||||
|
|
||||||
zlib is not subject to export controls, and so is classified as EAR99.
|
|
||||||
|
|
||||||
44. Can you please sign these lengthy legal documents and fax them back to us
|
|
||||||
so that we can use your software in our product?
|
|
||||||
|
|
||||||
No. Go away. Shoo.
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
CMakeLists.txt cmake build file
|
|
||||||
ChangeLog history of changes
|
|
||||||
FAQ Frequently Asked Questions about zlib
|
|
||||||
INDEX this file
|
|
||||||
Makefile dummy Makefile that tells you to ./configure
|
|
||||||
Makefile.in template for Unix Makefile
|
|
||||||
README guess what
|
|
||||||
configure configure script for Unix
|
|
||||||
make_vms.com makefile for VMS
|
|
||||||
test/example.c zlib usages examples for build testing
|
|
||||||
test/minigzip.c minimal gzip-like functionality for build testing
|
|
||||||
test/infcover.c inf*.c code coverage for build coverage testing
|
|
||||||
treebuild.xml XML description of source file dependencies
|
|
||||||
zconf.h.cmakein zconf.h template for cmake
|
|
||||||
zconf.h.in zconf.h template for configure
|
|
||||||
zlib.3 Man page for zlib
|
|
||||||
zlib.3.pdf Man page in PDF format
|
|
||||||
zlib.map Linux symbol information
|
|
||||||
zlib.pc.in Template for pkg-config descriptor
|
|
||||||
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
|
|
||||||
qnx/ makefiles for QNX
|
|
||||||
watcom/ makefiles for OpenWatcom
|
|
||||||
win32/ makefiles for Windows
|
|
||||||
|
|
||||||
zlib public header files (required for library use):
|
|
||||||
zconf.h
|
|
||||||
zlib.h
|
|
||||||
|
|
||||||
private source files used to build the zlib library:
|
|
||||||
adler32.c
|
|
||||||
compress.c
|
|
||||||
crc32.c
|
|
||||||
crc32.h
|
|
||||||
deflate.c
|
|
||||||
deflate.h
|
|
||||||
gzclose.c
|
|
||||||
gzguts.h
|
|
||||||
gzlib.c
|
|
||||||
gzread.c
|
|
||||||
gzwrite.c
|
|
||||||
infback.c
|
|
||||||
inffast.c
|
|
||||||
inffast.h
|
|
||||||
inffixed.h
|
|
||||||
inflate.c
|
|
||||||
inflate.h
|
|
||||||
inftrees.c
|
|
||||||
inftrees.h
|
|
||||||
trees.c
|
|
||||||
trees.h
|
|
||||||
uncompr.c
|
|
||||||
zutil.c
|
|
||||||
zutil.h
|
|
||||||
|
|
||||||
source files for sample programs
|
|
||||||
See examples/README.examples
|
|
||||||
|
|
||||||
unsupported contributions by third parties
|
|
||||||
See contrib/README.contrib
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
Copyright notice:
|
|
||||||
|
|
||||||
(C) 1995-2022 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,5 +0,0 @@
|
||||||
all:
|
|
||||||
-@echo "Please use ./configure first. Thank you."
|
|
||||||
|
|
||||||
distclean:
|
|
||||||
make -f Makefile.in distclean
|
|
||||||
|
|
@ -1,410 +0,0 @@
|
||||||
# Makefile for zlib
|
|
||||||
# Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
|
|
||||||
# For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
|
|
||||||
# To compile and test, type:
|
|
||||||
# ./configure; make test
|
|
||||||
# Normally configure builds both a static and a shared library.
|
|
||||||
# If you want to build just a static library, use: ./configure --static
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
CFLAGS=-O
|
|
||||||
#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
|
|
||||||
#CFLAGS=-g -DZLIB_DEBUG
|
|
||||||
#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
|
|
||||||
# -Wstrict-prototypes -Wmissing-prototypes
|
|
||||||
|
|
||||||
SFLAGS=-O
|
|
||||||
LDFLAGS=
|
|
||||||
TEST_LIBS=-L. libz.a
|
|
||||||
LDSHARED=$(CC)
|
|
||||||
CPP=$(CC) -E
|
|
||||||
|
|
||||||
STATICLIB=libz.a
|
|
||||||
SHAREDLIB=libz.so
|
|
||||||
SHAREDLIBV=libz.so.1.3.1
|
|
||||||
SHAREDLIBM=libz.so.1
|
|
||||||
LIBS=$(STATICLIB) $(SHAREDLIBV)
|
|
||||||
|
|
||||||
AR=ar
|
|
||||||
ARFLAGS=rc
|
|
||||||
RANLIB=ranlib
|
|
||||||
LDCONFIG=ldconfig
|
|
||||||
LDSHAREDLIBC=-lc
|
|
||||||
TAR=tar
|
|
||||||
SHELL=/bin/sh
|
|
||||||
EXE=
|
|
||||||
|
|
||||||
prefix = /usr/local
|
|
||||||
exec_prefix = ${prefix}
|
|
||||||
libdir = ${exec_prefix}/lib
|
|
||||||
sharedlibdir = ${libdir}
|
|
||||||
includedir = ${prefix}/include
|
|
||||||
mandir = ${prefix}/share/man
|
|
||||||
man3dir = ${mandir}/man3
|
|
||||||
pkgconfigdir = ${libdir}/pkgconfig
|
|
||||||
SRCDIR=
|
|
||||||
ZINC=
|
|
||||||
ZINCOUT=-I.
|
|
||||||
|
|
||||||
OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o
|
|
||||||
OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o
|
|
||||||
OBJC = $(OBJZ) $(OBJG)
|
|
||||||
|
|
||||||
PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo
|
|
||||||
PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo
|
|
||||||
PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG)
|
|
||||||
|
|
||||||
# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo
|
|
||||||
OBJA =
|
|
||||||
PIC_OBJA =
|
|
||||||
|
|
||||||
OBJS = $(OBJC) $(OBJA)
|
|
||||||
|
|
||||||
PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA)
|
|
||||||
|
|
||||||
all: static shared
|
|
||||||
|
|
||||||
static: example$(EXE) minigzip$(EXE)
|
|
||||||
|
|
||||||
shared: examplesh$(EXE) minigzipsh$(EXE)
|
|
||||||
|
|
||||||
all64: example64$(EXE) minigzip64$(EXE)
|
|
||||||
|
|
||||||
check: test
|
|
||||||
|
|
||||||
test: all teststatic testshared
|
|
||||||
|
|
||||||
teststatic: static
|
|
||||||
@TMPST=tmpst_$$; \
|
|
||||||
if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST ; then \
|
|
||||||
echo ' *** zlib test OK ***'; \
|
|
||||||
else \
|
|
||||||
echo ' *** zlib test FAILED ***'; false; \
|
|
||||||
fi
|
|
||||||
@rm -f tmpst_$$
|
|
||||||
|
|
||||||
testshared: shared
|
|
||||||
@LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
|
|
||||||
LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \
|
|
||||||
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 \
|
|
||||||
echo ' *** zlib shared test OK ***'; \
|
|
||||||
else \
|
|
||||||
echo ' *** zlib shared test FAILED ***'; false; \
|
|
||||||
fi
|
|
||||||
@rm -f tmpsh_$$
|
|
||||||
|
|
||||||
test64: all64
|
|
||||||
@TMP64=tmp64_$$; \
|
|
||||||
if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64; then \
|
|
||||||
echo ' *** zlib 64-bit test OK ***'; \
|
|
||||||
else \
|
|
||||||
echo ' *** zlib 64-bit test FAILED ***'; false; \
|
|
||||||
fi
|
|
||||||
@rm -f tmp64_$$
|
|
||||||
|
|
||||||
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) -o $@ infcover.o libz.a
|
|
||||||
|
|
||||||
cover: infcover
|
|
||||||
rm -f *.gcda
|
|
||||||
${QEMU_RUN} ./infcover
|
|
||||||
gcov inf*.c
|
|
||||||
|
|
||||||
libz.a: $(OBJS)
|
|
||||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
|
||||||
-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
|
|
||||||
|
|
||||||
match.o: match.S
|
|
||||||
$(CPP) match.S > _match.s
|
|
||||||
$(CC) -c _match.s
|
|
||||||
mv _match.o match.o
|
|
||||||
rm -f _match.s
|
|
||||||
|
|
||||||
match.lo: match.S
|
|
||||||
$(CPP) match.S > _match.s
|
|
||||||
$(CC) -c -fPIC _match.s
|
|
||||||
mv _match.o match.lo
|
|
||||||
rm -f _match.s
|
|
||||||
|
|
||||||
example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h
|
|
||||||
$(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c
|
|
||||||
|
|
||||||
minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h
|
|
||||||
$(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c
|
|
||||||
|
|
||||||
example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h
|
|
||||||
$(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c
|
|
||||||
|
|
||||||
minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h
|
|
||||||
$(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/minigzip.c
|
|
||||||
|
|
||||||
|
|
||||||
adler32.o: $(SRCDIR)adler32.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c
|
|
||||||
|
|
||||||
crc32.o: $(SRCDIR)crc32.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c
|
|
||||||
|
|
||||||
deflate.o: $(SRCDIR)deflate.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c
|
|
||||||
|
|
||||||
infback.o: $(SRCDIR)infback.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c
|
|
||||||
|
|
||||||
inffast.o: $(SRCDIR)inffast.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inffast.c
|
|
||||||
|
|
||||||
inflate.o: $(SRCDIR)inflate.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inflate.c
|
|
||||||
|
|
||||||
inftrees.o: $(SRCDIR)inftrees.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inftrees.c
|
|
||||||
|
|
||||||
trees.o: $(SRCDIR)trees.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c
|
|
||||||
|
|
||||||
zutil.o: $(SRCDIR)zutil.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c
|
|
||||||
|
|
||||||
compress.o: $(SRCDIR)compress.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)compress.c
|
|
||||||
|
|
||||||
uncompr.o: $(SRCDIR)uncompr.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)uncompr.c
|
|
||||||
|
|
||||||
gzclose.o: $(SRCDIR)gzclose.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzclose.c
|
|
||||||
|
|
||||||
gzlib.o: $(SRCDIR)gzlib.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzlib.c
|
|
||||||
|
|
||||||
gzread.o: $(SRCDIR)gzread.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzread.c
|
|
||||||
|
|
||||||
gzwrite.o: $(SRCDIR)gzwrite.c
|
|
||||||
$(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzwrite.c
|
|
||||||
|
|
||||||
|
|
||||||
adler32.lo: $(SRCDIR)adler32.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c
|
|
||||||
-@mv objs/adler32.o $@
|
|
||||||
|
|
||||||
crc32.lo: $(SRCDIR)crc32.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c
|
|
||||||
-@mv objs/crc32.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
|
|
||||||
-@mv objs/deflate.o $@
|
|
||||||
|
|
||||||
infback.lo: $(SRCDIR)infback.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c
|
|
||||||
-@mv objs/infback.o $@
|
|
||||||
|
|
||||||
inffast.lo: $(SRCDIR)inffast.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inffast.o $(SRCDIR)inffast.c
|
|
||||||
-@mv objs/inffast.o $@
|
|
||||||
|
|
||||||
inflate.lo: $(SRCDIR)inflate.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inflate.o $(SRCDIR)inflate.c
|
|
||||||
-@mv objs/inflate.o $@
|
|
||||||
|
|
||||||
inftrees.lo: $(SRCDIR)inftrees.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inftrees.o $(SRCDIR)inftrees.c
|
|
||||||
-@mv objs/inftrees.o $@
|
|
||||||
|
|
||||||
trees.lo: $(SRCDIR)trees.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c
|
|
||||||
-@mv objs/trees.o $@
|
|
||||||
|
|
||||||
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 $@
|
|
||||||
|
|
||||||
compress.lo: $(SRCDIR)compress.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/compress.o $(SRCDIR)compress.c
|
|
||||||
-@mv objs/compress.o $@
|
|
||||||
|
|
||||||
uncompr.lo: $(SRCDIR)uncompr.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/uncompr.o $(SRCDIR)uncompr.c
|
|
||||||
-@mv objs/uncompr.o $@
|
|
||||||
|
|
||||||
gzclose.lo: $(SRCDIR)gzclose.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzclose.o $(SRCDIR)gzclose.c
|
|
||||||
-@mv objs/gzclose.o $@
|
|
||||||
|
|
||||||
gzlib.lo: $(SRCDIR)gzlib.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzlib.o $(SRCDIR)gzlib.c
|
|
||||||
-@mv objs/gzlib.o $@
|
|
||||||
|
|
||||||
gzread.lo: $(SRCDIR)gzread.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzread.o $(SRCDIR)gzread.c
|
|
||||||
-@mv objs/gzread.o $@
|
|
||||||
|
|
||||||
gzwrite.lo: $(SRCDIR)gzwrite.c
|
|
||||||
-@mkdir objs 2>/dev/null || test -d objs
|
|
||||||
$(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzwrite.o $(SRCDIR)gzwrite.c
|
|
||||||
-@mv objs/gzwrite.o $@
|
|
||||||
|
|
||||||
|
|
||||||
placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a
|
|
||||||
$(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS)
|
|
||||||
rm -f $(SHAREDLIB) $(SHAREDLIBM)
|
|
||||||
ln -s $@ $(SHAREDLIB)
|
|
||||||
ln -s $@ $(SHAREDLIBM)
|
|
||||||
-@rmdir objs
|
|
||||||
|
|
||||||
example$(EXE): example.o $(STATICLIB)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(TEST_LIBS)
|
|
||||||
|
|
||||||
minigzip$(EXE): minigzip.o $(STATICLIB)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(TEST_LIBS)
|
|
||||||
|
|
||||||
examplesh$(EXE): example.o $(SHAREDLIBV)
|
|
||||||
$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV)
|
|
||||||
|
|
||||||
minigzipsh$(EXE): minigzip.o $(SHAREDLIBV)
|
|
||||||
$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV)
|
|
||||||
|
|
||||||
example64$(EXE): example64.o $(STATICLIB)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ example64.o $(TEST_LIBS)
|
|
||||||
|
|
||||||
minigzip64$(EXE): minigzip64.o $(STATICLIB)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip64.o $(TEST_LIBS)
|
|
||||||
|
|
||||||
install-libs: $(LIBS)
|
|
||||||
-@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi
|
|
||||||
-@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi
|
|
||||||
-@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi
|
|
||||||
-@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi
|
|
||||||
-@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi
|
|
||||||
rm -f $(DESTDIR)$(libdir)/$(STATICLIB)
|
|
||||||
cp $(STATICLIB) $(DESTDIR)$(libdir)
|
|
||||||
chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB)
|
|
||||||
-@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1
|
|
||||||
-@if test -n "$(SHAREDLIBV)"; then \
|
|
||||||
rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \
|
|
||||||
cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \
|
|
||||||
echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \
|
|
||||||
chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \
|
|
||||||
echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \
|
|
||||||
rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \
|
|
||||||
ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \
|
|
||||||
ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \
|
|
||||||
($(LDCONFIG) || true) >/dev/null 2>&1; \
|
|
||||||
fi
|
|
||||||
rm -f $(DESTDIR)$(man3dir)/zlib.3
|
|
||||||
cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir)
|
|
||||||
chmod 644 $(DESTDIR)$(man3dir)/zlib.3
|
|
||||||
rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc
|
|
||||||
cp zlib.pc $(DESTDIR)$(pkgconfigdir)
|
|
||||||
chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc
|
|
||||||
# The ranlib in install is needed on NeXTSTEP which checks file times
|
|
||||||
# ldconfig is for Linux
|
|
||||||
|
|
||||||
install: install-libs
|
|
||||||
-@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi
|
|
||||||
rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
|
|
||||||
cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir)
|
|
||||||
chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
|
|
||||||
|
|
||||||
uninstall:
|
|
||||||
cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h
|
|
||||||
cd $(DESTDIR)$(libdir) && rm -f libz.a; \
|
|
||||||
if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \
|
|
||||||
rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \
|
|
||||||
fi
|
|
||||||
cd $(DESTDIR)$(man3dir) && rm -f zlib.3
|
|
||||||
cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc
|
|
||||||
|
|
||||||
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: $(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
|
|
||||||
rm -f *.o *.lo *~ \
|
|
||||||
example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \
|
|
||||||
example64$(EXE) minigzip64$(EXE) \
|
|
||||||
infcover \
|
|
||||||
libz.* foo.gz so_locations \
|
|
||||||
_match.s maketree contrib/infback9/*.o
|
|
||||||
rm -rf objs
|
|
||||||
rm -f *.gcda *.gcno *.gcov
|
|
||||||
rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov
|
|
||||||
|
|
||||||
maintainer-clean: distclean
|
|
||||||
distclean: clean zconf zconf.h.cmakein
|
|
||||||
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
|
|
||||||
|
|
||||||
tags:
|
|
||||||
etags $(SRCDIR)*.[ch]
|
|
||||||
|
|
||||||
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
|
|
||||||
deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
|
|
||||||
infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h
|
|
||||||
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
|
|
||||||
|
|
||||||
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
|
|
||||||
deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
|
|
||||||
infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h
|
|
||||||
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
|
|
||||||
|
|
@ -1,117 +0,0 @@
|
||||||
ZLIB DATA COMPRESSION LIBRARY
|
|
||||||
|
|
||||||
zlib 1.3.1 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
|
|
||||||
of the library is given in the file test/example.c which also tests that
|
|
||||||
the library is working correctly. Another example is given in the file
|
|
||||||
test/minigzip.c. The compression library itself is composed of all source
|
|
||||||
files in the root directory.
|
|
||||||
|
|
||||||
To compile all files and run the test program, follow the instructions given at
|
|
||||||
the top of Makefile.in. In short "./configure; make test", and if that goes
|
|
||||||
well, "make install" should work for most flavors of Unix. For Windows, use
|
|
||||||
one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
|
|
||||||
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
|
|
||||||
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 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://marknelson.us/posts/1997/01/01/zlib-engine.html .
|
|
||||||
|
|
||||||
The changes made in version 1.3.1 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 .
|
|
||||||
|
|
||||||
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 Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
|
|
||||||
available in Python 1.5 and later versions, see
|
|
||||||
http://docs.python.org/library/zlib.html .
|
|
||||||
|
|
||||||
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
|
|
||||||
contrib/minizip directory of zlib.
|
|
||||||
|
|
||||||
|
|
||||||
Notes for some targets:
|
|
||||||
|
|
||||||
- For Windows DLL versions, please see win32/DLL_FAQ.txt
|
|
||||||
|
|
||||||
- For 64-bit Irix, deflate.c must be compiled without any optimization. With
|
|
||||||
-O, one libpng test fails. The test works in 32 bit mode (with the -n32
|
|
||||||
compiler flag). The compiler bug has been reported to SGI.
|
|
||||||
|
|
||||||
- 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
|
|
||||||
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.
|
|
||||||
|
|
||||||
- gzdopen is not supported on RISCOS or BEOS.
|
|
||||||
|
|
||||||
- For PalmOs, see http://palmzlib.sourceforge.net/
|
|
||||||
|
|
||||||
|
|
||||||
Acknowledgments:
|
|
||||||
|
|
||||||
The deflate format used by zlib was defined by Phil Katz. The deflate and
|
|
||||||
zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
|
||||||
people who reported problems and suggested various improvements in zlib; they
|
|
||||||
are too numerous to cite here.
|
|
||||||
|
|
||||||
Copyright notice:
|
|
||||||
|
|
||||||
(C) 1995-2024 Jean-loup Gailly and Mark Adler
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
|
||||||
jloup@gzip.org madler@alumni.caltech.edu
|
|
||||||
|
|
||||||
If you use the zlib library in a product, we would appreciate *not* receiving
|
|
||||||
lengthy legal documents to sign. The sources are provided for free but without
|
|
||||||
warranty of any kind. The library has been entirely written by Jean-loup
|
|
||||||
Gailly and Mark Adler; it does not include third-party code. 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.
|
|
||||||
|
|
||||||
If you redistribute modified sources, we would appreciate that you include in
|
|
||||||
the file ChangeLog history information documenting your changes. Please read
|
|
||||||
the FAQ for more information on the distribution of modified source versions.
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
||||||
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
|
||||||
* Copyright (C) 1995-2011, 2016 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
|
|
||||||
#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 */
|
|
||||||
|
|
||||||
#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
|
|
||||||
#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
|
|
||||||
#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
|
|
||||||
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
|
|
||||||
#define DO16(buf) DO8(buf,0); DO8(buf,8);
|
|
||||||
|
|
||||||
/* use NO_DIVIDE if your processor does not do division in hardware --
|
|
||||||
try it both ways to see which is faster */
|
|
||||||
#ifdef NO_DIVIDE
|
|
||||||
/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
|
|
||||||
(thank you to John Reiser for pointing this out) */
|
|
||||||
# define CHOP(a) \
|
|
||||||
do { \
|
|
||||||
unsigned long tmp = a >> 16; \
|
|
||||||
a &= 0xffffUL; \
|
|
||||||
a += (tmp << 4) - tmp; \
|
|
||||||
} while (0)
|
|
||||||
# define MOD28(a) \
|
|
||||||
do { \
|
|
||||||
CHOP(a); \
|
|
||||||
if (a >= BASE) a -= BASE; \
|
|
||||||
} while (0)
|
|
||||||
# define MOD(a) \
|
|
||||||
do { \
|
|
||||||
CHOP(a); \
|
|
||||||
MOD28(a); \
|
|
||||||
} while (0)
|
|
||||||
# define MOD63(a) \
|
|
||||||
do { /* this assumes a is not negative */ \
|
|
||||||
z_off64_t tmp = a >> 32; \
|
|
||||||
a &= 0xffffffffL; \
|
|
||||||
a += (tmp << 8) - (tmp << 5) + tmp; \
|
|
||||||
tmp = a >> 16; \
|
|
||||||
a &= 0xffffL; \
|
|
||||||
a += (tmp << 4) - tmp; \
|
|
||||||
tmp = a >> 16; \
|
|
||||||
a &= 0xffffL; \
|
|
||||||
a += (tmp << 4) - tmp; \
|
|
||||||
if (a >= BASE) a -= BASE; \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
# define MOD(a) a %= BASE
|
|
||||||
# define MOD28(a) a %= BASE
|
|
||||||
# define MOD63(a) a %= BASE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
|
|
||||||
unsigned long sum2;
|
|
||||||
unsigned n;
|
|
||||||
|
|
||||||
/* split Adler-32 into component sums */
|
|
||||||
sum2 = (adler >> 16) & 0xffff;
|
|
||||||
adler &= 0xffff;
|
|
||||||
|
|
||||||
/* in case user likes doing a byte at a time, keep it fast */
|
|
||||||
if (len == 1) {
|
|
||||||
adler += buf[0];
|
|
||||||
if (adler >= BASE)
|
|
||||||
adler -= BASE;
|
|
||||||
sum2 += adler;
|
|
||||||
if (sum2 >= BASE)
|
|
||||||
sum2 -= BASE;
|
|
||||||
return adler | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initial Adler-32 value (deferred check for len == 1 speed) */
|
|
||||||
if (buf == Z_NULL)
|
|
||||||
return 1L;
|
|
||||||
|
|
||||||
/* in case short lengths are provided, keep it somewhat fast */
|
|
||||||
if (len < 16) {
|
|
||||||
while (len--) {
|
|
||||||
adler += *buf++;
|
|
||||||
sum2 += adler;
|
|
||||||
}
|
|
||||||
if (adler >= BASE)
|
|
||||||
adler -= BASE;
|
|
||||||
MOD28(sum2); /* only added so many BASE's */
|
|
||||||
return adler | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do length NMAX blocks -- requires just one modulo operation */
|
|
||||||
while (len >= NMAX) {
|
|
||||||
len -= NMAX;
|
|
||||||
n = NMAX / 16; /* NMAX is divisible by 16 */
|
|
||||||
do {
|
|
||||||
DO16(buf); /* 16 sums unrolled */
|
|
||||||
buf += 16;
|
|
||||||
} while (--n);
|
|
||||||
MOD(adler);
|
|
||||||
MOD(sum2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do remaining bytes (less than NMAX, still just one modulo) */
|
|
||||||
if (len) { /* avoid modulos if none remaining */
|
|
||||||
while (len >= 16) {
|
|
||||||
len -= 16;
|
|
||||||
DO16(buf);
|
|
||||||
buf += 16;
|
|
||||||
}
|
|
||||||
while (len--) {
|
|
||||||
adler += *buf++;
|
|
||||||
sum2 += adler;
|
|
||||||
}
|
|
||||||
MOD(adler);
|
|
||||||
MOD(sum2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return recombined sums */
|
|
||||||
return adler | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT adler32(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) {
|
|
||||||
unsigned long sum1;
|
|
||||||
unsigned long sum2;
|
|
||||||
unsigned rem;
|
|
||||||
|
|
||||||
/* for negative len, return invalid adler32 as a clue for debugging */
|
|
||||||
if (len2 < 0)
|
|
||||||
return 0xffffffffUL;
|
|
||||||
|
|
||||||
/* the derivation of this formula is left as an exercise for the reader */
|
|
||||||
MOD63(len2); /* assumes len2 >= 0 */
|
|
||||||
rem = (unsigned)len2;
|
|
||||||
sum1 = adler1 & 0xffff;
|
|
||||||
sum2 = rem * sum1;
|
|
||||||
MOD(sum2);
|
|
||||||
sum1 += (adler2 & 0xffff) + BASE - 1;
|
|
||||||
sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
|
|
||||||
if (sum1 >= BASE) sum1 -= BASE;
|
|
||||||
if (sum1 >= BASE) sum1 -= BASE;
|
|
||||||
if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1);
|
|
||||||
if (sum2 >= BASE) sum2 -= BASE;
|
|
||||||
return sum1 | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT adler32_combine(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) {
|
|
||||||
return adler32_combine_(adler1, adler2, len2);
|
|
||||||
}
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
# Amiga powerUP (TM) Makefile
|
|
||||||
# makefile for libpng and SAS C V6.58/7.00 PPC compiler
|
|
||||||
# Copyright (C) 1998 by Andreas R. Kleinert
|
|
||||||
|
|
||||||
LIBNAME = libzip.a
|
|
||||||
|
|
||||||
CC = scppc
|
|
||||||
CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \
|
|
||||||
OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8 NOVER
|
|
||||||
AR = ppc-amigaos-ar cr
|
|
||||||
RANLIB = ppc-amigaos-ranlib
|
|
||||||
LD = ppc-amigaos-ld -r
|
|
||||||
LDFLAGS = -o
|
|
||||||
LDLIBS = LIB:scppc.a LIB:end.o
|
|
||||||
RM = delete quiet
|
|
||||||
|
|
||||||
OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \
|
|
||||||
uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
|
|
||||||
|
|
||||||
TEST_OBJS = example.o minigzip.o
|
|
||||||
|
|
||||||
all: example minigzip
|
|
||||||
|
|
||||||
check: test
|
|
||||||
test: all
|
|
||||||
example
|
|
||||||
echo hello world | minigzip | minigzip -d
|
|
||||||
|
|
||||||
$(LIBNAME): $(OBJS)
|
|
||||||
$(AR) $@ $(OBJS)
|
|
||||||
-$(RANLIB) $@
|
|
||||||
|
|
||||||
example: example.o $(LIBNAME)
|
|
||||||
$(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS)
|
|
||||||
|
|
||||||
minigzip: minigzip.o $(LIBNAME)
|
|
||||||
$(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS)
|
|
||||||
|
|
||||||
mostlyclean: clean
|
|
||||||
clean:
|
|
||||||
$(RM) *.o example minigzip $(LIBNAME) foo.gz
|
|
||||||
|
|
||||||
zip:
|
|
||||||
zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \
|
|
||||||
descrip.mms *.[ch]
|
|
||||||
|
|
||||||
tgz:
|
|
||||||
cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
|
|
||||||
zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch]
|
|
||||||
|
|
||||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
|
|
||||||
|
|
||||||
adler32.o: zlib.h zconf.h
|
|
||||||
compress.o: zlib.h zconf.h
|
|
||||||
crc32.o: crc32.h zlib.h zconf.h
|
|
||||||
deflate.o: deflate.h zutil.h zlib.h zconf.h
|
|
||||||
example.o: zlib.h zconf.h
|
|
||||||
gzclose.o: zlib.h zconf.h gzguts.h
|
|
||||||
gzlib.o: zlib.h zconf.h gzguts.h
|
|
||||||
gzread.o: zlib.h zconf.h gzguts.h
|
|
||||||
gzwrite.o: zlib.h zconf.h gzguts.h
|
|
||||||
inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
|
|
||||||
inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
|
|
||||||
infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
|
|
||||||
inftrees.o: zutil.h zlib.h zconf.h inftrees.h
|
|
||||||
minigzip.o: zlib.h zconf.h
|
|
||||||
trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
|
|
||||||
uncompr.o: zlib.h zconf.h
|
|
||||||
zutil.o: zutil.h zlib.h zconf.h
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
# SMakefile for zlib
|
|
||||||
# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly
|
|
||||||
# Osma Ahvenlampi <Osma.Ahvenlampi@hut.fi>
|
|
||||||
# Amiga, SAS/C 6.56 & Smake
|
|
||||||
|
|
||||||
CC=sc
|
|
||||||
CFLAGS=OPT
|
|
||||||
#CFLAGS=OPT CPU=68030
|
|
||||||
#CFLAGS=DEBUG=LINE
|
|
||||||
LDFLAGS=LIB z.lib
|
|
||||||
|
|
||||||
SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \
|
|
||||||
NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX \
|
|
||||||
DEF=POSTINC
|
|
||||||
|
|
||||||
OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \
|
|
||||||
uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
|
|
||||||
|
|
||||||
TEST_OBJS = example.o minigzip.o
|
|
||||||
|
|
||||||
all: SCOPTIONS example minigzip
|
|
||||||
|
|
||||||
check: test
|
|
||||||
test: all
|
|
||||||
example
|
|
||||||
echo hello world | minigzip | minigzip -d
|
|
||||||
|
|
||||||
install: z.lib
|
|
||||||
copy clone zlib.h zconf.h INCLUDE:
|
|
||||||
copy clone z.lib LIB:
|
|
||||||
|
|
||||||
z.lib: $(OBJS)
|
|
||||||
oml z.lib r $(OBJS)
|
|
||||||
|
|
||||||
example: example.o z.lib
|
|
||||||
$(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS)
|
|
||||||
|
|
||||||
minigzip: minigzip.o z.lib
|
|
||||||
$(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS)
|
|
||||||
|
|
||||||
mostlyclean: clean
|
|
||||||
clean:
|
|
||||||
-delete force quiet example minigzip *.o z.lib foo.gz *.lnk SCOPTIONS
|
|
||||||
|
|
||||||
SCOPTIONS: Makefile.sas
|
|
||||||
copy to $@ <from <
|
|
||||||
$(SCOPTIONS)
|
|
||||||
<
|
|
||||||
|
|
||||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
|
|
||||||
|
|
||||||
adler32.o: zlib.h zconf.h
|
|
||||||
compress.o: zlib.h zconf.h
|
|
||||||
crc32.o: crc32.h zlib.h zconf.h
|
|
||||||
deflate.o: deflate.h zutil.h zlib.h zconf.h
|
|
||||||
example.o: zlib.h zconf.h
|
|
||||||
gzclose.o: zlib.h zconf.h gzguts.h
|
|
||||||
gzlib.o: zlib.h zconf.h gzguts.h
|
|
||||||
gzread.o: zlib.h zconf.h gzguts.h
|
|
||||||
gzwrite.o: zlib.h zconf.h gzguts.h
|
|
||||||
inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
|
|
||||||
inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
|
|
||||||
infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
|
|
||||||
inftrees.o: zutil.h zlib.h zconf.h inftrees.h
|
|
||||||
minigzip.o: zlib.h zconf.h
|
|
||||||
trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
|
|
||||||
uncompr.o: zlib.h zconf.h
|
|
||||||
zutil.o: zutil.h zlib.h zconf.h
|
|
||||||
|
|
@ -1,75 +0,0 @@
|
||||||
/* compress.c -- compress a memory buffer
|
|
||||||
* Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#define ZLIB_INTERNAL
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
Compresses the source buffer into the destination buffer. The level
|
|
||||||
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
|
||||||
length of the source buffer. Upon entry, destLen is the total size of the
|
|
||||||
destination buffer, which must be at least 0.1% larger than sourceLen plus
|
|
||||||
12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
|
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
|
|
||||||
uLong sourceLen, int level) {
|
|
||||||
z_stream stream;
|
|
||||||
int err;
|
|
||||||
const uInt max = (uInt)-1;
|
|
||||||
uLong left;
|
|
||||||
|
|
||||||
left = *destLen;
|
|
||||||
*destLen = 0;
|
|
||||||
|
|
||||||
stream.zalloc = (alloc_func)0;
|
|
||||||
stream.zfree = (free_func)0;
|
|
||||||
stream.opaque = (voidpf)0;
|
|
||||||
|
|
||||||
err = deflateInit(&stream, level);
|
|
||||||
if (err != Z_OK) return err;
|
|
||||||
|
|
||||||
stream.next_out = dest;
|
|
||||||
stream.avail_out = 0;
|
|
||||||
stream.next_in = (z_const Bytef *)source;
|
|
||||||
stream.avail_in = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (stream.avail_out == 0) {
|
|
||||||
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
|
||||||
left -= stream.avail_out;
|
|
||||||
}
|
|
||||||
if (stream.avail_in == 0) {
|
|
||||||
stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
|
|
||||||
sourceLen -= stream.avail_in;
|
|
||||||
}
|
|
||||||
err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
|
|
||||||
} while (err == Z_OK);
|
|
||||||
|
|
||||||
*destLen = stream.total_out;
|
|
||||||
deflateEnd(&stream);
|
|
||||||
return err == Z_STREAM_END ? Z_OK : err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
*/
|
|
||||||
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
|
||||||
uLong sourceLen) {
|
|
||||||
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
If the default memLevel or windowBits for deflateInit() is changed, then
|
|
||||||
this function needs to be updated.
|
|
||||||
*/
|
|
||||||
uLong ZEXPORT compressBound(uLong sourceLen) {
|
|
||||||
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
|
||||||
(sourceLen >> 25) + 13;
|
|
||||||
}
|
|
||||||
929
contrib/zlib/configure
vendored
929
contrib/zlib/configure
vendored
|
|
@ -1,929 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# configure script for zlib.
|
|
||||||
#
|
|
||||||
# Normally configure builds both a static and a shared library.
|
|
||||||
# If you want to build just a static library, use: ./configure --static
|
|
||||||
#
|
|
||||||
# To impose specific compiler or flags or install directory, use for example:
|
|
||||||
# prefix=$HOME CC=cc CFLAGS="-O4" ./configure
|
|
||||||
# or for csh/tcsh users:
|
|
||||||
# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
|
|
||||||
|
|
||||||
# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
|
|
||||||
# If you have problems, try without defining CC and CFLAGS before reporting
|
|
||||||
# an error.
|
|
||||||
|
|
||||||
# start off configure.log
|
|
||||||
echo -------------------- >> configure.log
|
|
||||||
echo $0 $* >> configure.log
|
|
||||||
date >> configure.log
|
|
||||||
|
|
||||||
# get source directory
|
|
||||||
SRCDIR=`dirname $0`
|
|
||||||
if test $SRCDIR = "."; then
|
|
||||||
ZINC=""
|
|
||||||
ZINCOUT="-I."
|
|
||||||
SRCDIR=""
|
|
||||||
else
|
|
||||||
ZINC='-I. -include zconf.h'
|
|
||||||
ZINCOUT='-I. -I$(SRCDIR)'
|
|
||||||
SRCDIR="$SRCDIR/"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set command prefix for cross-compilation
|
|
||||||
if [ -n "${CHOST}" ]; then
|
|
||||||
uname=${CHOST}
|
|
||||||
mname=${CHOST}
|
|
||||||
CROSS_PREFIX="${CHOST}-"
|
|
||||||
else
|
|
||||||
mname=`(uname -a || echo unknown) 2>/dev/null`
|
|
||||||
fi
|
|
||||||
|
|
||||||
# destination name for static library
|
|
||||||
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'`
|
|
||||||
|
|
||||||
# establish commands for library building
|
|
||||||
if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then
|
|
||||||
AR=${AR-"${CROSS_PREFIX}ar"}
|
|
||||||
test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log
|
|
||||||
else
|
|
||||||
AR=${AR-"ar"}
|
|
||||||
test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log
|
|
||||||
fi
|
|
||||||
ARFLAGS=${ARFLAGS-"rc"}
|
|
||||||
if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then
|
|
||||||
RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"}
|
|
||||||
test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log
|
|
||||||
else
|
|
||||||
RANLIB=${RANLIB-"ranlib"}
|
|
||||||
fi
|
|
||||||
if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then
|
|
||||||
NM=${NM-"${CROSS_PREFIX}nm"}
|
|
||||||
test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log
|
|
||||||
else
|
|
||||||
NM=${NM-"nm"}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set defaults before processing command line options
|
|
||||||
LDCONFIG=${LDCONFIG-"ldconfig"}
|
|
||||||
LDSHAREDLIBC="${LDSHAREDLIBC--lc}"
|
|
||||||
ARCHS=
|
|
||||||
prefix=${prefix-/usr/local}
|
|
||||||
exec_prefix=${exec_prefix-'${prefix}'}
|
|
||||||
libdir=${libdir-'${exec_prefix}/lib'}
|
|
||||||
sharedlibdir=${sharedlibdir-'${libdir}'}
|
|
||||||
includedir=${includedir-'${prefix}/include'}
|
|
||||||
mandir=${mandir-'${prefix}/share/man'}
|
|
||||||
shared_ext='.so'
|
|
||||||
shared=1
|
|
||||||
solo=0
|
|
||||||
cover=0
|
|
||||||
zprefix=0
|
|
||||||
zconst=0
|
|
||||||
build64=0
|
|
||||||
gcc=0
|
|
||||||
warn=0
|
|
||||||
debug=0
|
|
||||||
address=0
|
|
||||||
memory=0
|
|
||||||
old_cc="$CC"
|
|
||||||
old_cflags="$CFLAGS"
|
|
||||||
OBJC='$(OBJZ) $(OBJG)'
|
|
||||||
PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)'
|
|
||||||
|
|
||||||
# leave this script, optionally in a bad way
|
|
||||||
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
|
|
||||||
echo -------------------- >> configure.log
|
|
||||||
echo >> configure.log
|
|
||||||
echo >> configure.log
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# process command line options
|
|
||||||
while test $# -ge 1
|
|
||||||
do
|
|
||||||
case "$1" in
|
|
||||||
-h* | --help)
|
|
||||||
echo 'usage:' | tee -a configure.log
|
|
||||||
echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | 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 ;;
|
|
||||||
-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 ;;
|
|
||||||
-i* | --includedir) includedir="$2"; shift; shift ;;
|
|
||||||
-s* | --shared | --enable-shared) shared=1; 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 ;;
|
|
||||||
--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=1; shift ;;
|
|
||||||
-d* | --debug) debug=1; shift ;;
|
|
||||||
--sanitize) address=1; shift ;;
|
|
||||||
--address) address=1; shift ;;
|
|
||||||
--memory) memory=1; shift ;;
|
|
||||||
*)
|
|
||||||
echo "unknown option: $1" | tee -a configure.log
|
|
||||||
echo "$0 --help for help" | tee -a configure.log
|
|
||||||
leave 1;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# temporary file name
|
|
||||||
test=ztest$$
|
|
||||||
|
|
||||||
# put arguments in log, also put test file in log if used in arguments
|
|
||||||
show()
|
|
||||||
{
|
|
||||||
case "$*" in
|
|
||||||
*$test.c*)
|
|
||||||
echo === $test.c === >> configure.log
|
|
||||||
cat $test.c >> configure.log
|
|
||||||
echo === >> configure.log;;
|
|
||||||
esac
|
|
||||||
echo $* >> configure.log
|
|
||||||
}
|
|
||||||
|
|
||||||
# check for gcc vs. cc and set compile and link flags based on the system identified by uname
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
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
|
|
||||||
|
|
||||||
case "$cc" in
|
|
||||||
*gcc*) gcc=1 ;;
|
|
||||||
*clang*) gcc=1 ;;
|
|
||||||
esac
|
|
||||||
case `$cc -v 2>&1` in
|
|
||||||
*gcc*) gcc=1 ;;
|
|
||||||
*clang*) gcc=1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
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}"
|
|
||||||
SFLAGS="${CFLAGS--O3} -fPIC"
|
|
||||||
if test "$ARCHS"; then
|
|
||||||
CFLAGS="${CFLAGS} ${ARCHS}"
|
|
||||||
LDFLAGS="${LDFLAGS} ${ARCHS}"
|
|
||||||
fi
|
|
||||||
if test $build64 -eq 1; then
|
|
||||||
CFLAGS="${CFLAGS} -m64"
|
|
||||||
SFLAGS="${SFLAGS} -m64"
|
|
||||||
fi
|
|
||||||
if test "$warn" -eq 1; then
|
|
||||||
if test "$zconst" -eq 1; then
|
|
||||||
CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -DZLIB_CONST"
|
|
||||||
else
|
|
||||||
CFLAGS="${CFLAGS} -Wall -Wextra"
|
|
||||||
fi
|
|
||||||
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 $debug -eq 1; then
|
|
||||||
CFLAGS="${CFLAGS} -DZLIB_DEBUG"
|
|
||||||
SFLAGS="${SFLAGS} -DZLIB_DEBUG"
|
|
||||||
fi
|
|
||||||
if test -z "$uname"; then
|
|
||||||
uname=`(uname -s || echo unknown) 2>/dev/null`
|
|
||||||
fi
|
|
||||||
case "$uname" in
|
|
||||||
Linux* | linux* | *-linux* | GNU | GNU/* | solaris*)
|
|
||||||
case "$mname" in
|
|
||||||
*sparc*)
|
|
||||||
LDFLAGS="${LDFLAGS} -Wl,--no-warn-rwx-segments" ;;
|
|
||||||
esac
|
|
||||||
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*)
|
|
||||||
EXE='.exe' ;;
|
|
||||||
MINGW* | mingw* | *-mingw*)
|
|
||||||
rm -f $test.[co] $test $test$shared_ext
|
|
||||||
echo "If this doesn't work for you, try win32/Makefile.gcc." | tee -a configure.log
|
|
||||||
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"} ;;
|
|
||||||
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*)
|
|
||||||
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"} ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
# find system name and corresponding cc options
|
|
||||||
CC=${CC-cc}
|
|
||||||
gcc=0
|
|
||||||
echo ... using $CC >> configure.log
|
|
||||||
if test -z "$uname"; then
|
|
||||||
uname=`(uname -sr || echo unknown) 2>/dev/null`
|
|
||||||
fi
|
|
||||||
case "$uname" in
|
|
||||||
HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
|
|
||||||
CFLAGS=${CFLAGS-"-O"}
|
|
||||||
# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
|
|
||||||
LDSHARED=${LDSHARED-"ld -b"}
|
|
||||||
case `(uname -m || echo unknown) 2>/dev/null` in
|
|
||||||
ia64)
|
|
||||||
shared_ext='.so'
|
|
||||||
SHAREDLIB='libz.so' ;;
|
|
||||||
*)
|
|
||||||
shared_ext='.sl'
|
|
||||||
SHAREDLIB='libz.sl' ;;
|
|
||||||
esac ;;
|
|
||||||
IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
|
|
||||||
CFLAGS=${CFLAGS-"-ansi -O2"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;
|
|
||||||
OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
|
|
||||||
CFLAGS=${CFLAGS-"-O -std1"}
|
|
||||||
LDFLAGS="${LDFLAGS} -Wl,-rpath,."
|
|
||||||
LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;;
|
|
||||||
OSF1*) SFLAGS=${CFLAGS-"-O -std1"}
|
|
||||||
CFLAGS=${CFLAGS-"-O -std1"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;
|
|
||||||
QNX*) SFLAGS=${CFLAGS-"-4 -O"}
|
|
||||||
CFLAGS=${CFLAGS-"-4 -O"}
|
|
||||||
LDSHARED=${LDSHARED-"cc"}
|
|
||||||
RANLIB=${RANLIB-"true"}
|
|
||||||
AR="cc"
|
|
||||||
ARFLAGS="-A" ;;
|
|
||||||
SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
|
|
||||||
CFLAGS=${CFLAGS-"-O3"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;;
|
|
||||||
SunOS\ 5* | solaris*)
|
|
||||||
LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"}
|
|
||||||
SFLAGS=${CFLAGS-"-fast -KPIC"}
|
|
||||||
CFLAGS=${CFLAGS-"-fast"}
|
|
||||||
if test $build64 -eq 1; then
|
|
||||||
# old versions of SunPRO/Workshop/Studio don't support -m64,
|
|
||||||
# but newer ones do. Check for it.
|
|
||||||
flag64=`$CC -flags | egrep -- '^-m64'`
|
|
||||||
if test x"$flag64" != x"" ; then
|
|
||||||
CFLAGS="${CFLAGS} -m64"
|
|
||||||
SFLAGS="${SFLAGS} -m64"
|
|
||||||
else
|
|
||||||
case `(uname -m || echo unknown) 2>/dev/null` in
|
|
||||||
i86*)
|
|
||||||
SFLAGS="$SFLAGS -xarch=amd64"
|
|
||||||
CFLAGS="$CFLAGS -xarch=amd64" ;;
|
|
||||||
*)
|
|
||||||
SFLAGS="$SFLAGS -xarch=v9"
|
|
||||||
CFLAGS="$CFLAGS -xarch=v9" ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test -n "$ZINC"; then
|
|
||||||
ZINC='-I- -I. -I$(SRCDIR)'
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
|
|
||||||
CFLAGS=${CFLAGS-"-O2"}
|
|
||||||
LDSHARED=${LDSHARED-"ld"} ;;
|
|
||||||
SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"}
|
|
||||||
CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;;
|
|
||||||
UNIX_System_V\ 4.2.0)
|
|
||||||
SFLAGS=${CFLAGS-"-KPIC -O"}
|
|
||||||
CFLAGS=${CFLAGS-"-O"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -G"} ;;
|
|
||||||
UNIX_SV\ 4.2MP)
|
|
||||||
SFLAGS=${CFLAGS-"-Kconform_pic -O"}
|
|
||||||
CFLAGS=${CFLAGS-"-O"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -G"} ;;
|
|
||||||
OpenUNIX\ 5)
|
|
||||||
SFLAGS=${CFLAGS-"-KPIC -O"}
|
|
||||||
CFLAGS=${CFLAGS-"-O"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -G"} ;;
|
|
||||||
AIX*) # Courtesy of dbakker@arrayasolutions.com
|
|
||||||
SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
|
|
||||||
CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
|
|
||||||
LDSHARED=${LDSHARED-"xlc -G"} ;;
|
|
||||||
# send working options for other systems to zlib@gzip.org
|
|
||||||
*) SFLAGS=${CFLAGS-"-O"}
|
|
||||||
CFLAGS=${CFLAGS-"-O"}
|
|
||||||
LDSHARED=${LDSHARED-"cc -shared"} ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# destination names for shared library if not defined above
|
|
||||||
SHAREDLIB=${SHAREDLIB-"libz$shared_ext"}
|
|
||||||
SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"}
|
|
||||||
SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"}
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# define functions for testing compiler and library characteristics and logging the results
|
|
||||||
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#error error
|
|
||||||
EOF
|
|
||||||
if ($CC -c $CFLAGS $test.c) 2>/dev/null; then
|
|
||||||
try()
|
|
||||||
{
|
|
||||||
show $*
|
|
||||||
test "`( $* ) 2>&1 | tee -a configure.log`" = ""
|
|
||||||
}
|
|
||||||
echo - using any output from compiler to indicate an error >> configure.log
|
|
||||||
else
|
|
||||||
try()
|
|
||||||
{
|
|
||||||
show $*
|
|
||||||
got=`( $* ) 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
|
|
||||||
return $ret
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
tryboth()
|
|
||||||
{
|
|
||||||
show $*
|
|
||||||
got=`( $* ) 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
|
|
||||||
return $ret
|
|
||||||
fi
|
|
||||||
test "$got" = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
cat > $test.c << EOF
|
|
||||||
int foo() { return 0; }
|
|
||||||
EOF
|
|
||||||
echo "Checking for obsessive-compulsive compiler options..." >> configure.log
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log
|
|
||||||
leave 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# see if shared library build supported
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
extern int getchar();
|
|
||||||
int hello() {return getchar();}
|
|
||||||
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 -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
|
|
||||||
shared=0;
|
|
||||||
else
|
|
||||||
echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log
|
|
||||||
shared=0;
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test $shared -eq 0; then
|
|
||||||
LDSHARED="$CC"
|
|
||||||
ALL="static"
|
|
||||||
TEST="all teststatic"
|
|
||||||
SHAREDLIB=""
|
|
||||||
SHAREDLIBV=""
|
|
||||||
SHAREDLIBM=""
|
|
||||||
echo Building static library $STATICLIB version $VER with $CC. | tee -a configure.log
|
|
||||||
else
|
|
||||||
ALL="static shared"
|
|
||||||
TEST="all teststatic testshared"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# check for size_t
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
size_t dummy = 0;
|
|
||||||
EOF
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking for size_t... Yes." | tee -a configure.log
|
|
||||||
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
|
|
||||||
long long dummy = 0;
|
|
||||||
EOF
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking for long long... Yes." | tee -a configure.log
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
int main(void) {
|
|
||||||
if (sizeof(void *) <= sizeof(int)) puts("int");
|
|
||||||
else if (sizeof(void *) <= sizeof(long)) puts("long");
|
|
||||||
else puts("z_longlong");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
echo "Checking for long long... No." | tee -a configure.log
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
int main(void) {
|
|
||||||
if (sizeof(void *) <= sizeof(int)) puts("int");
|
|
||||||
else puts("long");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# check for large file support, and if none, check for fseeko()
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <sys/types.h>
|
|
||||||
off64_t dummy = 0;
|
|
||||||
EOF
|
|
||||||
if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then
|
|
||||||
CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"
|
|
||||||
SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"
|
|
||||||
ALL="${ALL} all64"
|
|
||||||
TEST="${TEST} test64"
|
|
||||||
echo "Checking for off64_t... Yes." | tee -a configure.log
|
|
||||||
echo "Checking for fseeko... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
echo "Checking for off64_t... No." | tee -a configure.log
|
|
||||||
echo >> configure.log
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
int main(void) {
|
|
||||||
fseeko(NULL, 0, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
if try $CC $CFLAGS -o $test $test.c; then
|
|
||||||
echo "Checking for fseeko... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
CFLAGS="${CFLAGS} -DNO_FSEEKO"
|
|
||||||
SFLAGS="${SFLAGS} -DNO_FSEEKO"
|
|
||||||
echo "Checking for fseeko... No." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# check for strerror() for use by gz* functions
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
int main() { return strlen(strerror(errno)); }
|
|
||||||
EOF
|
|
||||||
if try $CC $CFLAGS -o $test $test.c; then
|
|
||||||
echo "Checking for strerror... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
CFLAGS="${CFLAGS} -DNO_STRERROR"
|
|
||||||
SFLAGS="${SFLAGS} -DNO_STRERROR"
|
|
||||||
echo "Checking for strerror... No." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
# copy clean zconf.h for subsequent edits
|
|
||||||
cp -p ${SRCDIR}zconf.h.in zconf.h
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# check for unistd.h and save result in zconf.h
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <unistd.h>
|
|
||||||
int main() { return 0; }
|
|
||||||
EOF
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
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
|
|
||||||
echo "Checking for unistd.h... No." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# check for stdarg.h and save result in zconf.h
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdarg.h>
|
|
||||||
int main() { return 0; }
|
|
||||||
EOF
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
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
|
|
||||||
echo "Checking for stdarg.h... No." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if the z_ prefix was requested, save that in zconf.h
|
|
||||||
if test $zprefix -eq 1; then
|
|
||||||
sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h
|
|
||||||
mv zconf.temp.h zconf.h
|
|
||||||
echo >> configure.log
|
|
||||||
echo "Using z_ prefix on all symbols." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists
|
|
||||||
if test $solo -eq 1; then
|
|
||||||
sed '/#define ZCONF_H/a\
|
|
||||||
#define Z_SOLO
|
|
||||||
|
|
||||||
' < zconf.h > zconf.temp.h
|
|
||||||
mv zconf.temp.h zconf.h
|
|
||||||
OBJC='$(OBJZ)'
|
|
||||||
PIC_OBJC='$(PIC_OBJZ)'
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions
|
|
||||||
# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a
|
|
||||||
# return value. The most secure result is vsnprintf() with a return value. snprintf() with a
|
|
||||||
# return value is secure as well, but then gzprintf() will be limited to 20 arguments.
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "zconf.h"
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
#ifndef STDC
|
|
||||||
choke me
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
int mytest(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return (mytest("Hello%d\n", 1));
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
if try $CC $CFLAGS -o $test $test.c; then
|
|
||||||
echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
cat >$test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
int mytest(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
char buf[20];
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
n = vsnprintf(buf, sizeof(buf), fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return (mytest("Hello%d\n", 1));
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
CFLAGS="$CFLAGS -DHAS_vsnprintf_void"
|
|
||||||
SFLAGS="$SFLAGS -DHAS_vsnprintf_void"
|
|
||||||
echo "Checking for return value of vsnprintf()... No." | tee -a configure.log
|
|
||||||
echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log
|
|
||||||
echo " can build but will be open to possible string-format security" | tee -a configure.log
|
|
||||||
echo " vulnerabilities." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
CFLAGS="$CFLAGS -DNO_vsnprintf"
|
|
||||||
SFLAGS="$SFLAGS -DNO_vsnprintf"
|
|
||||||
echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log
|
|
||||||
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
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
cat >$test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
int mytest(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
char buf[20];
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
n = vsprintf(buf, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return (mytest("Hello%d\n", 1));
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
CFLAGS="$CFLAGS -DHAS_vsprintf_void"
|
|
||||||
SFLAGS="$SFLAGS -DHAS_vsprintf_void"
|
|
||||||
echo "Checking for return value of vsprintf()... No." | tee -a configure.log
|
|
||||||
echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log
|
|
||||||
echo " can build but will be open to possible string-format security" | tee -a configure.log
|
|
||||||
echo " vulnerabilities." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
cat >$test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
int mytest()
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
snprintf(buf, sizeof(buf), "%s", "foo");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return (mytest());
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if try $CC $CFLAGS -o $test $test.c; then
|
|
||||||
echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
cat >$test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
int mytest()
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
return snprintf(buf, sizeof(buf), "%s", "foo");
|
|
||||||
}
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return (mytest());
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking for return value of snprintf()... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
CFLAGS="$CFLAGS -DHAS_snprintf_void"
|
|
||||||
SFLAGS="$SFLAGS -DHAS_snprintf_void"
|
|
||||||
echo "Checking for return value of snprintf()... No." | tee -a configure.log
|
|
||||||
echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log
|
|
||||||
echo " can build but will be open to possible string-format security" | tee -a configure.log
|
|
||||||
echo " vulnerabilities." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
CFLAGS="$CFLAGS -DNO_snprintf"
|
|
||||||
SFLAGS="$SFLAGS -DNO_snprintf"
|
|
||||||
echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log
|
|
||||||
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
|
|
||||||
|
|
||||||
echo >> configure.log
|
|
||||||
cat >$test.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
int mytest()
|
|
||||||
{
|
|
||||||
char buf[20];
|
|
||||||
return sprintf(buf, "%s", "foo");
|
|
||||||
}
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return (mytest());
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
|
||||||
echo "Checking for return value of sprintf()... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
CFLAGS="$CFLAGS -DHAS_sprintf_void"
|
|
||||||
SFLAGS="$SFLAGS -DHAS_sprintf_void"
|
|
||||||
echo "Checking for return value of sprintf()... No." | tee -a configure.log
|
|
||||||
echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log
|
|
||||||
echo " can build but will be open to possible string-format security" | tee -a configure.log
|
|
||||||
echo " vulnerabilities." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# see if we can hide zlib internal symbols that are linked between separate source files
|
|
||||||
if test "$gcc" -eq 1; then
|
|
||||||
echo >> configure.log
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
#define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
|
||||||
int ZLIB_INTERNAL foo;
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
if tryboth $CC -c $CFLAGS $test.c; then
|
|
||||||
CFLAGS="$CFLAGS -DHAVE_HIDDEN"
|
|
||||||
SFLAGS="$SFLAGS -DHAVE_HIDDEN"
|
|
||||||
echo "Checking for attribute(visibility) support... Yes." | tee -a configure.log
|
|
||||||
else
|
|
||||||
echo "Checking for attribute(visibility) support... No." | tee -a configure.log
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# show the results in the log
|
|
||||||
echo >> configure.log
|
|
||||||
echo ALL = $ALL >> configure.log
|
|
||||||
echo AR = $AR >> configure.log
|
|
||||||
echo ARFLAGS = $ARFLAGS >> configure.log
|
|
||||||
echo CC = $CC >> configure.log
|
|
||||||
echo CFLAGS = $CFLAGS >> configure.log
|
|
||||||
echo CPP = $CPP >> configure.log
|
|
||||||
echo EXE = $EXE >> configure.log
|
|
||||||
echo LDCONFIG = $LDCONFIG >> configure.log
|
|
||||||
echo LDFLAGS = $LDFLAGS >> configure.log
|
|
||||||
echo LDSHARED = $LDSHARED >> configure.log
|
|
||||||
echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log
|
|
||||||
echo OBJC = $OBJC >> configure.log
|
|
||||||
echo PIC_OBJC = $PIC_OBJC >> configure.log
|
|
||||||
echo RANLIB = $RANLIB >> configure.log
|
|
||||||
echo SFLAGS = $SFLAGS >> configure.log
|
|
||||||
echo SHAREDLIB = $SHAREDLIB >> configure.log
|
|
||||||
echo SHAREDLIBM = $SHAREDLIBM >> configure.log
|
|
||||||
echo SHAREDLIBV = $SHAREDLIBV >> configure.log
|
|
||||||
echo STATICLIB = $STATICLIB >> configure.log
|
|
||||||
echo TEST = $TEST >> configure.log
|
|
||||||
echo VER = $VER >> configure.log
|
|
||||||
echo SRCDIR = $SRCDIR >> configure.log
|
|
||||||
echo exec_prefix = $exec_prefix >> configure.log
|
|
||||||
echo includedir = $includedir >> configure.log
|
|
||||||
echo libdir = $libdir >> configure.log
|
|
||||||
echo mandir = $mandir >> configure.log
|
|
||||||
echo prefix = $prefix >> configure.log
|
|
||||||
echo sharedlibdir = $sharedlibdir >> configure.log
|
|
||||||
echo uname = $uname >> configure.log
|
|
||||||
|
|
||||||
# update Makefile with the configure results
|
|
||||||
sed < ${SRCDIR}Makefile.in "
|
|
||||||
/^CC *=/s#=.*#=$CC#
|
|
||||||
/^CFLAGS *=/s#=.*#=$CFLAGS#
|
|
||||||
/^SFLAGS *=/s#=.*#=$SFLAGS#
|
|
||||||
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
|
|
||||||
/^LDSHARED *=/s#=.*#=$LDSHARED#
|
|
||||||
/^CPP *=/s#=.*#=$CPP#
|
|
||||||
/^STATICLIB *=/s#=.*#=$STATICLIB#
|
|
||||||
/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
|
|
||||||
/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
|
|
||||||
/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
|
|
||||||
/^AR *=/s#=.*#=$AR#
|
|
||||||
/^ARFLAGS *=/s#=.*#=$ARFLAGS#
|
|
||||||
/^RANLIB *=/s#=.*#=$RANLIB#
|
|
||||||
/^LDCONFIG *=/s#=.*#=$LDCONFIG#
|
|
||||||
/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC#
|
|
||||||
/^EXE *=/s#=.*#=$EXE#
|
|
||||||
/^SRCDIR *=/s#=.*#=$SRCDIR#
|
|
||||||
/^ZINC *=/s#=.*#=$ZINC#
|
|
||||||
/^ZINCOUT *=/s#=.*#=$ZINCOUT#
|
|
||||||
/^prefix *=/s#=.*#=$prefix#
|
|
||||||
/^exec_prefix *=/s#=.*#=$exec_prefix#
|
|
||||||
/^libdir *=/s#=.*#=$libdir#
|
|
||||||
/^sharedlibdir *=/s#=.*#=$sharedlibdir#
|
|
||||||
/^includedir *=/s#=.*#=$includedir#
|
|
||||||
/^mandir *=/s#=.*#=$mandir#
|
|
||||||
/^OBJC *=/s#=.*#= $OBJC#
|
|
||||||
/^PIC_OBJC *=/s#=.*#= $PIC_OBJC#
|
|
||||||
/^all: */s#:.*#: $ALL#
|
|
||||||
/^test: */s#:.*#: $TEST#
|
|
||||||
" > Makefile
|
|
||||||
|
|
||||||
# create zlib.pc with the configure results
|
|
||||||
sed < ${SRCDIR}zlib.pc.in "
|
|
||||||
/^CC *=/s#=.*#=$CC#
|
|
||||||
/^CFLAGS *=/s#=.*#=$CFLAGS#
|
|
||||||
/^CPP *=/s#=.*#=$CPP#
|
|
||||||
/^LDSHARED *=/s#=.*#=$LDSHARED#
|
|
||||||
/^STATICLIB *=/s#=.*#=$STATICLIB#
|
|
||||||
/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
|
|
||||||
/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
|
|
||||||
/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
|
|
||||||
/^AR *=/s#=.*#=$AR#
|
|
||||||
/^ARFLAGS *=/s#=.*#=$ARFLAGS#
|
|
||||||
/^RANLIB *=/s#=.*#=$RANLIB#
|
|
||||||
/^EXE *=/s#=.*#=$EXE#
|
|
||||||
/^prefix *=/s#=.*#=$prefix#
|
|
||||||
/^exec_prefix *=/s#=.*#=$exec_prefix#
|
|
||||||
/^libdir *=/s#=.*#=$libdir#
|
|
||||||
/^sharedlibdir *=/s#=.*#=$sharedlibdir#
|
|
||||||
/^includedir *=/s#=.*#=$includedir#
|
|
||||||
/^mandir *=/s#=.*#=$mandir#
|
|
||||||
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
|
|
||||||
" | sed -e "
|
|
||||||
s/\@VERSION\@/$VER/g;
|
|
||||||
" > zlib.pc
|
|
||||||
|
|
||||||
# done
|
|
||||||
leave 0
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
All files under this contrib directory are UNSUPPORTED. They 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.
|
|
||||||
|
|
||||||
|
|
||||||
ada/ by Dmitriy Anisimkov <anisimkov@yahoo.com>
|
|
||||||
Support for Ada
|
|
||||||
See http://zlib-ada.sourceforge.net/
|
|
||||||
|
|
||||||
blast/ by Mark Adler <madler@alumni.caltech.edu>
|
|
||||||
Decompressor for output of PKWare Data Compression Library (DCL)
|
|
||||||
|
|
||||||
delphi/ by Cosmin Truta <cosmint@cs.ubbcluj.ro>
|
|
||||||
Support for Delphi and C++ Builder
|
|
||||||
|
|
||||||
dotzlib/ by Henrik Ravn <henrik@ravn.com>
|
|
||||||
Support for Microsoft .Net and Visual C++ .Net
|
|
||||||
|
|
||||||
gcc_gvmat64/by Gilles Vollant <info@winimage.com>
|
|
||||||
GCC Version of x86 64-bit (AMD64 and Intel EM64t) code for x64
|
|
||||||
assembler to replace longest_match() and inflate_fast()
|
|
||||||
|
|
||||||
infback9/ by Mark Adler <madler@alumni.caltech.edu>
|
|
||||||
Unsupported diffs to infback to decode the deflate64 format
|
|
||||||
|
|
||||||
iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
|
||||||
A C++ I/O streams interface to the zlib gz* functions
|
|
||||||
|
|
||||||
iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
|
|
||||||
Another C++ I/O streams interface
|
|
||||||
|
|
||||||
iostream3/ by Ludwig Schwardt <schwardt@sun.ac.za>
|
|
||||||
and Kevin Ruland <kevin@rodin.wustl.edu>
|
|
||||||
Yet another C++ I/O streams interface
|
|
||||||
|
|
||||||
minizip/ by Gilles Vollant <info@winimage.com>
|
|
||||||
Mini zip and unzip based on zlib
|
|
||||||
Includes Zip64 support by Mathias Svensson <mathias@result42.com>
|
|
||||||
See http://www.winimage.com/zLibDll/minizip.html
|
|
||||||
|
|
||||||
pascal/ by Bob Dellaca <bobdl@xtra.co.nz> et al.
|
|
||||||
Support for Pascal
|
|
||||||
|
|
||||||
puff/ by Mark Adler <madler@alumni.caltech.edu>
|
|
||||||
Small, low memory usage inflate. Also serves to provide an
|
|
||||||
unambiguous description of the deflate format.
|
|
||||||
|
|
||||||
testzlib/ by Gilles Vollant <info@winimage.com>
|
|
||||||
Example of the use of zlib
|
|
||||||
|
|
||||||
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,106 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
--
|
|
||||||
-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $
|
|
||||||
|
|
||||||
-- This demo program provided by Dr Steve Sangwine <sjs@essex.ac.uk>
|
|
||||||
--
|
|
||||||
-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer
|
|
||||||
-- of exactly the correct size is used for decompressed data, and the last
|
|
||||||
-- few bytes passed in to Zlib are checksum bytes.
|
|
||||||
|
|
||||||
-- This program compresses a string of text, and then decompresses the
|
|
||||||
-- compressed text into a buffer of the same size as the original text.
|
|
||||||
|
|
||||||
with Ada.Streams; use Ada.Streams;
|
|
||||||
with Ada.Text_IO;
|
|
||||||
|
|
||||||
with ZLib; use ZLib;
|
|
||||||
|
|
||||||
procedure Buffer_Demo is
|
|
||||||
EOL : Character renames ASCII.LF;
|
|
||||||
Text : constant String
|
|
||||||
:= "Four score and seven years ago our fathers brought forth," & EOL &
|
|
||||||
"upon this continent, a new nation, conceived in liberty," & EOL &
|
|
||||||
"and dedicated to the proposition that `all men are created equal'.";
|
|
||||||
|
|
||||||
Source : Stream_Element_Array (1 .. Text'Length);
|
|
||||||
for Source'Address use Text'Address;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Ada.Text_IO.Put (Text);
|
|
||||||
Ada.Text_IO.New_Line;
|
|
||||||
Ada.Text_IO.Put_Line
|
|
||||||
("Uncompressed size : " & Positive'Image (Text'Length) & " bytes");
|
|
||||||
|
|
||||||
declare
|
|
||||||
Compressed_Data : Stream_Element_Array (1 .. Text'Length);
|
|
||||||
L : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
Compress : declare
|
|
||||||
Compressor : Filter_Type;
|
|
||||||
I : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
Deflate_Init (Compressor);
|
|
||||||
|
|
||||||
-- Compress the whole of T at once.
|
|
||||||
|
|
||||||
Translate (Compressor, Source, I, Compressed_Data, L, Finish);
|
|
||||||
pragma Assert (I = Source'Last);
|
|
||||||
|
|
||||||
Close (Compressor);
|
|
||||||
|
|
||||||
Ada.Text_IO.Put_Line
|
|
||||||
("Compressed size : "
|
|
||||||
& Stream_Element_Offset'Image (L) & " bytes");
|
|
||||||
end Compress;
|
|
||||||
|
|
||||||
-- Now we decompress the data, passing short blocks of data to Zlib
|
|
||||||
-- (because this demonstrates the problem - the last block passed will
|
|
||||||
-- contain checksum information and there will be no output, only a
|
|
||||||
-- check inside Zlib that the checksum is correct).
|
|
||||||
|
|
||||||
Decompress : declare
|
|
||||||
Decompressor : Filter_Type;
|
|
||||||
|
|
||||||
Uncompressed_Data : Stream_Element_Array (1 .. Text'Length);
|
|
||||||
|
|
||||||
Block_Size : constant := 4;
|
|
||||||
-- This makes sure that the last block contains
|
|
||||||
-- only Adler checksum data.
|
|
||||||
|
|
||||||
P : Stream_Element_Offset := Compressed_Data'First - 1;
|
|
||||||
O : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
Inflate_Init (Decompressor);
|
|
||||||
|
|
||||||
loop
|
|
||||||
Translate
|
|
||||||
(Decompressor,
|
|
||||||
Compressed_Data
|
|
||||||
(P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)),
|
|
||||||
P,
|
|
||||||
Uncompressed_Data
|
|
||||||
(Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last),
|
|
||||||
O,
|
|
||||||
No_Flush);
|
|
||||||
|
|
||||||
Ada.Text_IO.Put_Line
|
|
||||||
("Total in : " & Count'Image (Total_In (Decompressor)) &
|
|
||||||
", out : " & Count'Image (Total_Out (Decompressor)));
|
|
||||||
|
|
||||||
exit when P = L;
|
|
||||||
end loop;
|
|
||||||
|
|
||||||
Ada.Text_IO.New_Line;
|
|
||||||
Ada.Text_IO.Put_Line
|
|
||||||
("Decompressed text matches original text : "
|
|
||||||
& Boolean'Image (Uncompressed_Data = Source));
|
|
||||||
end Decompress;
|
|
||||||
end;
|
|
||||||
end Buffer_Demo;
|
|
||||||
|
|
@ -1,156 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
-- Continuous test for ZLib multithreading. If the test would fail
|
|
||||||
-- we should provide thread safe allocation routines for the Z_Stream.
|
|
||||||
--
|
|
||||||
-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $
|
|
||||||
|
|
||||||
with ZLib;
|
|
||||||
with Ada.Streams;
|
|
||||||
with Ada.Numerics.Discrete_Random;
|
|
||||||
with Ada.Text_IO;
|
|
||||||
with Ada.Exceptions;
|
|
||||||
with Ada.Task_Identification;
|
|
||||||
|
|
||||||
procedure MTest is
|
|
||||||
use Ada.Streams;
|
|
||||||
use ZLib;
|
|
||||||
|
|
||||||
Stop : Boolean := False;
|
|
||||||
|
|
||||||
pragma Atomic (Stop);
|
|
||||||
|
|
||||||
subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
|
|
||||||
|
|
||||||
package Random_Elements is
|
|
||||||
new Ada.Numerics.Discrete_Random (Visible_Symbols);
|
|
||||||
|
|
||||||
task type Test_Task;
|
|
||||||
|
|
||||||
task body Test_Task is
|
|
||||||
Buffer : Stream_Element_Array (1 .. 100_000);
|
|
||||||
Gen : Random_Elements.Generator;
|
|
||||||
|
|
||||||
Buffer_First : Stream_Element_Offset;
|
|
||||||
Compare_First : Stream_Element_Offset;
|
|
||||||
|
|
||||||
Deflate : Filter_Type;
|
|
||||||
Inflate : Filter_Type;
|
|
||||||
|
|
||||||
procedure Further (Item : in Stream_Element_Array);
|
|
||||||
|
|
||||||
procedure Read_Buffer
|
|
||||||
(Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset);
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Further --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
procedure Further (Item : in Stream_Element_Array) is
|
|
||||||
|
|
||||||
procedure Compare (Item : in Stream_Element_Array);
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Compare --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
procedure Compare (Item : in Stream_Element_Array) is
|
|
||||||
Next_First : Stream_Element_Offset := Compare_First + Item'Length;
|
|
||||||
begin
|
|
||||||
if Buffer (Compare_First .. Next_First - 1) /= Item then
|
|
||||||
raise Program_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Compare_First := Next_First;
|
|
||||||
end Compare;
|
|
||||||
|
|
||||||
procedure Compare_Write is new ZLib.Write (Write => Compare);
|
|
||||||
begin
|
|
||||||
Compare_Write (Inflate, Item, No_Flush);
|
|
||||||
end Further;
|
|
||||||
|
|
||||||
-----------------
|
|
||||||
-- Read_Buffer --
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
procedure Read_Buffer
|
|
||||||
(Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset)
|
|
||||||
is
|
|
||||||
Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First;
|
|
||||||
Next_First : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
if Item'Length <= Buff_Diff then
|
|
||||||
Last := Item'Last;
|
|
||||||
|
|
||||||
Next_First := Buffer_First + Item'Length;
|
|
||||||
|
|
||||||
Item := Buffer (Buffer_First .. Next_First - 1);
|
|
||||||
|
|
||||||
Buffer_First := Next_First;
|
|
||||||
else
|
|
||||||
Last := Item'First + Buff_Diff;
|
|
||||||
Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
|
|
||||||
Buffer_First := Buffer'Last + 1;
|
|
||||||
end if;
|
|
||||||
end Read_Buffer;
|
|
||||||
|
|
||||||
procedure Translate is new Generic_Translate
|
|
||||||
(Data_In => Read_Buffer,
|
|
||||||
Data_Out => Further);
|
|
||||||
|
|
||||||
begin
|
|
||||||
Random_Elements.Reset (Gen);
|
|
||||||
|
|
||||||
Buffer := (others => 20);
|
|
||||||
|
|
||||||
Main : loop
|
|
||||||
for J in Buffer'Range loop
|
|
||||||
Buffer (J) := Random_Elements.Random (Gen);
|
|
||||||
|
|
||||||
Deflate_Init (Deflate);
|
|
||||||
Inflate_Init (Inflate);
|
|
||||||
|
|
||||||
Buffer_First := Buffer'First;
|
|
||||||
Compare_First := Buffer'First;
|
|
||||||
|
|
||||||
Translate (Deflate);
|
|
||||||
|
|
||||||
if Compare_First /= Buffer'Last + 1 then
|
|
||||||
raise Program_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Ada.Text_IO.Put_Line
|
|
||||||
(Ada.Task_Identification.Image
|
|
||||||
(Ada.Task_Identification.Current_Task)
|
|
||||||
& Stream_Element_Offset'Image (J)
|
|
||||||
& ZLib.Count'Image (Total_Out (Deflate)));
|
|
||||||
|
|
||||||
Close (Deflate);
|
|
||||||
Close (Inflate);
|
|
||||||
|
|
||||||
exit Main when Stop;
|
|
||||||
end loop;
|
|
||||||
end loop Main;
|
|
||||||
exception
|
|
||||||
when E : others =>
|
|
||||||
Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
|
|
||||||
Stop := True;
|
|
||||||
end Test_Task;
|
|
||||||
|
|
||||||
Test : array (1 .. 4) of Test_Task;
|
|
||||||
|
|
||||||
pragma Unreferenced (Test);
|
|
||||||
|
|
||||||
Dummy : Character;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Ada.Text_IO.Get_Immediate (Dummy);
|
|
||||||
Stop := True;
|
|
||||||
end MTest;
|
|
||||||
|
|
@ -1,156 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $
|
|
||||||
|
|
||||||
-- Test/demo program for the generic read interface.
|
|
||||||
|
|
||||||
with Ada.Numerics.Discrete_Random;
|
|
||||||
with Ada.Streams;
|
|
||||||
with Ada.Text_IO;
|
|
||||||
|
|
||||||
with ZLib;
|
|
||||||
|
|
||||||
procedure Read is
|
|
||||||
|
|
||||||
use Ada.Streams;
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
-- Test configuration parameters --
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
File_Size : Stream_Element_Offset := 100_000;
|
|
||||||
|
|
||||||
Continuous : constant Boolean := False;
|
|
||||||
-- If this constant is True, the test would be repeated again and again,
|
|
||||||
-- with increment File_Size for every iteration.
|
|
||||||
|
|
||||||
Header : constant ZLib.Header_Type := ZLib.Default;
|
|
||||||
-- Do not use Header other than Default in ZLib versions 1.1.4 and older.
|
|
||||||
|
|
||||||
Init_Random : constant := 8;
|
|
||||||
-- We are using the same random sequence, in case of we catch bug,
|
|
||||||
-- so we would be able to reproduce it.
|
|
||||||
|
|
||||||
-- End --
|
|
||||||
|
|
||||||
Pack_Size : Stream_Element_Offset;
|
|
||||||
Offset : Stream_Element_Offset;
|
|
||||||
|
|
||||||
Filter : ZLib.Filter_Type;
|
|
||||||
|
|
||||||
subtype Visible_Symbols
|
|
||||||
is Stream_Element range 16#20# .. 16#7E#;
|
|
||||||
|
|
||||||
package Random_Elements is new
|
|
||||||
Ada.Numerics.Discrete_Random (Visible_Symbols);
|
|
||||||
|
|
||||||
Gen : Random_Elements.Generator;
|
|
||||||
Period : constant Stream_Element_Offset := 200;
|
|
||||||
-- Period constant variable for random generator not to be very random.
|
|
||||||
-- Bigger period, harder random.
|
|
||||||
|
|
||||||
Read_Buffer : Stream_Element_Array (1 .. 2048);
|
|
||||||
Read_First : Stream_Element_Offset;
|
|
||||||
Read_Last : Stream_Element_Offset;
|
|
||||||
|
|
||||||
procedure Reset;
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset);
|
|
||||||
-- this procedure is for generic instantiation of
|
|
||||||
-- ZLib.Read
|
|
||||||
-- reading data from the File_In.
|
|
||||||
|
|
||||||
procedure Read is new ZLib.Read
|
|
||||||
(Read,
|
|
||||||
Read_Buffer,
|
|
||||||
Rest_First => Read_First,
|
|
||||||
Rest_Last => Read_Last);
|
|
||||||
|
|
||||||
----------
|
|
||||||
-- Read --
|
|
||||||
----------
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset) is
|
|
||||||
begin
|
|
||||||
Last := Stream_Element_Offset'Min
|
|
||||||
(Item'Last,
|
|
||||||
Item'First + File_Size - Offset);
|
|
||||||
|
|
||||||
for J in Item'First .. Last loop
|
|
||||||
if J < Item'First + Period then
|
|
||||||
Item (J) := Random_Elements.Random (Gen);
|
|
||||||
else
|
|
||||||
Item (J) := Item (J - Period);
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Offset := Offset + 1;
|
|
||||||
end loop;
|
|
||||||
end Read;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Reset --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Reset is
|
|
||||||
begin
|
|
||||||
Random_Elements.Reset (Gen, Init_Random);
|
|
||||||
Pack_Size := 0;
|
|
||||||
Offset := 1;
|
|
||||||
Read_First := Read_Buffer'Last + 1;
|
|
||||||
Read_Last := Read_Buffer'Last;
|
|
||||||
end Reset;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
|
|
||||||
|
|
||||||
loop
|
|
||||||
for Level in ZLib.Compression_Level'Range loop
|
|
||||||
|
|
||||||
Ada.Text_IO.Put ("Level ="
|
|
||||||
& ZLib.Compression_Level'Image (Level));
|
|
||||||
|
|
||||||
-- Deflate using generic instantiation.
|
|
||||||
|
|
||||||
ZLib.Deflate_Init
|
|
||||||
(Filter,
|
|
||||||
Level,
|
|
||||||
Header => Header);
|
|
||||||
|
|
||||||
Reset;
|
|
||||||
|
|
||||||
Ada.Text_IO.Put
|
|
||||||
(Stream_Element_Offset'Image (File_Size) & " ->");
|
|
||||||
|
|
||||||
loop
|
|
||||||
declare
|
|
||||||
Buffer : Stream_Element_Array (1 .. 1024);
|
|
||||||
Last : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
Read (Filter, Buffer, Last);
|
|
||||||
|
|
||||||
Pack_Size := Pack_Size + Last - Buffer'First + 1;
|
|
||||||
|
|
||||||
exit when Last < Buffer'Last;
|
|
||||||
end;
|
|
||||||
end loop;
|
|
||||||
|
|
||||||
Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
|
|
||||||
|
|
||||||
ZLib.Close (Filter);
|
|
||||||
end loop;
|
|
||||||
|
|
||||||
exit when not Continuous;
|
|
||||||
|
|
||||||
File_Size := File_Size + 1;
|
|
||||||
end loop;
|
|
||||||
end Read;
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
ZLib for Ada thick binding (ZLib.Ada)
|
|
||||||
Release 1.3
|
|
||||||
|
|
||||||
ZLib.Ada is a thick binding interface to the popular ZLib data
|
|
||||||
compression library, available at http://www.gzip.org/zlib/.
|
|
||||||
It provides Ada-style access to the ZLib C library.
|
|
||||||
|
|
||||||
|
|
||||||
Here are the main changes since ZLib.Ada 1.2:
|
|
||||||
|
|
||||||
- Attention: ZLib.Read generic routine have a initialization requirement
|
|
||||||
for Read_Last parameter now. It is a bit incompatible with previous version,
|
|
||||||
but extends functionality, we could use new parameters Allow_Read_Some and
|
|
||||||
Flush now.
|
|
||||||
|
|
||||||
- Added Is_Open routines to ZLib and ZLib.Streams packages.
|
|
||||||
|
|
||||||
- Add pragma Assert to check Stream_Element is 8 bit.
|
|
||||||
|
|
||||||
- Fix extraction to buffer with exact known decompressed size. Error reported by
|
|
||||||
Steve Sangwine.
|
|
||||||
|
|
||||||
- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits
|
|
||||||
computers. Patch provided by Pascal Obry.
|
|
||||||
|
|
||||||
- Add Status_Error exception definition.
|
|
||||||
|
|
||||||
- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit.
|
|
||||||
|
|
||||||
|
|
||||||
How to build ZLib.Ada under GNAT
|
|
||||||
|
|
||||||
You should have the ZLib library already build on your computer, before
|
|
||||||
building ZLib.Ada. Make the directory of ZLib.Ada sources current and
|
|
||||||
issue the command:
|
|
||||||
|
|
||||||
gnatmake test -largs -L<directory where libz.a is> -lz
|
|
||||||
|
|
||||||
Or use the GNAT project file build for GNAT 3.15 or later:
|
|
||||||
|
|
||||||
gnatmake -Pzlib.gpr -L<directory where libz.a is>
|
|
||||||
|
|
||||||
|
|
||||||
How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
|
|
||||||
|
|
||||||
1. Make a project with all *.ads and *.adb files from the distribution.
|
|
||||||
2. Build the libz.a library from the ZLib C sources.
|
|
||||||
3. Rename libz.a to z.lib.
|
|
||||||
4. Add the library z.lib to the project.
|
|
||||||
5. Add the libc.lib library from the ObjectAda distribution to the project.
|
|
||||||
6. Build the executable using test.adb as a main procedure.
|
|
||||||
|
|
||||||
|
|
||||||
How to use ZLib.Ada
|
|
||||||
|
|
||||||
The source files test.adb and read.adb are small demo programs that show
|
|
||||||
the main functionality of ZLib.Ada.
|
|
||||||
|
|
||||||
The routines from the package specifications are commented.
|
|
||||||
|
|
||||||
|
|
||||||
Homepage: http://zlib-ada.sourceforge.net/
|
|
||||||
Author: Dmitriy Anisimkov <anisimkov@yahoo.com>
|
|
||||||
|
|
||||||
Contributors: Pascal Obry <pascal@obry.org>, Steve Sangwine <sjs@essex.ac.uk>
|
|
||||||
|
|
@ -1,463 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $
|
|
||||||
|
|
||||||
-- The program has a few aims.
|
|
||||||
-- 1. Test ZLib.Ada95 thick binding functionality.
|
|
||||||
-- 2. Show the example of use main functionality of the ZLib.Ada95 binding.
|
|
||||||
-- 3. Build this program automatically compile all ZLib.Ada95 packages under
|
|
||||||
-- GNAT Ada95 compiler.
|
|
||||||
|
|
||||||
with ZLib.Streams;
|
|
||||||
with Ada.Streams.Stream_IO;
|
|
||||||
with Ada.Numerics.Discrete_Random;
|
|
||||||
|
|
||||||
with Ada.Text_IO;
|
|
||||||
|
|
||||||
with Ada.Calendar;
|
|
||||||
|
|
||||||
procedure Test is
|
|
||||||
|
|
||||||
use Ada.Streams;
|
|
||||||
use Stream_IO;
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
-- Test configuration parameters --
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
File_Size : Count := 100_000;
|
|
||||||
Continuous : constant Boolean := False;
|
|
||||||
|
|
||||||
Header : constant ZLib.Header_Type := ZLib.Default;
|
|
||||||
-- ZLib.None;
|
|
||||||
-- ZLib.Auto;
|
|
||||||
-- ZLib.GZip;
|
|
||||||
-- Do not use Header other then Default in ZLib versions 1.1.4
|
|
||||||
-- and older.
|
|
||||||
|
|
||||||
Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
|
|
||||||
Init_Random : constant := 10;
|
|
||||||
|
|
||||||
-- End --
|
|
||||||
|
|
||||||
In_File_Name : constant String := "testzlib.in";
|
|
||||||
-- Name of the input file
|
|
||||||
|
|
||||||
Z_File_Name : constant String := "testzlib.zlb";
|
|
||||||
-- Name of the compressed file.
|
|
||||||
|
|
||||||
Out_File_Name : constant String := "testzlib.out";
|
|
||||||
-- Name of the decompressed file.
|
|
||||||
|
|
||||||
File_In : File_Type;
|
|
||||||
File_Out : File_Type;
|
|
||||||
File_Back : File_Type;
|
|
||||||
File_Z : ZLib.Streams.Stream_Type;
|
|
||||||
|
|
||||||
Filter : ZLib.Filter_Type;
|
|
||||||
|
|
||||||
Time_Stamp : Ada.Calendar.Time;
|
|
||||||
|
|
||||||
procedure Generate_File;
|
|
||||||
-- Generate file of specified 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.
|
|
||||||
-- It is for compare data before and after compression/decompression.
|
|
||||||
|
|
||||||
procedure Compare_Files (Left, Right : String);
|
|
||||||
-- Compare files. Based on the Compare_Streams.
|
|
||||||
|
|
||||||
procedure Copy_Streams
|
|
||||||
(Source, Target : in out Root_Stream_Type'Class;
|
|
||||||
Buffer_Size : in Stream_Element_Offset := 1024);
|
|
||||||
-- Copying data from one stream to another. It is for test stream
|
|
||||||
-- interface of the library.
|
|
||||||
|
|
||||||
procedure Data_In
|
|
||||||
(Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset);
|
|
||||||
-- this procedure is for generic instantiation of
|
|
||||||
-- ZLib.Generic_Translate.
|
|
||||||
-- reading data from the File_In.
|
|
||||||
|
|
||||||
procedure Data_Out (Item : in Stream_Element_Array);
|
|
||||||
-- this procedure is for generic instantiation of
|
|
||||||
-- ZLib.Generic_Translate.
|
|
||||||
-- writing data to the File_Out.
|
|
||||||
|
|
||||||
procedure Stamp;
|
|
||||||
-- Store the timestamp to the local variable.
|
|
||||||
|
|
||||||
procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
|
|
||||||
-- Print the time statistic with the message.
|
|
||||||
|
|
||||||
procedure Translate is new ZLib.Generic_Translate
|
|
||||||
(Data_In => Data_In,
|
|
||||||
Data_Out => Data_Out);
|
|
||||||
-- This procedure is moving data from File_In to File_Out
|
|
||||||
-- with compression or decompression, depend on initialization of
|
|
||||||
-- Filter parameter.
|
|
||||||
|
|
||||||
-------------------
|
|
||||||
-- Compare_Files --
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
procedure Compare_Files (Left, Right : String) is
|
|
||||||
Left_File, Right_File : File_Type;
|
|
||||||
begin
|
|
||||||
Open (Left_File, In_File, Left);
|
|
||||||
Open (Right_File, In_File, Right);
|
|
||||||
Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
|
|
||||||
Close (Left_File);
|
|
||||||
Close (Right_File);
|
|
||||||
end Compare_Files;
|
|
||||||
|
|
||||||
---------------------
|
|
||||||
-- Compare_Streams --
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
procedure Compare_Streams
|
|
||||||
(Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
|
|
||||||
is
|
|
||||||
Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
|
|
||||||
Left_Last, Right_Last : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
loop
|
|
||||||
Read (Left, Left_Buffer, Left_Last);
|
|
||||||
Read (Right, Right_Buffer, Right_Last);
|
|
||||||
|
|
||||||
if Left_Last /= Right_Last then
|
|
||||||
Ada.Text_IO.Put_Line ("Compare error :"
|
|
||||||
& Stream_Element_Offset'Image (Left_Last)
|
|
||||||
& " /= "
|
|
||||||
& Stream_Element_Offset'Image (Right_Last));
|
|
||||||
|
|
||||||
raise Constraint_Error;
|
|
||||||
|
|
||||||
elsif Left_Buffer (0 .. Left_Last)
|
|
||||||
/= Right_Buffer (0 .. Right_Last)
|
|
||||||
then
|
|
||||||
Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
|
|
||||||
raise Constraint_Error;
|
|
||||||
|
|
||||||
end if;
|
|
||||||
|
|
||||||
exit when Left_Last < Left_Buffer'Last;
|
|
||||||
end loop;
|
|
||||||
end Compare_Streams;
|
|
||||||
|
|
||||||
------------------
|
|
||||||
-- Copy_Streams --
|
|
||||||
------------------
|
|
||||||
|
|
||||||
procedure Copy_Streams
|
|
||||||
(Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
|
|
||||||
Buffer_Size : in Stream_Element_Offset := 1024)
|
|
||||||
is
|
|
||||||
Buffer : Stream_Element_Array (1 .. Buffer_Size);
|
|
||||||
Last : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
loop
|
|
||||||
Read (Source, Buffer, Last);
|
|
||||||
Write (Target, Buffer (1 .. Last));
|
|
||||||
|
|
||||||
exit when Last < Buffer'Last;
|
|
||||||
end loop;
|
|
||||||
end Copy_Streams;
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Data_In --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
procedure Data_In
|
|
||||||
(Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset) is
|
|
||||||
begin
|
|
||||||
Read (File_In, Item, Last);
|
|
||||||
end Data_In;
|
|
||||||
|
|
||||||
--------------
|
|
||||||
-- Data_Out --
|
|
||||||
--------------
|
|
||||||
|
|
||||||
procedure Data_Out (Item : in Stream_Element_Array) is
|
|
||||||
begin
|
|
||||||
Write (File_Out, Item);
|
|
||||||
end Data_Out;
|
|
||||||
|
|
||||||
-------------------
|
|
||||||
-- Generate_File --
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
procedure Generate_File is
|
|
||||||
subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
|
|
||||||
|
|
||||||
package Random_Elements is
|
|
||||||
new Ada.Numerics.Discrete_Random (Visible_Symbols);
|
|
||||||
|
|
||||||
Gen : Random_Elements.Generator;
|
|
||||||
Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
|
|
||||||
|
|
||||||
Buffer_Count : constant Count := File_Size / Buffer'Length;
|
|
||||||
-- Number of same buffers in the packet.
|
|
||||||
|
|
||||||
Density : constant Count := 30; -- from 0 to Buffer'Length - 2;
|
|
||||||
|
|
||||||
procedure Fill_Buffer (J, D : in Count);
|
|
||||||
-- Change the part of the buffer.
|
|
||||||
|
|
||||||
-----------------
|
|
||||||
-- Fill_Buffer --
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
procedure Fill_Buffer (J, D : in Count) is
|
|
||||||
begin
|
|
||||||
for K in 0 .. D loop
|
|
||||||
Buffer
|
|
||||||
(Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
|
|
||||||
:= Random_Elements.Random (Gen);
|
|
||||||
|
|
||||||
end loop;
|
|
||||||
end Fill_Buffer;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Random_Elements.Reset (Gen, Init_Random);
|
|
||||||
|
|
||||||
Create (File_In, Out_File, In_File_Name);
|
|
||||||
|
|
||||||
Fill_Buffer (1, Buffer'Length - 2);
|
|
||||||
|
|
||||||
for J in 1 .. Buffer_Count loop
|
|
||||||
Write (File_In, Buffer);
|
|
||||||
|
|
||||||
Fill_Buffer (J, Density);
|
|
||||||
end loop;
|
|
||||||
|
|
||||||
-- fill remain size.
|
|
||||||
|
|
||||||
Write
|
|
||||||
(File_In,
|
|
||||||
Buffer
|
|
||||||
(1 .. Stream_Element_Offset
|
|
||||||
(File_Size - Buffer'Length * Buffer_Count)));
|
|
||||||
|
|
||||||
Flush (File_In);
|
|
||||||
Close (File_In);
|
|
||||||
end Generate_File;
|
|
||||||
|
|
||||||
---------------------
|
|
||||||
-- Print_Statistic --
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
|
|
||||||
use Ada.Calendar;
|
|
||||||
use Ada.Text_IO;
|
|
||||||
|
|
||||||
package Count_IO is new Integer_IO (ZLib.Count);
|
|
||||||
|
|
||||||
Curr_Dur : Duration := Clock - Time_Stamp;
|
|
||||||
begin
|
|
||||||
Put (Msg);
|
|
||||||
|
|
||||||
Set_Col (20);
|
|
||||||
Ada.Text_IO.Put ("size =");
|
|
||||||
|
|
||||||
Count_IO.Put
|
|
||||||
(Data_Size,
|
|
||||||
Width => Stream_IO.Count'Image (File_Size)'Length);
|
|
||||||
|
|
||||||
Put_Line (" duration =" & Duration'Image (Curr_Dur));
|
|
||||||
end Print_Statistic;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Stamp --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Stamp is
|
|
||||||
begin
|
|
||||||
Time_Stamp := Ada.Calendar.Clock;
|
|
||||||
end Stamp;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
|
|
||||||
|
|
||||||
loop
|
|
||||||
Generate_File;
|
|
||||||
|
|
||||||
for Level in ZLib.Compression_Level'Range loop
|
|
||||||
|
|
||||||
Ada.Text_IO.Put_Line ("Level ="
|
|
||||||
& ZLib.Compression_Level'Image (Level));
|
|
||||||
|
|
||||||
-- Test generic interface.
|
|
||||||
Open (File_In, In_File, In_File_Name);
|
|
||||||
Create (File_Out, Out_File, Z_File_Name);
|
|
||||||
|
|
||||||
Stamp;
|
|
||||||
|
|
||||||
-- Deflate using generic instantiation.
|
|
||||||
|
|
||||||
ZLib.Deflate_Init
|
|
||||||
(Filter => Filter,
|
|
||||||
Level => Level,
|
|
||||||
Strategy => Strategy,
|
|
||||||
Header => Header);
|
|
||||||
|
|
||||||
Translate (Filter);
|
|
||||||
Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
|
|
||||||
ZLib.Close (Filter);
|
|
||||||
|
|
||||||
Close (File_In);
|
|
||||||
Close (File_Out);
|
|
||||||
|
|
||||||
Open (File_In, In_File, Z_File_Name);
|
|
||||||
Create (File_Out, Out_File, Out_File_Name);
|
|
||||||
|
|
||||||
Stamp;
|
|
||||||
|
|
||||||
-- Inflate using generic instantiation.
|
|
||||||
|
|
||||||
ZLib.Inflate_Init (Filter, Header => Header);
|
|
||||||
|
|
||||||
Translate (Filter);
|
|
||||||
Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
|
|
||||||
|
|
||||||
ZLib.Close (Filter);
|
|
||||||
|
|
||||||
Close (File_In);
|
|
||||||
Close (File_Out);
|
|
||||||
|
|
||||||
Compare_Files (In_File_Name, Out_File_Name);
|
|
||||||
|
|
||||||
-- Test stream interface.
|
|
||||||
|
|
||||||
-- Compress to the back stream.
|
|
||||||
|
|
||||||
Open (File_In, In_File, In_File_Name);
|
|
||||||
Create (File_Back, Out_File, Z_File_Name);
|
|
||||||
|
|
||||||
Stamp;
|
|
||||||
|
|
||||||
ZLib.Streams.Create
|
|
||||||
(Stream => File_Z,
|
|
||||||
Mode => ZLib.Streams.Out_Stream,
|
|
||||||
Back => ZLib.Streams.Stream_Access
|
|
||||||
(Stream (File_Back)),
|
|
||||||
Back_Compressed => True,
|
|
||||||
Level => Level,
|
|
||||||
Strategy => Strategy,
|
|
||||||
Header => Header);
|
|
||||||
|
|
||||||
Copy_Streams
|
|
||||||
(Source => Stream (File_In).all,
|
|
||||||
Target => File_Z);
|
|
||||||
|
|
||||||
-- Flushing internal buffers to the back stream.
|
|
||||||
|
|
||||||
ZLib.Streams.Flush (File_Z, ZLib.Finish);
|
|
||||||
|
|
||||||
Print_Statistic ("Write compress",
|
|
||||||
ZLib.Streams.Write_Total_Out (File_Z));
|
|
||||||
|
|
||||||
ZLib.Streams.Close (File_Z);
|
|
||||||
|
|
||||||
Close (File_In);
|
|
||||||
Close (File_Back);
|
|
||||||
|
|
||||||
-- Compare reading from original file and from
|
|
||||||
-- decompression stream.
|
|
||||||
|
|
||||||
Open (File_In, In_File, In_File_Name);
|
|
||||||
Open (File_Back, In_File, Z_File_Name);
|
|
||||||
|
|
||||||
ZLib.Streams.Create
|
|
||||||
(Stream => File_Z,
|
|
||||||
Mode => ZLib.Streams.In_Stream,
|
|
||||||
Back => ZLib.Streams.Stream_Access
|
|
||||||
(Stream (File_Back)),
|
|
||||||
Back_Compressed => True,
|
|
||||||
Header => Header);
|
|
||||||
|
|
||||||
Stamp;
|
|
||||||
Compare_Streams (Stream (File_In).all, File_Z);
|
|
||||||
|
|
||||||
Print_Statistic ("Read decompress",
|
|
||||||
ZLib.Streams.Read_Total_Out (File_Z));
|
|
||||||
|
|
||||||
ZLib.Streams.Close (File_Z);
|
|
||||||
Close (File_In);
|
|
||||||
Close (File_Back);
|
|
||||||
|
|
||||||
-- Compress by reading from compression stream.
|
|
||||||
|
|
||||||
Open (File_Back, In_File, In_File_Name);
|
|
||||||
Create (File_Out, Out_File, Z_File_Name);
|
|
||||||
|
|
||||||
ZLib.Streams.Create
|
|
||||||
(Stream => File_Z,
|
|
||||||
Mode => ZLib.Streams.In_Stream,
|
|
||||||
Back => ZLib.Streams.Stream_Access
|
|
||||||
(Stream (File_Back)),
|
|
||||||
Back_Compressed => False,
|
|
||||||
Level => Level,
|
|
||||||
Strategy => Strategy,
|
|
||||||
Header => Header);
|
|
||||||
|
|
||||||
Stamp;
|
|
||||||
Copy_Streams
|
|
||||||
(Source => File_Z,
|
|
||||||
Target => Stream (File_Out).all);
|
|
||||||
|
|
||||||
Print_Statistic ("Read compress",
|
|
||||||
ZLib.Streams.Read_Total_Out (File_Z));
|
|
||||||
|
|
||||||
ZLib.Streams.Close (File_Z);
|
|
||||||
|
|
||||||
Close (File_Out);
|
|
||||||
Close (File_Back);
|
|
||||||
|
|
||||||
-- Decompress to decompression stream.
|
|
||||||
|
|
||||||
Open (File_In, In_File, Z_File_Name);
|
|
||||||
Create (File_Back, Out_File, Out_File_Name);
|
|
||||||
|
|
||||||
ZLib.Streams.Create
|
|
||||||
(Stream => File_Z,
|
|
||||||
Mode => ZLib.Streams.Out_Stream,
|
|
||||||
Back => ZLib.Streams.Stream_Access
|
|
||||||
(Stream (File_Back)),
|
|
||||||
Back_Compressed => False,
|
|
||||||
Header => Header);
|
|
||||||
|
|
||||||
Stamp;
|
|
||||||
|
|
||||||
Copy_Streams
|
|
||||||
(Source => Stream (File_In).all,
|
|
||||||
Target => File_Z);
|
|
||||||
|
|
||||||
Print_Statistic ("Write decompress",
|
|
||||||
ZLib.Streams.Write_Total_Out (File_Z));
|
|
||||||
|
|
||||||
ZLib.Streams.Close (File_Z);
|
|
||||||
Close (File_In);
|
|
||||||
Close (File_Back);
|
|
||||||
|
|
||||||
Compare_Files (In_File_Name, Out_File_Name);
|
|
||||||
end loop;
|
|
||||||
|
|
||||||
Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
|
|
||||||
|
|
||||||
exit when not Continuous;
|
|
||||||
|
|
||||||
File_Size := File_Size + 1;
|
|
||||||
end loop;
|
|
||||||
end Test;
|
|
||||||
|
|
@ -1,225 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $
|
|
||||||
|
|
||||||
with Ada.Unchecked_Deallocation;
|
|
||||||
|
|
||||||
package body ZLib.Streams is
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Close --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Close (Stream : in out Stream_Type) is
|
|
||||||
procedure Free is new Ada.Unchecked_Deallocation
|
|
||||||
(Stream_Element_Array, Buffer_Access);
|
|
||||||
begin
|
|
||||||
if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
|
|
||||||
-- We should flush the data written by the writer.
|
|
||||||
|
|
||||||
Flush (Stream, Finish);
|
|
||||||
|
|
||||||
Close (Stream.Writer);
|
|
||||||
end if;
|
|
||||||
|
|
||||||
if Stream.Mode = In_Stream or Stream.Mode = Duplex then
|
|
||||||
Close (Stream.Reader);
|
|
||||||
Free (Stream.Buffer);
|
|
||||||
end if;
|
|
||||||
end Close;
|
|
||||||
|
|
||||||
------------
|
|
||||||
-- Create --
|
|
||||||
------------
|
|
||||||
|
|
||||||
procedure Create
|
|
||||||
(Stream : out Stream_Type;
|
|
||||||
Mode : in Stream_Mode;
|
|
||||||
Back : in Stream_Access;
|
|
||||||
Back_Compressed : in Boolean;
|
|
||||||
Level : in Compression_Level := Default_Compression;
|
|
||||||
Strategy : in Strategy_Type := Default_Strategy;
|
|
||||||
Header : in Header_Type := Default;
|
|
||||||
Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
|
|
||||||
:= Default_Buffer_Size;
|
|
||||||
Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
|
|
||||||
:= Default_Buffer_Size)
|
|
||||||
is
|
|
||||||
|
|
||||||
subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
|
|
||||||
|
|
||||||
procedure Init_Filter
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Compress : in Boolean);
|
|
||||||
|
|
||||||
-----------------
|
|
||||||
-- Init_Filter --
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
procedure Init_Filter
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Compress : in Boolean) is
|
|
||||||
begin
|
|
||||||
if Compress then
|
|
||||||
Deflate_Init
|
|
||||||
(Filter, Level, Strategy, Header => Header);
|
|
||||||
else
|
|
||||||
Inflate_Init (Filter, Header => Header);
|
|
||||||
end if;
|
|
||||||
end Init_Filter;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Stream.Back := Back;
|
|
||||||
Stream.Mode := Mode;
|
|
||||||
|
|
||||||
if Mode = Out_Stream or Mode = Duplex then
|
|
||||||
Init_Filter (Stream.Writer, Back_Compressed);
|
|
||||||
Stream.Buffer_Size := Write_Buffer_Size;
|
|
||||||
else
|
|
||||||
Stream.Buffer_Size := 0;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
if Mode = In_Stream or Mode = Duplex then
|
|
||||||
Init_Filter (Stream.Reader, not Back_Compressed);
|
|
||||||
|
|
||||||
Stream.Buffer := new Buffer_Subtype;
|
|
||||||
Stream.Rest_First := Stream.Buffer'Last + 1;
|
|
||||||
Stream.Rest_Last := Stream.Buffer'Last;
|
|
||||||
end if;
|
|
||||||
end Create;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Flush --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Flush
|
|
||||||
(Stream : in out Stream_Type;
|
|
||||||
Mode : in Flush_Mode := Sync_Flush)
|
|
||||||
is
|
|
||||||
Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
|
|
||||||
Last : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
loop
|
|
||||||
Flush (Stream.Writer, Buffer, Last, Mode);
|
|
||||||
|
|
||||||
Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
|
|
||||||
|
|
||||||
exit when Last < Buffer'Last;
|
|
||||||
end loop;
|
|
||||||
end Flush;
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Is_Open --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
function Is_Open (Stream : Stream_Type) return Boolean is
|
|
||||||
begin
|
|
||||||
return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer);
|
|
||||||
end Is_Open;
|
|
||||||
|
|
||||||
----------
|
|
||||||
-- Read --
|
|
||||||
----------
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Stream : in out Stream_Type;
|
|
||||||
Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset)
|
|
||||||
is
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset);
|
|
||||||
|
|
||||||
----------
|
|
||||||
-- Read --
|
|
||||||
----------
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Item : out Stream_Element_Array;
|
|
||||||
Last : out Stream_Element_Offset) is
|
|
||||||
begin
|
|
||||||
Ada.Streams.Read (Stream.Back.all, Item, Last);
|
|
||||||
end Read;
|
|
||||||
|
|
||||||
procedure Read is new ZLib.Read
|
|
||||||
(Read => Read,
|
|
||||||
Buffer => Stream.Buffer.all,
|
|
||||||
Rest_First => Stream.Rest_First,
|
|
||||||
Rest_Last => Stream.Rest_Last);
|
|
||||||
|
|
||||||
begin
|
|
||||||
Read (Stream.Reader, Item, Last);
|
|
||||||
end Read;
|
|
||||||
|
|
||||||
-------------------
|
|
||||||
-- Read_Total_In --
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
function Read_Total_In (Stream : in Stream_Type) return Count is
|
|
||||||
begin
|
|
||||||
return Total_In (Stream.Reader);
|
|
||||||
end Read_Total_In;
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
-- Read_Total_Out --
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
function Read_Total_Out (Stream : in Stream_Type) return Count is
|
|
||||||
begin
|
|
||||||
return Total_Out (Stream.Reader);
|
|
||||||
end Read_Total_Out;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Write --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Write
|
|
||||||
(Stream : in out Stream_Type;
|
|
||||||
Item : in Stream_Element_Array)
|
|
||||||
is
|
|
||||||
|
|
||||||
procedure Write (Item : in Stream_Element_Array);
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Write --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Write (Item : in Stream_Element_Array) is
|
|
||||||
begin
|
|
||||||
Ada.Streams.Write (Stream.Back.all, Item);
|
|
||||||
end Write;
|
|
||||||
|
|
||||||
procedure Write is new ZLib.Write
|
|
||||||
(Write => Write,
|
|
||||||
Buffer_Size => Stream.Buffer_Size);
|
|
||||||
|
|
||||||
begin
|
|
||||||
Write (Stream.Writer, Item, No_Flush);
|
|
||||||
end Write;
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
-- Write_Total_In --
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
function Write_Total_In (Stream : in Stream_Type) return Count is
|
|
||||||
begin
|
|
||||||
return Total_In (Stream.Writer);
|
|
||||||
end Write_Total_In;
|
|
||||||
|
|
||||||
---------------------
|
|
||||||
-- Write_Total_Out --
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
function Write_Total_Out (Stream : in Stream_Type) return Count is
|
|
||||||
begin
|
|
||||||
return Total_Out (Stream.Writer);
|
|
||||||
end Write_Total_Out;
|
|
||||||
|
|
||||||
end ZLib.Streams;
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $
|
|
||||||
|
|
||||||
package ZLib.Streams is
|
|
||||||
|
|
||||||
type Stream_Mode is (In_Stream, Out_Stream, Duplex);
|
|
||||||
|
|
||||||
type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class;
|
|
||||||
|
|
||||||
type Stream_Type is
|
|
||||||
new Ada.Streams.Root_Stream_Type with private;
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Stream : in out Stream_Type;
|
|
||||||
Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset);
|
|
||||||
|
|
||||||
procedure Write
|
|
||||||
(Stream : in out Stream_Type;
|
|
||||||
Item : in Ada.Streams.Stream_Element_Array);
|
|
||||||
|
|
||||||
procedure Flush
|
|
||||||
(Stream : in out Stream_Type;
|
|
||||||
Mode : in Flush_Mode := Sync_Flush);
|
|
||||||
-- Flush the written data to the back stream,
|
|
||||||
-- all data placed to the compressor is flushing to the Back stream.
|
|
||||||
-- Should not be used until necessary, because it is decreasing
|
|
||||||
-- compression.
|
|
||||||
|
|
||||||
function Read_Total_In (Stream : in Stream_Type) return Count;
|
|
||||||
pragma Inline (Read_Total_In);
|
|
||||||
-- Return total number of bytes read from back stream so far.
|
|
||||||
|
|
||||||
function Read_Total_Out (Stream : in Stream_Type) return Count;
|
|
||||||
pragma Inline (Read_Total_Out);
|
|
||||||
-- Return total number of bytes read so far.
|
|
||||||
|
|
||||||
function Write_Total_In (Stream : in Stream_Type) return Count;
|
|
||||||
pragma Inline (Write_Total_In);
|
|
||||||
-- Return total number of bytes written so far.
|
|
||||||
|
|
||||||
function Write_Total_Out (Stream : in Stream_Type) return Count;
|
|
||||||
pragma Inline (Write_Total_Out);
|
|
||||||
-- Return total number of bytes written to the back stream.
|
|
||||||
|
|
||||||
procedure Create
|
|
||||||
(Stream : out Stream_Type;
|
|
||||||
Mode : in Stream_Mode;
|
|
||||||
Back : in Stream_Access;
|
|
||||||
Back_Compressed : in Boolean;
|
|
||||||
Level : in Compression_Level := Default_Compression;
|
|
||||||
Strategy : in Strategy_Type := Default_Strategy;
|
|
||||||
Header : in Header_Type := Default;
|
|
||||||
Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
|
|
||||||
:= Default_Buffer_Size;
|
|
||||||
Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
|
|
||||||
:= Default_Buffer_Size);
|
|
||||||
-- Create the Compression/Decompression stream.
|
|
||||||
-- If mode is In_Stream then Write operation is disabled.
|
|
||||||
-- If mode is Out_Stream then Read operation is disabled.
|
|
||||||
|
|
||||||
-- If Back_Compressed is true then
|
|
||||||
-- Data written to the Stream is compressing to the Back stream
|
|
||||||
-- and data read from the Stream is decompressed data from the Back stream.
|
|
||||||
|
|
||||||
-- If Back_Compressed is false then
|
|
||||||
-- Data written to the Stream is decompressing to the Back stream
|
|
||||||
-- and data read from the Stream is compressed data from the Back stream.
|
|
||||||
|
|
||||||
-- !!! When the Need_Header is False ZLib-Ada is using undocumented
|
|
||||||
-- ZLib 1.1.4 functionality to do not create/wait for ZLib headers.
|
|
||||||
|
|
||||||
function Is_Open (Stream : Stream_Type) return Boolean;
|
|
||||||
|
|
||||||
procedure Close (Stream : in out Stream_Type);
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
use Ada.Streams;
|
|
||||||
|
|
||||||
type Buffer_Access is access all Stream_Element_Array;
|
|
||||||
|
|
||||||
type Stream_Type
|
|
||||||
is new Root_Stream_Type with
|
|
||||||
record
|
|
||||||
Mode : Stream_Mode;
|
|
||||||
|
|
||||||
Buffer : Buffer_Access;
|
|
||||||
Rest_First : Stream_Element_Offset;
|
|
||||||
Rest_Last : Stream_Element_Offset;
|
|
||||||
-- Buffer for Read operation.
|
|
||||||
-- We need to have this buffer in the record
|
|
||||||
-- because not all read data from back stream
|
|
||||||
-- could be processed during the read operation.
|
|
||||||
|
|
||||||
Buffer_Size : Stream_Element_Offset;
|
|
||||||
-- Buffer size for write operation.
|
|
||||||
-- We do not need to have this buffer
|
|
||||||
-- in the record because all data could be
|
|
||||||
-- processed in the write operation.
|
|
||||||
|
|
||||||
Back : Stream_Access;
|
|
||||||
Reader : Filter_Type;
|
|
||||||
Writer : Filter_Type;
|
|
||||||
end record;
|
|
||||||
|
|
||||||
end ZLib.Streams;
|
|
||||||
|
|
@ -1,141 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $
|
|
||||||
|
|
||||||
package body ZLib.Thin is
|
|
||||||
|
|
||||||
ZLIB_VERSION : constant Chars_Ptr := zlibVersion;
|
|
||||||
|
|
||||||
Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit;
|
|
||||||
|
|
||||||
--------------
|
|
||||||
-- Avail_In --
|
|
||||||
--------------
|
|
||||||
|
|
||||||
function Avail_In (Strm : in Z_Stream) return UInt is
|
|
||||||
begin
|
|
||||||
return Strm.Avail_In;
|
|
||||||
end Avail_In;
|
|
||||||
|
|
||||||
---------------
|
|
||||||
-- Avail_Out --
|
|
||||||
---------------
|
|
||||||
|
|
||||||
function Avail_Out (Strm : in Z_Stream) return UInt is
|
|
||||||
begin
|
|
||||||
return Strm.Avail_Out;
|
|
||||||
end Avail_Out;
|
|
||||||
|
|
||||||
------------------
|
|
||||||
-- Deflate_Init --
|
|
||||||
------------------
|
|
||||||
|
|
||||||
function Deflate_Init
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
level : Int;
|
|
||||||
method : Int;
|
|
||||||
windowBits : Int;
|
|
||||||
memLevel : Int;
|
|
||||||
strategy : Int)
|
|
||||||
return Int is
|
|
||||||
begin
|
|
||||||
return deflateInit2
|
|
||||||
(strm,
|
|
||||||
level,
|
|
||||||
method,
|
|
||||||
windowBits,
|
|
||||||
memLevel,
|
|
||||||
strategy,
|
|
||||||
ZLIB_VERSION,
|
|
||||||
Z_Stream_Size);
|
|
||||||
end Deflate_Init;
|
|
||||||
|
|
||||||
------------------
|
|
||||||
-- Inflate_Init --
|
|
||||||
------------------
|
|
||||||
|
|
||||||
function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is
|
|
||||||
begin
|
|
||||||
return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size);
|
|
||||||
end Inflate_Init;
|
|
||||||
|
|
||||||
------------------------
|
|
||||||
-- Last_Error_Message --
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
function Last_Error_Message (Strm : in Z_Stream) return String is
|
|
||||||
use Interfaces.C.Strings;
|
|
||||||
begin
|
|
||||||
if Strm.msg = Null_Ptr then
|
|
||||||
return "";
|
|
||||||
else
|
|
||||||
return Value (Strm.msg);
|
|
||||||
end if;
|
|
||||||
end Last_Error_Message;
|
|
||||||
|
|
||||||
------------
|
|
||||||
-- Set_In --
|
|
||||||
------------
|
|
||||||
|
|
||||||
procedure Set_In
|
|
||||||
(Strm : in out Z_Stream;
|
|
||||||
Buffer : in Voidp;
|
|
||||||
Size : in UInt) is
|
|
||||||
begin
|
|
||||||
Strm.Next_In := Buffer;
|
|
||||||
Strm.Avail_In := Size;
|
|
||||||
end Set_In;
|
|
||||||
|
|
||||||
------------------
|
|
||||||
-- Set_Mem_Func --
|
|
||||||
------------------
|
|
||||||
|
|
||||||
procedure Set_Mem_Func
|
|
||||||
(Strm : in out Z_Stream;
|
|
||||||
Opaque : in Voidp;
|
|
||||||
Alloc : in alloc_func;
|
|
||||||
Free : in free_func) is
|
|
||||||
begin
|
|
||||||
Strm.opaque := Opaque;
|
|
||||||
Strm.zalloc := Alloc;
|
|
||||||
Strm.zfree := Free;
|
|
||||||
end Set_Mem_Func;
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Set_Out --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
procedure Set_Out
|
|
||||||
(Strm : in out Z_Stream;
|
|
||||||
Buffer : in Voidp;
|
|
||||||
Size : in UInt) is
|
|
||||||
begin
|
|
||||||
Strm.Next_Out := Buffer;
|
|
||||||
Strm.Avail_Out := Size;
|
|
||||||
end Set_Out;
|
|
||||||
|
|
||||||
--------------
|
|
||||||
-- Total_In --
|
|
||||||
--------------
|
|
||||||
|
|
||||||
function Total_In (Strm : in Z_Stream) return ULong is
|
|
||||||
begin
|
|
||||||
return Strm.Total_In;
|
|
||||||
end Total_In;
|
|
||||||
|
|
||||||
---------------
|
|
||||||
-- Total_Out --
|
|
||||||
---------------
|
|
||||||
|
|
||||||
function Total_Out (Strm : in Z_Stream) return ULong is
|
|
||||||
begin
|
|
||||||
return Strm.Total_Out;
|
|
||||||
end Total_Out;
|
|
||||||
|
|
||||||
end ZLib.Thin;
|
|
||||||
|
|
@ -1,450 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $
|
|
||||||
|
|
||||||
with Interfaces.C.Strings;
|
|
||||||
|
|
||||||
with System;
|
|
||||||
|
|
||||||
private package ZLib.Thin is
|
|
||||||
|
|
||||||
-- From zconf.h
|
|
||||||
|
|
||||||
MAX_MEM_LEVEL : constant := 9; -- zconf.h:105
|
|
||||||
-- zconf.h:105
|
|
||||||
MAX_WBITS : constant := 15; -- zconf.h:115
|
|
||||||
-- 32K LZ77 window
|
|
||||||
-- zconf.h:115
|
|
||||||
SEEK_SET : constant := 8#0000#; -- zconf.h:244
|
|
||||||
-- Seek from beginning of file.
|
|
||||||
-- zconf.h:244
|
|
||||||
SEEK_CUR : constant := 1; -- zconf.h:245
|
|
||||||
-- Seek from current position.
|
|
||||||
-- zconf.h:245
|
|
||||||
SEEK_END : constant := 2; -- zconf.h:246
|
|
||||||
-- Set file pointer to EOF plus "offset"
|
|
||||||
-- zconf.h:246
|
|
||||||
|
|
||||||
type Byte is new Interfaces.C.unsigned_char; -- 8 bits
|
|
||||||
-- zconf.h:214
|
|
||||||
type UInt is new Interfaces.C.unsigned; -- 16 bits or more
|
|
||||||
-- zconf.h:216
|
|
||||||
type Int is new Interfaces.C.int;
|
|
||||||
|
|
||||||
type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more
|
|
||||||
-- zconf.h:217
|
|
||||||
subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr;
|
|
||||||
|
|
||||||
type ULong_Access is access ULong;
|
|
||||||
type Int_Access is access Int;
|
|
||||||
|
|
||||||
subtype Voidp is System.Address; -- zconf.h:232
|
|
||||||
|
|
||||||
subtype Byte_Access is Voidp;
|
|
||||||
|
|
||||||
Nul : constant Voidp := System.Null_Address;
|
|
||||||
-- end from zconf
|
|
||||||
|
|
||||||
Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125
|
|
||||||
-- zlib.h:125
|
|
||||||
Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126
|
|
||||||
-- will be removed, use
|
|
||||||
-- Z_SYNC_FLUSH instead
|
|
||||||
-- zlib.h:126
|
|
||||||
Z_SYNC_FLUSH : constant := 2; -- zlib.h:127
|
|
||||||
-- zlib.h:127
|
|
||||||
Z_FULL_FLUSH : constant := 3; -- zlib.h:128
|
|
||||||
-- zlib.h:128
|
|
||||||
Z_FINISH : constant := 4; -- zlib.h:129
|
|
||||||
-- zlib.h:129
|
|
||||||
Z_OK : constant := 8#0000#; -- zlib.h:132
|
|
||||||
-- zlib.h:132
|
|
||||||
Z_STREAM_END : constant := 1; -- zlib.h:133
|
|
||||||
-- zlib.h:133
|
|
||||||
Z_NEED_DICT : constant := 2; -- zlib.h:134
|
|
||||||
-- zlib.h:134
|
|
||||||
Z_ERRNO : constant := -1; -- zlib.h:135
|
|
||||||
-- zlib.h:135
|
|
||||||
Z_STREAM_ERROR : constant := -2; -- zlib.h:136
|
|
||||||
-- zlib.h:136
|
|
||||||
Z_DATA_ERROR : constant := -3; -- zlib.h:137
|
|
||||||
-- zlib.h:137
|
|
||||||
Z_MEM_ERROR : constant := -4; -- zlib.h:138
|
|
||||||
-- zlib.h:138
|
|
||||||
Z_BUF_ERROR : constant := -5; -- zlib.h:139
|
|
||||||
-- zlib.h:139
|
|
||||||
Z_VERSION_ERROR : constant := -6; -- zlib.h:140
|
|
||||||
-- zlib.h:140
|
|
||||||
Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145
|
|
||||||
-- zlib.h:145
|
|
||||||
Z_BEST_SPEED : constant := 1; -- zlib.h:146
|
|
||||||
-- zlib.h:146
|
|
||||||
Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147
|
|
||||||
-- zlib.h:147
|
|
||||||
Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148
|
|
||||||
-- zlib.h:148
|
|
||||||
Z_FILTERED : constant := 1; -- zlib.h:151
|
|
||||||
-- zlib.h:151
|
|
||||||
Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152
|
|
||||||
-- zlib.h:152
|
|
||||||
Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153
|
|
||||||
-- zlib.h:153
|
|
||||||
Z_BINARY : constant := 8#0000#; -- zlib.h:156
|
|
||||||
-- zlib.h:156
|
|
||||||
Z_ASCII : constant := 1; -- zlib.h:157
|
|
||||||
-- zlib.h:157
|
|
||||||
Z_UNKNOWN : constant := 2; -- zlib.h:158
|
|
||||||
-- zlib.h:158
|
|
||||||
Z_DEFLATED : constant := 8; -- zlib.h:161
|
|
||||||
-- zlib.h:161
|
|
||||||
Z_NULL : constant := 8#0000#; -- zlib.h:164
|
|
||||||
-- for initializing zalloc, zfree, opaque
|
|
||||||
-- zlib.h:164
|
|
||||||
type gzFile is new Voidp; -- zlib.h:646
|
|
||||||
|
|
||||||
type Z_Stream is private;
|
|
||||||
|
|
||||||
type Z_Streamp is access all Z_Stream; -- zlib.h:89
|
|
||||||
|
|
||||||
type alloc_func is access function
|
|
||||||
(Opaque : Voidp;
|
|
||||||
Items : UInt;
|
|
||||||
Size : UInt)
|
|
||||||
return Voidp; -- zlib.h:63
|
|
||||||
|
|
||||||
type free_func is access procedure (opaque : Voidp; address : Voidp);
|
|
||||||
|
|
||||||
function zlibVersion return Chars_Ptr;
|
|
||||||
|
|
||||||
function Deflate (strm : Z_Streamp; flush : Int) return Int;
|
|
||||||
|
|
||||||
function DeflateEnd (strm : Z_Streamp) return Int;
|
|
||||||
|
|
||||||
function Inflate (strm : Z_Streamp; flush : Int) return Int;
|
|
||||||
|
|
||||||
function InflateEnd (strm : Z_Streamp) return Int;
|
|
||||||
|
|
||||||
function deflateSetDictionary
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
dictionary : Byte_Access;
|
|
||||||
dictLength : UInt)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int;
|
|
||||||
-- zlib.h:478
|
|
||||||
|
|
||||||
function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495
|
|
||||||
|
|
||||||
function deflateParams
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
level : Int;
|
|
||||||
strategy : Int)
|
|
||||||
return Int; -- zlib.h:506
|
|
||||||
|
|
||||||
function inflateSetDictionary
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
dictionary : Byte_Access;
|
|
||||||
dictLength : UInt)
|
|
||||||
return Int; -- zlib.h:548
|
|
||||||
|
|
||||||
function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565
|
|
||||||
|
|
||||||
function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580
|
|
||||||
|
|
||||||
function compress
|
|
||||||
(dest : Byte_Access;
|
|
||||||
destLen : ULong_Access;
|
|
||||||
source : Byte_Access;
|
|
||||||
sourceLen : ULong)
|
|
||||||
return Int; -- zlib.h:601
|
|
||||||
|
|
||||||
function compress2
|
|
||||||
(dest : Byte_Access;
|
|
||||||
destLen : ULong_Access;
|
|
||||||
source : Byte_Access;
|
|
||||||
sourceLen : ULong;
|
|
||||||
level : Int)
|
|
||||||
return Int; -- zlib.h:615
|
|
||||||
|
|
||||||
function uncompress
|
|
||||||
(dest : Byte_Access;
|
|
||||||
destLen : ULong_Access;
|
|
||||||
source : Byte_Access;
|
|
||||||
sourceLen : ULong)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile;
|
|
||||||
|
|
||||||
function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile;
|
|
||||||
|
|
||||||
function gzsetparams
|
|
||||||
(file : gzFile;
|
|
||||||
level : Int;
|
|
||||||
strategy : Int)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function gzread
|
|
||||||
(file : gzFile;
|
|
||||||
buf : Voidp;
|
|
||||||
len : UInt)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function gzwrite
|
|
||||||
(file : in gzFile;
|
|
||||||
buf : in Voidp;
|
|
||||||
len : in UInt)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int;
|
|
||||||
|
|
||||||
function gzputs (file : in gzFile; s : in Chars_Ptr) return Int;
|
|
||||||
|
|
||||||
function gzgets
|
|
||||||
(file : gzFile;
|
|
||||||
buf : Chars_Ptr;
|
|
||||||
len : Int)
|
|
||||||
return Chars_Ptr;
|
|
||||||
|
|
||||||
function gzputc (file : gzFile; char : Int) return Int;
|
|
||||||
|
|
||||||
function gzgetc (file : gzFile) return Int;
|
|
||||||
|
|
||||||
function gzflush (file : gzFile; flush : Int) return Int;
|
|
||||||
|
|
||||||
function gzseek
|
|
||||||
(file : gzFile;
|
|
||||||
offset : Int;
|
|
||||||
whence : Int)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function gzrewind (file : gzFile) return Int;
|
|
||||||
|
|
||||||
function gztell (file : gzFile) return Int;
|
|
||||||
|
|
||||||
function gzeof (file : gzFile) return Int;
|
|
||||||
|
|
||||||
function gzclose (file : gzFile) return Int;
|
|
||||||
|
|
||||||
function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr;
|
|
||||||
|
|
||||||
function adler32
|
|
||||||
(adler : ULong;
|
|
||||||
buf : Byte_Access;
|
|
||||||
len : UInt)
|
|
||||||
return ULong;
|
|
||||||
|
|
||||||
function crc32
|
|
||||||
(crc : ULong;
|
|
||||||
buf : Byte_Access;
|
|
||||||
len : UInt)
|
|
||||||
return ULong;
|
|
||||||
|
|
||||||
function deflateInit
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
level : Int;
|
|
||||||
version : Chars_Ptr;
|
|
||||||
stream_size : Int)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function deflateInit2
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
level : Int;
|
|
||||||
method : Int;
|
|
||||||
windowBits : Int;
|
|
||||||
memLevel : Int;
|
|
||||||
strategy : Int;
|
|
||||||
version : Chars_Ptr;
|
|
||||||
stream_size : Int)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function Deflate_Init
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
level : Int;
|
|
||||||
method : Int;
|
|
||||||
windowBits : Int;
|
|
||||||
memLevel : Int;
|
|
||||||
strategy : Int)
|
|
||||||
return Int;
|
|
||||||
pragma Inline (Deflate_Init);
|
|
||||||
|
|
||||||
function inflateInit
|
|
||||||
(strm : Z_Streamp;
|
|
||||||
version : Chars_Ptr;
|
|
||||||
stream_size : Int)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function inflateInit2
|
|
||||||
(strm : in Z_Streamp;
|
|
||||||
windowBits : in Int;
|
|
||||||
version : in Chars_Ptr;
|
|
||||||
stream_size : in Int)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function inflateBackInit
|
|
||||||
(strm : in Z_Streamp;
|
|
||||||
windowBits : in Int;
|
|
||||||
window : in Byte_Access;
|
|
||||||
version : in Chars_Ptr;
|
|
||||||
stream_size : in Int)
|
|
||||||
return Int;
|
|
||||||
-- Size of window have to be 2**windowBits.
|
|
||||||
|
|
||||||
function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int;
|
|
||||||
pragma Inline (Inflate_Init);
|
|
||||||
|
|
||||||
function zError (err : Int) return Chars_Ptr;
|
|
||||||
|
|
||||||
function inflateSyncPoint (z : Z_Streamp) return Int;
|
|
||||||
|
|
||||||
function get_crc_table return ULong_Access;
|
|
||||||
|
|
||||||
-- Interface to the available fields of the z_stream structure.
|
|
||||||
-- The application must update next_in and avail_in when avail_in has
|
|
||||||
-- dropped to zero. It must update next_out and avail_out when avail_out
|
|
||||||
-- has dropped to zero. The application must initialize zalloc, zfree and
|
|
||||||
-- opaque before calling the init function.
|
|
||||||
|
|
||||||
procedure Set_In
|
|
||||||
(Strm : in out Z_Stream;
|
|
||||||
Buffer : in Voidp;
|
|
||||||
Size : in UInt);
|
|
||||||
pragma Inline (Set_In);
|
|
||||||
|
|
||||||
procedure Set_Out
|
|
||||||
(Strm : in out Z_Stream;
|
|
||||||
Buffer : in Voidp;
|
|
||||||
Size : in UInt);
|
|
||||||
pragma Inline (Set_Out);
|
|
||||||
|
|
||||||
procedure Set_Mem_Func
|
|
||||||
(Strm : in out Z_Stream;
|
|
||||||
Opaque : in Voidp;
|
|
||||||
Alloc : in alloc_func;
|
|
||||||
Free : in free_func);
|
|
||||||
pragma Inline (Set_Mem_Func);
|
|
||||||
|
|
||||||
function Last_Error_Message (Strm : in Z_Stream) return String;
|
|
||||||
pragma Inline (Last_Error_Message);
|
|
||||||
|
|
||||||
function Avail_Out (Strm : in Z_Stream) return UInt;
|
|
||||||
pragma Inline (Avail_Out);
|
|
||||||
|
|
||||||
function Avail_In (Strm : in Z_Stream) return UInt;
|
|
||||||
pragma Inline (Avail_In);
|
|
||||||
|
|
||||||
function Total_In (Strm : in Z_Stream) return ULong;
|
|
||||||
pragma Inline (Total_In);
|
|
||||||
|
|
||||||
function Total_Out (Strm : in Z_Stream) return ULong;
|
|
||||||
pragma Inline (Total_Out);
|
|
||||||
|
|
||||||
function inflateCopy
|
|
||||||
(dest : in Z_Streamp;
|
|
||||||
Source : in Z_Streamp)
|
|
||||||
return Int;
|
|
||||||
|
|
||||||
function compressBound (Source_Len : in ULong) return ULong;
|
|
||||||
|
|
||||||
function deflateBound
|
|
||||||
(Strm : in Z_Streamp;
|
|
||||||
Source_Len : in ULong)
|
|
||||||
return ULong;
|
|
||||||
|
|
||||||
function gzungetc (C : in Int; File : in gzFile) return Int;
|
|
||||||
|
|
||||||
function zlibCompileFlags return ULong;
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
type Z_Stream is record -- zlib.h:68
|
|
||||||
Next_In : Voidp := Nul; -- next input byte
|
|
||||||
Avail_In : UInt := 0; -- number of bytes available at next_in
|
|
||||||
Total_In : ULong := 0; -- total nb of input bytes read so far
|
|
||||||
Next_Out : Voidp := Nul; -- next output byte should be put there
|
|
||||||
Avail_Out : UInt := 0; -- remaining free space at next_out
|
|
||||||
Total_Out : ULong := 0; -- total nb of bytes output so far
|
|
||||||
msg : Chars_Ptr; -- last error message, NULL if no error
|
|
||||||
state : Voidp; -- not visible by applications
|
|
||||||
zalloc : alloc_func := null; -- used to allocate the internal state
|
|
||||||
zfree : free_func := null; -- used to free the internal state
|
|
||||||
opaque : Voidp; -- private data object passed to
|
|
||||||
-- zalloc and zfree
|
|
||||||
data_type : Int; -- best guess about the data type:
|
|
||||||
-- ascii or binary
|
|
||||||
adler : ULong; -- adler32 value of the uncompressed
|
|
||||||
-- data
|
|
||||||
reserved : ULong; -- reserved for future use
|
|
||||||
end record;
|
|
||||||
|
|
||||||
pragma Convention (C, Z_Stream);
|
|
||||||
|
|
||||||
pragma Import (C, zlibVersion, "zlibVersion");
|
|
||||||
pragma Import (C, Deflate, "deflate");
|
|
||||||
pragma Import (C, DeflateEnd, "deflateEnd");
|
|
||||||
pragma Import (C, Inflate, "inflate");
|
|
||||||
pragma Import (C, InflateEnd, "inflateEnd");
|
|
||||||
pragma Import (C, deflateSetDictionary, "deflateSetDictionary");
|
|
||||||
pragma Import (C, deflateCopy, "deflateCopy");
|
|
||||||
pragma Import (C, deflateReset, "deflateReset");
|
|
||||||
pragma Import (C, deflateParams, "deflateParams");
|
|
||||||
pragma Import (C, inflateSetDictionary, "inflateSetDictionary");
|
|
||||||
pragma Import (C, inflateSync, "inflateSync");
|
|
||||||
pragma Import (C, inflateReset, "inflateReset");
|
|
||||||
pragma Import (C, compress, "compress");
|
|
||||||
pragma Import (C, compress2, "compress2");
|
|
||||||
pragma Import (C, uncompress, "uncompress");
|
|
||||||
pragma Import (C, gzopen, "gzopen");
|
|
||||||
pragma Import (C, gzdopen, "gzdopen");
|
|
||||||
pragma Import (C, gzsetparams, "gzsetparams");
|
|
||||||
pragma Import (C, gzread, "gzread");
|
|
||||||
pragma Import (C, gzwrite, "gzwrite");
|
|
||||||
pragma Import (C, gzprintf, "gzprintf");
|
|
||||||
pragma Import (C, gzputs, "gzputs");
|
|
||||||
pragma Import (C, gzgets, "gzgets");
|
|
||||||
pragma Import (C, gzputc, "gzputc");
|
|
||||||
pragma Import (C, gzgetc, "gzgetc");
|
|
||||||
pragma Import (C, gzflush, "gzflush");
|
|
||||||
pragma Import (C, gzseek, "gzseek");
|
|
||||||
pragma Import (C, gzrewind, "gzrewind");
|
|
||||||
pragma Import (C, gztell, "gztell");
|
|
||||||
pragma Import (C, gzeof, "gzeof");
|
|
||||||
pragma Import (C, gzclose, "gzclose");
|
|
||||||
pragma Import (C, gzerror, "gzerror");
|
|
||||||
pragma Import (C, adler32, "adler32");
|
|
||||||
pragma Import (C, crc32, "crc32");
|
|
||||||
pragma Import (C, deflateInit, "deflateInit_");
|
|
||||||
pragma Import (C, inflateInit, "inflateInit_");
|
|
||||||
pragma Import (C, deflateInit2, "deflateInit2_");
|
|
||||||
pragma Import (C, inflateInit2, "inflateInit2_");
|
|
||||||
pragma Import (C, zError, "zError");
|
|
||||||
pragma Import (C, inflateSyncPoint, "inflateSyncPoint");
|
|
||||||
pragma Import (C, get_crc_table, "get_crc_table");
|
|
||||||
|
|
||||||
-- since zlib 1.2.0:
|
|
||||||
|
|
||||||
pragma Import (C, inflateCopy, "inflateCopy");
|
|
||||||
pragma Import (C, compressBound, "compressBound");
|
|
||||||
pragma Import (C, deflateBound, "deflateBound");
|
|
||||||
pragma Import (C, gzungetc, "gzungetc");
|
|
||||||
pragma Import (C, zlibCompileFlags, "zlibCompileFlags");
|
|
||||||
|
|
||||||
pragma Import (C, inflateBackInit, "inflateBackInit_");
|
|
||||||
|
|
||||||
-- I stopped binding the inflateBack routines, because realize that
|
|
||||||
-- it does not support zlib and gzip headers for now, and have no
|
|
||||||
-- symmetric deflateBack routines.
|
|
||||||
-- ZLib-Ada is symmetric regarding deflate/inflate data transformation
|
|
||||||
-- and has a similar generic callback interface for the
|
|
||||||
-- deflate/inflate transformation based on the regular Deflate/Inflate
|
|
||||||
-- routines.
|
|
||||||
|
|
||||||
-- pragma Import (C, inflateBack, "inflateBack");
|
|
||||||
-- pragma Import (C, inflateBackEnd, "inflateBackEnd");
|
|
||||||
|
|
||||||
end ZLib.Thin;
|
|
||||||
|
|
@ -1,701 +0,0 @@
|
||||||
----------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- Open source license information is in the zlib.ads file. --
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $
|
|
||||||
|
|
||||||
with Ada.Exceptions;
|
|
||||||
with Ada.Unchecked_Conversion;
|
|
||||||
with Ada.Unchecked_Deallocation;
|
|
||||||
|
|
||||||
with Interfaces.C.Strings;
|
|
||||||
|
|
||||||
with ZLib.Thin;
|
|
||||||
|
|
||||||
package body ZLib is
|
|
||||||
|
|
||||||
use type Thin.Int;
|
|
||||||
|
|
||||||
type Z_Stream is new Thin.Z_Stream;
|
|
||||||
|
|
||||||
type Return_Code_Enum is
|
|
||||||
(OK,
|
|
||||||
STREAM_END,
|
|
||||||
NEED_DICT,
|
|
||||||
ERRNO,
|
|
||||||
STREAM_ERROR,
|
|
||||||
DATA_ERROR,
|
|
||||||
MEM_ERROR,
|
|
||||||
BUF_ERROR,
|
|
||||||
VERSION_ERROR);
|
|
||||||
|
|
||||||
type Flate_Step_Function is access
|
|
||||||
function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int;
|
|
||||||
pragma Convention (C, Flate_Step_Function);
|
|
||||||
|
|
||||||
type Flate_End_Function is access
|
|
||||||
function (Ctrm : in Thin.Z_Streamp) return Thin.Int;
|
|
||||||
pragma Convention (C, Flate_End_Function);
|
|
||||||
|
|
||||||
type Flate_Type is record
|
|
||||||
Step : Flate_Step_Function;
|
|
||||||
Done : Flate_End_Function;
|
|
||||||
end record;
|
|
||||||
|
|
||||||
subtype Footer_Array is Stream_Element_Array (1 .. 8);
|
|
||||||
|
|
||||||
Simple_GZip_Header : constant Stream_Element_Array (1 .. 10)
|
|
||||||
:= (16#1f#, 16#8b#, -- Magic header
|
|
||||||
16#08#, -- Z_DEFLATED
|
|
||||||
16#00#, -- Flags
|
|
||||||
16#00#, 16#00#, 16#00#, 16#00#, -- Time
|
|
||||||
16#00#, -- XFlags
|
|
||||||
16#03# -- OS code
|
|
||||||
);
|
|
||||||
-- The simplest gzip header is not for informational, but just for
|
|
||||||
-- gzip format compatibility.
|
|
||||||
-- Note that some code below is using assumption
|
|
||||||
-- Simple_GZip_Header'Last > Footer_Array'Last, so do not make
|
|
||||||
-- Simple_GZip_Header'Last <= Footer_Array'Last.
|
|
||||||
|
|
||||||
Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum
|
|
||||||
:= (0 => OK,
|
|
||||||
1 => STREAM_END,
|
|
||||||
2 => NEED_DICT,
|
|
||||||
-1 => ERRNO,
|
|
||||||
-2 => STREAM_ERROR,
|
|
||||||
-3 => DATA_ERROR,
|
|
||||||
-4 => MEM_ERROR,
|
|
||||||
-5 => BUF_ERROR,
|
|
||||||
-6 => VERSION_ERROR);
|
|
||||||
|
|
||||||
Flate : constant array (Boolean) of Flate_Type
|
|
||||||
:= (True => (Step => Thin.Deflate'Access,
|
|
||||||
Done => Thin.DeflateEnd'Access),
|
|
||||||
False => (Step => Thin.Inflate'Access,
|
|
||||||
Done => Thin.InflateEnd'Access));
|
|
||||||
|
|
||||||
Flush_Finish : constant array (Boolean) of Flush_Mode
|
|
||||||
:= (True => Finish, False => No_Flush);
|
|
||||||
|
|
||||||
procedure Raise_Error (Stream : in Z_Stream);
|
|
||||||
pragma Inline (Raise_Error);
|
|
||||||
|
|
||||||
procedure Raise_Error (Message : in String);
|
|
||||||
pragma Inline (Raise_Error);
|
|
||||||
|
|
||||||
procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int);
|
|
||||||
|
|
||||||
procedure Free is new Ada.Unchecked_Deallocation
|
|
||||||
(Z_Stream, Z_Stream_Access);
|
|
||||||
|
|
||||||
function To_Thin_Access is new Ada.Unchecked_Conversion
|
|
||||||
(Z_Stream_Access, Thin.Z_Streamp);
|
|
||||||
|
|
||||||
procedure Translate_GZip
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Data : in Ada.Streams.Stream_Element_Array;
|
|
||||||
In_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode);
|
|
||||||
-- Separate translate routine for make gzip header.
|
|
||||||
|
|
||||||
procedure Translate_Auto
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Data : in Ada.Streams.Stream_Element_Array;
|
|
||||||
In_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode);
|
|
||||||
-- translate routine without additional headers.
|
|
||||||
|
|
||||||
-----------------
|
|
||||||
-- Check_Error --
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is
|
|
||||||
use type Thin.Int;
|
|
||||||
begin
|
|
||||||
if Code /= Thin.Z_OK then
|
|
||||||
Raise_Error
|
|
||||||
(Return_Code_Enum'Image (Return_Code (Code))
|
|
||||||
& ": " & Last_Error_Message (Stream));
|
|
||||||
end if;
|
|
||||||
end Check_Error;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Close --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Close
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Ignore_Error : in Boolean := False)
|
|
||||||
is
|
|
||||||
Code : Thin.Int;
|
|
||||||
begin
|
|
||||||
if not Ignore_Error and then not Is_Open (Filter) then
|
|
||||||
raise Status_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm));
|
|
||||||
|
|
||||||
if Ignore_Error or else Code = Thin.Z_OK then
|
|
||||||
Free (Filter.Strm);
|
|
||||||
else
|
|
||||||
declare
|
|
||||||
Error_Message : constant String
|
|
||||||
:= Last_Error_Message (Filter.Strm.all);
|
|
||||||
begin
|
|
||||||
Free (Filter.Strm);
|
|
||||||
Ada.Exceptions.Raise_Exception
|
|
||||||
(ZLib_Error'Identity,
|
|
||||||
Return_Code_Enum'Image (Return_Code (Code))
|
|
||||||
& ": " & Error_Message);
|
|
||||||
end;
|
|
||||||
end if;
|
|
||||||
end Close;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- CRC32 --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
function CRC32
|
|
||||||
(CRC : in Unsigned_32;
|
|
||||||
Data : in Ada.Streams.Stream_Element_Array)
|
|
||||||
return Unsigned_32
|
|
||||||
is
|
|
||||||
use Thin;
|
|
||||||
begin
|
|
||||||
return Unsigned_32 (crc32 (ULong (CRC),
|
|
||||||
Data'Address,
|
|
||||||
Data'Length));
|
|
||||||
end CRC32;
|
|
||||||
|
|
||||||
procedure CRC32
|
|
||||||
(CRC : in out Unsigned_32;
|
|
||||||
Data : in Ada.Streams.Stream_Element_Array) is
|
|
||||||
begin
|
|
||||||
CRC := CRC32 (CRC, Data);
|
|
||||||
end CRC32;
|
|
||||||
|
|
||||||
------------------
|
|
||||||
-- Deflate_Init --
|
|
||||||
------------------
|
|
||||||
|
|
||||||
procedure Deflate_Init
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Level : in Compression_Level := Default_Compression;
|
|
||||||
Strategy : in Strategy_Type := Default_Strategy;
|
|
||||||
Method : in Compression_Method := Deflated;
|
|
||||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
|
||||||
Memory_Level : in Memory_Level_Type := Default_Memory_Level;
|
|
||||||
Header : in Header_Type := Default)
|
|
||||||
is
|
|
||||||
use type Thin.Int;
|
|
||||||
Win_Bits : Thin.Int := Thin.Int (Window_Bits);
|
|
||||||
begin
|
|
||||||
if Is_Open (Filter) then
|
|
||||||
raise Status_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
-- We allow ZLib to make header only in case of default header type.
|
|
||||||
-- Otherwise we would either do header by ourselves, or do not do
|
|
||||||
-- header at all.
|
|
||||||
|
|
||||||
if Header = None or else Header = GZip then
|
|
||||||
Win_Bits := -Win_Bits;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
-- For the GZip CRC calculation and make headers.
|
|
||||||
|
|
||||||
if Header = GZip then
|
|
||||||
Filter.CRC := 0;
|
|
||||||
Filter.Offset := Simple_GZip_Header'First;
|
|
||||||
else
|
|
||||||
Filter.Offset := Simple_GZip_Header'Last + 1;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Filter.Strm := new Z_Stream;
|
|
||||||
Filter.Compression := True;
|
|
||||||
Filter.Stream_End := False;
|
|
||||||
Filter.Header := Header;
|
|
||||||
|
|
||||||
if Thin.Deflate_Init
|
|
||||||
(To_Thin_Access (Filter.Strm),
|
|
||||||
Level => Thin.Int (Level),
|
|
||||||
method => Thin.Int (Method),
|
|
||||||
windowBits => Win_Bits,
|
|
||||||
memLevel => Thin.Int (Memory_Level),
|
|
||||||
strategy => Thin.Int (Strategy)) /= Thin.Z_OK
|
|
||||||
then
|
|
||||||
Raise_Error (Filter.Strm.all);
|
|
||||||
end if;
|
|
||||||
end Deflate_Init;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Flush --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Flush
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode)
|
|
||||||
is
|
|
||||||
No_Data : Stream_Element_Array := (1 .. 0 => 0);
|
|
||||||
Last : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush);
|
|
||||||
end Flush;
|
|
||||||
|
|
||||||
-----------------------
|
|
||||||
-- Generic_Translate --
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
procedure Generic_Translate
|
|
||||||
(Filter : in out ZLib.Filter_Type;
|
|
||||||
In_Buffer_Size : in Integer := Default_Buffer_Size;
|
|
||||||
Out_Buffer_Size : in Integer := Default_Buffer_Size)
|
|
||||||
is
|
|
||||||
In_Buffer : Stream_Element_Array
|
|
||||||
(1 .. Stream_Element_Offset (In_Buffer_Size));
|
|
||||||
Out_Buffer : Stream_Element_Array
|
|
||||||
(1 .. Stream_Element_Offset (Out_Buffer_Size));
|
|
||||||
Last : Stream_Element_Offset;
|
|
||||||
In_Last : Stream_Element_Offset;
|
|
||||||
In_First : Stream_Element_Offset;
|
|
||||||
Out_Last : Stream_Element_Offset;
|
|
||||||
begin
|
|
||||||
Main : loop
|
|
||||||
Data_In (In_Buffer, Last);
|
|
||||||
|
|
||||||
In_First := In_Buffer'First;
|
|
||||||
|
|
||||||
loop
|
|
||||||
Translate
|
|
||||||
(Filter => Filter,
|
|
||||||
In_Data => In_Buffer (In_First .. Last),
|
|
||||||
In_Last => In_Last,
|
|
||||||
Out_Data => Out_Buffer,
|
|
||||||
Out_Last => Out_Last,
|
|
||||||
Flush => Flush_Finish (Last < In_Buffer'First));
|
|
||||||
|
|
||||||
if Out_Buffer'First <= Out_Last then
|
|
||||||
Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
|
|
||||||
end if;
|
|
||||||
|
|
||||||
exit Main when Stream_End (Filter);
|
|
||||||
|
|
||||||
-- The end of in buffer.
|
|
||||||
|
|
||||||
exit when In_Last = Last;
|
|
||||||
|
|
||||||
In_First := In_Last + 1;
|
|
||||||
end loop;
|
|
||||||
end loop Main;
|
|
||||||
|
|
||||||
end Generic_Translate;
|
|
||||||
|
|
||||||
------------------
|
|
||||||
-- Inflate_Init --
|
|
||||||
------------------
|
|
||||||
|
|
||||||
procedure Inflate_Init
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
|
||||||
Header : in Header_Type := Default)
|
|
||||||
is
|
|
||||||
use type Thin.Int;
|
|
||||||
Win_Bits : Thin.Int := Thin.Int (Window_Bits);
|
|
||||||
|
|
||||||
procedure Check_Version;
|
|
||||||
-- Check the latest header types compatibility.
|
|
||||||
|
|
||||||
procedure Check_Version is
|
|
||||||
begin
|
|
||||||
if Version <= "1.1.4" then
|
|
||||||
Raise_Error
|
|
||||||
("Inflate header type " & Header_Type'Image (Header)
|
|
||||||
& " incompatible with ZLib version " & Version);
|
|
||||||
end if;
|
|
||||||
end Check_Version;
|
|
||||||
|
|
||||||
begin
|
|
||||||
if Is_Open (Filter) then
|
|
||||||
raise Status_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
case Header is
|
|
||||||
when None =>
|
|
||||||
Check_Version;
|
|
||||||
|
|
||||||
-- Inflate data without headers determined
|
|
||||||
-- by negative Win_Bits.
|
|
||||||
|
|
||||||
Win_Bits := -Win_Bits;
|
|
||||||
when GZip =>
|
|
||||||
Check_Version;
|
|
||||||
|
|
||||||
-- Inflate gzip data defined by flag 16.
|
|
||||||
|
|
||||||
Win_Bits := Win_Bits + 16;
|
|
||||||
when Auto =>
|
|
||||||
Check_Version;
|
|
||||||
|
|
||||||
-- Inflate with automatic detection
|
|
||||||
-- of gzip or native header defined by flag 32.
|
|
||||||
|
|
||||||
Win_Bits := Win_Bits + 32;
|
|
||||||
when Default => null;
|
|
||||||
end case;
|
|
||||||
|
|
||||||
Filter.Strm := new Z_Stream;
|
|
||||||
Filter.Compression := False;
|
|
||||||
Filter.Stream_End := False;
|
|
||||||
Filter.Header := Header;
|
|
||||||
|
|
||||||
if Thin.Inflate_Init
|
|
||||||
(To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK
|
|
||||||
then
|
|
||||||
Raise_Error (Filter.Strm.all);
|
|
||||||
end if;
|
|
||||||
end Inflate_Init;
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Is_Open --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
function Is_Open (Filter : in Filter_Type) return Boolean is
|
|
||||||
begin
|
|
||||||
return Filter.Strm /= null;
|
|
||||||
end Is_Open;
|
|
||||||
|
|
||||||
-----------------
|
|
||||||
-- Raise_Error --
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
procedure Raise_Error (Message : in String) is
|
|
||||||
begin
|
|
||||||
Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);
|
|
||||||
end Raise_Error;
|
|
||||||
|
|
||||||
procedure Raise_Error (Stream : in Z_Stream) is
|
|
||||||
begin
|
|
||||||
Raise_Error (Last_Error_Message (Stream));
|
|
||||||
end Raise_Error;
|
|
||||||
|
|
||||||
----------
|
|
||||||
-- Read --
|
|
||||||
----------
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode := No_Flush)
|
|
||||||
is
|
|
||||||
In_Last : Stream_Element_Offset;
|
|
||||||
Item_First : Ada.Streams.Stream_Element_Offset := Item'First;
|
|
||||||
V_Flush : Flush_Mode := Flush;
|
|
||||||
|
|
||||||
begin
|
|
||||||
pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);
|
|
||||||
pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
|
|
||||||
|
|
||||||
loop
|
|
||||||
if Rest_Last = Buffer'First - 1 then
|
|
||||||
V_Flush := Finish;
|
|
||||||
|
|
||||||
elsif Rest_First > Rest_Last then
|
|
||||||
Read (Buffer, Rest_Last);
|
|
||||||
Rest_First := Buffer'First;
|
|
||||||
|
|
||||||
if Rest_Last < Buffer'First then
|
|
||||||
V_Flush := Finish;
|
|
||||||
end if;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Translate
|
|
||||||
(Filter => Filter,
|
|
||||||
In_Data => Buffer (Rest_First .. Rest_Last),
|
|
||||||
In_Last => In_Last,
|
|
||||||
Out_Data => Item (Item_First .. Item'Last),
|
|
||||||
Out_Last => Last,
|
|
||||||
Flush => V_Flush);
|
|
||||||
|
|
||||||
Rest_First := In_Last + 1;
|
|
||||||
|
|
||||||
exit when Stream_End (Filter)
|
|
||||||
or else Last = Item'Last
|
|
||||||
or else (Last >= Item'First and then Allow_Read_Some);
|
|
||||||
|
|
||||||
Item_First := Last + 1;
|
|
||||||
end loop;
|
|
||||||
end Read;
|
|
||||||
|
|
||||||
----------------
|
|
||||||
-- Stream_End --
|
|
||||||
----------------
|
|
||||||
|
|
||||||
function Stream_End (Filter : in Filter_Type) return Boolean is
|
|
||||||
begin
|
|
||||||
if Filter.Header = GZip and Filter.Compression then
|
|
||||||
return Filter.Stream_End
|
|
||||||
and then Filter.Offset = Footer_Array'Last + 1;
|
|
||||||
else
|
|
||||||
return Filter.Stream_End;
|
|
||||||
end if;
|
|
||||||
end Stream_End;
|
|
||||||
|
|
||||||
--------------
|
|
||||||
-- Total_In --
|
|
||||||
--------------
|
|
||||||
|
|
||||||
function Total_In (Filter : in Filter_Type) return Count is
|
|
||||||
begin
|
|
||||||
return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all));
|
|
||||||
end Total_In;
|
|
||||||
|
|
||||||
---------------
|
|
||||||
-- Total_Out --
|
|
||||||
---------------
|
|
||||||
|
|
||||||
function Total_Out (Filter : in Filter_Type) return Count is
|
|
||||||
begin
|
|
||||||
return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all));
|
|
||||||
end Total_Out;
|
|
||||||
|
|
||||||
---------------
|
|
||||||
-- Translate --
|
|
||||||
---------------
|
|
||||||
|
|
||||||
procedure Translate
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Data : in Ada.Streams.Stream_Element_Array;
|
|
||||||
In_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode) is
|
|
||||||
begin
|
|
||||||
if Filter.Header = GZip and then Filter.Compression then
|
|
||||||
Translate_GZip
|
|
||||||
(Filter => Filter,
|
|
||||||
In_Data => In_Data,
|
|
||||||
In_Last => In_Last,
|
|
||||||
Out_Data => Out_Data,
|
|
||||||
Out_Last => Out_Last,
|
|
||||||
Flush => Flush);
|
|
||||||
else
|
|
||||||
Translate_Auto
|
|
||||||
(Filter => Filter,
|
|
||||||
In_Data => In_Data,
|
|
||||||
In_Last => In_Last,
|
|
||||||
Out_Data => Out_Data,
|
|
||||||
Out_Last => Out_Last,
|
|
||||||
Flush => Flush);
|
|
||||||
end if;
|
|
||||||
end Translate;
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
-- Translate_Auto --
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
procedure Translate_Auto
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Data : in Ada.Streams.Stream_Element_Array;
|
|
||||||
In_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode)
|
|
||||||
is
|
|
||||||
use type Thin.Int;
|
|
||||||
Code : Thin.Int;
|
|
||||||
|
|
||||||
begin
|
|
||||||
if not Is_Open (Filter) then
|
|
||||||
raise Status_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
if Out_Data'Length = 0 and then In_Data'Length = 0 then
|
|
||||||
raise Constraint_Error;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length);
|
|
||||||
Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length);
|
|
||||||
|
|
||||||
Code := Flate (Filter.Compression).Step
|
|
||||||
(To_Thin_Access (Filter.Strm),
|
|
||||||
Thin.Int (Flush));
|
|
||||||
|
|
||||||
if Code = Thin.Z_STREAM_END then
|
|
||||||
Filter.Stream_End := True;
|
|
||||||
else
|
|
||||||
Check_Error (Filter.Strm.all, Code);
|
|
||||||
end if;
|
|
||||||
|
|
||||||
In_Last := In_Data'Last
|
|
||||||
- Stream_Element_Offset (Avail_In (Filter.Strm.all));
|
|
||||||
Out_Last := Out_Data'Last
|
|
||||||
- Stream_Element_Offset (Avail_Out (Filter.Strm.all));
|
|
||||||
end Translate_Auto;
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
-- Translate_GZip --
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
procedure Translate_GZip
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Data : in Ada.Streams.Stream_Element_Array;
|
|
||||||
In_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode)
|
|
||||||
is
|
|
||||||
Out_First : Stream_Element_Offset;
|
|
||||||
|
|
||||||
procedure Add_Data (Data : in Stream_Element_Array);
|
|
||||||
-- Add data to stream from the Filter.Offset till necessary,
|
|
||||||
-- used for add gzip headr/footer.
|
|
||||||
|
|
||||||
procedure Put_32
|
|
||||||
(Item : in out Stream_Element_Array;
|
|
||||||
Data : in Unsigned_32);
|
|
||||||
pragma Inline (Put_32);
|
|
||||||
|
|
||||||
--------------
|
|
||||||
-- Add_Data --
|
|
||||||
--------------
|
|
||||||
|
|
||||||
procedure Add_Data (Data : in Stream_Element_Array) is
|
|
||||||
Data_First : Stream_Element_Offset renames Filter.Offset;
|
|
||||||
Data_Last : Stream_Element_Offset;
|
|
||||||
Data_Len : Stream_Element_Offset; -- -1
|
|
||||||
Out_Len : Stream_Element_Offset; -- -1
|
|
||||||
begin
|
|
||||||
Out_First := Out_Last + 1;
|
|
||||||
|
|
||||||
if Data_First > Data'Last then
|
|
||||||
return;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Data_Len := Data'Last - Data_First;
|
|
||||||
Out_Len := Out_Data'Last - Out_First;
|
|
||||||
|
|
||||||
if Data_Len <= Out_Len then
|
|
||||||
Out_Last := Out_First + Data_Len;
|
|
||||||
Data_Last := Data'Last;
|
|
||||||
else
|
|
||||||
Out_Last := Out_Data'Last;
|
|
||||||
Data_Last := Data_First + Out_Len;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last);
|
|
||||||
|
|
||||||
Data_First := Data_Last + 1;
|
|
||||||
Out_First := Out_Last + 1;
|
|
||||||
end Add_Data;
|
|
||||||
|
|
||||||
------------
|
|
||||||
-- Put_32 --
|
|
||||||
------------
|
|
||||||
|
|
||||||
procedure Put_32
|
|
||||||
(Item : in out Stream_Element_Array;
|
|
||||||
Data : in Unsigned_32)
|
|
||||||
is
|
|
||||||
D : Unsigned_32 := Data;
|
|
||||||
begin
|
|
||||||
for J in Item'First .. Item'First + 3 loop
|
|
||||||
Item (J) := Stream_Element (D and 16#FF#);
|
|
||||||
D := Shift_Right (D, 8);
|
|
||||||
end loop;
|
|
||||||
end Put_32;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Out_Last := Out_Data'First - 1;
|
|
||||||
|
|
||||||
if not Filter.Stream_End then
|
|
||||||
Add_Data (Simple_GZip_Header);
|
|
||||||
|
|
||||||
Translate_Auto
|
|
||||||
(Filter => Filter,
|
|
||||||
In_Data => In_Data,
|
|
||||||
In_Last => In_Last,
|
|
||||||
Out_Data => Out_Data (Out_First .. Out_Data'Last),
|
|
||||||
Out_Last => Out_Last,
|
|
||||||
Flush => Flush);
|
|
||||||
|
|
||||||
CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));
|
|
||||||
end if;
|
|
||||||
|
|
||||||
if Filter.Stream_End and then Out_Last <= Out_Data'Last then
|
|
||||||
-- This detection method would work only when
|
|
||||||
-- Simple_GZip_Header'Last > Footer_Array'Last
|
|
||||||
|
|
||||||
if Filter.Offset = Simple_GZip_Header'Last + 1 then
|
|
||||||
Filter.Offset := Footer_Array'First;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
declare
|
|
||||||
Footer : Footer_Array;
|
|
||||||
begin
|
|
||||||
Put_32 (Footer, Filter.CRC);
|
|
||||||
Put_32 (Footer (Footer'First + 4 .. Footer'Last),
|
|
||||||
Unsigned_32 (Total_In (Filter)));
|
|
||||||
Add_Data (Footer);
|
|
||||||
end;
|
|
||||||
end if;
|
|
||||||
end Translate_GZip;
|
|
||||||
|
|
||||||
-------------
|
|
||||||
-- Version --
|
|
||||||
-------------
|
|
||||||
|
|
||||||
function Version return String is
|
|
||||||
begin
|
|
||||||
return Interfaces.C.Strings.Value (Thin.zlibVersion);
|
|
||||||
end Version;
|
|
||||||
|
|
||||||
-----------
|
|
||||||
-- Write --
|
|
||||||
-----------
|
|
||||||
|
|
||||||
procedure Write
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Item : in Ada.Streams.Stream_Element_Array;
|
|
||||||
Flush : in Flush_Mode := No_Flush)
|
|
||||||
is
|
|
||||||
Buffer : Stream_Element_Array (1 .. Buffer_Size);
|
|
||||||
In_Last : Stream_Element_Offset;
|
|
||||||
Out_Last : Stream_Element_Offset;
|
|
||||||
In_First : Stream_Element_Offset := Item'First;
|
|
||||||
begin
|
|
||||||
if Item'Length = 0 and Flush = No_Flush then
|
|
||||||
return;
|
|
||||||
end if;
|
|
||||||
|
|
||||||
loop
|
|
||||||
Translate
|
|
||||||
(Filter => Filter,
|
|
||||||
In_Data => Item (In_First .. Item'Last),
|
|
||||||
In_Last => In_Last,
|
|
||||||
Out_Data => Buffer,
|
|
||||||
Out_Last => Out_Last,
|
|
||||||
Flush => Flush);
|
|
||||||
|
|
||||||
if Out_Last >= Buffer'First then
|
|
||||||
Write (Buffer (1 .. Out_Last));
|
|
||||||
end if;
|
|
||||||
|
|
||||||
exit when In_Last = Item'Last or Stream_End (Filter);
|
|
||||||
|
|
||||||
In_First := In_Last + 1;
|
|
||||||
end loop;
|
|
||||||
end Write;
|
|
||||||
|
|
||||||
end ZLib;
|
|
||||||
|
|
@ -1,328 +0,0 @@
|
||||||
------------------------------------------------------------------------------
|
|
||||||
-- ZLib for Ada thick binding. --
|
|
||||||
-- --
|
|
||||||
-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
|
|
||||||
-- --
|
|
||||||
-- This library is free software; you can redistribute it and/or modify --
|
|
||||||
-- it under the terms of the GNU General Public License as published by --
|
|
||||||
-- the Free Software Foundation; either version 2 of the License, or (at --
|
|
||||||
-- your option) any later version. --
|
|
||||||
-- --
|
|
||||||
-- This library is distributed in the hope that it will be useful, but --
|
|
||||||
-- WITHOUT ANY WARRANTY; without even the implied warranty of --
|
|
||||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
|
|
||||||
-- General Public License for more details. --
|
|
||||||
-- --
|
|
||||||
-- You should have received a copy of the GNU General Public License --
|
|
||||||
-- along with this library; if not, write to the Free Software Foundation, --
|
|
||||||
-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
|
|
||||||
-- --
|
|
||||||
-- As a special exception, if other files instantiate generics from this --
|
|
||||||
-- unit, or you link this unit with other files to produce an executable, --
|
|
||||||
-- this unit does not by itself cause the resulting executable to be --
|
|
||||||
-- covered by the GNU General Public License. This exception does not --
|
|
||||||
-- however invalidate any other reasons why the executable file might be --
|
|
||||||
-- covered by the GNU Public License. --
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $
|
|
||||||
|
|
||||||
with Ada.Streams;
|
|
||||||
|
|
||||||
with Interfaces;
|
|
||||||
|
|
||||||
package ZLib is
|
|
||||||
|
|
||||||
ZLib_Error : exception;
|
|
||||||
Status_Error : exception;
|
|
||||||
|
|
||||||
type Compression_Level is new Integer range -1 .. 9;
|
|
||||||
|
|
||||||
type Flush_Mode is private;
|
|
||||||
|
|
||||||
type Compression_Method is private;
|
|
||||||
|
|
||||||
type Window_Bits_Type is new Integer range 8 .. 15;
|
|
||||||
|
|
||||||
type Memory_Level_Type is new Integer range 1 .. 9;
|
|
||||||
|
|
||||||
type Unsigned_32 is new Interfaces.Unsigned_32;
|
|
||||||
|
|
||||||
type Strategy_Type is private;
|
|
||||||
|
|
||||||
type Header_Type is (None, Auto, Default, GZip);
|
|
||||||
-- Header type usage have a some limitation for inflate.
|
|
||||||
-- See comment for Inflate_Init.
|
|
||||||
|
|
||||||
subtype Count is Ada.Streams.Stream_Element_Count;
|
|
||||||
|
|
||||||
Default_Memory_Level : constant Memory_Level_Type := 8;
|
|
||||||
Default_Window_Bits : constant Window_Bits_Type := 15;
|
|
||||||
|
|
||||||
----------------------------------
|
|
||||||
-- Compression method constants --
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
Deflated : constant Compression_Method;
|
|
||||||
-- Only one method allowed in this ZLib version
|
|
||||||
|
|
||||||
---------------------------------
|
|
||||||
-- Compression level constants --
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
No_Compression : constant Compression_Level := 0;
|
|
||||||
Best_Speed : constant Compression_Level := 1;
|
|
||||||
Best_Compression : constant Compression_Level := 9;
|
|
||||||
Default_Compression : constant Compression_Level := -1;
|
|
||||||
|
|
||||||
--------------------------
|
|
||||||
-- Flush mode constants --
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
No_Flush : constant Flush_Mode;
|
|
||||||
-- Regular way for compression, no flush
|
|
||||||
|
|
||||||
Partial_Flush : constant Flush_Mode;
|
|
||||||
-- Will be removed, use Z_SYNC_FLUSH instead
|
|
||||||
|
|
||||||
Sync_Flush : constant Flush_Mode;
|
|
||||||
-- All pending output is flushed to the output buffer and the output
|
|
||||||
-- is aligned on a byte boundary, so that the decompressor can get all
|
|
||||||
-- input data available so far. (In particular avail_in is zero after the
|
|
||||||
-- call if enough output space has been provided before the call.)
|
|
||||||
-- Flushing may degrade compression for some compression algorithms and so
|
|
||||||
-- it should be used only when necessary.
|
|
||||||
|
|
||||||
Block_Flush : constant Flush_Mode;
|
|
||||||
-- Z_BLOCK requests that inflate() stop
|
|
||||||
-- if and when it get to the next deflate block boundary. When decoding the
|
|
||||||
-- zlib or gzip format, this will cause inflate() to return immediately
|
|
||||||
-- after the header and before the first block. When doing a raw inflate,
|
|
||||||
-- inflate() will go ahead and process the first block, and will return
|
|
||||||
-- when it gets to the end of that block, or when it runs out of data.
|
|
||||||
|
|
||||||
Full_Flush : constant Flush_Mode;
|
|
||||||
-- All output is flushed as with SYNC_FLUSH, and the compression state
|
|
||||||
-- is reset so that decompression can restart from this point if previous
|
|
||||||
-- compressed data has been damaged or if random access is desired. Using
|
|
||||||
-- Full_Flush too often can seriously degrade the compression.
|
|
||||||
|
|
||||||
Finish : constant Flush_Mode;
|
|
||||||
-- Just for tell the compressor that input data is complete.
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
-- Compression strategy constants --
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
-- RLE strategy could be used only in version 1.2.0 and later.
|
|
||||||
|
|
||||||
Filtered : constant Strategy_Type;
|
|
||||||
Huffman_Only : constant Strategy_Type;
|
|
||||||
RLE : constant Strategy_Type;
|
|
||||||
Default_Strategy : constant Strategy_Type;
|
|
||||||
|
|
||||||
Default_Buffer_Size : constant := 4096;
|
|
||||||
|
|
||||||
type Filter_Type is tagged limited private;
|
|
||||||
-- The filter is for compression and for decompression.
|
|
||||||
-- The usage of the type is depend of its initialization.
|
|
||||||
|
|
||||||
function Version return String;
|
|
||||||
pragma Inline (Version);
|
|
||||||
-- Return string representation of the ZLib version.
|
|
||||||
|
|
||||||
procedure Deflate_Init
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Level : in Compression_Level := Default_Compression;
|
|
||||||
Strategy : in Strategy_Type := Default_Strategy;
|
|
||||||
Method : in Compression_Method := Deflated;
|
|
||||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
|
||||||
Memory_Level : in Memory_Level_Type := Default_Memory_Level;
|
|
||||||
Header : in Header_Type := Default);
|
|
||||||
-- Compressor initialization.
|
|
||||||
-- When Header parameter is Auto or Default, then default zlib header
|
|
||||||
-- would be provided for compressed data.
|
|
||||||
-- When Header is GZip, then gzip header would be set instead of
|
|
||||||
-- default header.
|
|
||||||
-- When Header is None, no header would be set for compressed data.
|
|
||||||
|
|
||||||
procedure Inflate_Init
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Window_Bits : in Window_Bits_Type := Default_Window_Bits;
|
|
||||||
Header : in Header_Type := Default);
|
|
||||||
-- Decompressor initialization.
|
|
||||||
-- Default header type mean that ZLib default header is expecting in the
|
|
||||||
-- input compressed stream.
|
|
||||||
-- Header type None mean that no header is expecting in the input stream.
|
|
||||||
-- GZip header type mean that GZip header is expecting in the
|
|
||||||
-- input compressed stream.
|
|
||||||
-- Auto header type mean that header type (GZip or Native) would be
|
|
||||||
-- detected automatically in the input stream.
|
|
||||||
-- Note that header types parameter values None, GZip and Auto are
|
|
||||||
-- supported for inflate routine only in ZLib versions 1.2.0.2 and later.
|
|
||||||
-- Deflate_Init is supporting all header types.
|
|
||||||
|
|
||||||
function Is_Open (Filter : in Filter_Type) return Boolean;
|
|
||||||
pragma Inline (Is_Open);
|
|
||||||
-- Is the filter opened for compression or decompression.
|
|
||||||
|
|
||||||
procedure Close
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Ignore_Error : in Boolean := False);
|
|
||||||
-- Closing the compression or decompressor.
|
|
||||||
-- If stream is closing before the complete and Ignore_Error is False,
|
|
||||||
-- The exception would be raised.
|
|
||||||
|
|
||||||
generic
|
|
||||||
with procedure Data_In
|
|
||||||
(Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset);
|
|
||||||
with procedure Data_Out
|
|
||||||
(Item : in Ada.Streams.Stream_Element_Array);
|
|
||||||
procedure Generic_Translate
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Buffer_Size : in Integer := Default_Buffer_Size;
|
|
||||||
Out_Buffer_Size : in Integer := Default_Buffer_Size);
|
|
||||||
-- Compress/decompress data fetch from Data_In routine and pass the result
|
|
||||||
-- to the Data_Out routine. User should provide Data_In and Data_Out
|
|
||||||
-- for compression/decompression data flow.
|
|
||||||
-- Compression or decompression depend on Filter initialization.
|
|
||||||
|
|
||||||
function Total_In (Filter : in Filter_Type) return Count;
|
|
||||||
pragma Inline (Total_In);
|
|
||||||
-- Returns total number of input bytes read so far
|
|
||||||
|
|
||||||
function Total_Out (Filter : in Filter_Type) return Count;
|
|
||||||
pragma Inline (Total_Out);
|
|
||||||
-- Returns total number of bytes output so far
|
|
||||||
|
|
||||||
function CRC32
|
|
||||||
(CRC : in Unsigned_32;
|
|
||||||
Data : in Ada.Streams.Stream_Element_Array)
|
|
||||||
return Unsigned_32;
|
|
||||||
pragma Inline (CRC32);
|
|
||||||
-- Compute CRC32, it could be necessary for make gzip format
|
|
||||||
|
|
||||||
procedure CRC32
|
|
||||||
(CRC : in out Unsigned_32;
|
|
||||||
Data : in Ada.Streams.Stream_Element_Array);
|
|
||||||
pragma Inline (CRC32);
|
|
||||||
-- Compute CRC32, it could be necessary for make gzip format
|
|
||||||
|
|
||||||
-------------------------------------------------
|
|
||||||
-- Below is more complex low level routines. --
|
|
||||||
-------------------------------------------------
|
|
||||||
|
|
||||||
procedure Translate
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
In_Data : in Ada.Streams.Stream_Element_Array;
|
|
||||||
In_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode);
|
|
||||||
-- Compress/decompress the In_Data buffer and place the result into
|
|
||||||
-- Out_Data. In_Last is the index of last element from In_Data accepted by
|
|
||||||
-- the Filter. Out_Last is the last element of the received data from
|
|
||||||
-- Filter. To tell the filter that incoming data are complete put the
|
|
||||||
-- Flush parameter to Finish.
|
|
||||||
|
|
||||||
function Stream_End (Filter : in Filter_Type) return Boolean;
|
|
||||||
pragma Inline (Stream_End);
|
|
||||||
-- Return the true when the stream is complete.
|
|
||||||
|
|
||||||
procedure Flush
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Out_Data : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Out_Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode);
|
|
||||||
pragma Inline (Flush);
|
|
||||||
-- Flushing the data from the compressor.
|
|
||||||
|
|
||||||
generic
|
|
||||||
with procedure Write
|
|
||||||
(Item : in Ada.Streams.Stream_Element_Array);
|
|
||||||
-- User should provide this routine for accept
|
|
||||||
-- compressed/decompressed data.
|
|
||||||
|
|
||||||
Buffer_Size : in Ada.Streams.Stream_Element_Offset
|
|
||||||
:= Default_Buffer_Size;
|
|
||||||
-- Buffer size for Write user routine.
|
|
||||||
|
|
||||||
procedure Write
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Item : in Ada.Streams.Stream_Element_Array;
|
|
||||||
Flush : in Flush_Mode := No_Flush);
|
|
||||||
-- Compress/Decompress data from Item to the generic parameter procedure
|
|
||||||
-- Write. Output buffer size could be set in Buffer_Size generic parameter.
|
|
||||||
|
|
||||||
generic
|
|
||||||
with procedure Read
|
|
||||||
(Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset);
|
|
||||||
-- User should provide data for compression/decompression
|
|
||||||
-- thru this routine.
|
|
||||||
|
|
||||||
Buffer : in out Ada.Streams.Stream_Element_Array;
|
|
||||||
-- Buffer for keep remaining data from the previous
|
|
||||||
-- back read.
|
|
||||||
|
|
||||||
Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset;
|
|
||||||
-- Rest_First have to be initialized to Buffer'Last + 1
|
|
||||||
-- Rest_Last have to be initialized to Buffer'Last
|
|
||||||
-- before usage.
|
|
||||||
|
|
||||||
Allow_Read_Some : in Boolean := False;
|
|
||||||
-- Is it allowed to return Last < Item'Last before end of data.
|
|
||||||
|
|
||||||
procedure Read
|
|
||||||
(Filter : in out Filter_Type;
|
|
||||||
Item : out Ada.Streams.Stream_Element_Array;
|
|
||||||
Last : out Ada.Streams.Stream_Element_Offset;
|
|
||||||
Flush : in Flush_Mode := No_Flush);
|
|
||||||
-- Compress/Decompress data from generic parameter procedure Read to the
|
|
||||||
-- Item. User should provide Buffer and initialized Rest_First, Rest_Last
|
|
||||||
-- indicators. If Allow_Read_Some is True, Read routines could return
|
|
||||||
-- Last < Item'Last only at end of stream.
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
use Ada.Streams;
|
|
||||||
|
|
||||||
pragma Assert (Ada.Streams.Stream_Element'Size = 8);
|
|
||||||
pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8);
|
|
||||||
|
|
||||||
type Flush_Mode is new Integer range 0 .. 5;
|
|
||||||
|
|
||||||
type Compression_Method is new Integer range 8 .. 8;
|
|
||||||
|
|
||||||
type Strategy_Type is new Integer range 0 .. 3;
|
|
||||||
|
|
||||||
No_Flush : constant Flush_Mode := 0;
|
|
||||||
Partial_Flush : constant Flush_Mode := 1;
|
|
||||||
Sync_Flush : constant Flush_Mode := 2;
|
|
||||||
Full_Flush : constant Flush_Mode := 3;
|
|
||||||
Finish : constant Flush_Mode := 4;
|
|
||||||
Block_Flush : constant Flush_Mode := 5;
|
|
||||||
|
|
||||||
Filtered : constant Strategy_Type := 1;
|
|
||||||
Huffman_Only : constant Strategy_Type := 2;
|
|
||||||
RLE : constant Strategy_Type := 3;
|
|
||||||
Default_Strategy : constant Strategy_Type := 0;
|
|
||||||
|
|
||||||
Deflated : constant Compression_Method := 8;
|
|
||||||
|
|
||||||
type Z_Stream;
|
|
||||||
|
|
||||||
type Z_Stream_Access is access all Z_Stream;
|
|
||||||
|
|
||||||
type Filter_Type is tagged limited record
|
|
||||||
Strm : Z_Stream_Access;
|
|
||||||
Compression : Boolean;
|
|
||||||
Stream_End : Boolean;
|
|
||||||
Header : Header_Type;
|
|
||||||
CRC : Unsigned_32;
|
|
||||||
Offset : Stream_Element_Offset;
|
|
||||||
-- Offset for gzip header/footer output.
|
|
||||||
end record;
|
|
||||||
|
|
||||||
end ZLib;
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
project Zlib is
|
|
||||||
|
|
||||||
for Languages use ("Ada");
|
|
||||||
for Source_Dirs use (".");
|
|
||||||
for Object_Dir use ".";
|
|
||||||
for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo");
|
|
||||||
|
|
||||||
package Compiler is
|
|
||||||
for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
|
|
||||||
end Compiler;
|
|
||||||
|
|
||||||
package Linker is
|
|
||||||
for Default_Switches ("ada") use ("-lz");
|
|
||||||
end Linker;
|
|
||||||
|
|
||||||
package Builder is
|
|
||||||
for Default_Switches ("ada") use ("-s", "-gnatQ");
|
|
||||||
end Builder;
|
|
||||||
|
|
||||||
end Zlib;
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
blast: blast.c blast.h
|
|
||||||
cc -DTEST -o blast blast.c
|
|
||||||
|
|
||||||
test: blast
|
|
||||||
blast < test.pk | cmp - test.txt
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f blast blast.o
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
Read blast.h for purpose and usage.
|
|
||||||
|
|
||||||
Mark Adler
|
|
||||||
madler@alumni.caltech.edu
|
|
||||||
|
|
@ -1,466 +0,0 @@
|
||||||
/* blast.c
|
|
||||||
* Copyright (C) 2003, 2012, 2013 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in blast.h
|
|
||||||
* version 1.3, 24 Aug 2013
|
|
||||||
*
|
|
||||||
* blast.c decompresses data compressed by the PKWare Compression Library.
|
|
||||||
* This function provides functionality similar to the explode() function of
|
|
||||||
* the PKWare library, hence the name "blast".
|
|
||||||
*
|
|
||||||
* This decompressor is based on the excellent format description provided by
|
|
||||||
* Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the
|
|
||||||
* example Ben provided in the post is incorrect. The distance 110001 should
|
|
||||||
* instead be 111000. When corrected, the example byte stream becomes:
|
|
||||||
*
|
|
||||||
* 00 04 82 24 25 8f 80 7f
|
|
||||||
*
|
|
||||||
* which decompresses to "AIAIAIAIAIAIA" (without the quotes).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Change history:
|
|
||||||
*
|
|
||||||
* 1.0 12 Feb 2003 - First version
|
|
||||||
* 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data
|
|
||||||
* 1.2 24 Oct 2012 - Add note about using binary mode in stdio
|
|
||||||
* - Fix comparisons of differently signed integers
|
|
||||||
* 1.3 24 Aug 2013 - Return unused input from blast()
|
|
||||||
* - Fix test code to correctly report unused input
|
|
||||||
* - Enable the provision of initial input to blast()
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stddef.h> /* for NULL */
|
|
||||||
#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 */
|
|
||||||
|
|
||||||
/* input and output state */
|
|
||||||
struct state {
|
|
||||||
/* input state */
|
|
||||||
blast_in infun; /* input function provided by user */
|
|
||||||
void *inhow; /* opaque information passed to infun() */
|
|
||||||
unsigned char *in; /* next input location */
|
|
||||||
unsigned left; /* available input at in */
|
|
||||||
int bitbuf; /* bit buffer */
|
|
||||||
int bitcnt; /* number of bits in bit buffer */
|
|
||||||
|
|
||||||
/* input limit error return state for bits() and decode() */
|
|
||||||
jmp_buf env;
|
|
||||||
|
|
||||||
/* output state */
|
|
||||||
blast_out outfun; /* output function provided by user */
|
|
||||||
void *outhow; /* opaque information passed to outfun() */
|
|
||||||
unsigned next; /* index of next write location in out[] */
|
|
||||||
int first; /* true to check distances (for first 4K) */
|
|
||||||
unsigned char out[MAXWIN]; /* output buffer and sliding window */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return need bits from the input stream. This always leaves less than
|
|
||||||
* eight bits in the buffer. bits() works properly for need == 0.
|
|
||||||
*
|
|
||||||
* Format notes:
|
|
||||||
*
|
|
||||||
* - Bits are stored in bytes from the least significant bit to the most
|
|
||||||
* significant bit. Therefore bits are dropped from the bottom of the bit
|
|
||||||
* buffer, using shift right, and new bytes are appended to the top of the
|
|
||||||
* bit buffer, using shift left.
|
|
||||||
*/
|
|
||||||
local int bits(struct state *s, int need)
|
|
||||||
{
|
|
||||||
int val; /* bit accumulator */
|
|
||||||
|
|
||||||
/* load at least need bits into val */
|
|
||||||
val = s->bitbuf;
|
|
||||||
while (s->bitcnt < need) {
|
|
||||||
if (s->left == 0) {
|
|
||||||
s->left = s->infun(s->inhow, &(s->in));
|
|
||||||
if (s->left == 0) longjmp(s->env, 1); /* out of input */
|
|
||||||
}
|
|
||||||
val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */
|
|
||||||
s->left--;
|
|
||||||
s->bitcnt += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* drop need bits and update buffer, always zero to seven bits left */
|
|
||||||
s->bitbuf = val >> need;
|
|
||||||
s->bitcnt -= need;
|
|
||||||
|
|
||||||
/* return need bits, zeroing the bits above that */
|
|
||||||
return val & ((1 << need) - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of
|
|
||||||
* each length, which for a canonical code are stepped through in order.
|
|
||||||
* symbol[] are the symbol values in canonical order, where the number of
|
|
||||||
* entries is the sum of the counts in count[]. The decoding process can be
|
|
||||||
* seen in the function decode() below.
|
|
||||||
*/
|
|
||||||
struct huffman {
|
|
||||||
short *count; /* number of symbols of each length */
|
|
||||||
short *symbol; /* canonically ordered symbols */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a code from the stream s using huffman table h. Return the symbol or
|
|
||||||
* a negative value if there is an error. If all of the lengths are zero, i.e.
|
|
||||||
* an empty code, or if the code is incomplete and an invalid code is received,
|
|
||||||
* then -9 is returned after reading MAXBITS bits.
|
|
||||||
*
|
|
||||||
* Format notes:
|
|
||||||
*
|
|
||||||
* - The codes as stored in the compressed data are bit-reversed relative to
|
|
||||||
* a simple integer ordering of codes of the same lengths. Hence below the
|
|
||||||
* bits are pulled from the compressed data one at a time and used to
|
|
||||||
* build the code value reversed from what is in the stream in order to
|
|
||||||
* permit simple integer comparisons for decoding.
|
|
||||||
*
|
|
||||||
* - The first code for the shortest length is all ones. Subsequent codes of
|
|
||||||
* the same length are simply integer decrements of the previous code. When
|
|
||||||
* moving up a length, a one bit is appended to the code. For a complete
|
|
||||||
* code, the last code of the longest length will be all zeros. To support
|
|
||||||
* this ordering, the bits pulled during decoding are inverted to apply the
|
|
||||||
* more "natural" ordering starting with all zeros and incrementing.
|
|
||||||
*/
|
|
||||||
local int decode(struct state *s, struct huffman *h)
|
|
||||||
{
|
|
||||||
int len; /* current number of bits in code */
|
|
||||||
int code; /* len bits being decoded */
|
|
||||||
int first; /* first code of length len */
|
|
||||||
int count; /* number of codes of length len */
|
|
||||||
int index; /* index of first code of length len in symbol table */
|
|
||||||
int bitbuf; /* bits from stream */
|
|
||||||
int left; /* bits left in next or left to process */
|
|
||||||
short *next; /* next number of codes */
|
|
||||||
|
|
||||||
bitbuf = s->bitbuf;
|
|
||||||
left = s->bitcnt;
|
|
||||||
code = first = index = 0;
|
|
||||||
len = 1;
|
|
||||||
next = h->count + 1;
|
|
||||||
while (1) {
|
|
||||||
while (left--) {
|
|
||||||
code |= (bitbuf & 1) ^ 1; /* invert code */
|
|
||||||
bitbuf >>= 1;
|
|
||||||
count = *next++;
|
|
||||||
if (code < first + count) { /* if length len, return symbol */
|
|
||||||
s->bitbuf = bitbuf;
|
|
||||||
s->bitcnt = (s->bitcnt - len) & 7;
|
|
||||||
return h->symbol[index + (code - first)];
|
|
||||||
}
|
|
||||||
index += count; /* else update for next length */
|
|
||||||
first += count;
|
|
||||||
first <<= 1;
|
|
||||||
code <<= 1;
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
left = (MAXBITS+1) - len;
|
|
||||||
if (left == 0) break;
|
|
||||||
if (s->left == 0) {
|
|
||||||
s->left = s->infun(s->inhow, &(s->in));
|
|
||||||
if (s->left == 0) longjmp(s->env, 1); /* out of input */
|
|
||||||
}
|
|
||||||
bitbuf = *(s->in)++;
|
|
||||||
s->left--;
|
|
||||||
if (left > 8) left = 8;
|
|
||||||
}
|
|
||||||
return -9; /* ran out of codes */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Given a list of repeated code lengths rep[0..n-1], where each byte is a
|
|
||||||
* count (high four bits + 1) and a code length (low four bits), generate the
|
|
||||||
* list of code lengths. This compaction reduces the size of the object code.
|
|
||||||
* Then given the list of code lengths length[0..n-1] representing a canonical
|
|
||||||
* Huffman code for n symbols, construct the tables required to decode those
|
|
||||||
* codes. Those tables are the number of codes of each length, and the symbols
|
|
||||||
* sorted by length, retaining their original order within each length. The
|
|
||||||
* return value is zero for a complete code set, negative for an over-
|
|
||||||
* subscribed code set, and positive for an incomplete code set. The tables
|
|
||||||
* can be used if the return value is zero or positive, but they cannot be used
|
|
||||||
* if the return value is negative. If the return value is zero, it is not
|
|
||||||
* possible for decode() using that table to return an error--any stream of
|
|
||||||
* enough bits will resolve to a symbol. If the return value is positive, then
|
|
||||||
* it is possible for decode() using that table to return an error for received
|
|
||||||
* codes past the end of the incomplete lengths.
|
|
||||||
*/
|
|
||||||
local int construct(struct huffman *h, const unsigned char *rep, int n)
|
|
||||||
{
|
|
||||||
int symbol; /* current symbol when stepping through length[] */
|
|
||||||
int len; /* current length when stepping through h->count[] */
|
|
||||||
int left; /* number of possible codes left of current length */
|
|
||||||
short offs[MAXBITS+1]; /* offsets in symbol table for each length */
|
|
||||||
short length[256]; /* code lengths */
|
|
||||||
|
|
||||||
/* convert compact repeat counts into symbol bit length list */
|
|
||||||
symbol = 0;
|
|
||||||
do {
|
|
||||||
len = *rep++;
|
|
||||||
left = (len >> 4) + 1;
|
|
||||||
len &= 15;
|
|
||||||
do {
|
|
||||||
length[symbol++] = len;
|
|
||||||
} while (--left);
|
|
||||||
} while (--n);
|
|
||||||
n = symbol;
|
|
||||||
|
|
||||||
/* count number of codes of each length */
|
|
||||||
for (len = 0; len <= MAXBITS; len++)
|
|
||||||
h->count[len] = 0;
|
|
||||||
for (symbol = 0; symbol < n; symbol++)
|
|
||||||
(h->count[length[symbol]])++; /* assumes lengths are within bounds */
|
|
||||||
if (h->count[0] == n) /* no codes! */
|
|
||||||
return 0; /* complete, but decode() will fail */
|
|
||||||
|
|
||||||
/* check for an over-subscribed or incomplete set of lengths */
|
|
||||||
left = 1; /* one possible code of zero length */
|
|
||||||
for (len = 1; len <= MAXBITS; len++) {
|
|
||||||
left <<= 1; /* one more bit, double codes left */
|
|
||||||
left -= h->count[len]; /* deduct count from possible codes */
|
|
||||||
if (left < 0) return left; /* over-subscribed--return negative */
|
|
||||||
} /* left > 0 means incomplete */
|
|
||||||
|
|
||||||
/* generate offsets into symbol table for each length for sorting */
|
|
||||||
offs[1] = 0;
|
|
||||||
for (len = 1; len < MAXBITS; len++)
|
|
||||||
offs[len + 1] = offs[len] + h->count[len];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* put symbols in table sorted by length, by symbol order within each
|
|
||||||
* length
|
|
||||||
*/
|
|
||||||
for (symbol = 0; symbol < n; symbol++)
|
|
||||||
if (length[symbol] != 0)
|
|
||||||
h->symbol[offs[length[symbol]]++] = symbol;
|
|
||||||
|
|
||||||
/* return zero for complete set, positive for incomplete set */
|
|
||||||
return left;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode PKWare Compression Library stream.
|
|
||||||
*
|
|
||||||
* Format notes:
|
|
||||||
*
|
|
||||||
* - First byte is 0 if literals are uncoded or 1 if they are coded. Second
|
|
||||||
* byte is 4, 5, or 6 for the number of extra bits in the distance code.
|
|
||||||
* This is the base-2 logarithm of the dictionary size minus six.
|
|
||||||
*
|
|
||||||
* - Compressed data is a combination of literals and length/distance pairs
|
|
||||||
* terminated by an end code. Literals are either Huffman coded or
|
|
||||||
* uncoded bytes. A length/distance pair is a coded length followed by a
|
|
||||||
* coded distance to represent a string that occurs earlier in the
|
|
||||||
* uncompressed data that occurs again at the current location.
|
|
||||||
*
|
|
||||||
* - A bit preceding a literal or length/distance pair indicates which comes
|
|
||||||
* next, 0 for literals, 1 for length/distance.
|
|
||||||
*
|
|
||||||
* - If literals are uncoded, then the next eight bits are the literal, in the
|
|
||||||
* normal bit order in the stream, i.e. no bit-reversal is needed. Similarly,
|
|
||||||
* no bit reversal is needed for either the length extra bits or the distance
|
|
||||||
* extra bits.
|
|
||||||
*
|
|
||||||
* - Literal bytes are simply written to the output. A length/distance pair is
|
|
||||||
* an instruction to copy previously uncompressed bytes to the output. The
|
|
||||||
* copy is from distance bytes back in the output stream, copying for length
|
|
||||||
* bytes.
|
|
||||||
*
|
|
||||||
* - Distances pointing before the beginning of the output data are not
|
|
||||||
* permitted.
|
|
||||||
*
|
|
||||||
* - Overlapped copies, where the length is greater than the distance, are
|
|
||||||
* allowed and common. For example, a distance of one and a length of 518
|
|
||||||
* simply copies the last byte 518 times. A distance of four and a length of
|
|
||||||
* twelve copies the last four bytes three times. A simple forward copy
|
|
||||||
* ignoring whether the length is greater than the distance or not implements
|
|
||||||
* this correctly.
|
|
||||||
*/
|
|
||||||
local int decomp(struct state *s)
|
|
||||||
{
|
|
||||||
int lit; /* true if literals are coded */
|
|
||||||
int dict; /* log2(dictionary size) - 6 */
|
|
||||||
int symbol; /* decoded symbol, extra bits for distance */
|
|
||||||
int len; /* length for copy */
|
|
||||||
unsigned dist; /* distance for copy */
|
|
||||||
int copy; /* copy counter */
|
|
||||||
unsigned char *from, *to; /* copy pointers */
|
|
||||||
static int virgin = 1; /* build tables once */
|
|
||||||
static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */
|
|
||||||
static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */
|
|
||||||
static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */
|
|
||||||
static struct huffman litcode = {litcnt, litsym}; /* length code */
|
|
||||||
static struct huffman lencode = {lencnt, lensym}; /* length code */
|
|
||||||
static struct huffman distcode = {distcnt, distsym};/* distance code */
|
|
||||||
/* bit lengths of literal codes */
|
|
||||||
static const unsigned char litlen[] = {
|
|
||||||
11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8,
|
|
||||||
9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5,
|
|
||||||
7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12,
|
|
||||||
8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27,
|
|
||||||
44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45,
|
|
||||||
44, 173};
|
|
||||||
/* bit lengths of length codes 0..15 */
|
|
||||||
static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23};
|
|
||||||
/* bit lengths of distance codes 0..63 */
|
|
||||||
static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248};
|
|
||||||
static const short base[16] = { /* base for length codes */
|
|
||||||
3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264};
|
|
||||||
static const char extra[16] = { /* extra bits for length codes */
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
|
|
||||||
|
|
||||||
/* set up decoding tables (once--might not be thread-safe) */
|
|
||||||
if (virgin) {
|
|
||||||
construct(&litcode, litlen, sizeof(litlen));
|
|
||||||
construct(&lencode, lenlen, sizeof(lenlen));
|
|
||||||
construct(&distcode, distlen, sizeof(distlen));
|
|
||||||
virgin = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read header */
|
|
||||||
lit = bits(s, 8);
|
|
||||||
if (lit > 1) return -1;
|
|
||||||
dict = bits(s, 8);
|
|
||||||
if (dict < 4 || dict > 6) return -2;
|
|
||||||
|
|
||||||
/* decode literals and length/distance pairs */
|
|
||||||
do {
|
|
||||||
if (bits(s, 1)) {
|
|
||||||
/* get length */
|
|
||||||
symbol = decode(s, &lencode);
|
|
||||||
len = base[symbol] + bits(s, extra[symbol]);
|
|
||||||
if (len == 519) break; /* end code */
|
|
||||||
|
|
||||||
/* get distance */
|
|
||||||
symbol = len == 2 ? 2 : dict;
|
|
||||||
dist = decode(s, &distcode) << symbol;
|
|
||||||
dist += bits(s, symbol);
|
|
||||||
dist++;
|
|
||||||
if (s->first && dist > s->next)
|
|
||||||
return -3; /* distance too far back */
|
|
||||||
|
|
||||||
/* copy length bytes from distance bytes back */
|
|
||||||
do {
|
|
||||||
to = s->out + s->next;
|
|
||||||
from = to - dist;
|
|
||||||
copy = MAXWIN;
|
|
||||||
if (s->next < dist) {
|
|
||||||
from += copy;
|
|
||||||
copy = dist;
|
|
||||||
}
|
|
||||||
copy -= s->next;
|
|
||||||
if (copy > len) copy = len;
|
|
||||||
len -= copy;
|
|
||||||
s->next += copy;
|
|
||||||
do {
|
|
||||||
*to++ = *from++;
|
|
||||||
} while (--copy);
|
|
||||||
if (s->next == MAXWIN) {
|
|
||||||
if (s->outfun(s->outhow, s->out, s->next)) return 1;
|
|
||||||
s->next = 0;
|
|
||||||
s->first = 0;
|
|
||||||
}
|
|
||||||
} while (len != 0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* get literal and write it */
|
|
||||||
symbol = lit ? decode(s, &litcode) : bits(s, 8);
|
|
||||||
s->out[s->next++] = symbol;
|
|
||||||
if (s->next == MAXWIN) {
|
|
||||||
if (s->outfun(s->outhow, s->out, s->next)) return 1;
|
|
||||||
s->next = 0;
|
|
||||||
s->first = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See comments in blast.h */
|
|
||||||
int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
|
|
||||||
unsigned *left, unsigned char **in)
|
|
||||||
{
|
|
||||||
struct state s; /* input/output state */
|
|
||||||
int err; /* return value */
|
|
||||||
|
|
||||||
/* initialize input state */
|
|
||||||
s.infun = infun;
|
|
||||||
s.inhow = inhow;
|
|
||||||
if (left != NULL && *left) {
|
|
||||||
s.left = *left;
|
|
||||||
s.in = *in;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
s.left = 0;
|
|
||||||
s.bitbuf = 0;
|
|
||||||
s.bitcnt = 0;
|
|
||||||
|
|
||||||
/* initialize output state */
|
|
||||||
s.outfun = outfun;
|
|
||||||
s.outhow = outhow;
|
|
||||||
s.next = 0;
|
|
||||||
s.first = 1;
|
|
||||||
|
|
||||||
/* return if bits() or decode() tries to read past available input */
|
|
||||||
if (setjmp(s.env) != 0) /* if came back here via longjmp(), */
|
|
||||||
err = 2; /* then skip decomp(), return error */
|
|
||||||
else
|
|
||||||
err = decomp(&s); /* decompress */
|
|
||||||
|
|
||||||
/* return unused input */
|
|
||||||
if (left != NULL)
|
|
||||||
*left = s.left;
|
|
||||||
if (in != NULL)
|
|
||||||
*in = s.left ? s.in : NULL;
|
|
||||||
|
|
||||||
/* write any leftover output and update the error code if needed */
|
|
||||||
if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0)
|
|
||||||
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
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
/* blast.h -- interface for blast.c
|
|
||||||
Copyright (C) 2003, 2012, 2013 Mark Adler
|
|
||||||
version 1.3, 24 Aug 2013
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the author be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Mark Adler madler@alumni.caltech.edu
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* blast() decompresses the PKWare Data Compression Library (DCL) compressed
|
|
||||||
* format. It provides the same functionality as the explode() function in
|
|
||||||
* that library. (Note: PKWare overused the "implode" verb, and the format
|
|
||||||
* used by their library implode() function is completely different and
|
|
||||||
* incompatible with the implode compression method supported by PKZIP.)
|
|
||||||
*
|
|
||||||
* The binary mode for stdio functions should be used to assure that the
|
|
||||||
* compressed data is not corrupted when read or written. For example:
|
|
||||||
* fopen(..., "rb") and fopen(..., "wb").
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
typedef unsigned (*blast_in)(void *how, unsigned char **buf);
|
|
||||||
typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len);
|
|
||||||
/* Definitions for input/output functions passed to blast(). See below for
|
|
||||||
* what the provided functions need to do.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
|
|
||||||
unsigned *left, unsigned char **in);
|
|
||||||
/* Decompress input to output using the provided infun() and outfun() calls.
|
|
||||||
* On success, the return value of blast() is zero. If there is an error in
|
|
||||||
* the source data, i.e. it is not in the proper format, then a negative value
|
|
||||||
* is returned. If there is not enough input available or there is not enough
|
|
||||||
* output space, then a positive error is returned.
|
|
||||||
*
|
|
||||||
* The input function is invoked: len = infun(how, &buf), where buf is set by
|
|
||||||
* infun() to point to the input buffer, and infun() returns the number of
|
|
||||||
* available bytes there. If infun() returns zero, then blast() returns with
|
|
||||||
* an input error. (blast() only asks for input if it needs it.) inhow is for
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* with an output error. outfun() is always called with len <= 4096. outhow
|
|
||||||
* is for use by the application to pass an output descriptor to outfun(), if
|
|
||||||
* desired.
|
|
||||||
*
|
|
||||||
* If there is any unused input, *left is set to the number of bytes that were
|
|
||||||
* read and *in points to them. Otherwise *left is set to zero and *in is set
|
|
||||||
* to NULL. If left or in are NULL, then they are not set.
|
|
||||||
*
|
|
||||||
* The return codes are:
|
|
||||||
*
|
|
||||||
* 2: ran out of input before completing decompression
|
|
||||||
* 1: output error before completing decompression
|
|
||||||
* 0: successful decompression
|
|
||||||
* -1: literal flag not zero or one
|
|
||||||
* -2: dictionary size not in 4..6
|
|
||||||
* -3: distance is too far back
|
|
||||||
*
|
|
||||||
* At the bottom of blast.c is an example program that uses blast() that can be
|
|
||||||
* compiled to produce a command-line decompression filter by defining TEST.
|
|
||||||
*/
|
|
||||||
Binary file not shown.
|
|
@ -1 +0,0 @@
|
||||||
AIAIAIAIAIAIA
|
|
||||||
|
|
@ -1,557 +0,0 @@
|
||||||
{*******************************************************}
|
|
||||||
{ }
|
|
||||||
{ Borland Delphi Supplemental Components }
|
|
||||||
{ ZLIB Data Compression Interface Unit }
|
|
||||||
{ }
|
|
||||||
{ Copyright (c) 1997,99 Borland Corporation }
|
|
||||||
{ }
|
|
||||||
{*******************************************************}
|
|
||||||
|
|
||||||
{ Updated for zlib 1.2.x by Cosmin Truta <cosmint@cs.ubbcluj.ro> }
|
|
||||||
|
|
||||||
unit ZLib;
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses SysUtils, Classes;
|
|
||||||
|
|
||||||
type
|
|
||||||
TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
|
|
||||||
TFree = procedure (AppData, Block: Pointer); cdecl;
|
|
||||||
|
|
||||||
// Internal structure. Ignore.
|
|
||||||
TZStreamRec = packed record
|
|
||||||
next_in: PChar; // next input byte
|
|
||||||
avail_in: Integer; // number of bytes available at next_in
|
|
||||||
total_in: Longint; // total nb of input bytes read so far
|
|
||||||
|
|
||||||
next_out: PChar; // next output byte should be put here
|
|
||||||
avail_out: Integer; // remaining free space at next_out
|
|
||||||
total_out: Longint; // total nb of bytes output so far
|
|
||||||
|
|
||||||
msg: PChar; // last error message, NULL if no error
|
|
||||||
internal: Pointer; // not visible by applications
|
|
||||||
|
|
||||||
zalloc: TAlloc; // used to allocate the internal state
|
|
||||||
zfree: TFree; // used to free the internal state
|
|
||||||
AppData: Pointer; // private data object passed to zalloc and zfree
|
|
||||||
|
|
||||||
data_type: Integer; // best guess about the data type: ascii or binary
|
|
||||||
adler: Longint; // adler32 value of the uncompressed data
|
|
||||||
reserved: Longint; // reserved for future use
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Abstract ancestor class
|
|
||||||
TCustomZlibStream = class(TStream)
|
|
||||||
private
|
|
||||||
FStrm: TStream;
|
|
||||||
FStrmPos: Integer;
|
|
||||||
FOnProgress: TNotifyEvent;
|
|
||||||
FZRec: TZStreamRec;
|
|
||||||
FBuffer: array [Word] of Char;
|
|
||||||
protected
|
|
||||||
procedure Progress(Sender: TObject); dynamic;
|
|
||||||
property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;
|
|
||||||
constructor Create(Strm: TStream);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TCompressionStream compresses data on the fly as data is written to it, and
|
|
||||||
stores the compressed data to another stream.
|
|
||||||
|
|
||||||
TCompressionStream is write-only and strictly sequential. Reading from the
|
|
||||||
stream will raise an exception. Using Seek to move the stream pointer
|
|
||||||
will raise an exception.
|
|
||||||
|
|
||||||
Output data is cached internally, written to the output stream only when
|
|
||||||
the internal output buffer is full. All pending output data is flushed
|
|
||||||
when the stream is destroyed.
|
|
||||||
|
|
||||||
The Position property returns the number of uncompressed bytes of
|
|
||||||
data that have been written to the stream so far.
|
|
||||||
|
|
||||||
CompressionRate returns the on-the-fly percentage by which the original
|
|
||||||
data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100
|
|
||||||
If raw data size = 100 and compressed data size = 25, the CompressionRate
|
|
||||||
is 75%
|
|
||||||
|
|
||||||
The OnProgress event is called each time the output buffer is filled and
|
|
||||||
written to the output stream. This is useful for updating a progress
|
|
||||||
indicator when you are writing a large chunk of data to the compression
|
|
||||||
stream in a single call.}
|
|
||||||
|
|
||||||
|
|
||||||
TCompressionLevel = (clNone, clFastest, clDefault, clMax);
|
|
||||||
|
|
||||||
TCompressionStream = class(TCustomZlibStream)
|
|
||||||
private
|
|
||||||
function GetCompressionRate: Single;
|
|
||||||
public
|
|
||||||
constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream);
|
|
||||||
destructor Destroy; override;
|
|
||||||
function Read(var Buffer; Count: Longint): Longint; override;
|
|
||||||
function Write(const Buffer; Count: Longint): Longint; override;
|
|
||||||
function Seek(Offset: Longint; Origin: Word): Longint; override;
|
|
||||||
property CompressionRate: Single read GetCompressionRate;
|
|
||||||
property OnProgress;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TDecompressionStream decompresses data on the fly as data is read from it.
|
|
||||||
|
|
||||||
Compressed data comes from a separate source stream. TDecompressionStream
|
|
||||||
is read-only and unidirectional; you can seek forward in the stream, but not
|
|
||||||
backwards. The special case of setting the stream position to zero is
|
|
||||||
allowed. Seeking forward decompresses data until the requested position in
|
|
||||||
the uncompressed data has been reached. Seeking backwards, seeking relative
|
|
||||||
to the end of the stream, requesting the size of the stream, and writing to
|
|
||||||
the stream will raise an exception.
|
|
||||||
|
|
||||||
The Position property returns the number of bytes of uncompressed data that
|
|
||||||
have been read from the stream so far.
|
|
||||||
|
|
||||||
The OnProgress event is called each time the internal input buffer of
|
|
||||||
compressed data is exhausted and the next block is read from the input stream.
|
|
||||||
This is useful for updating a progress indicator when you are reading a
|
|
||||||
large chunk of data from the decompression stream in a single call.}
|
|
||||||
|
|
||||||
TDecompressionStream = class(TCustomZlibStream)
|
|
||||||
public
|
|
||||||
constructor Create(Source: TStream);
|
|
||||||
destructor Destroy; override;
|
|
||||||
function Read(var Buffer; Count: Longint): Longint; override;
|
|
||||||
function Write(const Buffer; Count: Longint): Longint; override;
|
|
||||||
function Seek(Offset: Longint; Origin: Word): Longint; override;
|
|
||||||
property OnProgress;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ CompressBuf compresses data, buffer to buffer, in one call.
|
|
||||||
In: InBuf = ptr to compressed data
|
|
||||||
InBytes = number of bytes in InBuf
|
|
||||||
Out: OutBuf = ptr to newly allocated buffer containing decompressed data
|
|
||||||
OutBytes = number of bytes in OutBuf }
|
|
||||||
procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
|
|
||||||
out OutBuf: Pointer; out OutBytes: Integer);
|
|
||||||
|
|
||||||
|
|
||||||
{ DecompressBuf decompresses data, buffer to buffer, in one call.
|
|
||||||
In: InBuf = ptr to compressed data
|
|
||||||
InBytes = number of bytes in InBuf
|
|
||||||
OutEstimate = zero, or est. size of the decompressed data
|
|
||||||
Out: OutBuf = ptr to newly allocated buffer containing decompressed data
|
|
||||||
OutBytes = number of bytes in OutBuf }
|
|
||||||
procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
|
|
||||||
OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
|
|
||||||
|
|
||||||
{ DecompressToUserBuf decompresses data, buffer to buffer, in one call.
|
|
||||||
In: InBuf = ptr to compressed data
|
|
||||||
InBytes = number of bytes in InBuf
|
|
||||||
Out: OutBuf = ptr to user-allocated buffer to contain decompressed data
|
|
||||||
BufSize = number of bytes in OutBuf }
|
|
||||||
procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
|
|
||||||
const OutBuf: Pointer; BufSize: Integer);
|
|
||||||
|
|
||||||
const
|
|
||||||
zlib_version = '1.3.1';
|
|
||||||
|
|
||||||
type
|
|
||||||
EZlibError = class(Exception);
|
|
||||||
ECompressionError = class(EZlibError);
|
|
||||||
EDecompressionError = class(EZlibError);
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses ZLibConst;
|
|
||||||
|
|
||||||
const
|
|
||||||
Z_NO_FLUSH = 0;
|
|
||||||
Z_PARTIAL_FLUSH = 1;
|
|
||||||
Z_SYNC_FLUSH = 2;
|
|
||||||
Z_FULL_FLUSH = 3;
|
|
||||||
Z_FINISH = 4;
|
|
||||||
|
|
||||||
Z_OK = 0;
|
|
||||||
Z_STREAM_END = 1;
|
|
||||||
Z_NEED_DICT = 2;
|
|
||||||
Z_ERRNO = (-1);
|
|
||||||
Z_STREAM_ERROR = (-2);
|
|
||||||
Z_DATA_ERROR = (-3);
|
|
||||||
Z_MEM_ERROR = (-4);
|
|
||||||
Z_BUF_ERROR = (-5);
|
|
||||||
Z_VERSION_ERROR = (-6);
|
|
||||||
|
|
||||||
Z_NO_COMPRESSION = 0;
|
|
||||||
Z_BEST_SPEED = 1;
|
|
||||||
Z_BEST_COMPRESSION = 9;
|
|
||||||
Z_DEFAULT_COMPRESSION = (-1);
|
|
||||||
|
|
||||||
Z_FILTERED = 1;
|
|
||||||
Z_HUFFMAN_ONLY = 2;
|
|
||||||
Z_RLE = 3;
|
|
||||||
Z_DEFAULT_STRATEGY = 0;
|
|
||||||
|
|
||||||
Z_BINARY = 0;
|
|
||||||
Z_ASCII = 1;
|
|
||||||
Z_UNKNOWN = 2;
|
|
||||||
|
|
||||||
Z_DEFLATED = 8;
|
|
||||||
|
|
||||||
|
|
||||||
{$L adler32.obj}
|
|
||||||
{$L compress.obj}
|
|
||||||
{$L crc32.obj}
|
|
||||||
{$L deflate.obj}
|
|
||||||
{$L infback.obj}
|
|
||||||
{$L inffast.obj}
|
|
||||||
{$L inflate.obj}
|
|
||||||
{$L inftrees.obj}
|
|
||||||
{$L trees.obj}
|
|
||||||
{$L uncompr.obj}
|
|
||||||
{$L zutil.obj}
|
|
||||||
|
|
||||||
procedure adler32; external;
|
|
||||||
procedure compressBound; external;
|
|
||||||
procedure crc32; external;
|
|
||||||
procedure deflateInit2_; external;
|
|
||||||
procedure deflateParams; external;
|
|
||||||
|
|
||||||
function _malloc(Size: Integer): Pointer; cdecl;
|
|
||||||
begin
|
|
||||||
Result := AllocMem(Size);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure _free(Block: Pointer); cdecl;
|
|
||||||
begin
|
|
||||||
FreeMem(Block);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
|
|
||||||
begin
|
|
||||||
FillChar(P^, count, B);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
|
|
||||||
begin
|
|
||||||
Move(source^, dest^, count);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// deflate compresses data
|
|
||||||
function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar;
|
|
||||||
recsize: Integer): Integer; external;
|
|
||||||
function deflate(var strm: TZStreamRec; flush: Integer): Integer; external;
|
|
||||||
function deflateEnd(var strm: TZStreamRec): Integer; external;
|
|
||||||
|
|
||||||
// inflate decompresses data
|
|
||||||
function inflateInit_(var strm: TZStreamRec; version: PChar;
|
|
||||||
recsize: Integer): Integer; external;
|
|
||||||
function inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
|
|
||||||
function inflateEnd(var strm: TZStreamRec): Integer; external;
|
|
||||||
function inflateReset(var strm: TZStreamRec): Integer; external;
|
|
||||||
|
|
||||||
|
|
||||||
function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
|
|
||||||
begin
|
|
||||||
// GetMem(Result, Items*Size);
|
|
||||||
Result := AllocMem(Items * Size);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
|
|
||||||
begin
|
|
||||||
FreeMem(Block);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{function zlibCheck(code: Integer): Integer;
|
|
||||||
begin
|
|
||||||
Result := code;
|
|
||||||
if code < 0 then
|
|
||||||
raise EZlibError.Create('error'); //!!
|
|
||||||
end;}
|
|
||||||
|
|
||||||
function CCheck(code: Integer): Integer;
|
|
||||||
begin
|
|
||||||
Result := code;
|
|
||||||
if code < 0 then
|
|
||||||
raise ECompressionError.Create('error'); //!!
|
|
||||||
end;
|
|
||||||
|
|
||||||
function DCheck(code: Integer): Integer;
|
|
||||||
begin
|
|
||||||
Result := code;
|
|
||||||
if code < 0 then
|
|
||||||
raise EDecompressionError.Create('error'); //!!
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
|
|
||||||
out OutBuf: Pointer; out OutBytes: Integer);
|
|
||||||
var
|
|
||||||
strm: TZStreamRec;
|
|
||||||
P: Pointer;
|
|
||||||
begin
|
|
||||||
FillChar(strm, sizeof(strm), 0);
|
|
||||||
strm.zalloc := zlibAllocMem;
|
|
||||||
strm.zfree := zlibFreeMem;
|
|
||||||
OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
|
|
||||||
GetMem(OutBuf, OutBytes);
|
|
||||||
try
|
|
||||||
strm.next_in := InBuf;
|
|
||||||
strm.avail_in := InBytes;
|
|
||||||
strm.next_out := OutBuf;
|
|
||||||
strm.avail_out := OutBytes;
|
|
||||||
CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
|
|
||||||
try
|
|
||||||
while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do
|
|
||||||
begin
|
|
||||||
P := OutBuf;
|
|
||||||
Inc(OutBytes, 256);
|
|
||||||
ReallocMem(OutBuf, OutBytes);
|
|
||||||
strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
|
|
||||||
strm.avail_out := 256;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
CCheck(deflateEnd(strm));
|
|
||||||
end;
|
|
||||||
ReallocMem(OutBuf, strm.total_out);
|
|
||||||
OutBytes := strm.total_out;
|
|
||||||
except
|
|
||||||
FreeMem(OutBuf);
|
|
||||||
raise
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
|
|
||||||
OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
|
|
||||||
var
|
|
||||||
strm: TZStreamRec;
|
|
||||||
P: Pointer;
|
|
||||||
BufInc: Integer;
|
|
||||||
begin
|
|
||||||
FillChar(strm, sizeof(strm), 0);
|
|
||||||
strm.zalloc := zlibAllocMem;
|
|
||||||
strm.zfree := zlibFreeMem;
|
|
||||||
BufInc := (InBytes + 255) and not 255;
|
|
||||||
if OutEstimate = 0 then
|
|
||||||
OutBytes := BufInc
|
|
||||||
else
|
|
||||||
OutBytes := OutEstimate;
|
|
||||||
GetMem(OutBuf, OutBytes);
|
|
||||||
try
|
|
||||||
strm.next_in := InBuf;
|
|
||||||
strm.avail_in := InBytes;
|
|
||||||
strm.next_out := OutBuf;
|
|
||||||
strm.avail_out := OutBytes;
|
|
||||||
DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
|
|
||||||
try
|
|
||||||
while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do
|
|
||||||
begin
|
|
||||||
P := OutBuf;
|
|
||||||
Inc(OutBytes, BufInc);
|
|
||||||
ReallocMem(OutBuf, OutBytes);
|
|
||||||
strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
|
|
||||||
strm.avail_out := BufInc;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
DCheck(inflateEnd(strm));
|
|
||||||
end;
|
|
||||||
ReallocMem(OutBuf, strm.total_out);
|
|
||||||
OutBytes := strm.total_out;
|
|
||||||
except
|
|
||||||
FreeMem(OutBuf);
|
|
||||||
raise
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
|
|
||||||
const OutBuf: Pointer; BufSize: Integer);
|
|
||||||
var
|
|
||||||
strm: TZStreamRec;
|
|
||||||
begin
|
|
||||||
FillChar(strm, sizeof(strm), 0);
|
|
||||||
strm.zalloc := zlibAllocMem;
|
|
||||||
strm.zfree := zlibFreeMem;
|
|
||||||
strm.next_in := InBuf;
|
|
||||||
strm.avail_in := InBytes;
|
|
||||||
strm.next_out := OutBuf;
|
|
||||||
strm.avail_out := BufSize;
|
|
||||||
DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
|
|
||||||
try
|
|
||||||
if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then
|
|
||||||
raise EZlibError.CreateRes(@sTargetBufferTooSmall);
|
|
||||||
finally
|
|
||||||
DCheck(inflateEnd(strm));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// TCustomZlibStream
|
|
||||||
|
|
||||||
constructor TCustomZLibStream.Create(Strm: TStream);
|
|
||||||
begin
|
|
||||||
inherited Create;
|
|
||||||
FStrm := Strm;
|
|
||||||
FStrmPos := Strm.Position;
|
|
||||||
FZRec.zalloc := zlibAllocMem;
|
|
||||||
FZRec.zfree := zlibFreeMem;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TCustomZLibStream.Progress(Sender: TObject);
|
|
||||||
begin
|
|
||||||
if Assigned(FOnProgress) then FOnProgress(Sender);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
// TCompressionStream
|
|
||||||
|
|
||||||
constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;
|
|
||||||
Dest: TStream);
|
|
||||||
const
|
|
||||||
Levels: array [TCompressionLevel] of ShortInt =
|
|
||||||
(Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);
|
|
||||||
begin
|
|
||||||
inherited Create(Dest);
|
|
||||||
FZRec.next_out := FBuffer;
|
|
||||||
FZRec.avail_out := sizeof(FBuffer);
|
|
||||||
CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TCompressionStream.Destroy;
|
|
||||||
begin
|
|
||||||
FZRec.next_in := nil;
|
|
||||||
FZRec.avail_in := 0;
|
|
||||||
try
|
|
||||||
if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
|
|
||||||
while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
|
|
||||||
and (FZRec.avail_out = 0) do
|
|
||||||
begin
|
|
||||||
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
|
|
||||||
FZRec.next_out := FBuffer;
|
|
||||||
FZRec.avail_out := sizeof(FBuffer);
|
|
||||||
end;
|
|
||||||
if FZRec.avail_out < sizeof(FBuffer) then
|
|
||||||
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
|
|
||||||
finally
|
|
||||||
deflateEnd(FZRec);
|
|
||||||
end;
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCompressionStream.Read(var Buffer; Count: Longint): Longint;
|
|
||||||
begin
|
|
||||||
raise ECompressionError.CreateRes(@sInvalidStreamOp);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
|
|
||||||
begin
|
|
||||||
FZRec.next_in := @Buffer;
|
|
||||||
FZRec.avail_in := Count;
|
|
||||||
if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
|
|
||||||
while (FZRec.avail_in > 0) do
|
|
||||||
begin
|
|
||||||
CCheck(deflate(FZRec, 0));
|
|
||||||
if FZRec.avail_out = 0 then
|
|
||||||
begin
|
|
||||||
FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
|
|
||||||
FZRec.next_out := FBuffer;
|
|
||||||
FZRec.avail_out := sizeof(FBuffer);
|
|
||||||
FStrmPos := FStrm.Position;
|
|
||||||
Progress(Self);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
Result := Count;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
|
|
||||||
begin
|
|
||||||
if (Offset = 0) and (Origin = soFromCurrent) then
|
|
||||||
Result := FZRec.total_in
|
|
||||||
else
|
|
||||||
raise ECompressionError.CreateRes(@sInvalidStreamOp);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TCompressionStream.GetCompressionRate: Single;
|
|
||||||
begin
|
|
||||||
if FZRec.total_in = 0 then
|
|
||||||
Result := 0
|
|
||||||
else
|
|
||||||
Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
// TDecompressionStream
|
|
||||||
|
|
||||||
constructor TDecompressionStream.Create(Source: TStream);
|
|
||||||
begin
|
|
||||||
inherited Create(Source);
|
|
||||||
FZRec.next_in := FBuffer;
|
|
||||||
FZRec.avail_in := 0;
|
|
||||||
DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TDecompressionStream.Destroy;
|
|
||||||
begin
|
|
||||||
FStrm.Seek(-FZRec.avail_in, 1);
|
|
||||||
inflateEnd(FZRec);
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
|
|
||||||
begin
|
|
||||||
FZRec.next_out := @Buffer;
|
|
||||||
FZRec.avail_out := Count;
|
|
||||||
if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
|
|
||||||
while (FZRec.avail_out > 0) do
|
|
||||||
begin
|
|
||||||
if FZRec.avail_in = 0 then
|
|
||||||
begin
|
|
||||||
FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
|
|
||||||
if FZRec.avail_in = 0 then
|
|
||||||
begin
|
|
||||||
Result := Count - FZRec.avail_out;
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
FZRec.next_in := FBuffer;
|
|
||||||
FStrmPos := FStrm.Position;
|
|
||||||
Progress(Self);
|
|
||||||
end;
|
|
||||||
CCheck(inflate(FZRec, 0));
|
|
||||||
end;
|
|
||||||
Result := Count;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
|
|
||||||
begin
|
|
||||||
raise EDecompressionError.CreateRes(@sInvalidStreamOp);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
|
|
||||||
var
|
|
||||||
I: Integer;
|
|
||||||
Buf: array [0..4095] of Char;
|
|
||||||
begin
|
|
||||||
if (Offset = 0) and (Origin = soFromBeginning) then
|
|
||||||
begin
|
|
||||||
DCheck(inflateReset(FZRec));
|
|
||||||
FZRec.next_in := FBuffer;
|
|
||||||
FZRec.avail_in := 0;
|
|
||||||
FStrm.Position := 0;
|
|
||||||
FStrmPos := 0;
|
|
||||||
end
|
|
||||||
else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
|
|
||||||
( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then
|
|
||||||
begin
|
|
||||||
if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);
|
|
||||||
if Offset > 0 then
|
|
||||||
begin
|
|
||||||
for I := 1 to Offset div sizeof(Buf) do
|
|
||||||
ReadBuffer(Buf, sizeof(Buf));
|
|
||||||
ReadBuffer(Buf, Offset mod sizeof(Buf));
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
raise EDecompressionError.CreateRes(@sInvalidStreamOp);
|
|
||||||
Result := FZRec.total_out;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
unit ZLibConst;
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
resourcestring
|
|
||||||
sTargetBufferTooSmall = 'ZLib error: target buffer may be too small';
|
|
||||||
sInvalidStreamOp = 'Invalid stream operation';
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
end.
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
|
|
||||||
Overview
|
|
||||||
========
|
|
||||||
|
|
||||||
This directory contains an update to the ZLib interface unit,
|
|
||||||
distributed by Borland as a Delphi supplemental component.
|
|
||||||
|
|
||||||
The original ZLib unit is Copyright (c) 1997,99 Borland Corp.,
|
|
||||||
and is based on zlib version 1.0.4. There are a series of bugs
|
|
||||||
and security problems associated with that old zlib version, and
|
|
||||||
we recommend the users to update their ZLib unit.
|
|
||||||
|
|
||||||
|
|
||||||
Summary of modifications
|
|
||||||
========================
|
|
||||||
|
|
||||||
- Improved makefile, adapted to zlib version 1.2.1.
|
|
||||||
|
|
||||||
- Some field types from TZStreamRec are changed from Integer to
|
|
||||||
Longint, for consistency with the zlib.h header, and for 64-bit
|
|
||||||
readiness.
|
|
||||||
|
|
||||||
- The zlib_version constant is updated.
|
|
||||||
|
|
||||||
- The new Z_RLE strategy has its corresponding symbolic constant.
|
|
||||||
|
|
||||||
- The allocation and deallocation functions and function types
|
|
||||||
(TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl,
|
|
||||||
and _malloc and _free are added as C RTL stubs. As a result,
|
|
||||||
the original C sources of zlib can be compiled out of the box,
|
|
||||||
and linked to the ZLib unit.
|
|
||||||
|
|
||||||
|
|
||||||
Suggestions for improvements
|
|
||||||
============================
|
|
||||||
|
|
||||||
Currently, the ZLib unit provides only a limited wrapper around
|
|
||||||
the zlib library, and much of the original zlib functionality is
|
|
||||||
missing. Handling compressed file formats like ZIP/GZIP or PNG
|
|
||||||
cannot be implemented without having this functionality.
|
|
||||||
Applications that handle these formats are either using their own,
|
|
||||||
duplicated code, or not using the ZLib unit at all.
|
|
||||||
|
|
||||||
Here are a few suggestions:
|
|
||||||
|
|
||||||
- Checksum class wrappers around adler32() and crc32(), similar
|
|
||||||
to the Java classes that implement the java.util.zip.Checksum
|
|
||||||
interface.
|
|
||||||
|
|
||||||
- The ability to read and write raw deflate streams, without the
|
|
||||||
zlib stream header and trailer. Raw deflate streams are used
|
|
||||||
in the ZIP file format.
|
|
||||||
|
|
||||||
- The ability to read and write gzip streams, used in the GZIP
|
|
||||||
file format, and normally produced by the gzip program.
|
|
||||||
|
|
||||||
- The ability to select a different compression strategy, useful
|
|
||||||
to PNG and MNG image compression, and to multimedia compression
|
|
||||||
in general. Besides the compression level
|
|
||||||
|
|
||||||
TCompressionLevel = (clNone, clFastest, clDefault, clMax);
|
|
||||||
|
|
||||||
which, in fact, could have used the 'z' prefix and avoided
|
|
||||||
TColor-like symbols
|
|
||||||
|
|
||||||
TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax);
|
|
||||||
|
|
||||||
there could be a compression strategy
|
|
||||||
|
|
||||||
TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle);
|
|
||||||
|
|
||||||
- ZIP and GZIP stream handling via TStreams.
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
Cosmin Truta <cosmint@cs.ubbcluj.ro>
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
# Makefile for zlib
|
|
||||||
# For use with Delphi and C++ Builder under Win32
|
|
||||||
# Updated for zlib 1.2.x by Cosmin Truta
|
|
||||||
|
|
||||||
# ------------ Borland C++ ------------
|
|
||||||
|
|
||||||
# This project uses the Delphi (fastcall/register) calling convention:
|
|
||||||
LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
|
|
||||||
|
|
||||||
CC = bcc32
|
|
||||||
LD = bcc32
|
|
||||||
AR = tlib
|
|
||||||
# do not use "-pr" in CFLAGS
|
|
||||||
CFLAGS = -a -d -k- -O2 $(LOC)
|
|
||||||
LDFLAGS =
|
|
||||||
|
|
||||||
|
|
||||||
# variables
|
|
||||||
ZLIB_LIB = zlib.lib
|
|
||||||
|
|
||||||
OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj
|
|
||||||
OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
|
|
||||||
OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj
|
|
||||||
OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
|
|
||||||
|
|
||||||
|
|
||||||
# targets
|
|
||||||
all: $(ZLIB_LIB) example.exe minigzip.exe
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
$(CC) -c $(CFLAGS) $*.c
|
|
||||||
|
|
||||||
adler32.obj: adler32.c zlib.h zconf.h
|
|
||||||
|
|
||||||
compress.obj: compress.c zlib.h zconf.h
|
|
||||||
|
|
||||||
crc32.obj: crc32.c zlib.h zconf.h crc32.h
|
|
||||||
|
|
||||||
deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
|
|
||||||
|
|
||||||
gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h
|
|
||||||
|
|
||||||
gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h
|
|
||||||
|
|
||||||
gzread.obj: gzread.c zlib.h zconf.h gzguts.h
|
|
||||||
|
|
||||||
gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h
|
|
||||||
|
|
||||||
infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
|
|
||||||
inffast.h inffixed.h
|
|
||||||
|
|
||||||
inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
|
|
||||||
inffast.h
|
|
||||||
|
|
||||||
inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
|
|
||||||
inffast.h inffixed.h
|
|
||||||
|
|
||||||
inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
|
|
||||||
|
|
||||||
trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
|
|
||||||
|
|
||||||
uncompr.obj: uncompr.c zlib.h zconf.h
|
|
||||||
|
|
||||||
zutil.obj: zutil.c zutil.h zlib.h zconf.h
|
|
||||||
|
|
||||||
example.obj: test/example.c zlib.h zconf.h
|
|
||||||
|
|
||||||
minigzip.obj: test/minigzip.c zlib.h zconf.h
|
|
||||||
|
|
||||||
|
|
||||||
# For the sake of the old Borland make,
|
|
||||||
# the command line is cut to fit in the MS-DOS 128 byte limit:
|
|
||||||
$(ZLIB_LIB): $(OBJ1) $(OBJ2)
|
|
||||||
-del $(ZLIB_LIB)
|
|
||||||
$(AR) $(ZLIB_LIB) $(OBJP1)
|
|
||||||
$(AR) $(ZLIB_LIB) $(OBJP2)
|
|
||||||
|
|
||||||
|
|
||||||
# testing
|
|
||||||
test: example.exe minigzip.exe
|
|
||||||
example
|
|
||||||
echo hello world | minigzip | minigzip -d
|
|
||||||
|
|
||||||
example.exe: example.obj $(ZLIB_LIB)
|
|
||||||
$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
|
|
||||||
|
|
||||||
minigzip.exe: minigzip.obj $(ZLIB_LIB)
|
|
||||||
$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
|
|
||||||
|
|
||||||
|
|
||||||
# cleanup
|
|
||||||
clean:
|
|
||||||
-del *.obj
|
|
||||||
-del *.exe
|
|
||||||
-del *.lib
|
|
||||||
-del *.tds
|
|
||||||
-del zlib.bak
|
|
||||||
-del foo.gz
|
|
||||||
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<project name="DotZLib" default="build" basedir="./DotZLib">
|
|
||||||
<description>A .Net wrapper library around ZLib1.dll</description>
|
|
||||||
|
|
||||||
<property name="nunit.location" value="c:/program files/NUnit V2.1/bin" />
|
|
||||||
<property name="build.root" value="bin" />
|
|
||||||
|
|
||||||
<property name="debug" value="true" />
|
|
||||||
<property name="nunit" value="true" />
|
|
||||||
|
|
||||||
<property name="build.folder" value="${build.root}/debug/" if="${debug}" />
|
|
||||||
<property name="build.folder" value="${build.root}/release/" unless="${debug}" />
|
|
||||||
|
|
||||||
<target name="clean" description="Remove all generated files">
|
|
||||||
<delete dir="${build.root}" failonerror="false" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="build" description="compiles the source code">
|
|
||||||
|
|
||||||
<mkdir dir="${build.folder}" />
|
|
||||||
<csc target="library" output="${build.folder}DotZLib.dll" debug="${debug}">
|
|
||||||
<references basedir="${nunit.location}">
|
|
||||||
<includes if="${nunit}" name="nunit.framework.dll" />
|
|
||||||
</references>
|
|
||||||
<sources>
|
|
||||||
<includes name="*.cs" />
|
|
||||||
<excludes name="UnitTests.cs" unless="${nunit}" />
|
|
||||||
</sources>
|
|
||||||
<arg value="/d:nunit" if="${nunit}" />
|
|
||||||
</csc>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
|
|
@ -1,21 +0,0 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotZLib", "DotZLib\DotZLib.csproj", "{BB1EE0B1-1808-46CB-B786-949D91117FC5}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
|
||||||
Debug = Debug
|
|
||||||
Release = Release
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
|
||||||
{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.ActiveCfg = Debug|.NET
|
|
||||||
{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.Build.0 = Debug|.NET
|
|
||||||
{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.ActiveCfg = Release|.NET
|
|
||||||
{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.Build.0 = Release|.NET
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
|
|
||||||
//
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
//
|
|
||||||
[assembly: AssemblyTitle("DotZLib")]
|
|
||||||
[assembly: AssemblyDescription(".Net bindings for ZLib compression dll 1.2.x")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("Henrik Ravn")]
|
|
||||||
[assembly: AssemblyProduct("")]
|
|
||||||
[assembly: AssemblyCopyright("(c) 2004 by Henrik Ravn")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
//
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
// You can specify all the values or you can default the Revision and Build Numbers
|
|
||||||
// by using the '*' as shown below:
|
|
||||||
|
|
||||||
[assembly: AssemblyVersion("1.0.*")]
|
|
||||||
|
|
||||||
//
|
|
||||||
// In order to sign your assembly you must specify a key to use. Refer to the
|
|
||||||
// Microsoft .NET Framework documentation for more information on assembly signing.
|
|
||||||
//
|
|
||||||
// Use the attributes below to control which key is used for signing.
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
// (*) If no key is specified, the assembly is not signed.
|
|
||||||
// (*) KeyName refers to a key that has been installed in the Crypto Service
|
|
||||||
// Provider (CSP) on your machine. KeyFile refers to a file which contains
|
|
||||||
// a key.
|
|
||||||
// (*) If the KeyFile and the KeyName values are both specified, the
|
|
||||||
// following processing occurs:
|
|
||||||
// (1) If the KeyName can be found in the CSP, that key is used.
|
|
||||||
// (2) If the KeyName does not exist and the KeyFile does exist, the key
|
|
||||||
// in the KeyFile is installed into the CSP and used.
|
|
||||||
// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
|
|
||||||
// When specifying the KeyFile, the location of the KeyFile should be
|
|
||||||
// relative to the project output directory which is
|
|
||||||
// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
|
|
||||||
// located in the project directory, you would specify the AssemblyKeyFile
|
|
||||||
// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
|
|
||||||
// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
|
|
||||||
// documentation for more information on this.
|
|
||||||
//
|
|
||||||
[assembly: AssemblyDelaySign(false)]
|
|
||||||
[assembly: AssemblyKeyFile("")]
|
|
||||||
[assembly: AssemblyKeyName("")]
|
|
||||||
|
|
@ -1,202 +0,0 @@
|
||||||
//
|
|
||||||
// © 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 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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
//
|
|
||||||
// © 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 +0,0 @@
|
||||||
//
|
|
||||||
// © 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 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
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
//
|
|
||||||
// © 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 +0,0 @@
|
||||||
//
|
|
||||||
// © 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,141 +0,0 @@
|
||||||
<VisualStudioProject>
|
|
||||||
<CSHARP
|
|
||||||
ProjectType = "Local"
|
|
||||||
ProductVersion = "7.10.3077"
|
|
||||||
SchemaVersion = "2.0"
|
|
||||||
ProjectGuid = "{BB1EE0B1-1808-46CB-B786-949D91117FC5}"
|
|
||||||
>
|
|
||||||
<Build>
|
|
||||||
<Settings
|
|
||||||
ApplicationIcon = ""
|
|
||||||
AssemblyKeyContainerName = ""
|
|
||||||
AssemblyName = "DotZLib"
|
|
||||||
AssemblyOriginatorKeyFile = ""
|
|
||||||
DefaultClientScript = "JScript"
|
|
||||||
DefaultHTMLPageLayout = "Grid"
|
|
||||||
DefaultTargetSchema = "IE50"
|
|
||||||
DelaySign = "false"
|
|
||||||
OutputType = "Library"
|
|
||||||
PreBuildEvent = ""
|
|
||||||
PostBuildEvent = ""
|
|
||||||
RootNamespace = "DotZLib"
|
|
||||||
RunPostBuildEvent = "OnBuildSuccess"
|
|
||||||
StartupObject = ""
|
|
||||||
>
|
|
||||||
<Config
|
|
||||||
Name = "Debug"
|
|
||||||
AllowUnsafeBlocks = "false"
|
|
||||||
BaseAddress = "285212672"
|
|
||||||
CheckForOverflowUnderflow = "false"
|
|
||||||
ConfigurationOverrideFile = ""
|
|
||||||
DefineConstants = "DEBUG;TRACE"
|
|
||||||
DocumentationFile = "docs\DotZLib.xml"
|
|
||||||
DebugSymbols = "true"
|
|
||||||
FileAlignment = "4096"
|
|
||||||
IncrementalBuild = "false"
|
|
||||||
NoStdLib = "false"
|
|
||||||
NoWarn = "1591"
|
|
||||||
Optimize = "false"
|
|
||||||
OutputPath = "bin\Debug\"
|
|
||||||
RegisterForComInterop = "false"
|
|
||||||
RemoveIntegerChecks = "false"
|
|
||||||
TreatWarningsAsErrors = "false"
|
|
||||||
WarningLevel = "4"
|
|
||||||
/>
|
|
||||||
<Config
|
|
||||||
Name = "Release"
|
|
||||||
AllowUnsafeBlocks = "false"
|
|
||||||
BaseAddress = "285212672"
|
|
||||||
CheckForOverflowUnderflow = "false"
|
|
||||||
ConfigurationOverrideFile = ""
|
|
||||||
DefineConstants = "TRACE"
|
|
||||||
DocumentationFile = "docs\DotZLib.xml"
|
|
||||||
DebugSymbols = "false"
|
|
||||||
FileAlignment = "4096"
|
|
||||||
IncrementalBuild = "false"
|
|
||||||
NoStdLib = "false"
|
|
||||||
NoWarn = ""
|
|
||||||
Optimize = "true"
|
|
||||||
OutputPath = "bin\Release\"
|
|
||||||
RegisterForComInterop = "false"
|
|
||||||
RemoveIntegerChecks = "false"
|
|
||||||
TreatWarningsAsErrors = "false"
|
|
||||||
WarningLevel = "4"
|
|
||||||
/>
|
|
||||||
</Settings>
|
|
||||||
<References>
|
|
||||||
<Reference
|
|
||||||
Name = "System"
|
|
||||||
AssemblyName = "System"
|
|
||||||
HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"
|
|
||||||
/>
|
|
||||||
<Reference
|
|
||||||
Name = "System.Data"
|
|
||||||
AssemblyName = "System.Data"
|
|
||||||
HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
|
|
||||||
/>
|
|
||||||
<Reference
|
|
||||||
Name = "System.XML"
|
|
||||||
AssemblyName = "System.Xml"
|
|
||||||
HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
|
|
||||||
/>
|
|
||||||
<Reference
|
|
||||||
Name = "nunit.framework"
|
|
||||||
AssemblyName = "nunit.framework"
|
|
||||||
HintPath = "E:\apps\NUnit V2.1\\bin\nunit.framework.dll"
|
|
||||||
AssemblyFolderKey = "hklm\dn\nunit.framework"
|
|
||||||
/>
|
|
||||||
</References>
|
|
||||||
</Build>
|
|
||||||
<Files>
|
|
||||||
<Include>
|
|
||||||
<File
|
|
||||||
RelPath = "AssemblyInfo.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "ChecksumImpl.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "CircularBuffer.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "CodecBase.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "Deflater.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "DotZLib.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "GZipStream.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "Inflater.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
<File
|
|
||||||
RelPath = "UnitTests.cs"
|
|
||||||
SubType = "Code"
|
|
||||||
BuildAction = "Compile"
|
|
||||||
/>
|
|
||||||
</Include>
|
|
||||||
</Files>
|
|
||||||
</CSHARP>
|
|
||||||
</VisualStudioProject>
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue