From 360297c3381930f77663a1c6a65781876808431e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Tue, 17 Dec 2019 15:03:41 +0100 Subject: [PATCH] Mesonification --- .github/.gitignore | 1 + .github/build.sh | 61 + .github/get-release-info.sh | 2 + .github/get-type.py | 20 + .github/invoke-vcvarsall.bat | 7 + .github/workflows/build.yaml | 83 + .gitignore | 2 - SConscript | 612 ------- SConstruct | 18 - data/IntroText.h | 2 + data/hmap.cpp | 1 + data/images.cpp | 2 + data/meson.build | 10 + meson.build | 317 ++++ meson_options.txt | 149 ++ pch/pch_cpp.h | 95 + resources/meson.build | 11 + src/Activity.h | 1 + src/{Config.h => Config.template.h} | 67 +- src/Controller.h | 1 + src/Format.h | 1 + src/Misc.h | 1 + src/Platform.h | 1 + src/PowderToyFontEditor.cpp | 475 +++++ src/PowderToyRenderer.cpp | 22 +- src/PowderToySDL.cpp | 66 +- src/Probability.h | 1 + src/SDLCompat.h | 16 +- src/SDLMain.h | 16 - src/SDLMain.m | 433 ----- src/Update.h | 1 + src/bson/BSON.cpp | 2 +- src/bson/BSON.h | 1 + src/bson/meson.build | 3 + src/client/Client.cpp | 5 +- src/client/Client.h | 1 + src/client/GameSave.cpp | 2 + src/client/GameSave.h | 2 +- src/client/MD5.h | 1 + src/client/SaveInfo.h | 1 + src/client/http/Request.h | 1 + src/client/http/RequestManager.h | 1 + src/client/http/meson.build | 10 + src/client/meson.build | 16 + src/common/String.h | 3 + src/common/macosx.h | 10 + src/common/meson.build | 4 + src/common/tpt-minmax.h | 26 +- src/common/tpt-rand.h | 1 + src/debug/DebugInfo.h | 1 + src/debug/meson.build | 6 + src/graphics/FontReader.cpp | 48 + src/graphics/FontReader.h | 49 +- src/graphics/Graphics.h | 2 +- src/graphics/OpenGLHeaders.h | 49 +- src/graphics/Renderer.cpp | 13 +- src/graphics/Renderer.h | 2 +- src/graphics/meson.build | 11 + src/gui/Style.h | 1 + src/gui/colourpicker/meson.build | 3 + src/gui/console/ConsoleController.h | 1 + src/gui/console/ConsoleModel.h | 1 + src/gui/console/meson.build | 5 + src/gui/dialogues/meson.build | 7 + src/gui/elementsearch/meson.build | 3 + src/gui/filebrowser/meson.build | 3 + src/gui/font/FontEditor.cpp | 2 - src/gui/font/meson.build | 3 + src/gui/game/Brush.h | 1 + src/gui/game/Favorite.h | 1 + src/gui/game/GameController.h | 1 + src/gui/game/GameModel.h | 1 + src/gui/game/GameView.cpp | 2 + src/gui/game/Menu.h | 1 + src/gui/game/QuickOption.h | 1 + src/gui/game/Tool.h | 1 + src/gui/game/meson.build | 17 + src/gui/interface/Appearance.h | 1 + src/gui/interface/Component.h | 1 + src/gui/interface/Mouse.h | 5 - src/gui/interface/meson.build | 25 + src/gui/localbrowser/LocalBrowserController.h | 1 + src/gui/localbrowser/LocalBrowserModel.h | 1 + src/gui/localbrowser/meson.build | 5 + src/gui/login/LoginController.h | 1 + src/gui/login/LoginModel.h | 1 + src/gui/login/meson.build | 5 + src/gui/meson.build | 25 + src/gui/options/OptionsController.h | 1 + src/gui/options/OptionsModel.h | 1 + src/gui/options/OptionsView.cpp | 1 + src/gui/options/meson.build | 5 + src/gui/preview/PreviewController.h | 1 + src/gui/preview/PreviewModel.h | 1 + src/gui/preview/meson.build | 5 + src/gui/profile/meson.build | 3 + src/gui/render/RenderController.h | 1 + src/gui/render/RenderModel.h | 1 + src/gui/render/meson.build | 5 + src/gui/save/meson.build | 4 + src/gui/search/SearchController.h | 1 + src/gui/search/SearchModel.h | 1 + src/gui/search/meson.build | 5 + src/gui/tags/TagsController.h | 1 + src/gui/tags/TagsModel.h | 1 + src/gui/tags/meson.build | 5 + src/gui/update/meson.build | 3 + src/json/meson.build | 3 + src/lua/CommandInterface.h | 1 + src/lua/LegacyLuaAPI.cpp | 1 + src/lua/LuaBit.cpp | 2 + src/lua/LuaBit.h | 6 +- src/lua/LuaButton.cpp | 1 + src/lua/LuaCheckbox.cpp | 1 + src/lua/LuaCompat.h | 21 +- src/lua/LuaComponent.cpp | 1 + src/lua/LuaEvents.h | 2 + src/lua/LuaLabel.cpp | 1 + src/lua/LuaProgressBar.cpp | 1 + src/lua/LuaScriptInterface.cpp | 2 +- src/lua/LuaScriptInterface.h | 1 + src/lua/LuaSlider.cpp | 1 + src/lua/LuaSmartRef.cpp | 1 + src/lua/LuaTextbox.cpp | 1 + src/lua/LuaWindow.cpp | 1 + src/lua/TPTSTypes.h | 1 + src/lua/TPTScriptInterface.h | 1 + src/lua/luascripts/eventcompat.lua.cpp | 1 + src/lua/luascripts/meson.build | 3 + src/lua/meson.build | 37 + src/lua/socket/meson.build | 10 + src/lua/socket/socket.lua.cpp | 1 + src/lua/socket/usocket.h | 2 - src/lua/socket/wsocket.c | 2 - src/lua/socket/wsocket.h | 2 - src/meson.build | 67 + src/powdertoyjava/OpenGLCanvasWin32.h | 1 + src/powdertoyjava/PowderToyJava.h | 1 + src/powdertoyjava/meson.build | 4 + src/resampler/meson.build | 7 + src/resampler/resampler.cpp | 6 +- src/resampler/resampler.h | 2 + src/simulation/Element.h | 7 +- src/simulation/ElementCommon.h | 3 + src/simulation/ElementNumbers.h | 203 --- src/simulation/ElementNumbers.template.h | 13 + src/simulation/Gravity.cpp | 3 +- src/simulation/Gravity.h | 2 +- src/simulation/Particle.h | 1 + src/simulation/SaveRenderer.h | 1 + src/simulation/Sign.h | 1 + src/simulation/Simulation.cpp | 8 + src/simulation/Simulation.h | 2 +- src/simulation/SimulationData.h | 1 + src/simulation/ToolCommon.h | 2 + .../{ToolNumbers.h => ToolNumbers.template.h} | 9 +- src/simulation/elements/meson.build | 199 +++ src/simulation/meson.build | 20 + src/simulation/simtools/meson.build | 16 + src/tasks/Task.h | 1 + src/tasks/meson.build | 5 + subprojects/.gitignore | 2 + subprojects/tpt-bzip2/LICENSE | 42 + subprojects/tpt-bzip2/Makefile | 217 +++ subprojects/tpt-bzip2/include/bzlib.h | 282 +++ subprojects/tpt-bzip2/meson.build | 14 + subprojects/tpt-bzip2/src/blocksort.c | 1094 ++++++++++++ subprojects/tpt-bzip2/src/bzlib.c | 1572 +++++++++++++++++ subprojects/tpt-bzip2/src/bzlib_private.h | 509 ++++++ subprojects/tpt-bzip2/src/compress.c | 672 +++++++ subprojects/tpt-bzip2/src/crctable.c | 104 ++ subprojects/tpt-bzip2/src/decompress.c | 652 +++++++ subprojects/tpt-bzip2/src/huffman.c | 205 +++ subprojects/tpt-bzip2/src/meson.build | 9 + subprojects/tpt-bzip2/src/randtable.c | 84 + .../tpt-libs-prebuilt-lin64-static.wrap | 6 + .../tpt-libs-prebuilt-mac64-static.wrap | 6 + .../tpt-libs-prebuilt-win64-dynamic.wrap | 6 + .../tpt-libs-prebuilt-win64-static.wrap | 6 + 179 files changed, 7602 insertions(+), 1511 deletions(-) create mode 100644 .github/.gitignore create mode 100755 .github/build.sh create mode 100755 .github/get-release-info.sh create mode 100644 .github/get-type.py create mode 100644 .github/invoke-vcvarsall.bat create mode 100644 .github/workflows/build.yaml delete mode 100644 SConscript delete mode 100644 SConstruct create mode 100644 data/meson.build create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 pch/pch_cpp.h create mode 100644 resources/meson.build rename src/{Config.h => Config.template.h} (74%) create mode 100644 src/PowderToyFontEditor.cpp delete mode 100644 src/SDLMain.h delete mode 100644 src/SDLMain.m create mode 100644 src/bson/meson.build create mode 100644 src/client/http/meson.build create mode 100644 src/client/meson.build create mode 100644 src/common/macosx.h create mode 100644 src/common/meson.build create mode 100644 src/debug/meson.build create mode 100644 src/graphics/FontReader.cpp create mode 100644 src/graphics/meson.build create mode 100644 src/gui/colourpicker/meson.build create mode 100644 src/gui/console/meson.build create mode 100644 src/gui/dialogues/meson.build create mode 100644 src/gui/elementsearch/meson.build create mode 100644 src/gui/filebrowser/meson.build create mode 100644 src/gui/font/meson.build create mode 100644 src/gui/game/meson.build create mode 100644 src/gui/interface/meson.build create mode 100644 src/gui/localbrowser/meson.build create mode 100644 src/gui/login/meson.build create mode 100644 src/gui/meson.build create mode 100644 src/gui/options/meson.build create mode 100644 src/gui/preview/meson.build create mode 100644 src/gui/profile/meson.build create mode 100644 src/gui/render/meson.build create mode 100644 src/gui/save/meson.build create mode 100644 src/gui/search/meson.build create mode 100644 src/gui/tags/meson.build create mode 100644 src/gui/update/meson.build create mode 100644 src/json/meson.build create mode 100644 src/lua/luascripts/meson.build create mode 100644 src/lua/meson.build create mode 100644 src/lua/socket/meson.build create mode 100644 src/meson.build create mode 100644 src/powdertoyjava/meson.build create mode 100644 src/resampler/meson.build delete mode 100644 src/simulation/ElementNumbers.h create mode 100644 src/simulation/ElementNumbers.template.h rename src/simulation/{ToolNumbers.h => ToolNumbers.template.h} (65%) create mode 100644 src/simulation/elements/meson.build create mode 100644 src/simulation/meson.build create mode 100644 src/simulation/simtools/meson.build create mode 100644 src/tasks/meson.build create mode 100644 subprojects/.gitignore create mode 100644 subprojects/tpt-bzip2/LICENSE create mode 100644 subprojects/tpt-bzip2/Makefile create mode 100644 subprojects/tpt-bzip2/include/bzlib.h create mode 100644 subprojects/tpt-bzip2/meson.build create mode 100644 subprojects/tpt-bzip2/src/blocksort.c create mode 100644 subprojects/tpt-bzip2/src/bzlib.c create mode 100644 subprojects/tpt-bzip2/src/bzlib_private.h create mode 100644 subprojects/tpt-bzip2/src/compress.c create mode 100644 subprojects/tpt-bzip2/src/crctable.c create mode 100644 subprojects/tpt-bzip2/src/decompress.c create mode 100644 subprojects/tpt-bzip2/src/huffman.c create mode 100644 subprojects/tpt-bzip2/src/meson.build create mode 100644 subprojects/tpt-bzip2/src/randtable.c create mode 100644 subprojects/tpt-libs-prebuilt-lin64-static.wrap create mode 100644 subprojects/tpt-libs-prebuilt-mac64-static.wrap create mode 100644 subprojects/tpt-libs-prebuilt-win64-dynamic.wrap create mode 100644 subprojects/tpt-libs-prebuilt-win64-static.wrap diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 000000000..139ec1540 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +build_init.bat diff --git a/.github/build.sh b/.github/build.sh new file mode 100755 index 000000000..c98b39b0a --- /dev/null +++ b/.github/build.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +set -euo pipefail +IFS=$'\n\t' + +if [ -z "${PLATFORM_SHORT-}" ]; then + >&2 echo "PLATFORM_SHORT not set" + exit 1 +fi + +if [ -z "${STATIC_DYNAMIC-}" ]; then + >&2 echo "STATIC_DYNAMIC not set" + exit 1 +fi + +if [ -z "${RELTYPECFG-}" ]; then + >&2 echo "RELTYPECFG not set" + exit 1 +fi + +if [ -z "${build_sh_init-}" ]; then + if [ $PLATFORM_SHORT == "win" ]; then + for i in C:/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/**/**/VC/Auxiliary/Build/vcvarsall.bat; do + vcvarsall_path=$i + done + cat << BUILD_INIT_BAT > .github/build_init.bat +@echo off +call "${vcvarsall_path}" x64 +bash -c 'build_sh_init=1 ./.github/build.sh' +BUILD_INIT_BAT + ./.github/build_init.bat + else + build_sh_init=1 ./.github/build.sh + fi + exit 0 +fi + +other_flags= +bin_postfix= +static_flag= +if [ $STATIC_DYNAMIC == "static" ]; then + static_flag=-Dstatic=prebuilt + if [ $PLATFORM_SHORT == "win" ]; then + other_flags+=$'\t-Db_vscrt=mt' + fi +fi +if [ $PLATFORM_SHORT == "lin" ]; then + # We use gcc on lin; sadly, gcc + lto + libstdc++ + pthread = undefined reference to + # pthread_create, thanks to weak symbols in libstdc++.so (or something). See + # https://gcc.gnu.org/legacy-ml/gcc-help/2017-03/msg00081.html + other_flags+=$'\t-Db_asneeded=false\t-Dcpp_link_args=-Wl,--no-as-needed' +fi +if [ $PLATFORM_SHORT == "win" ]; then + bin_postfix=$bin_postfix.exe +fi +meson -Dbuildtype=release -Dbuild_render=true -Dbuild_font=true -Db_pie=false -Db_staticpic=false -Db_lto=true $static_flag -Dinstall_check=true $other_flags `echo $RELTYPECFG | base64 -d` build +cd build +ninja +7z a ../powder.zip powder$bin_postfix render$bin_postfix font$bin_postfix +cd .. +7z a powder.zip README.md LICENSE diff --git a/.github/get-release-info.sh b/.github/get-release-info.sh new file mode 100755 index 000000000..1d6b66909 --- /dev/null +++ b/.github/get-release-info.sh @@ -0,0 +1,2 @@ +value=`cat release_url/release_url.txt` +echo ::set-output name=upload_url::$value diff --git a/.github/get-type.py b/.github/get-type.py new file mode 100644 index 000000000..b763c5ae6 --- /dev/null +++ b/.github/get-type.py @@ -0,0 +1,20 @@ +import base64 +import re +import sys + +ref = sys.argv[1] + +match_stable = re.match(r'refs/tags/v([0-9]+)\.([0-9]+)\.([0-9]+)', ref) +match_snapshot = re.match(r'refs/tags/snapshot-([0-9]+)', ref) +if match_stable: + print('::set-output name=TYPE::stable') + print('::set-output name=NAME::v%s.%s.%s' % (match_stable.group(1), match_stable.group(2), match_stable.group(3))) + print('::set-output name=RELTYPECFG::%s' % base64.b64encode(('-Dignore_updates=false\t-Dversion_major=%s\t-Dversion_minor=%s\t-Dversion_build=%s' % (match_stable.group(1), match_stable.group(2), match_stable.group(3))).encode('utf-8')).decode('utf-8')) +elif match_snapshot: + print('::set-output name=TYPE::snapshot') + print('::set-output name=NAME::snapshot-%s' % match_snapshot.group(1)) + print('::set-output name=RELTYPECFG::%s' % base64.b64encode(('-Dignore_updates=false\t-Dsnapshot=true\t-Dsnapshot_id=%s' % match_snapshot.group(1)).encode('utf-8')).decode('utf-8')) +else: + print('::set-output name=TYPE::dev') + print('::set-output name=NAME::dev') + print('::set-output name=RELTYPECFG::%s' % base64.b64encode(('-Dignore_updates=true').encode('utf-8')).decode('utf-8')) diff --git a/.github/invoke-vcvarsall.bat b/.github/invoke-vcvarsall.bat new file mode 100644 index 000000000..c3d0e741a --- /dev/null +++ b/.github/invoke-vcvarsall.bat @@ -0,0 +1,7 @@ +@echo off + +call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x86 +echo ::set-env name=PATH::%PATH% +echo ::set-env name=CC::cl +echo ::set-env name=CXX::cl +exit diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 000000000..11f65b3f6 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,83 @@ +name: build + +on: + push: + branches: + - '*' + tags: + - 'v*.*' + - 'snapshot-*' + pull_request: + branches: + - '*' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - id: get_type + run: python ./.github/get-type.py ${{ github.ref }} + - id: create_release + if: steps.get_type.outputs.TYPE != 'dev' + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ steps.get_type.outputs.NAME }} + draft: true + prerelease: false + - run: echo "${{ steps.create_release.outputs.upload_url }}" > release_url.txt + - uses: actions/upload-artifact@v1 + with: + name: release_url + path: release_url.txt + build: + runs-on: ${{ matrix.os }} + needs: [release] + strategy: + matrix: + platform_short: [lin, mac, win] + static_dynamic: [static, dynamic] + include: + - platform_short: lin + os: ubuntu-latest + - platform_short: mac + os: macos-latest + - platform_short: win + os: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - id: get_type + run: python ./.github/get-type.py ${{ github.ref }} + - uses: actions/download-artifact@v1 + with: + name: release_url + - id: get_release_info + if: steps.get_type.outputs.TYPE != 'dev' + run: bash -c "./.github/get-release-info.sh" ## gg github, this is terrible + - if: matrix.platform_short == 'mac' + run: brew install pkg-config + - if: matrix.platform_short == 'mac' && matrix.static_dynamic != 'static' + run: brew install luajit curl fftw zlib sdl2 + - if: matrix.platform_short == 'lin' && matrix.static_dynamic != 'static' + run: sudo apt update && sudo apt install libluajit-5.1-dev libcurl4-openssl-dev libfftw3-dev zlib1g-dev libsdl2-dev + - run: python -m pip install meson ninja + - run: bash -c 'PLATFORM_SHORT=${{ matrix.platform_short }} STATIC_DYNAMIC=${{ matrix.static_dynamic }} RELTYPECFG=${{ steps.get_type.outputs.RELTYPECFG }} ./.github/build.sh' + - uses: actions/upload-release-asset@v1 + if: steps.get_type.outputs.TYPE != 'dev' && matrix.static_dynamic == 'static' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.get_release_info.outputs.upload_url }} + asset_path: powder.zip + asset_name: powder-${{ matrix.platform_short }}-${{ steps.get_type.outputs.NAME }}64.zip + asset_content_type: application/zip + - uses: actions/upload-artifact@v2 + if: steps.get_type.outputs.TYPE == 'dev' && matrix.static_dynamic == 'static' + with: + path: powder.zip + name: powder-${{ steps.get_type.outputs.NAME }}-${{ matrix.static_dynamic }}-${{ matrix.platform_short }}64.zip diff --git a/.gitignore b/.gitignore index 37c2b91ec..5f54d57f3 100644 --- a/.gitignore +++ b/.gitignore @@ -71,7 +71,5 @@ site_scons/site_tools/mfprogram/*.pyc site_scons/site_tools/gch/*.pyc .vscode/ .vs/ -# Intentional merge conflict (meson stuff) -subprojects/ screenshot_* diff --git a/SConscript b/SConscript deleted file mode 100644 index 18abb9d39..000000000 --- a/SConscript +++ /dev/null @@ -1,612 +0,0 @@ - -import os -import subprocess -import sys -import platform -import atexit -import time -import SCons.Util - - -# because of an implementation detail commandlines are limited to 10000 characters on windows using mingw. the following fix was copied from -# http://scons.org/wiki/LongCmdLinesOnWin32 and circumvents this issue. -class ourSpawn: - def ourspawn(self, sh, escape, cmd, args, env): - newargs = ' '.join(args[1:]) - cmdline = cmd + " " + newargs - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, env=env) - data, err = proc.communicate() - rv = proc.wait() - if rv: - print("=====") - print(err) - print("=====") - return rv -def SetupSpawn(env): - buf = ourSpawn() - buf.ourenv = env - env['SPAWN'] = buf.ourspawn - -def FatalError(message): - print(message) - raise SystemExit(1) - -#wrapper around SCons' AddOption -def AddSconsOption(name, default, hasArgs, help): - AddOption("--{0}".format(name), dest=name, action=("store" if hasArgs else "store_true"), default=default, help=help) - -AddSconsOption('win', False, False, "Target Windows.") -AddSconsOption('lin', False, False, "Target Linux.") -AddSconsOption('mac', False, False, "Target Mac OS X.") -AddSconsOption('msvc', False, False, "Use the Microsoft Visual Studio compiler.") -AddSconsOption("tool", False, True, "Tool prefix appended before gcc/g++.") - -AddSconsOption('beta', False, False, "Beta build.") -AddSconsOption('no-install-prompt', False, False, "Disable the \"do you want to install Powder Toy?\" prompt.") -AddSconsOption('ignore-updates', False, False, "Disable checking for updates.") -AddSconsOption('save-version', False, True, "Save version.") -AddSconsOption('minor-version', False, True, "Minor version.") -AddSconsOption('build-number', False, True, "Build number.") -AddSconsOption('snapshot', False, False, "Snapshot build.") -AddSconsOption('snapshot-id', False, True, "Snapshot build ID.") - -AddSconsOption('64bit', False, False, "Compile a 64 bit binary.") -AddSconsOption('32bit', False, False, "Compile a 32 bit binary.") -AddSconsOption("universal", False, False, "compile universal binaries on Mac OS X.") -AddSconsOption('no-sse', False, False, "Disable SSE optimizations.") -AddSconsOption('sse', True, False, "Enable SSE optimizations (default).") -AddSconsOption('sse2', True, False, "Enable SSE2 optimizations (default).") -AddSconsOption('sse3', False, False, "Enable SSE3 optimizations.") -AddSconsOption('native', False, False, "Enable optimizations specific to your cpu.") -AddSconsOption('release', False, False, "Enable loop / compiling optimizations.") - -AddSconsOption('debugging', False, False, "Compile with debug symbols.") -AddSconsOption('symbols', False, False, "Preserve (don't strip) symbols") -AddSconsOption('static', False, False, "Compile statically.") -AddSconsOption('opengl', False, False, "Build with OpenGL interface support.") -AddSconsOption('opengl-renderer', False, False, "Build with OpenGL renderer support (turns on --opengl).") #Note: this has nothing to do with --renderer, only tells the game to render particles with opengl -AddSconsOption('renderer', False, False, "Build the save renderer.") -AddSconsOption('font', False, False, "Build the font editor.") - -AddSconsOption('wall', False, False, "Error on all warnings.") -AddSconsOption('no-warnings', False, False, "Disable all compiler warnings.") -AddSconsOption('nolua', False, False, "Disable Lua.") -AddSconsOption('luajit', False, False, "Enable LuaJIT.") -AddSconsOption('lua52', False, False, "Compile using lua 5.2.") -AddSconsOption('nofft', False, False, "Disable FFT.") -AddSconsOption('nohttp', False, False, "Disable http requests and libcurl.") -AddSconsOption("output", False, True, "Executable output name.") - - -#detect platform automatically, but it can be overrided -tool = GetOption('tool') -isX86 = platform.machine() in ["amd64", "AMD64", "i386", "i686", "x86", "x86_64"] -platform = compilePlatform = platform.system() -if GetOption('win'): - platform = "Windows" -elif GetOption('lin'): - platform = "Linux" -elif GetOption('mac'): - platform = "Darwin" -elif compilePlatform not in ["Linux", "Windows", "Darwin", "FreeBSD"]: - FatalError("Unknown platform: {0}".format(platform)) - -msvc = GetOption('msvc') -if msvc and platform != "Windows": - FatalError("Error: --msvc only works on windows") - -#Create SCons Environment -if GetOption('msvc'): - env = Environment(tools=['default'], ENV=os.environ, TARGET_ARCH='x86') -elif platform == "Windows" and not GetOption('msvc'): - env = Environment(tools=['mingw'], ENV=os.environ) -else: - env = Environment(tools=['default'], ENV=os.environ) - -#attempt to automatically find cross compiler -if not tool and compilePlatform == "Linux" and platform == "Windows" and compilePlatform != platform: - if not GetOption('64bit'): - crossList = ["mingw32", "i686-w64-mingw32", "i386-mingw32msvc", "i486-mingw32msvc", "i586-mingw32msvc", "i686-mingw32msvc"] - else: - crossList = ["x86_64-w64-mingw32", "amd64-mingw32msvc"] - for i in crossList: - #found a cross compiler, set tool here, which will update everything in env later - if WhereIs("{0}-g++".format(i)): - tool = i+"-" - break - if not tool: - print("Could not automatically find cross compiler, use --tool to specify manually") - -#set tool prefix -#more things may need to be set (http://clam-project.org/clam/trunk/CLAM/scons/sconstools/crossmingw.py), but this works for us -if tool: - env['CC'] = tool+env['CC'] - env['CXX'] = tool+env['CXX'] - if platform == "Windows": - env['RC'] = tool+env['RC'] - env['STRIP'] = tool+'strip' - if os.path.isdir("/usr/{0}/bin".format(tool[:-1])): - env['ENV']['PATH'] = "/usr/{0}/bin:{1}".format(tool[:-1], os.environ['PATH']) - -#copy environment variables because scons doesn't do this by default -for var in ["CC","CXX","LD","LIBPATH","STRIP"]: - if var in os.environ: - env[var] = os.environ[var] - print("copying environment variable {0}={1!r}".format(var,os.environ[var])) -# variables containing several space separated things -for var in ["CFLAGS","CCFLAGS","CXXFLAGS","LINKFLAGS","CPPDEFINES","CPPPATH"]: - if var in os.environ: - if var in env: - env[var] += SCons.Util.CLVar(os.environ[var]) - else: - env[var] = SCons.Util.CLVar(os.environ[var]) - print("copying environment variable {0}={1!r}".format(var,os.environ[var])) - -#Used for intro text / executable name, actual bit flags are only set if the --64bit/--32bit command line args are given -def add32bitflags(env): - env["BIT"] = 32 -def add64bitflags(env): - if platform == "Windows": - env.Append(CPPDEFINES=['__CRT__NO_INLINE']) - env.Append(LINKFLAGS=['-Wl,--stack=16777216']) - env.Append(CPPDEFINES=['_64BIT']) - env["BIT"] = 64 -#add 32/64 bit defines before configuration -if GetOption('64bit'): - env.Append(LINKFLAGS=['-m64']) - env.Append(CCFLAGS=['-m64']) - add64bitflags(env) -elif GetOption('32bit'): - env.Append(LINKFLAGS=['-m32']) - env.Append(CCFLAGS=['-m32']) - add32bitflags(env) - -if GetOption('universal'): - if platform != "Darwin": - FatalError("Error: --universal only works on Mac OS X") - else: - env.Append(CCFLAGS=['-arch', 'i386', '-arch', 'x86_64']) - env.Append(LINKFLAGS=['-arch', 'i386', '-arch', 'x86_64']) - -env.Append(CPPPATH=['src/', 'data/']) -if GetOption("msvc"): - if GetOption("static"): - env.Append(LIBPATH=['StaticLibs/']) - else: - env.Append(LIBPATH=['Libraries/']) - env.Append(CPPPATH=['includes/', 'resources/']) - -#Check 32/64 bit -def CheckBit(context): - context.Message('Checking if 64 bit... ') - program = """#include - #include - int main() { - printf("%d", (int)sizeof(size_t)); - return 0; - } - """ - ret = context.TryCompile(program, '.c') - if ret == 0: - return False - ret = context.TryRun(program, '.c') - if ret[1] == '': - return False - context.Result(int(ret[1]) == 8) - if int(ret[1]) == 8: - print("Adding 64 bit compile flags") - add64bitflags(context.env) - elif int(ret[1]) == 4: - print("Adding 32 bit compile flags") - add32bitflags(context.env) - return ret[1] - -#Custom function to check for Mac OS X frameworks -def CheckFramework(context, framework): - import SCons.Conftest - #Extreme hack, TODO: maybe think of a better one (like replicating CheckLib here) or at least just fix the message - oldLinkFlags = env["LINKFLAGS"] - context.env.Append(LINKFLAGS=["-framework", framework]) - context.Display("Checking for Darwin Framework {0}...".format(framework)) - ret = SCons.Conftest.CheckLib(context, ["m"], autoadd = 0) - context.did_show_result = 1 - if not ret: - context.env.Append(LINKFLAGS=["-framework", framework]) - if framework != "Cocoa": - env.Append(CPPPATH=['/Library/Frameworks/{0}.framework/Headers/'.format(framework)]) - else: - context.env.Replace(LINKFLAGS=oldLinkFlags) - return not ret - -#function that finds libraries and appends them to LIBS -def findLibs(env, conf): - #Windows specific libs - if platform == "Windows": - if msvc: - libChecks = ['shell32', 'wsock32', 'user32', 'Advapi32', 'ws2_32', 'Wldap32', 'crypt32'] - if GetOption('static'): - libChecks += ['imm32', 'version', 'Ole32', 'OleAut32', 'SetupApi'] - for i in libChecks: - if not conf.CheckLib(i): - FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly") - else: - if not conf.CheckLib('mingw32') or not conf.CheckLib('ws2_32'): - FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly") - - if not GetOption('renderer') and not conf.CheckLib('SDL2main'): - FatalError("libSDL2main not found or not installed") - - #Look for SDL - runSdlConfig = platform == "Linux" or compilePlatform == "Linux" or platform == "FreeBSD" - if platform == "Darwin" and conf.CheckFramework("SDL2"): - runSdlConfig = False - elif not conf.CheckLib("SDL2"): - FatalError("SDL2 development library not found or not installed") - - if runSdlConfig: - try: - env.ParseConfig('sdl2-config --cflags') - if GetOption('static'): - env.ParseConfig('sdl2-config --static-libs') - else: - env.ParseConfig('sdl2-config --libs') - except: - pass - - #look for SDL.h - if conf.CheckCHeader('SDL2/SDL.h'): - env.Append(CPPDEFINES=["SDL_INC"]) - elif not conf.CheckCHeader('SDL.h'): - FatalError("SDL.h not found") - - if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'): - #Look for Lua - if platform == "FreeBSD": - luaver = "lua-5.1" - else: - luaver = "lua5.1" - if GetOption('luajit'): - if not conf.CheckLib(['luajit-5.1', 'luajit5.1', 'luajit2.0', 'luajit', 'libluajit']): - FatalError("luajit development library not found or not installed") - env.Append(CPPDEFINES=["LUAJIT"]) - luaver = "luajit" - elif GetOption('lua52'): - if not conf.CheckLib(['lua5.2', 'lua-5.2', 'lua52', 'lua']): - FatalError("lua5.2 development library not found or not installed") - env.Append(CPPDEFINES=["LUA_COMPAT_ALL"]) - if platform == "FreeBSD": - luaver = "lua-5.2" - else: - luaver = "lua5.2" - else: - if not conf.CheckLib(['lua5.1', 'lua-5.1', 'lua51', 'lua']): - if platform != "Darwin" or not conf.CheckFramework("Lua"): - FatalError("lua5.1 development library not found or not installed") - foundpkg = False - if platform == "Linux" or platform == "FreeBSD": - try: - env.ParseConfig("pkg-config --cflags {0}".format(luaver)) - env.ParseConfig("pkg-config --libs {0}".format(luaver)) - env.Append(CPPDEFINES=["LUA_R_INCL"]) - foundpkg = True - except: - pass - if not foundpkg: - #Look for lua.h - foundheader = False - if GetOption('luajit'): - foundheader = conf.CheckCHeader('luajit-2.0/lua.h') - elif GetOption('lua52'): - foundheader = conf.CheckCHeader('lua5.2/lua.h') or conf.CheckCHeader('lua52/lua.h') - else: - foundheader = conf.CheckCHeader('lua5.1/lua.h') or conf.CheckCHeader('lua51/lua.h') - if not foundheader: - if conf.CheckCHeader('lua.h'): - env.Append(CPPDEFINES=["LUA_R_INCL"]) - else: - FatalError("lua.h not found") - - #needed for static lua compiles (in some cases) - if platform == "Linux": - conf.CheckLib('dl') - - #Look for fftw - if not GetOption('nofft') and not GetOption('renderer') and not conf.CheckLib(['fftw3f', 'fftw3f-3', 'libfftw3f-3', 'libfftw3f']): - FatalError("fftw3f development library not found or not installed") - - #Look for bz2 - if not conf.CheckLib(['bz2', 'libbz2']): - FatalError("bz2 development library not found or not installed") - - #Check bz2 header too for some reason - if not conf.CheckCHeader('bzlib.h'): - FatalError("bzip2 headers not found") - - #Look for libz - if not conf.CheckLib(['z', 'zlib']): - FatalError("libz not found or not installed") - - #Look for libcurl - useCurl = not GetOption('nohttp') and not GetOption('renderer') - if useCurl and not conf.CheckLib(['curl', 'libcurl']): - FatalError("libcurl not found or not installed") - - if useCurl and (platform == "Linux" or compilePlatform == "Linux" or platform == "FreeBSD"): - if GetOption('static'): - env.ParseConfig("curl-config --static-libs") - else: - env.ParseConfig("curl-config --libs") - - # Needed for ssl. Scons seems incapable of parsing this out of curl-config - if platform == "Darwin": - if not conf.CheckFramework('Security'): - FatalError("Could not find Security.Framework") - - #Look for pthreads - if not conf.CheckLib(['pthread', 'pthreadVC2']): - FatalError("pthreads development library not found or not installed") - - if msvc: - if not conf.CheckHeader('dirent.h') or not conf.CheckHeader('fftw3.h') or not conf.CheckHeader('pthread.h') or not conf.CheckHeader('zlib.h'): - FatalError("Required headers not found") - else: - #Look for libm - if not conf.CheckLib('m'): - FatalError("libm not found or not installed") - - #Look for OpenGL libraries - if GetOption('opengl'): - if platform == "Linux" or platform == "FreeBSD": - if not conf.CheckLib('GL'): - FatalError("libGL not found or not installed") - try: - env.ParseConfig('pkg-config --libs glew gl glu') - except: - FatalError(sys.exc_info()[0]) - - elif platform == "Windows": - if not conf.CheckLib('opengl32'): - FatalError("opengl32 not found or not installed") - if not conf.CheckLib('glew32'): - FatalError("glew32 not found or not installed") - elif platform == "Darwin": - if not conf.CheckFramework("OpenGL"): - FatalError("OpenGL framework not found or not installed") - - if platform == "Linux" or platform == "FreeBSD": - if not conf.CheckLib('X11'): - FatalError("X11 development library not found or not installed") - - if not conf.CheckLib('rt'): - FatalError("librt not found or not installed") - elif platform == "Windows": - #These need to go last - if not conf.CheckLib('gdi32') or not conf.CheckLib('winmm') or (not msvc and not conf.CheckLib('dxguid')): - FatalError("Error: some windows libraries not found or not installed, make sure your compiler is set up correctly") - elif platform == "Darwin": - if not conf.CheckFramework("Cocoa"): - FatalError("Cocoa framework not found or not installed") - -if GetOption('clean'): - pass -elif not GetOption('help'): - conf = Configure(env) - conf.AddTest('CheckFramework', CheckFramework) - conf.AddTest('CheckBit', CheckBit) - if not conf.CheckCC() or not conf.CheckCXX(): - FatalError("compiler not correctly configured") - if platform == compilePlatform and isX86 and not GetOption('32bit') and not GetOption('64bit') and not GetOption('msvc'): - conf.CheckBit() - findLibs(env, conf) - env = conf.Finish() - -if not msvc: - env.Append(CXXFLAGS=['-std=c++11', '-U__STRICT_ANSI__']) - env.Append(CXXFLAGS=['-Wno-invalid-offsetof']) - if platform == "Linux": - env.Append(CXXFLAGS=['-Wno-unused-result']) - - -#Add platform specific flags and defines -if platform == "Windows": - env.Append(CPPDEFINES=["WIN", "_WIN32_WINNT=0x0501", "_USING_V110_SDK71_"]) - if msvc: - env.Append(CCFLAGS=['/Gm', '/Zi', '/EHsc', '/FS', '/GS']) #enable minimal rebuild, ?, enable exceptions, allow -j to work in debug builds, enable security check - if GetOption('renderer'): - env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) - else: - env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS,"5.01"']) - env.Append(LINKFLAGS=['/OPT:REF', '/OPT:ICF']) - env.Append(CPPDEFINES=['_SCL_SECURE_NO_WARNINGS']) #Disable warnings about 'std::print' - if GetOption('static'): - env.Append(LINKFLAGS=['/NODEFAULTLIB:msvcrt.lib', '/LTCG']) - elif not GetOption('debugging'): - env.Append(LINKFLAGS=['/NODEFAULTLIB:msvcrtd.lib']) - else: - env.Append(LINKFLAGS=['-mwindows']) -elif platform == "Linux" or platform == "FreeBSD": - env.Append(CPPDEFINES=['LIN']) -elif platform == "Darwin": - env.Append(CPPDEFINES=['MACOSX']) - #env.Append(LINKFLAGS=['-headerpad_max_install_names']) #needed in some cross compiles - if GetOption('luajit'): - env.Append(LINKFLAGS=['-pagezero_size', '10000', '-image_base', '100000000']) - - -#Add architecture flags and defines -if isX86: - env.Append(CPPDEFINES='X86') -if not GetOption('no-sse'): - if GetOption('sse'): - if msvc: - if not GetOption('sse2'): - env.Append(CCFLAGS=['/arch:SSE']) - else: - env.Append(CCFLAGS=['-msse']) - env.Append(CPPDEFINES=['X86_SSE']) - if GetOption('sse2'): - if msvc: - env.Append(CCFLAGS=['/arch:SSE2']) - else: - env.Append(CCFLAGS=['-msse2']) - env.Append(CPPDEFINES=['X86_SSE2']) - if GetOption('sse3'): - if msvc: - FatalError("--sse3 doesn't work with --msvc") - else: - env.Append(CCFLAGS=['-msse3']) - env.Append(CPPDEFINES=['X86_SSE3']) -if GetOption('native') and not msvc: - env.Append(CCFLAGS=['-march=native']) - - -#Add optimization flags and defines -if GetOption('debugging'): - if msvc: - env.Append(CCFLAGS=['/Od']) - if GetOption('static'): - env.Append(CCFLAGS=['/MTd']) - else: - env.Append(CCFLAGS=['/MDd']) - else: - env.Append(CCFLAGS=['-Wall', '-g']) - env.Append(CPPDEFINES=['DEBUG']) -elif GetOption('release'): - if msvc: - # Certain options (like /GL and /GS) cause TPT to be flagged as a virus. Don't include them - env.Append(CCFLAGS=['/O2', '/Oy-', '/fp:fast']) - if GetOption('static'): - env.Append(CCFLAGS=['/MT']) - else: - env.Append(CCFLAGS=['/MD']) - else: - env.Append(CCFLAGS=['-O3', '-ftree-vectorize', '-funsafe-math-optimizations', '-ffast-math', '-fomit-frame-pointer']) - if platform != "Darwin": - env.Append(CCFLAGS=['-funsafe-loop-optimizations']) - -if GetOption('static'): - if platform == "Windows": - env.Append(CPPDEFINES=['CURL_STATICLIB']) - if compilePlatform == "Windows" and not msvc: - env.Append(CPPDEFINES=['_PTW32_STATIC_LIB']) - else: - env.Append(CPPDEFINES=['PTW32_STATIC_LIB']) - if msvc: - env.Append(CPPDEFINES=['ZLIB_WINAPI']) - else: - env.Append(LINKFLAGS=['-Wl,-Bstatic']) - - -#Add other flags and defines -if not GetOption('nofft') and not GetOption('renderer'): - env.Append(CPPDEFINES=['GRAVFFT']) -if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'): - env.Append(CPPDEFINES=['LUACONSOLE']) -if GetOption('nohttp') or GetOption('renderer'): - env.Append(CPPDEFINES=['NOHTTP']) - -if GetOption('opengl') or GetOption('opengl-renderer'): - env.Append(CPPDEFINES=['OGLI', 'PIX32OGL']) - if GetOption('opengl-renderer'): - env.Append(CPPDEFINES=['OGLR']) - -if GetOption('renderer'): - env.Append(CPPDEFINES=['RENDERER']) - -if GetOption('font'): - env.Append(CPPDEFINES=['FONTEDITOR']) - -if GetOption("wall"): - if msvc: - env.Append(CCFLAGS=['/WX']) - else: - env.Append(CCFLAGS=['-Werror']) -elif GetOption("no-warnings"): - if msvc: - env.Append(CCFLAGS=['/W0']) - else: - env.Append(CCFLAGS=['-w']) - - -#Add version defines -if GetOption('save-version'): - env.Append(CPPDEFINES=["SAVE_VERSION={0}".format(GetOption('save-version'))]) - -if GetOption('minor-version'): - env.Append(CPPDEFINES=["MINOR_VERSION={0}".format(GetOption('minor-version'))]) - -if GetOption('build-number'): - env.Append(CPPDEFINES=["BUILD_NUM={0}".format(GetOption('build-number'))]) - -if GetOption('snapshot-id'): - env.Append(CPPDEFINES=["SNAPSHOT", "SNAPSHOT_ID={0}".format(GetOption('snapshot-id'))]) -elif GetOption('snapshot'): - env.Append(CPPDEFINES=["SNAPSHOT", "SNAPSHOT_ID={0}".format(str(int(time.time())))]) - -if GetOption('beta'): - env.Append(CPPDEFINES=['BETA']) -if GetOption('no-install-prompt'): - env.Append(CPPDEFINES=['NO_INSTALL_CHECK']) -if GetOption('ignore-updates'): - env.Append(CPPDEFINES=['IGNORE_UPDATES']) - - -#Generate list of sources to compile -sources = Glob("src/*.cpp") + Glob("src/*/*.cpp") + Glob("src/*/*/*.cpp") + Glob("data/*.cpp") -if not GetOption('nolua') and not GetOption('renderer') and not GetOption('font'): - sources += Glob("src/lua/socket/*.c") + Glob("src/lua/LuaCompat.c") - -if platform == "Windows": - sources += env.RES('resources/powder-res.rc') - if not msvc: - sources = filter(lambda source: not 'src\\simulation\\Gravity.cpp' in str(source), sources) - sources = filter(lambda source: not 'src/simulation/Gravity.cpp' in str(source), sources) - envCopy = env.Clone() - envCopy.Append(CCFLAGS='-mstackrealign') - sources += envCopy.Object('src/simulation/Gravity.cpp') -#elif platform == "Darwin": -# sources += ["src/SDLMain.m"] - - -#Program output name -if GetOption('output'): - programName = GetOption('output') -else: - programName = "powder" - if GetOption('renderer'): - programName = "render" - if GetOption('font'): - programName = "font" - if "BIT" in env and env["BIT"] == 64: - programName += "64" - if isX86 and GetOption('no-sse'): - programName += "-legacy" - if platform == "Windows": - programName = programName.capitalize() - programName += ".exe" - elif platform == "Darwin": - programName += "-x" - -#strip binary after compilation -def strip(): - global programName - global env - try: - os.system("{0} {1}/{2}".format(env['STRIP'] if 'STRIP' in env else "strip", GetOption('builddir'), programName)) - except: - print("Couldn't strip binary") -if not GetOption('debugging') and not GetOption('symbols') and not GetOption('clean') and not GetOption('help') and not msvc: - atexit.register(strip) - -#Long command line fix for mingw on windows -if compilePlatform == "Windows" and not msvc: - SetupSpawn(env) - -#Once we get here, finally compile -env.Decider('MD5-timestamp') -SetOption('implicit_cache', 1) -t = env.Program(target=programName, source=sources) -Default(t) diff --git a/SConstruct b/SConstruct deleted file mode 100644 index 95e57aeef..000000000 --- a/SConstruct +++ /dev/null @@ -1,18 +0,0 @@ -AddOption('--builddir',dest="builddir",default="build",help="Directory to build to.") -SConscript('SConscript', variant_dir=GetOption('builddir'), duplicate=0) -if GetOption('clean'): - import os, shutil - try: - shutil.rmtree(".sconf_temp/") - except: - print("couldn't remove .sconf_temp/") - - try: - shutil.rmtree("generated/") - except: - print("couldn't remove generated/") - - try: - os.remove(".sconsign.dblite") - except: - print("couldn't remove .sconsign.dblite") diff --git a/data/IntroText.h b/data/IntroText.h index b069c4121..6fffd214b 100644 --- a/data/IntroText.h +++ b/data/IntroText.h @@ -1,4 +1,6 @@ #pragma once +#include "Config.h" + const char *const introTextData = "\blThe Powder Toy - Version " MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " - https://powdertoy.co.uk, irc.freenode.net #powder\n" "\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\n" diff --git a/data/hmap.cpp b/data/hmap.cpp index 8cade69ce..1f24c651d 100644 --- a/data/hmap.cpp +++ b/data/hmap.cpp @@ -17,6 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "hmap.h" extern const unsigned char color_data[] = {0x2B,0x00,0xFF,0x2B,0x00,0xFF,0x28,0x04,0xFF,0x24,0x08,0xFF,0x20,0x0D,0xFF,0x1C,0x12,0xFF,0x17,0x18,0xFF,0x12,0x1E,0xFF,0x0D,0x25,0xFF,0x07,0x2D,0xFF,0x03,0x35,0xFF,0x01,0x3E,0xFF,0x00,0x42,0xFF,0x00,0x44,0xFF,0x00,0x48,0xFF,0x00,0x4A,0xFF,0x00,0x4D,0xFF,0x00,0x51,0xFF,0x00,0x54,0xFF,0x00,0x58,0xFF,0x00,0x5C,0xFF,0x00,0x5E,0xFF,0x00,0x62,0xFF,0x00,0x66,0xFF,0x00,0x6A,0xFF,0x00,0x6D,0xFF,0x00,0x71,0xFF,0x00,0x75,0xFF,0x00,0x79,0xFF,0x00,0x7C,0xFF,0x00,0x7F,0xFF,0x00,0x83,0xFF,0x00,0x87,0xFF,0x00,0x8B,0xFF,0x00,0x8F,0xFF,0x00,0x92,0xFF,0x00,0x96,0xFF,0x00,0x99,0xFF,0x00,0x9C,0xFF,0x00,0xA0,0xFF,0x00,0xA3,0xFF,0x00,0xA7,0xFF,0x00,0xAA,0xFF,0x00,0xAD,0xFF,0x00,0xAE,0xFE,0x00,0xB1,0xFE,0x00,0xB3,0xFE,0x00,0xB6,0xFE,0x00,0xB9,0xFE,0x00,0xBB,0xFD,0x00,0xBD,0xFD,0x00,0xC0,0xFD,0x00,0xC2,0xFD,0x00,0xC5,0xFD,0x00,0xC7,0xFD,0x00,0xC9,0xFD,0x00,0xCC,0xFC,0x00,0xCF,0xFD,0x00,0xD0,0xFC,0x00,0xD3,0xFC,0x00,0xD5,0xFC,0x00,0xD7,0xFB,0x00,0xDA,0xFB,0x00,0xDC,0xFB,0x00,0xDE,0xFB,0x00,0xE1,0xFA,0x00,0xE3,0xF9,0x00,0xE6,0xF9,0x00,0xE7,0xF9,0x00,0xEA,0xF8,0x00,0xEB,0xF7,0x00,0xED,0xF7,0x00,0xEF,0xF6,0x00,0xF1,0xF5,0x00,0xF2,0xF4,0x00,0xF5,0xF3,0x00,0xF6,0xF2,0x00,0xF7,0xF2,0x00,0xFA,0xF0,0x00,0xFA,0xEF,0x00,0xFC,0xEE,0x00,0xFD,0xEC,0x00,0xFF,0xEB,0x00,0xFF,0xE9,0x00,0xFF,0xE8,0x00,0xFF,0xE7,0x00,0xFF,0xE6,0x00,0xFF,0xE3,0x00,0xFF,0xE3,0x00,0xFF,0xE1,0x00,0xFF,0xDF,0x00,0xFF,0xDE,0x00,0xFF,0xDC,0x00,0xFF,0xDA,0x00,0xFF,0xD8,0x00,0xFF,0xD6,0x00,0xFF,0xD4,0x00,0xFF,0xD2,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCC,0x00,0xFF,0xCA,0x00,0xFF,0xC8,0x00,0xFF,0xC5,0x00,0xFF,0xC3,0x00,0xFF,0xC1,0x00,0xFF,0xBF,0x00,0xFF,0xBD,0x00,0xFF,0xBB,0x00,0xFF,0xB9,0x00,0xFF,0xB5,0x00,0xFF,0xB3,0x00,0xFF,0xB1,0x00,0xFF,0xAF,0x00,0xFF,0xAC,0x00,0xFF,0xAA,0x00,0xFF,0xA8,0x00,0xFF,0xA5,0x00,0xFF,0xA3,0x00,0xFF,0xA1,0x00,0xFF,0x9F,0x00,0xFF,0x9C,0x00,0xFF,0x99,0x00,0xFF,0x97,0x00,0xFF,0x95,0x00,0xFF,0x93,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8C,0x00,0xFF,0x8A,0x00,0xFF,0x88,0x00,0xFF,0x86,0x00,0xFF,0x83,0x00,0xFF,0x81,0x00,0xFF,0x7F,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x76,0x00,0xFF,0x74,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x6F,0x00,0xFF,0x6D,0x00,0xFF,0x6A,0x00,0xFF,0x69,0x00,0xFF,0x67,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x61,0x00,0xFF,0x5F,0x00,0xFF,0x5D,0x00,0xFF,0x5B,0x00,0xFF,0x5A,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x54,0x00,0xFF,0x51,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4C,0x00,0xFF,0x4A,0x00,0xFF,0x48,0x00,0xFF,0x46,0x00,0xFF,0x45,0x00,0xFF,0x43,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x39,0x00,0xFF,0x37,0x00,0xFF,0x35,0x00,0xFF,0x33,0x00,0xFF,0x32,0x00,0xFF,0x30,0x00,0xFF,0x2F,0x00,0xFF,0x2D,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x25,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x16,0x00,0xFF,0x16,0x01,0xFF,0x15,0x02,0xFF,0x14,0x02,0xFF,0x12,0x02,0xFF,0x12,0x03,0xFF,0x12,0x04,0xFF,0x10,0x05,0xFF,0x10,0x06,0xFF,0x0F,0x06,0xFF,0x0F,0x07,0xFF,0x0D,0x08,0xFF,0x0D,0x09,0xFF,0x0C,0x0A,0xFF,0x0C,0x0B,0xFF,0x0C,0x0C,0xFF,0x0B,0x0C,0xFF,0x0B,0x0E,0xFF,0x0A,0x0F,0xFF,0x09,0x10,0xFF,0x09,0x11,0xFF,0x08,0x12,0xFF,0x08,0x13,0xFF,0x08,0x14,0xFF,0x07,0x15,0xFF,0x07,0x16,0xFF,0x06,0x18,0xFF,0x06,0x19,0xFF,0x06,0x1A,0xFF,0x06,0x1C,0xFF,0x06,0x1D,0xFF,0x06,0x1E,0xFF,0x05,0x1F,0xFF,0x05,0x20,0xFF,0x05,0x21,0xFF,0x05,0x23,0xFF,0x04,0x24,0xFF,0x04,0x25,0xFF,0x04,0x26,0xFF,0x04,0x28,0xFF,0x03,0x29,0xFF,0x03,0x2B,0xFF,0x03,0x2B,0xFF,0x03,0x2D,0xFF,0x03,0x2E,0xFF,0x03,0x30,0xFF,0x03,0x31,0xFF,0x02,0x32,0xFF,0x03,0x34,0xFF,0x03,0x35,0xFF,0x02,0x37,0xFF,0x03,0x39,0xFF,0x02,0x3A,0xFF,0x02,0x3B,0xFF,0x01,0x3C,0xFF,0x01,0x3E,0xFF,0x01,0x3F,0xFF,0x01,0x40,0xFF,0x02,0x42,0xFF,0x02,0x44,0xFF,0x01,0x45,0xFF,0x01,0x46,0xFF,0x01,0x48,0xFF,0x01,0x49,0xFF,0x01,0x4A,0xFF,0x01,0x4C,0xFF,0x00,0x4E,0xFF,0x01,0x4E,0xFF,0x00,0x50,0xFF,0x01,0x52,0xFF,0x01,0x52,0xFF,0x00,0x54,0xFF,0x00,0x55,0xFF,0x00,0x56,0xFF,0x00,0x58,0xFF,0x00,0x58,0xFF,0x00,0x59,0xFF,0x00,0x5A,0xFF,0x00,0x5B,0xFF,0x00,0x5C,0xFF,0x00,0x5D,0xFF,0x00,0x5E,0xFF,0x00,0x5F,0xFF,0x00,0x60,0xFF,0x00,0x61,0xFF,0x00,0x62,0xFF,0x00,0x63,0xFF,0x00,0x64,0xFF,0x00,0x65,0xFF,0x00,0x66,0xFF,0x00,0x67,0xFF,0x00,0x69,0xFF,0x00,0x6A,0xFF,0x00,0x6A,0xFF,0x00,0x6B,0xFF,0x00,0x6C,0xFF,0x00,0x6E,0xFF,0x00,0x6F,0xFF,0x00,0x70,0xFF,0x00,0x71,0xFF,0x00,0x72,0xFF,0x00,0x73,0xFF,0x00,0x74,0xFF,0x00,0x75,0xFF,0x00,0x76,0xFF,0x00,0x77,0xFF,0x00,0x79,0xFF,0x00,0x7A,0xFF,0x00,0x7B,0xFF,0x00,0x7B,0xFF,0x00,0x7D,0xFF,0x00,0x7E,0xFF,0x00,0x7F,0xFF,0x00,0x80,0xFF,0x00,0x82,0xFF,0x00,0x83,0xFF,0x00,0x83,0xFF,0x00,0x84,0xFF,0x00,0x86,0xFF,0x00,0x87,0xFF,0x00,0x88,0xFF,0x00,0x89,0xFF,0x00,0x8A,0xFF,0x00,0x8C,0xFF,0x00,0x8D,0xFF,0x00,0x8E,0xFF,0x00,0x8F,0xFF,0x00,0x90,0xFF,0x00,0x92,0xFF,0x00,0x93,0xFF,0x00,0x93,0xFF,0x00,0x94,0xFF,0x00,0x96,0xFF,0x00,0x97,0xFF,0x00,0x98,0xFF,0x00,0x99,0xFF,0x00,0x9A,0xFF,0x00,0x9B,0xFF,0x00,0x9C,0xFF,0x00,0x9E,0xFF,0x00,0x9E,0xFF,0x00,0x9F,0xFF,0x00,0xA0,0xFF,0x00,0xA1,0xFF,0x00,0xA3,0xFF,0x00,0xA4,0xFF,0x00,0xA4,0xFF,0x00,0xA6,0xFF,0x00,0xA7,0xFF,0x00,0xA7,0xFF,0x00,0xA9,0xFF,0x00,0xAA,0xFF,0x00,0xAB,0xFF,0x00,0xAC,0xFF,0x00,0xAD,0xFF,0x00,0xAE,0xFF,0x00,0xAE,0xFF,0x00,0xB0,0xFF,0x00,0xB1,0xFF,0x00,0xB1,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB5,0xFF,0x00,0xB6,0xFF,0x00,0xB7,0xFF,0x00,0xB8,0xFF,0x00,0xB8,0xFF,0x00,0xBA,0xFF,0x00,0xBB,0xFF,0x00,0xBB,0xFF,0x00,0xBC,0xFF,0x00,0xBD,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xBF,0xFF,0x00,0xC0,0xFE,0x00,0xC1,0xFE,0x00,0xC2,0xFE,0x00,0xC2,0xFF,0x00,0xC3,0xFE,0x00,0xC4,0xFE,0x00,0xC5,0xFE,0x00,0xC6,0xFD,0x00,0xC7,0xFD,0x00,0xC8,0xFD,0x00,0xC8,0xFC,0x00,0xC9,0xFC,0x00,0xCA,0xFC,0x00,0xCB,0xFC,0x00,0xCC,0xFB,0x00,0xCC,0xFC,0x00,0xCD,0xFB,0x00,0xCE,0xFB,0x00,0xCF,0xFB,0x00,0xCF,0xFA,0x00,0xD0,0xFA,0x00,0xD1,0xFA,0x00,0xD1,0xFA,0x00,0xD3,0xF9,0x00,0xD3,0xFA,0x00,0xD4,0xF9,0x00,0xD5,0xF9,0x00,0xD5,0xF8,0x00,0xD6,0xF8,0x00,0xD7,0xF8,0x00,0xD8,0xF7,0x00,0xD9,0xF7,0x00,0xD9,0xF6,0x00,0xDA,0xF7,0x00,0xDB,0xF6,0x00,0xDC,0xF5,0x00,0xDC,0xF5,0x00,0xDD,0xF5,0x00,0xDD,0xF5,0x00,0xDE,0xF5,0x00,0xDF,0xF4,0x00,0xDF,0xF4,0x00,0xE0,0xF3,0x00,0xE1,0xF4,0x00,0xE2,0xF2,0x00,0xE2,0xF3,0x00,0xE3,0xF2,0x00,0xE3,0xF1,0x00,0xE4,0xF1,0x00,0xE5,0xF1,0x00,0xE6,0xF0,0x00,0xE6,0xF0,0x00,0xE7,0xF0,0x00,0xE7,0xEF,0x00,0xE8,0xEF,0x00,0xE9,0xEE,0x00,0xEA,0xEE,0x00,0xEA,0xEE,0x00,0xEB,0xED,0x00,0xEC,0xED,0x00,0xEC,0xED,0x00,0xED,0xEB,0x00,0xED,0xEC,0x00,0xED,0xEB,0x00,0xEE,0xEA,0x00,0xEF,0xEB,0x00,0xF0,0xE9,0x00,0xF0,0xEA,0x00,0xF1,0xE9,0x00,0xF1,0xE8,0x00,0xF2,0xE7,0x00,0xF2,0xE7,0x00,0xF3,0xE6,0x00,0xF3,0xE6,0x00,0xF4,0xE6,0x00,0xF4,0xE5,0x00,0xF5,0xE5,0x00,0xF6,0xE4,0x00,0xF5,0xE3,0x00,0xF7,0xE3,0x00,0xF6,0xE2,0x00,0xF8,0xE1,0x00,0xF8,0xE1,0x00,0xF8,0xE1,0x00,0xF9,0xDF,0x00,0xF9,0xDF,0x00,0xFA,0xDE,0x00,0xFA,0xDE,0x00,0xFA,0xDE,0x00,0xFA,0xDD,0x00,0xFB,0xDC,0x00,0xFC,0xDB,0x00,0xFC,0xDB,0x00,0xFD,0xDB,0x00,0xFD,0xDA,0x00,0xFD,0xD8,0x00,0xFD,0xD8,0x00,0xFE,0xD8,0x00,0xFE,0xD7,0x00,0xFF,0xD6,0x00,0xFE,0xD5,0x00,0xFF,0xD5,0x00,0xFF,0xD3,0x00,0xFF,0xD3,0x00,0xFF,0xD2,0x00,0xFF,0xD2,0x00,0xFF,0xD2,0x00,0xFF,0xD0,0x00,0xFF,0xD0,0x00,0xFF,0xCF,0x00,0xFF,0xCF,0x00,0xFF,0xCE,0x00,0xFF,0xCD,0x00,0xFF,0xCC,0x00,0xFF,0xCC,0x00,0xFF,0xCB,0x00,0xFF,0xCA,0x00,0xFF,0xC9,0x00,0xFF,0xC9,0x00,0xFF,0xC8,0x00,0xFF,0xC7,0x00,0xFF,0xC7,0x00,0xFF,0xC6,0x00,0xFF,0xC5,0x00,0xFF,0xC5,0x00,0xFF,0xC4,0x00,0xFF,0xC3,0x00,0xFF,0xC2,0x00,0xFF,0xC2,0x00,0xFF,0xC1,0x00,0xFF,0xC0,0x00,0xFF,0xBF,0x00,0xFF,0xBE,0x00,0xFF,0xBD,0x00,0xFF,0xBC,0x00,0xFF,0xBC,0x00,0xFF,0xBB,0x00,0xFF,0xBA,0x00,0xFF,0xB9,0x00,0xFF,0xB9,0x00,0xFF,0xB8,0x00,0xFF,0xB6,0x00,0xFF,0xB6,0x00,0xFF,0xB5,0x00,0xFF,0xB4,0x00,0xFF,0xB3,0x00,0xFF,0xB2,0x00,0xFF,0xB1,0x00,0xFF,0xB0,0x00,0xFF,0xB0,0x00,0xFF,0xAF,0x00,0xFF,0xAE,0x00,0xFF,0xAD,0x00,0xFF,0xAC,0x00,0xFF,0xAB,0x00,0xFF,0xAA,0x00,0xFF,0xA9,0x00,0xFF,0xA8,0x00,0xFF,0xA8,0x00,0xFF,0xA6,0x00,0xFF,0xA6,0x00,0xFF,0xA5,0x00,0xFF,0xA4,0x00,0xFF,0xA3,0x00,0xFF,0xA2,0x00,0xFF,0xA1,0x00,0xFF,0xA0,0x00,0xFF,0x9F,0x00,0xFF,0x9E,0x00,0xFF,0x9D,0x00,0xFF,0x9D,0x00,0xFF,0x9B,0x00,0xFF,0x9B,0x00,0xFF,0x99,0x00,0xFF,0x98,0x00,0xFF,0x98,0x00,0xFF,0x97,0x00,0xFF,0x95,0x00,0xFF,0x94,0x00,0xFF,0x93,0x00,0xFF,0x93,0x00,0xFF,0x92,0x00,0xFF,0x91,0x00,0xFF,0x90,0x00,0xFF,0x8F,0x00,0xFF,0x8E,0x00,0xFF,0x8D,0x00,0xFF,0x8C,0x00,0xFF,0x8B,0x00,0xFF,0x8A,0x00,0xFF,0x89,0x00,0xFF,0x89,0x00,0xFF,0x88,0x00,0xFF,0x87,0x00,0xFF,0x86,0x00,0xFF,0x84,0x00,0xFF,0x84,0x00,0xFF,0x82,0x00,0xFF,0x82,0x00,0xFF,0x81,0x00,0xFF,0x80,0x00,0xFF,0x7F,0x00,0xFF,0x7E,0x00,0xFF,0x7D,0x00,0xFF,0x7C,0x00,0xFF,0x7B,0x00,0xFF,0x7B,0x00,0xFF,0x7A,0x00,0xFF,0x78,0x00,0xFF,0x78,0x00,0xFF,0x77,0x00,0xFF,0x76,0x00,0xFF,0x74,0x00,0xFF,0x74,0x00,0xFF,0x73,0x00,0xFF,0x72,0x00,0xFF,0x71,0x00,0xFF,0x70,0x00,0xFF,0x70,0x00,0xFF,0x6E,0x00,0xFF,0x6D,0x00,0xFF,0x6C,0x00,0xFF,0x6C,0x00,0xFF,0x6B,0x00,0xFF,0x6A,0x00,0xFF,0x6A,0x00,0xFF,0x68,0x00,0xFF,0x67,0x00,0xFF,0x66,0x00,0xFF,0x66,0x00,0xFF,0x65,0x00,0xFF,0x64,0x00,0xFF,0x64,0x00,0xFF,0x62,0x00,0xFF,0x62,0x00,0xFF,0x61,0x00,0xFF,0x60,0x00,0xFF,0x5F,0x00,0xFF,0x5E,0x00,0xFF,0x5D,0x00,0xFF,0x5D,0x00,0xFF,0x5C,0x00,0xFF,0x5A,0x00,0xFF,0x5A,0x00,0xFF,0x59,0x00,0xFF,0x58,0x00,0xFF,0x57,0x00,0xFF,0x56,0x00,0xFF,0x55,0x00,0xFF,0x54,0x00,0xFF,0x54,0x00,0xFF,0x53,0x00,0xFF,0x52,0x00,0xFF,0x51,0x00,0xFF,0x50,0x00,0xFF,0x4F,0x00,0xFF,0x4E,0x00,0xFF,0x4D,0x00,0xFF,0x4D,0x00,0xFF,0x4C,0x00,0xFF,0x4A,0x00,0xFF,0x4A,0x00,0xFF,0x48,0x00,0xFF,0x47,0x00,0xFF,0x47,0x00,0xFF,0x45,0x00,0xFF,0x45,0x00,0xFF,0x44,0x00,0xFF,0x43,0x00,0xFF,0x43,0x00,0xFF,0x41,0x00,0xFF,0x40,0x00,0xFF,0x40,0x00,0xFF,0x3F,0x00,0xFF,0x3E,0x00,0xFF,0x3C,0x00,0xFF,0x3C,0x00,0xFF,0x3B,0x00,0xFF,0x3A,0x00,0xFF,0x38,0x00,0xFF,0x38,0x00,0xFF,0x37,0x00,0xFF,0x36,0x00,0xFF,0x35,0x00,0xFF,0x34,0x00,0xFF,0x34,0x00,0xFF,0x33,0x00,0xFF,0x31,0x00,0xFF,0x31,0x00,0xFF,0x2F,0x00,0xFF,0x2F,0x00,0xFF,0x2E,0x00,0xFF,0x2C,0x00,0xFF,0x2C,0x00,0xFF,0x2B,0x00,0xFF,0x2A,0x00,0xFF,0x29,0x00,0xFF,0x28,0x00,0xFF,0x27,0x00,0xFF,0x26,0x00,0xFF,0x26,0x00,0xFF,0x25,0x00,0xFF,0x25,0x00,0xFF,0x23,0x00,0xFF,0x23,0x00,0xFF,0x22,0x00,0xFF,0x21,0x00,0xFF,0x20,0x00,0xFF,0x1F,0x00,0xFF,0x1E,0x00,0xFF,0x1D,0x00,0xFF,0x1D,0x00,0xFF,0x1C,0x00,0xFF,0x1B,0x00,0xFF,0x1A,0x00,0xFF,0x19,0x00,0xFF,0x19,0x00,0xFF,0x18,0x00,0xFF,0x17,0x00,0xFF,0x16,0x00,0xFF,0x15,0x00,0xFF,0x15,0x00,0xFF,0x14,0x00,0xFF,0x14,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x12,0x00,0xFF,0x10,0x00,0xFF,0x10,0x00,0xFF,0x0F,0x00,0xFF,0x0E,0x00,0xFF,0x0E,0x00,0xFF,0x0D,0x00,0xFF,0x0C,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0B,0x00,0xFF,0x0A,0x00,0xFF,0x09,0x00,0xFF,0x09,0x00,0xFF,0x08,0x00,0xFF,0x07,0x00,0xFF,0x07,0x00,0xFF,0x06,0x00,0xFF,0x06,0x00,0xFF,0x05,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x04,0x00,0xFF,0x03,0x00,0xFF,0x03,0x00,0xFF,0x02,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x01,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x01,0xFF,0x00,0x02,0xFF,0x00,0x03,0xFF,0x00,0x03,0xFF,0x00,0x03,0xFF,0x00,0x04,0xFF,0x00,0x05,0xFF,0x00,0x05,0xFF,0x00,0x05,0xFF,0x00,0x06,0xFF,0x00,0x07,0xFF,0x00,0x06,0xFF,0x00,0x07,0xFF,0x00,0x08,0xFF,0x00,0x09,0xFF,0x00,0x09,0xFF,0x00,0x09,0xFF,0x00,0x0B,0xFF,0x00,0x0B,0xFF,0x00,0x0C,0xFF,0x00,0x0B,0xFF,0x00,0x0C,0xFF,0x00,0x0E,0xFF,0x00,0x0D,0xFF,0x00,0x0E,0xFF,0x00,0x0F,0xFF,0x00,0x0F,0xFF,0x00,0x10,0xFF,0x00,0x11,0xFF,0x00,0x11,0xFF,0x00,0x12,0xFF,0x00,0x13,0xFF,0x00,0x14,0xFF,0x00,0x14,0xFF,0x00,0x15,0xFF,0x00,0x16,0xFF,0x00,0x16,0xFF,0x00,0x17,0xFF,0x00,0x17,0xFF,0x00,0x18,0xFF,0x00,0x19,0xFF,0x00,0x1A,0xFF,0x00,0x1A,0xFF,0x00,0x1B,0xFF,0x00,0x1C,0xFF,0x00,0x1D,0xFF,0x00,0x1E,0xFF,0x00,0x1E,0xFF,0x00,0x1F,0xFF,0x00,0x20,0xFF,0x00,0x21,0xFF,0x00,0x22,0xFF,0x00,0x22,0xFF,0x00,0x22,0xFF,0x00,0x24,0xFF,0x00,0x25,0xFF,0x00,0x26,0xFF,0x00,0x26,0xFF,0x00,0x27,0xFF,0x00,0x27,0xFF,0x00,0x28,0xFF,0x00,0x2A,0xFF,0x00,0x2A,0xFF,0x00,0x2B,0xFF,0x00,0x2C,0xFF,0x00,0x2C,0xFF,0x00,0x2E,0xFF,0x00,0x2E,0xFF,0x00,0x2F,0xFF,0x00,0x30,0xFF,0x00,0x31,0xFF,0x00,0x31,0xFF,0x00,0x32,0xFF,0x00,0x33,0xFF,0x00,0x34,0xFF,0x00,0x35,0xFF,0x00,0x36,0xFF,0x00,0x37,0xFF,0x00,0x37,0xFF,0x00,0x39,0xFF,0x00,0x3A,0xFF,0x00,0x3A,0xFF,0x00,0x3B,0xFF,0x00,0x3C,0xFF,0x00,0x3D,0xFF,0x00,0x3E,0xFF,0x00,0x3E,0xFF,0x00,0x3F,0xFF,0x00,0x40,0xFF,0x00,0x41,0xFF,0x00,0x42,0xFF,0x00,0x43,0xFF,0x00,0x43,0xFF,0x00,0x45,0xFF,0x00,0x46,0xFF,0x00,0x46,0xFF,0x00,0x47,0xFF,0x00,0x48,0xFF,0x00,0x49,0xFF,0x00,0x4A,0xFF,0x00,0x4B,0xFF,0x00,0x4C,0xFF,0x00,0x4C,0xFF,0x00,0x4D,0xFF,0x00,0x4E,0xFF,0x00,0x4F,0xFF,0x00,0x50,0xFF,0x00,0x51,0xFF,0x00,0x51,0xFF,0x00,0x52,0xFF,0x00,0x53,0xFF,0x00,0x54,0xFF,0x00,0x54,0xFF,0x00,0x56,0xFF,0x00,0x56,0xFF,0x00,0x57,0xFF,0x00,0x59,0xFF,0x00,0x59,0xFF,0x00,0x5A,0xFF,0x00,0x5A,0xFF,0x00,0x5C,0xFF,0x00,0x5D,0xFF,0x00,0x5D,0xFF,0x00,0x5E,0xFF,0x00,0x5F,0xFF,0x00,0x60,0xFF,0x00,0x61,0xFF,0x00,0x61,0xFF,0x00,0x62,0xFF,0x00,0x63,0xFF,0x00,0x64,0xFF,0x00,0x64,0xFF,0x00,0x65,0xFF,0x00,0x66,0xFF,0x00,0x67,0xFF,0x00,0x67,0xFF,0x00,0x68,0xFF,0x00,0x69,0xFF,0x00,0x6A,0xFF,0x00,0x6B,0xFF,0x00,0x6B,0xFF,0x00,0x6C,0xFF,0x00,0x6C,0xFF,0x00,0x6D,0xFF,0x00,0x6E,0xFF,0x00,0x6F,0xFF,0x00,0x6F,0xFF,0x00,0x70,0xFF,0x00,0x71,0xFF,0x00,0x72,0xFF,0x00,0x72,0xFF,0x00,0x73,0xFF,0x00,0x74,0xFF,0x00,0x74,0xFF,0x00,0x75,0xFF,0x00,0x76,0xFF,0x00,0x77,0xFF,0x00,0x78,0xFF,0x00,0x78,0xFF,0x00,0x79,0xFF,0x00,0x7A,0xFF,0x00,0x7A,0xFF,0x00,0x7B,0xFF,0x00,0x7C,0xFF,0x00,0x7D,0xFF,0x00,0x7E,0xFF,0x00,0x7E,0xFF,0x00,0x80,0xFF,0x00,0x80,0xFF,0x00,0x81,0xFF,0x00,0x82,0xFF,0x00,0x82,0xFF,0x00,0x83,0xFF,0x00,0x84,0xFF,0x00,0x85,0xFF,0x00,0x85,0xFF,0x00,0x87,0xFF,0x00,0x87,0xFF,0x00,0x88,0xFF,0x00,0x89,0xFF,0x00,0x8A,0xFF,0x00,0x8A,0xFF,0x00,0x8B,0xFF,0x00,0x8C,0xFF,0x00,0x8D,0xFF,0x00,0x8E,0xFF,0x00,0x8F,0xFF,0x00,0x90,0xFF,0x00,0x90,0xFF,0x00,0x91,0xFF,0x00,0x92,0xFF,0x00,0x92,0xFF,0x00,0x94,0xFF,0x00,0x94,0xFF,0x00,0x95,0xFF,0x00,0x95,0xFF,0x00,0x97,0xFF,0x00,0x98,0xFF,0x00,0x98,0xFF,0x00,0x99,0xFF,0x00,0x9A,0xFF,0x00,0x9B,0xFF,0x00,0x9B,0xFF,0x00,0x9C,0xFF,0x00,0x9D,0xFF,0x00,0x9E,0xFF,0x00,0x9F,0xFF,0x00,0x9F,0xFF,0x00,0xA0,0xFF,0x00,0xA1,0xFF,0x00,0xA2,0xFF,0x00,0xA2,0xFF,0x00,0xA3,0xFF,0x00,0xA4,0xFF,0x00,0xA5,0xFF,0x00,0xA6,0xFF,0x00,0xA6,0xFF,0x00,0xA7,0xFF,0x00,0xA8,0xFF,0x00,0xA9,0xFF,0x00,0xAA,0xFF,0x00,0xAA,0xFF,0x00,0xAB,0xFF,0x00,0xAC,0xFF,0x00,0xAD,0xFF,0x00,0xAE,0xFF,0x00,0xAE,0xFF,0x00,0xAF,0xFF,0x00,0xB0,0xFF,0x00,0xB1,0xFF,0x00,0xB1,0xFF,0x00,0xB2,0xFF,0x00,0xB3,0xFF,0x00,0xB4,0xFF,0x00,0xB4,0xFF,0x00,0xB5,0xFF,0x00,0xB6,0xFF,0x00,0xB7,0xFF,0x00,0xB7,0xFF,0x00,0xB8,0xFF,0x00,0xB9,0xFF,0x00,0xB9,0xFF,0x00,0xBA,0xFF,0x00,0xBA,0xFF,0x00,0xBC,0xFF,0x00,0xBC,0xFF,0x00,0xBC,0xFF,0x00,0xBD,0xFF,0x00,0xBE,0xFF,0x00,0xBE,0xFF,0x00,0xBF,0xFF,0x00,0xC0,0xFF,0x00,0xC1,0xFF,0x00,0xC1,0xFF,0x00,0xC1,0xFF,0x00,0xC2,0xFF,0x00,0xC2,0xFF,0x00,0xC4,0xFF,0x00,0xC4,0xFF,0x00,0xC5,0xFF,0x00,0xC5,0xFF,0x00,0xC6,0xFF,0x00,0xC7,0xFF,0x00,0xC7,0xFF,0x00,0xC7,0xFF,0x00,0xC8,0xFF,0x00,0xC9,0xFF,0x00,0xC9,0xFF,0x00,0xCA,0xFF,0x00,0xCA,0xFF,0x00,0xCB,0xFF,0x00,0xCC,0xFF,0x00,0xCC,0xFF,0x00,0xCC,0xFF,0x00,0xCD,0xFF,0x00,0xCD,0xFF,0x00,0xCE,0xFF,0x00,0xCE,0xFF,0x00,0xCF,0xFF,0x00,0xCF,0xFF,0x00,0xD0,0xFF,0x00,0xD0,0xFF,0x00,0xD1,0xFF,0x00,0xD1,0xFF,0x00,0xD1,0xFF,0x00,0xD2,0xFF,0x00,0xD2,0xFF,0x00,0xD3,0xFF,0x00,0xD3,0xFF,0x00,0xD4,0xFF,0x00,0xD3,0xFF,0x00,0xD4,0xFF,0x00,0xD4}; //1024 Pixels //extern const char plasma_data[] = {0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x09,0x00,0x00,0x0E,0x00,0x00,0x12,0x00,0x00,0x17,0x00,0x00,0x1C,0x00,0x00,0x22,0x00,0x00,0x27,0x00,0x00,0x2C,0x00,0x00,0x32,0x00,0x00,0x37,0x00,0x00,0x3C,0x00,0x00,0x41,0x00,0x00,0x45,0x00,0x00,0x4A,0x00,0x00,0x4D,0x00,0x00,0x51,0x00,0x00,0x53,0x00,0x00,0x55,0x00,0x00,0x55,0x00,0x02,0x55,0x02,0x03,0x55,0x03,0x06,0x55,0x03,0x07,0x55,0x05,0x09,0x55,0x06,0x0C,0x55,0x06,0x0F,0x55,0x07,0x10,0x55,0x09,0x13,0x55,0x0A,0x16,0x55,0x0C,0x1A,0x55,0x0C,0x1D,0x54,0x0E,0x20,0x53,0x10,0x23,0x54,0x11,0x26,0x53,0x13,0x2A,0x52,0x14,0x2E,0x51,0x15,0x31,0x50,0x17,0x35,0x50,0x19,0x38,0x4E,0x1A,0x3D,0x4D,0x1C,0x40,0x4D,0x1D,0x44,0x4C,0x1F,0x47,0x4B,0x21,0x4C,0x4A,0x23,0x4F,0x49,0x24,0x54,0x48,0x25,0x57,0x47,0x28,0x5B,0x46,0x29,0x5F,0x45,0x2B,0x62,0x44,0x2D,0x66,0x44,0x2E,0x6A,0x43,0x30,0x6E,0x42,0x32,0x72,0x41,0x33,0x76,0x40,0x35,0x79,0x3F,0x38,0x7C,0x3F,0x39,0x7F,0x3E,0x3B,0x83,0x3D,0x3D,0x86,0x3C,0x3F,0x8A,0x3B,0x40,0x8C,0x3B,0x43,0x8F,0x3B,0x44,0x92,0x3A,0x46,0x95,0x39,0x48,0x98,0x39,0x4A,0x9B,0x39,0x4C,0x9C,0x39,0x4E,0x9F,0x3A,0x4F,0xA1,0x39,0x51,0xA3,0x39,0x52,0xA4,0x39,0x54,0xA6,0x39,0x56,0xA7,0x39,0x57,0xA8,0x39,0x58,0xA8,0x3A,0x5A,0xA9,0x3A,0x5C,0xA8,0x3A,0x5D,0xA8,0x3B,0x5F,0xA8,0x3C,0x61,0xA8,0x3D,0x62,0xA8,0x3D,0x64,0xA9,0x3E,0x66,0xA8,0x3E,0x67,0xA9,0x3F,0x68,0xA8,0x40,0x6A,0xA8,0x41,0x6C,0xA8,0x42,0x6E,0xA8,0x42,0x70,0xA8,0x43,0x71,0xA8,0x44,0x73,0xA8,0x45,0x74,0xA9,0x46,0x76,0xA8,0x48,0x79,0xA8,0x49,0x7A,0xA7,0x4A,0x7C,0xA6,0x4A,0x7D,0xA5,0x4C,0x7F,0xA4,0x4D,0x81,0xA3,0x4E,0x83,0xA2,0x4E,0x85,0xA1,0x50,0x86,0xA0,0x51,0x88,0x9F,0x52,0x8A,0x9D,0x53,0x8B,0x9D,0x55,0x8D,0x9B,0x56,0x8F,0x9A,0x57,0x91,0x98,0x58,0x92,0x98,0x5A,0x94,0x97,0x5B,0x96,0x95,0x5C,0x97,0x94,0x5E,0x99,0x93,0x5F,0x9A,0x91,0x60,0x9C,0x90,0x61,0x9D,0x90,0x62,0x9F,0x8E,0x64,0xA1,0x8D,0x65,0xA2,0x8C,0x67,0xA3,0x8B,0x68,0xA5,0x8A,0x6A,0xA6,0x89,0x6A,0xA7,0x88,0x6B,0xA9,0x87,0x6D,0xAB,0x86,0x6E,0xAB,0x86,0x6F,0xAE,0x85,0x71,0xAE,0x85,0x72,0xAF,0x85,0x73,0xB0,0x84,0x75,0xB2,0x83,0x75,0xB2,0x83,0x77,0xB4,0x83,0x77,0xB5,0x83,0x79,0xB6,0x83,0x7A,0xB6,0x83,0x7B,0xB8,0x83,0x7D,0xB9,0x84,0x7E,0xB9,0x83,0x7F,0xBA,0x84,0x7F,0xBB,0x85,0x82,0xBC,0x85,0x83,0xBD,0x86,0x84,0xBD,0x87,0x85,0xBD,0x87,0x86,0xBE,0x88,0x88,0xBF,0x88,0x89,0xBF,0x89,0x8A,0xC0,0x8B,0x8B,0xC0,0x8C,0x8D,0xC1,0x8D,0x8F,0xC1,0x8E,0x90,0xC2,0x8F,0x91,0xC1,0x90,0x92,0xC2,0x91,0x94,0xC3,0x93,0x95,0xC3,0x93,0x97,0xC3,0x95,0x98,0xC3,0x96,0x99,0xC3,0x98,0x9B,0xC4,0x99,0x9C,0xC3,0x9A,0x9E,0xC4,0x9B,0x9F,0xC4,0x9D,0xA0,0xC4,0x9E,0xA2,0xC4,0x9F,0xA4,0xC4,0xA0,0xA5,0xC4,0xA2,0xA6,0xC4,0xA4,0xA8,0xC4,0xA5,0xA9,0xC5,0xA6,0xAA,0xC5,0xA8,0xAB,0xC4,0xA9,0xAC,0xC4,0xAA,0xAE,0xC4,0xAC,0xAF,0xC4,0xAD,0xB0,0xC4,0xAE,0xB2,0xC4,0xB0,0xB3,0xC4,0xB1,0xB4,0xC4,0xB3,0xB5,0xC5,0xB4,0xB6,0xC4,0xB6,0xB7,0xC4,0xB7,0xB8,0xC4,0xB7,0xBA,0xC4,0xB9,0xBA,0xC4,0xBA,0xBC,0xC4,0xBB,0xBC,0xC4,0xBC,0xBE,0xC4,0xBD,0xBF,0xC4,0xBE,0xBF,0xC4,0xBF,0xC0,0xC4,0xC0,0xC1,0xC4,0xC1,0xC2,0xC4,0xC2,0xC2,0xC4,0xC3,0xC4,0xC4,0xC3,0xC4,0xC4,0xC4}; //200 Pixels extern const unsigned char hflm_data[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x01,0x01,0x02,0x02,0x01,0x04,0x02,0x01,0x04,0x02,0x03,0x05,0x03,0x03,0x07,0x04,0x04,0x08,0x04,0x03,0x09,0x04,0x04,0x0B,0x05,0x04,0x0C,0x05,0x05,0x0D,0x06,0x05,0x0E,0x07,0x06,0x10,0x07,0x07,0x11,0x08,0x07,0x12,0x09,0x08,0x14,0x09,0x08,0x15,0x0A,0x09,0x17,0x0A,0x09,0x19,0x0B,0x0A,0x1A,0x0C,0x0A,0x1C,0x0D,0x0B,0x1D,0x0D,0x0B,0x1F,0x0D,0x0C,0x22,0x0F,0x0D,0x23,0x0F,0x0E,0x25,0x10,0x0E,0x26,0x11,0x0F,0x28,0x12,0x10,0x2A,0x13,0x10,0x2C,0x13,0x11,0x2E,0x14,0x12,0x2F,0x15,0x12,0x31,0x15,0x13,0x33,0x16,0x14,0x35,0x17,0x15,0x36,0x18,0x15,0x39,0x19,0x16,0x3B,0x19,0x17,0x3D,0x1B,0x17,0x3E,0x1B,0x18,0x40,0x1C,0x19,0x42,0x1D,0x1A,0x43,0x1D,0x1B,0x45,0x1E,0x1C,0x47,0x1F,0x1C,0x49,0x20,0x1D,0x4B,0x21,0x1F,0x4C,0x21,0x1F,0x4E,0x22,0x20,0x50,0x23,0x21,0x52,0x23,0x22,0x53,0x24,0x23,0x55,0x25,0x23,0x56,0x26,0x24,0x59,0x26,0x25,0x5A,0x27,0x26,0x5B,0x28,0x27,0x5D,0x28,0x28,0x5E,0x29,0x29,0x60,0x29,0x2A,0x62,0x2A,0x2B,0x63,0x2B,0x2C,0x64,0x2C,0x2E,0x65,0x2C,0x2E,0x66,0x2C,0x2F,0x68,0x2D,0x31,0x69,0x2E,0x32,0x6A,0x2F,0x32,0x6B,0x2F,0x34,0x6C,0x30,0x34,0x6D,0x30,0x35,0x6F,0x31,0x37,0x70,0x31,0x38,0x71,0x32,0x39,0x72,0x33,0x3B,0x73,0x33,0x3C,0x74,0x34,0x3D,0x75,0x35,0x3E,0x76,0x35,0x3F,0x78,0x36,0x41,0x78,0x36,0x42,0x79,0x36,0x43,0x7A,0x37,0x44,0x7B,0x37,0x46,0x7C,0x38,0x48,0x7D,0x39,0x48,0x7E,0x3A,0x49,0x7F,0x39,0x4B,0x80,0x3A,0x4C,0x81,0x3B,0x4E,0x82,0x3C,0x4F,0x83,0x3C,0x51,0x84,0x3C,0x52,0x84,0x3D,0x54,0x86,0x3E,0x55,0x87,0x3E,0x56,0x88,0x3F,0x57,0x89,0x40,0x59,0x8A,0x40,0x5A,0x8A,0x41,0x5C,0x8B,0x41,0x5D,0x8C,0x42,0x5F,0x8D,0x41,0x60,0x8E,0x42,0x62,0x8E,0x42,0x62,0x8F,0x44,0x65,0x90,0x43,0x65,0x91,0x45,0x67,0x91,0x44,0x69,0x92,0x45,0x6A,0x93,0x46,0x6B,0x94,0x46,0x6C,0x94,0x46,0x6E,0x96,0x47,0x70,0x96,0x48,0x70,0x97,0x48,0x72,0x98,0x48,0x73,0x99,0x49,0x74,0x99,0x49,0x76,0x9A,0x4A,0x77,0x9A,0x4B,0x78,0x9B,0x4B,0x7A,0x9C,0x4B,0x7B,0x9D,0x4B,0x7C,0x9E,0x4C,0x7D,0x9F,0x4C,0x7E,0x9F,0x4D,0x7F,0xA0,0x4E,0x80,0xA0,0x4E,0x82,0xA1,0x4E,0x83,0xA2,0x4F,0x84,0xA3,0x4F,0x85,0xA3,0x4F,0x86,0xA4,0x4F,0x88,0xA5,0x50,0x89,0xA5,0x50,0x89,0xA6,0x51,0x8B,0xA6,0x51,0x8B,0xA7,0x51,0x8D,0xA8,0x51,0x8E,0xA9,0x52,0x8F,0xAA,0x52,0x90,0xAA,0x53,0x92,0xAB,0x53,0x92,0xAB,0x53,0x93,0xAC,0x54,0x95,0xAD,0x53,0x95,0xAE,0x54,0x96,0xAE,0x55,0x98,0xAE,0x54,0x98,0xAF,0x55,0x9A,0xB0,0x56,0x9B,0xB0,0x56,0x9C,0xB1,0x56,0x9D,0xB1,0x56,0x9E,0xB2,0x56,0xA0,0xB3,0x57,0xA0,0xB3,0x57,0xA1,0xB3,0x57,0xA2,0xB4,0x58,0xA3,0xB4,0x58,0xA4,0xB5,0x57,0xA5,0xB6,0x58,0xA6,0xB6,0x58,0xA7,0xB7,0x58,0xA8,0xB7,0x59,0xA9,0xB8,0x58,0xAA,0xB9,0x5A,0xAB,0xB9,0x59,0xAC,0xBA,0x5A,0xAD,0xBA,0x5A,0xAE,0xBB,0x5A,0xAF,0xBB,0x5A,0xB0,0xBC,0x5B,0xB0,0xBC,0x5A,0xB1,0xBD,0x5B,0xB2,0xBD,0x5B,0xB3,0xBD,0x5B,0xB4,0xBE,0x5C,0xB5,0xBE,0x5B,0xB5,0xBE,0x5B,0xB7,0xBF,0x5C,0xB7,0xBF,0x5C,0xB8,0xBF,0x5C,0xB9,0xC0,0x5C,0xB9,0xC0,0x5C,0xBA,0xC0,0x5C,0xBA,0xC1,0x5D,0xBB,0xC2,0x5D,0xBC,0xC2,0x5D,0xBC,0xC2,0x5D,0xBD,0xC2,0x5E,0xBE,0xC3,0x5E,0xBE,0xC3,0x5E,0xBF,0xC3,0x5E,0xC0,0xC3,0x5E,0xC0,0xC4,0x5E,0xC1,0xC4,}; //200 Pixels diff --git a/data/images.cpp b/data/images.cpp index 6c4b511b5..7c63665cc 100644 --- a/data/images.cpp +++ b/data/images.cpp @@ -1,3 +1,5 @@ +#include "images.h" + /** * Powder Toy - Images * diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 000000000..433f0ed8d --- /dev/null +++ b/data/meson.build @@ -0,0 +1,10 @@ +data_files = files( + 'font.cpp', + 'hmap.cpp', + 'icon.cpp', + 'images.cpp', +) + +powder_files += data_files +render_files += data_files +font_files += data_files diff --git a/meson.build b/meson.build new file mode 100644 index 000000000..c0fafa1a8 --- /dev/null +++ b/meson.build @@ -0,0 +1,317 @@ +project('the-powder-toy', [ 'c', 'cpp' ], version: 'the.cake.is.a.lie', default_options: [ + 'cpp_std=c++11', + 'b_vscrt=md', + 'backend_startup_project=powder', +]) + +cpp_compiler = meson.get_compiler('cpp') + +project_c_args = [] +project_cpp_args = [] +project_link_args = [] + +conf_data = configuration_data() +conf_data.set('CURL_STATICLIB', false) +conf_data.set('ZLIB_WINAPI', false) + +copt_x86 = host_machine.cpu_family() in [ 'x86_64', 'x86' ] +copt_64bit = host_machine.cpu_family() in [ 'x86_64', 'aarch64' ] +copt_msvc = cpp_compiler.get_id() in [ 'msvc' ] + +if host_machine.system() in [ 'linux', 'freebsd' ] + copt_platform = 'linux' +elif host_machine.system() in [ 'windows' ] + copt_platform = 'windows' +elif host_machine.system() in [ 'darwin' ] + copt_platform = 'macosx' +else + error('unsupported platform: ' + host_machine.system()) +endif + +if copt_platform == 'linux' and not copt_64bit + error('lin32 is not supported') +endif +if copt_platform == 'windows' and not copt_64bit + error('win32 is not supported') +endif +if copt_platform == 'macosx' and not copt_64bit + error('mac32 is not even a thing') +endif + +if get_option('ogli') or get_option('oglr') + error('OpenGL features are currently unavailable') +endif + +uopt_static = get_option('static') +use_tpt_libs = false +if uopt_static == 'system' + if copt_platform == 'windows' + error('no way to find static system libraries on windows') + endif +elif uopt_static == 'prebuilt' + if copt_platform == 'windows' + use_tpt_libs = true + tpt_libs = subproject('tpt-libs-prebuilt-win64-static') + elif copt_platform == 'linux' + use_tpt_libs = true + tpt_libs = subproject('tpt-libs-prebuilt-lin64-static') + elif copt_platform == 'macosx' + use_tpt_libs = true + tpt_libs = subproject('tpt-libs-prebuilt-mac64-static') + endif +else + if copt_platform == 'windows' + use_tpt_libs = true + tpt_libs = subproject('tpt-libs-prebuilt-win64-dynamic') + endif +endif + +uopt_native = get_option('native') +uopt_x86_sse = get_option('x86_sse') +if uopt_x86_sse == 'auto' + uopt_x86_sse_level = 20 +elif uopt_x86_sse == 'sse3' + uopt_x86_sse_level = 30 +elif uopt_x86_sse == 'sse2' + uopt_x86_sse_level = 20 +elif uopt_x86_sse == 'sse' + uopt_x86_sse_level = 10 +elif uopt_x86_sse == 'none' + uopt_x86_sse_level = 0 +endif +if not copt_x86 or uopt_native + uopt_x86_sse_level = 0 +endif + +uopt_lua = get_option('lua') +if uopt_lua == 'luajit' + lua_opt_dep = [ use_tpt_libs ? tpt_libs.get_variable('luajit_dep') : dependency('luajit', static: uopt_static == 'system') ] +elif uopt_lua == 'lua5.2' + lua_opt_dep = [ use_tpt_libs ? tpt_libs.get_variable('lua52_dep') : dependency('lua5.2', static: uopt_static == 'system') ] +elif uopt_lua == 'lua5.1' + lua_opt_dep = [ use_tpt_libs ? tpt_libs.get_variable('lua51_dep') : dependency('lua5.1', static: uopt_static == 'system') ] +else + lua_opt_dep = [] +endif + +uopt_http = get_option('http') +if uopt_http + curl_opt_dep = [ use_tpt_libs ? tpt_libs.get_variable('libcurl_dep') : dependency('libcurl', static: uopt_static == 'system') ] +else + curl_opt_dep = [] +endif + +uopt_fftw = get_option('gravfft') +if uopt_fftw + fftw_opt_dep = [ use_tpt_libs ? tpt_libs.get_variable('fftw_dep') : dependency('fftw3f', static: uopt_static == 'system') ] +else + fftw_opt_dep = [] +endif + +threads_dep = dependency('threads') +zlib_dep = use_tpt_libs ? tpt_libs.get_variable('zlib_dep') : dependency('zlib', static: uopt_static == 'system') +sdl2_dep = use_tpt_libs ? tpt_libs.get_variable('sdl2_dep') : dependency('sdl2', static: uopt_static == 'system') +bzip2_dep = subproject('tpt-bzip2').get_variable('bzip2_dep') + +if copt_msvc + if uopt_x86_sse_level >= 30 + message('SSE3 configured to be enabled but unavailable in msvc') + uopt_x86_sse_level = 20 + endif + if uopt_native + message('local machine optimization configured to be enabled but unavailable in msvc') + uopt_native = false + endif + if copt_64bit + message('SSE explicitly configured but unavailable in msvc targeting 64-bit machines') + else + args_msvc_sse = [] + if uopt_x86_sse_level >= 20 + args_msvc_sse += '/arch:SSE2' + elif uopt_x86_sse_level >= 10 + args_msvc_sse += '/arch:SSE' + endif + project_c_args += args_msvc_sse + project_cpp_args += args_msvc_sse + endif + args_msvc = [ '/GS', '-D_SCL_SECURE_NO_WARNINGS' ] + project_c_args += args_msvc + project_cpp_args += args_msvc + project_link_args += [ + '/OPT:REF', + '/OPT:ICF', + ] + if not get_option('debug') + args_msvc_opt = [ '/Oy-', '/fp:fast' ] + project_c_args += args_msvc_opt + project_cpp_args += args_msvc_opt + endif +else + if copt_platform == 'macosx' + if uopt_x86_sse_level >= 0 + message('SSE level explicitly configured but unavailable on macosx') + uopt_x86_sse_level = 0 + endif + if uopt_native + message('local machine optimization configured to be enabled but unavailable on macosx') + uopt_native = false + endif + else + args_ccomp_sse = [] + if uopt_x86_sse_level >= 30 + args_ccomp_sse += '-msse3' + endif + if uopt_x86_sse_level >= 20 + args_ccomp_sse += '-msse2' + endif + if uopt_x86_sse_level >= 10 + args_ccomp_sse += '-msse' + endif + if uopt_native + args_ccomp_sse += '-march=native' + endif + project_c_args += args_ccomp_sse + project_cpp_args += args_ccomp_sse + endif + project_c_args += [ '-U__STRICT_ANSI__', '-Wno-unused-result' ] + project_cpp_args += [ '-U__STRICT_ANSI__', '-Wno-unused-result', '-Wno-invalid-offsetof' ] + if not get_option('debug') + args_ccomp = [ '-ftree-vectorize', '-funsafe-math-optimizations', '-ffast-math', '-fomit-frame-pointer' ] + project_c_args += args_ccomp + project_cpp_args += args_ccomp + endif +endif + +if copt_platform == 'windows' + other_dep = tpt_libs.get_variable('other_dep') + sdl2main_dep = tpt_libs.get_variable('sdl2main_dep') + project_c_args += [ '-D_WIN32_WINNT=0x0501' ] + project_cpp_args += [ '-D_WIN32_WINNT=0x0501' ] + windows_mod = import('windows') + if uopt_static != 'none' + conf_data.set('CURL_STATICLIB', true) + conf_data.set('ZLIB_WINAPI', true) + else + foreach input_and_output : tpt_libs.get_variable('config_dlls') + configure_file(input: input_and_output[0], output: input_and_output[1], copy: true) + endforeach + endif +endif + +if copt_platform == 'macosx' and uopt_lua == 'luajit' + project_link_args += [ '-pagezero_size', '10000', '-image_base', '100000000' ] +endif + +project_inc = include_directories([ 'src', 'data', 'resources' ]) + +conf_data.set('LIN', copt_platform == 'linux') +conf_data.set('WIN', copt_platform == 'windows') +conf_data.set('MACOSX', copt_platform == 'macosx') +conf_data.set('X86', copt_x86) +conf_data.set('X86_SSE3', uopt_x86_sse_level >= 30) +conf_data.set('X86_SSE2', uopt_x86_sse_level >= 20) +conf_data.set('X86_SSE', uopt_x86_sse_level >= 10) +conf_data.set('NATIVE', uopt_native) +conf_data.set('_64BIT', copt_64bit) +conf_data.set('OGLI', get_option('ogli')) +conf_data.set('OGLR', get_option('oglr')) +conf_data.set('PIX32OGL', get_option('ogli')) +conf_data.set('BETA', get_option('beta')) +conf_data.set('NO_INSTALL_CHECK', not get_option('install_check')) +conf_data.set('IGNORE_UPDATES', get_option('ignore_updates')) +conf_data.set('SAVE_VERSION', get_option('version_major')) +conf_data.set('MINOR_VERSION', get_option('version_minor')) +conf_data.set('BUILD_NUM', get_option('version_build')) +conf_data.set('MOD_ID', get_option('mod_id')) +conf_data.set('DEBUG', get_option('debug')) +conf_data.set('SNAPSHOT', get_option('snapshot')) +conf_data.set('SNAPSHOT_ID', get_option('snapshot_id')) +conf_data.set('FUTURE_SAVE_VERSION', get_option('future_major')) +conf_data.set('FUTURE_MINOR_VERSION', get_option('future_minor')) + +resources_files = [] + +subdir('src') +subdir('data') +subdir('resources') + +if get_option('build_powder') + powder_args = [] + if uopt_lua != 'none' + powder_args += '-DLUACONSOLE' + endif + if not uopt_http + powder_args += '-DNOHTTP' + endif + if uopt_fftw + powder_args += '-DGRAVFFT' + endif + powder_deps = [ + threads_dep, + zlib_dep, + sdl2_dep, + bzip2_dep, + lua_opt_dep, + curl_opt_dep, + fftw_opt_dep, + ] + if copt_platform == 'windows' + powder_deps += other_dep + powder_deps += sdl2main_dep + endif + executable( + 'powder', + sources: powder_files, + include_directories: project_inc, + c_args: project_c_args + powder_args, + cpp_args: project_cpp_args + powder_args, + cpp_pch: 'pch/pch_cpp.h', + gui_app: true, + link_args: project_link_args, + dependencies: powder_deps, + ) +endif + +if get_option('build_render') + render_args = [ '-DRENDERER', '-DNOHTTP' ] + render_deps = [ + threads_dep, + zlib_dep, + bzip2_dep, + ] + executable( + 'render', + sources: render_files, + include_directories: project_inc, + c_args: project_c_args + render_args, + cpp_args: project_cpp_args + render_args, + cpp_pch: 'pch/pch_cpp.h', + link_args: project_link_args, + dependencies: render_deps, + ) +endif + +if get_option('build_font') + font_args = [ '-DFONTEDITOR', '-DNOHTTP' ] + font_deps = [ + threads_dep, + zlib_dep, + sdl2_dep, + bzip2_dep, + ] + if copt_platform == 'windows' + font_deps += other_dep + font_deps += sdl2main_dep + endif + executable( + 'font', + sources: font_files, + include_directories: project_inc, + c_args: project_c_args + font_args, + cpp_args: project_cpp_args + font_args, + cpp_pch: 'pch/pch_cpp.h', + gui_app: true, + link_args: project_link_args, + dependencies: font_deps, + ) +endif diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 000000000..286bf62ae --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,149 @@ +option( + 'static', + type: 'combo', + choices: [ 'none', 'system', 'prebuilt' ], + value: 'none', + description: 'Build statically using libraries present on the system (\'system\') or using prebuilt libraries official builds use (\'prebuilt\')' +) +option( + 'beta', + type: 'boolean', + value: false, + description: 'Beta build' +) +option( + 'ignore_updates', + type: 'boolean', + value: true, + description: 'Don\'t show notifications about available updates' +) +option( + 'install_check', + type: 'boolean', + value: false, + description: 'Do install check on startup' +) +option( + 'http', + type: 'boolean', + value: true, + description: 'Enable HTTP via libcurl' +) +option( + 'gravfft', + type: 'boolean', + value: true, + description: 'Enable FFT gravity via libfftw3' +) +option( + 'snapshot', + type: 'boolean', + value: false, + description: 'Snapshot build' +) +option( + 'version_major', + type: 'integer', + min: 0, + value: 95, + description: 'Major version' +) +option( + 'version_minor', + type: 'integer', + min: 0, + value: 0, + description: 'Minor version' +) +option( + 'version_build', + type: 'integer', + min: 0, + value: 345, + description: 'Build number' +) +option( + 'snapshot_id', + type: 'integer', + min: 0, + value: 199, + description: 'Snapshot ID, only relevant if \'snapshot\' is true' +) +option( + 'future_major', + type: 'integer', + min: 0, + value: 95, + description: 'Future major version, used for debugging and in snapshots, only relevant if at least one of \'debug\' and \'snapshot\' is true' +) +option( + 'future_minor', + type: 'integer', + min: 0, + value: 0, + description: 'Future minor version, similar to \'future_major\'' +) +option( + 'mod_id', + type: 'integer', + min: 0, + value: 0, + description: 'Mod ID, used on the https://starcatcher.us/TPT build server, the build server will compile for all platforms for you and send updates in-game, see jacob1 to get a mod ID' +) +option( + 'lua', + type: 'combo', + choices: [ 'none', 'lua5.1', 'lua5.2', 'luajit' ], + value: 'luajit', + description: 'Lua library to use' +) +option( + 'ssl', + type: 'combo', + choices: [ 'openssl' ], + value: 'openssl', + description: 'SSL library to use' +) +option( + 'x86_sse', + type: 'combo', + choices: [ 'none', 'sse', 'sse2', 'sse3', 'auto' ], + value: 'auto', + description: 'Enable SSE (available only on x86)' +) +option( + 'native', + type: 'boolean', + value: false, + description: 'Build with optimizations specific to the local machine, may not run on other machines, overrides \'x86_sse\'' +) +option( + 'ogli', + type: 'boolean', + value: false, + description: 'Enable OpenGL interface rendering (currently defunct)' +) +option( + 'oglr', + type: 'boolean', + value: false, + description: 'Enable OpenGL particle rendering (currently defunct)' +) +option( + 'build_powder', + type: 'boolean', + value: true, + description: 'Build the game' +) +option( + 'build_render', + type: 'boolean', + value: false, + description: 'Build the thumbnail renderer' +) +option( + 'build_font', + type: 'boolean', + value: false, + description: 'Build the font editor' +) diff --git a/pch/pch_cpp.h b/pch/pch_cpp.h new file mode 100644 index 000000000..3b11153a2 --- /dev/null +++ b/pch/pch_cpp.h @@ -0,0 +1,95 @@ +#include "Config.h" + +#include "common/Format.h" +#include "common/Singleton.h" +#include "common/String.h" +#include "common/tpt-compat.h" +#include "common/tpt-inline.h" +#include "common/tpt-minmax.h" +#include "common/tpt-rand.h" +#include "common/tpt-rand.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WIN +# include +# include +# include +# include +# include +# include +# include +#endif + +#ifdef WIN +# include +# include +# include +# include +#endif + +#include +#include +#include +#include +#include +#include + +#if !defined(FONTEDITOR) && !defined(RENDERER) +# include "lua/LuaCompat.h" +#endif +#include "SDLCompat.h" diff --git a/resources/meson.build b/resources/meson.build new file mode 100644 index 000000000..e8708890f --- /dev/null +++ b/resources/meson.build @@ -0,0 +1,11 @@ +resources_files += files( + 'icon.ico', + 'document.ico', +) + +if copt_platform == 'windows' + powder_files += windows_mod.compile_resources( + 'powder-res.rc', + depend_files: resources_files, + ) +endif diff --git a/src/Activity.h b/src/Activity.h index 563314ae6..d11418c59 100644 --- a/src/Activity.h +++ b/src/Activity.h @@ -1,4 +1,5 @@ #pragma once +#include "Config.h" #include "gui/interface/Window.h" diff --git a/src/Config.h b/src/Config.template.h similarity index 74% rename from src/Config.h rename to src/Config.template.h index 08dc241bd..43d4e5044 100644 --- a/src/Config.h +++ b/src/Config.template.h @@ -1,47 +1,50 @@ #ifndef CONFIG_H #define CONFIG_H +#mesondefine CURL_STATICLIB +#mesondefine ZLIB_WINAPI + +#mesondefine BETA +#mesondefine DEBUG +#mesondefine IGNORE_UPDATES +#mesondefine LIN +#mesondefine NATIVE +#mesondefine NO_INSTALL_CHECK +#mesondefine OGLI +#mesondefine OGLR +#mesondefine PIX32OGL +#mesondefine SNAPSHOT +#mesondefine WIN +#mesondefine MACOSX +#mesondefine X86 +#mesondefine X86_SSE +#mesondefine X86_SSE2 +#mesondefine X86_SSE3 +#mesondefine _64BIT #ifdef WIN -#define PATH_SEP "\\" -#define PATH_SEP_CHAR '\\' +# define PATH_SEP "\\" +# define PATH_SEP_CHAR '\\' #else -#define PATH_SEP "/" -#define PATH_SEP_CHAR '/' +# define PATH_SEP "/" +# define PATH_SEP_CHAR '/' #endif //VersionInfoStart -#ifndef SAVE_VERSION -#define SAVE_VERSION 95 -#endif +#mesondefine SAVE_VERSION +#mesondefine MINOR_VERSION +#mesondefine BUILD_NUM +#mesondefine SNAPSHOT_ID +#mesondefine MOD_ID +#mesondefine FUTURE_SAVE_VERSION +#mesondefine FUTURE_MINOR_VERSION -#ifndef MINOR_VERSION -#define MINOR_VERSION 0 -#endif - -#ifndef BUILD_NUM -#define BUILD_NUM 345 -#endif - -#ifndef SNAPSHOT_ID -#define SNAPSHOT_ID 0 -#endif - -// Mod ID, used on the https://starcatcher.us/TPT build server -// The build server will compile for all platforms for you, and send updates in game -// See jacob1 to get a mod ID -#ifndef MOD_ID -#define MOD_ID 0 -#endif - -#if defined(SNAPSHOT) || defined(BETA) || defined(DEBUG) || MOD_ID > 0 -#define FUTURE_SAVE_VERSION 96 -#define FUTURE_MINOR_VERSION 0 +#if !(defined(SNAPSHOT) || defined(BETA) || defined(DEBUG) || MOD_ID > 0) +#undef FUTURE_SAVE_VERSION +#undef FUTURE_MINOR_VERSION #endif //VersionInfoEnd -//#define IGNORE_UPDATES //uncomment this for mods, to not get any update notifications - #if !(defined(MACOSX) && defined(DEBUG)) #define HIGH_QUALITY_RESAMPLE //High quality image resampling, slower but much higher quality than my terribad linear interpolation #endif @@ -118,8 +121,6 @@ #define WINDOWW (XRES+BARSIZE) #define WINDOWH (YRES+MENUSIZE) -#define MAX_DISTANCE sqrt(pow((float)XRES, 2)+pow((float)YRES, 2)) - #define GRAV_DIFF #define MAXSIGNS 16 diff --git a/src/Controller.h b/src/Controller.h index 626e476cf..aae55b612 100644 --- a/src/Controller.h +++ b/src/Controller.h @@ -7,6 +7,7 @@ private: virtual void Exit(); virtual void Show(); virtual void Hide(); + virtual ~Controller() = default; }; #endif /* CONTROLLER_H_ */ diff --git a/src/Format.h b/src/Format.h index 33d7ffa75..f2f0dcadc 100644 --- a/src/Format.h +++ b/src/Format.h @@ -1,4 +1,5 @@ #pragma once +#include "Config.h" #include "common/String.h" #include diff --git a/src/Misc.h b/src/Misc.h index adb40cddb..48348b07d 100644 --- a/src/Misc.h +++ b/src/Misc.h @@ -1,5 +1,6 @@ #ifndef UTILS_H #define UTILS_H +#include "Config.h" #include #include #include diff --git a/src/Platform.h b/src/Platform.h index 9a2ad8ab5..76dfbfb29 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -1,5 +1,6 @@ #ifndef PLATFORM_H #define PLATFORM_H +#include "Config.h" #include "common/String.h" diff --git a/src/PowderToyFontEditor.cpp b/src/PowderToyFontEditor.cpp new file mode 100644 index 000000000..56aff650b --- /dev/null +++ b/src/PowderToyFontEditor.cpp @@ -0,0 +1,475 @@ +#include "Config.h" +#include +#include +#ifdef WIN +#include +#endif +#include "SDLCompat.h" + +#ifdef X86_SSE +#include +#endif +#ifdef X86_SSE3 +#include +#endif + +#include +#if defined(LIN) +#include "icon.h" +#endif +#include + +#ifndef WIN +#include +#endif +#ifdef MACOSX +# include "common/macosx.h" +#endif + +#include "Format.h" +#include "Misc.h" + +#include "graphics/Graphics.h" + +#include "client/SaveInfo.h" +#include "client/GameSave.h" +#include "client/SaveFile.h" +#include "client/Client.h" + +#include "gui/game/GameController.h" +#include "gui/game/GameView.h" +#include "gui/font/FontEditor.h" +#include "gui/dialogues/ErrorMessage.h" +#include "gui/dialogues/ConfirmPrompt.h" +#include "gui/interface/Keys.h" +#include "gui/Style.h" +#include "gui/interface/Engine.h" + +#define INCLUDE_SYSWM +#include "SDLCompat.h" + +int desktopWidth = 1280, desktopHeight = 1024; + +SDL_Window * sdl_window; +SDL_Renderer * sdl_renderer; +SDL_Texture * sdl_texture; +int scale = 1; +bool fullscreen = false; +bool altFullscreen = false; +bool forceIntegerScaling = true; +bool resizable = false; + + +void ClipboardPush(ByteString text) +{ + SDL_SetClipboardText(text.c_str()); +} + +ByteString ClipboardPull() +{ + return ByteString(SDL_GetClipboardText()); +} + +int GetModifiers() +{ + return SDL_GetModState(); +} + +void CalculateMousePosition(int *x, int *y) +{ + int globalMx, globalMy; + SDL_GetGlobalMouseState(&globalMx, &globalMy); + int windowX, windowY; + SDL_GetWindowPosition(sdl_window, &windowX, &windowY); + + if (x) + *x = (globalMx - windowX) / scale; + if (y) + *y = (globalMy - windowY) / scale; +} + +#ifdef OGLI +void blit() +{ + SDL_GL_SwapBuffers(); +} +#else +void blit(pixel * vid) +{ + SDL_UpdateTexture(sdl_texture, NULL, vid, WINDOWW * sizeof (Uint32)); + // need to clear the renderer if there are black edges (fullscreen, or resizable window) + if (fullscreen || resizable) + SDL_RenderClear(sdl_renderer); + SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); + SDL_RenderPresent(sdl_renderer); +} +#endif + +void RecreateWindow(); +int SDLOpen() +{ + if (SDL_Init(SDL_INIT_VIDEO) < 0) + { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + return 1; + } + + RecreateWindow(); + + int displayIndex = SDL_GetWindowDisplayIndex(sdl_window); + if (displayIndex >= 0) + { + SDL_Rect rect; + if (!SDL_GetDisplayUsableBounds(displayIndex, &rect)) + { + desktopWidth = rect.w; + desktopHeight = rect.h; + } + } + +#ifdef WIN + SDL_SysWMinfo SysInfo; + SDL_VERSION(&SysInfo.version); + if(SDL_GetWindowWMInfo(sdl_window, &SysInfo) <= 0) + { + printf("%s : %p\n", SDL_GetError(), SysInfo.info.win.window); + exit(-1); + } + HWND WindowHandle = SysInfo.info.win.window; + + // Use GetModuleHandle to get the Exe HMODULE/HINSTANCE + HMODULE hModExe = GetModuleHandle(NULL); + HICON hIconSmall = (HICON)LoadImage(hModExe, MAKEINTRESOURCE(101), IMAGE_ICON, 16, 16, LR_SHARED); + HICON hIconBig = (HICON)LoadImage(hModExe, MAKEINTRESOURCE(101), IMAGE_ICON, 32, 32, LR_SHARED); + SendMessage(WindowHandle, WM_SETICON, ICON_SMALL, (LPARAM)hIconSmall); + SendMessage(WindowHandle, WM_SETICON, ICON_BIG, (LPARAM)hIconBig); +#endif +#ifdef LIN + SDL_Surface *icon = SDL_CreateRGBSurfaceFrom((void*)app_icon, 128, 128, 32, 512, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); + SDL_SetWindowIcon(sdl_window, icon); + SDL_FreeSurface(icon); +#endif + + return 0; +} + +void SDLSetScreen(int scale_, bool resizable_, bool fullscreen_, bool altFullscreen_, bool forceIntegerScaling_) +{ +// bool changingScale = scale != scale_; + bool changingFullscreen = fullscreen_ != fullscreen || (altFullscreen_ != altFullscreen && fullscreen); + bool changingResizable = resizable != resizable_; + scale = scale_; + fullscreen = fullscreen_; + altFullscreen = altFullscreen_; + resizable = resizable_; + forceIntegerScaling = forceIntegerScaling_; + // Recreate the window when toggling fullscreen, due to occasional issues + // Also recreate it when enabling resizable windows, to fix bugs on windows, + // see https://github.com/jacob1/The-Powder-Toy/issues/24 + if (changingFullscreen || (changingResizable && resizable && !fullscreen)) + { + RecreateWindow(); + return; + } + if (changingResizable) + SDL_RestoreWindow(sdl_window); + + SDL_SetWindowSize(sdl_window, WINDOWW * scale, WINDOWH * scale); + SDL_RenderSetIntegerScale(sdl_renderer, forceIntegerScaling && fullscreen ? SDL_TRUE : SDL_FALSE); + unsigned int flags = 0; + if (fullscreen) + flags = altFullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_FULLSCREEN_DESKTOP; + SDL_SetWindowFullscreen(sdl_window, flags); + if (fullscreen) + SDL_RaiseWindow(sdl_window); + SDL_SetWindowResizable(sdl_window, resizable ? SDL_TRUE : SDL_FALSE); +} + +void RecreateWindow() +{ + unsigned int flags = 0; + if (fullscreen) + flags = altFullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_FULLSCREEN_DESKTOP; + if (resizable && !fullscreen) + flags |= SDL_WINDOW_RESIZABLE; + + if (sdl_texture) + SDL_DestroyTexture(sdl_texture); + if (sdl_renderer) + SDL_DestroyRenderer(sdl_renderer); + if (sdl_window) + { + SDL_DestroyWindow(sdl_window); + } + + sdl_window = SDL_CreateWindow("The Powder Toy", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOWW * scale, WINDOWH * scale, + flags); + sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); + SDL_RenderSetLogicalSize(sdl_renderer, WINDOWW, WINDOWH); + if (forceIntegerScaling && fullscreen) + SDL_RenderSetIntegerScale(sdl_renderer, SDL_TRUE); + sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, WINDOWW, WINDOWH); + SDL_RaiseWindow(sdl_window); + //Uncomment this to enable resizing + //SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); + //SDL_SetWindowResizable(sdl_window, SDL_TRUE); +} + +unsigned int GetTicks() +{ + return SDL_GetTicks(); +} + +int elapsedTime = 0, currentTime = 0, lastTime = 0, currentFrame = 0; +unsigned int lastTick = 0; +unsigned int lastFpsUpdate = 0; +float fps = 0; +ui::Engine * engine = NULL; +bool showDoubleScreenDialog = false; +float currentWidth, currentHeight; + +int mousex = 0, mousey = 0; +int mouseButton = 0; +bool mouseDown = false; + +bool calculatedInitialMouse = false, delay = false; +bool hasMouseMoved = false; + +void EventProcess(SDL_Event event) +{ + switch (event.type) + { + case SDL_QUIT: + if (engine->GetFastQuit() || engine->CloseWindow()) + engine->Exit(); + break; + case SDL_KEYDOWN: + if (!event.key.repeat && event.key.keysym.sym == 'q' && (event.key.keysym.mod&KMOD_CTRL)) + engine->ConfirmExit(); + else + engine->onKeyPress(event.key.keysym.sym, event.key.keysym.scancode, event.key.repeat, event.key.keysym.mod&KMOD_SHIFT, event.key.keysym.mod&KMOD_CTRL, event.key.keysym.mod&KMOD_ALT); + break; + case SDL_KEYUP: + engine->onKeyRelease(event.key.keysym.sym, event.key.keysym.scancode, event.key.repeat, event.key.keysym.mod&KMOD_SHIFT, event.key.keysym.mod&KMOD_CTRL, event.key.keysym.mod&KMOD_ALT); + break; + case SDL_TEXTINPUT: + engine->onTextInput(ByteString(event.text.text).FromUtf8()); + break; + case SDL_MOUSEWHEEL: + { + int x = event.wheel.x; + int y = event.wheel.y; + if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) + { + x *= -1; + y *= -1; + } + + engine->onMouseWheel(mousex, mousey, y); // TODO: pass x? + break; + } + case SDL_MOUSEMOTION: + mousex = event.motion.x; + mousey = event.motion.y; + engine->onMouseMove(mousex, mousey); + + hasMouseMoved = true; + break; + case SDL_DROPFILE: + engine->onFileDrop(event.drop.file); + SDL_free(event.drop.file); + break; + case SDL_MOUSEBUTTONDOWN: + // if mouse hasn't moved yet, sdl will send 0,0. We don't want that + if (hasMouseMoved) + { + mousex = event.motion.x; + mousey = event.motion.y; + } + mouseButton = event.button.button; + engine->onMouseClick(event.motion.x, event.motion.y, mouseButton); + + mouseDown = true; +#if !defined(NDEBUG) && !defined(DEBUG) + SDL_CaptureMouse(SDL_TRUE); +#endif + break; + case SDL_MOUSEBUTTONUP: + // if mouse hasn't moved yet, sdl will send 0,0. We don't want that + if (hasMouseMoved) + { + mousex = event.motion.x; + mousey = event.motion.y; + } + mouseButton = event.button.button; + engine->onMouseUnclick(mousex, mousey, mouseButton); + + mouseDown = false; +#if !defined(NDEBUG) && !defined(DEBUG) + SDL_CaptureMouse(SDL_FALSE); +#endif + break; + case SDL_WINDOWEVENT: + { + switch (event.window.event) + { + case SDL_WINDOWEVENT_SHOWN: + if (!calculatedInitialMouse) + { + //initial mouse coords, sdl won't tell us this if mouse hasn't moved + CalculateMousePosition(&mousex, &mousey); + engine->onMouseMove(mousex, mousey); + calculatedInitialMouse = true; + } + break; + // This event would be needed in certain glitchy cases of window resizing + // But for all currently tested cases, it isn't needed + /*case SDL_WINDOWEVENT_RESIZED: + { + float width = event.window.data1; + float height = event.window.data2; + + currentWidth = width; + currentHeight = height; + // this "* scale" thing doesn't really work properly + // currently there is a bug where input doesn't scale properly after resizing, only when double scale mode is active + inputScaleH = (float)WINDOWW * scale / currentWidth; + inputScaleV = (float)WINDOWH * scale / currentHeight; + std::cout << "Changing input scale to " << inputScaleH << "x" << inputScaleV << std::endl; + break; + }*/ + // This would send a mouse up event when focus is lost + // Not even sdl itself will know when the mouse was released if it happens in another window + // So it will ignore the next mouse down (after tpt is re-focused) and not send any events at all + // This is more unintuitive than pretending the mouse is still down when it's not, so this code is commented out + /*case SDL_WINDOWEVENT_FOCUS_LOST: + if (mouseDown) + { + mouseDown = false; + engine->onMouseUnclick(mousex, mousey, mouseButton); + } + break;*/ + } + break; + } + } +} + +void EngineProcess() +{ + double frameTimeAvg = 0.0f, correctedFrameTimeAvg = 0.0f; + SDL_Event event; + while(engine->Running()) + { + int frameStart = SDL_GetTicks(); + if(engine->Broken()) { engine->UnBreak(); break; } + event.type = 0; + while (SDL_PollEvent(&event)) + { + EventProcess(event); + event.type = 0; //Clear last event + } + if(engine->Broken()) { engine->UnBreak(); break; } + + engine->Tick(); + engine->Draw(); + + if (scale != engine->Scale || fullscreen != engine->Fullscreen || + altFullscreen != engine->GetAltFullscreen() || + forceIntegerScaling != engine->GetForceIntegerScaling() || resizable != engine->GetResizable()) + { + SDLSetScreen(engine->Scale, engine->GetResizable(), engine->Fullscreen, engine->GetAltFullscreen(), + engine->GetForceIntegerScaling()); + } + +#ifdef OGLI + blit(); +#else + blit(engine->g->vid); +#endif + + int frameTime = SDL_GetTicks() - frameStart; + frameTimeAvg = frameTimeAvg * 0.8 + frameTime * 0.2; + int fpsLimit = ui::Engine::Ref().FpsLimit; + if(fpsLimit > 2) + { + double offset = 1000.0 / fpsLimit - frameTimeAvg; + if(offset > 0) + SDL_Delay(offset + 0.5); + } + int correctedFrameTime = SDL_GetTicks() - frameStart; + correctedFrameTimeAvg = correctedFrameTimeAvg * 0.95 + correctedFrameTime * 0.05; + if (frameStart - lastFpsUpdate > 200) + { + engine->SetFps(1000.0 / correctedFrameTimeAvg); + lastFpsUpdate = frameStart; + } + if (frameStart - lastTick > 100) + { + lastTick = frameStart; + } + if (showDoubleScreenDialog) + { + showDoubleScreenDialog = false; + } + } +#ifdef DEBUG + std::cout << "Breaking out of EngineProcess" << std::endl; +#endif +} + +int main(int argc, char * argv[]) +{ + currentWidth = WINDOWW; + currentHeight = WINDOWH; + + scale = 1; + if (argc >= 3) + { + std::istringstream ss(argv[2]); + int buf; + if (ss >> buf) + { + scale = buf; + } + } + resizable = false; + fullscreen = false; + altFullscreen = false; + forceIntegerScaling = true; + + // TODO: maybe bind the maximum allowed scale to screen size somehow + if(scale < 1 || scale > 10) + scale = 1; + + SDLOpen(); + + ui::Engine::Ref().g = new Graphics(); + ui::Engine::Ref().Scale = scale; + ui::Engine::Ref().SetResizable(resizable); + ui::Engine::Ref().Fullscreen = fullscreen; + ui::Engine::Ref().SetAltFullscreen(altFullscreen); + ui::Engine::Ref().SetForceIntegerScaling(forceIntegerScaling); + + engine = &ui::Engine::Ref(); + engine->SetMaxSize(desktopWidth, desktopHeight); + engine->Begin(WINDOWW, WINDOWH); + engine->SetFastQuit(true); + + GameController * gameController = NULL; + + if (argc >= 2) + { + engine->ShowWindow(new FontEditor(argv[1])); + } + else + { + throw std::runtime_error("path to font.cpp not supplied"); + } + + EngineProcess(); + ui::Engine::Ref().CloseWindow(); + delete gameController; + delete ui::Engine::Ref().g; + return 0; +} diff --git a/src/PowderToyRenderer.cpp b/src/PowderToyRenderer.cpp index e5714ea40..fc1a0a653 100644 --- a/src/PowderToyRenderer.cpp +++ b/src/PowderToyRenderer.cpp @@ -1,5 +1,4 @@ -#if defined(RENDERER) - +#include "Config.h" #include "graphics/Graphics.h" #include "graphics/Renderer.h" @@ -9,7 +8,6 @@ #include #include "common/String.h" -#include "Config.h" #include "Format.h" #include "gui/interface/Engine.h" @@ -56,9 +54,16 @@ void writeFile(ByteString filename, std::vector & fileData) } } +// * On windows, sdl2 (which gets included somewhere along the way) defines +// main away to some identifier which sdl2main calls. The renderer is not +// linked against sdl2main, so we get an undefined reference to main. This +// can be fixed by removing the macro. +#ifdef main +# undef main +#endif + int main(int argc, char *argv[]) { - ui::Engine * engine; ByteString outputPrefix, inputFilename; std::vector inputFile; ByteString ppmFilename, ptiFilename, ptiSmallFilename, pngFilename, pngSmallFilename; @@ -79,11 +84,6 @@ int main(int argc, char *argv[]) readFile(inputFilename, inputFile); - ui::Engine::Ref().g = new Graphics(); - - engine = &ui::Engine::Ref(); - engine->Begin(WINDOWW, WINDOWH); - GameSave * gameSave = NULL; try { @@ -97,7 +97,7 @@ int main(int argc, char *argv[]) } Simulation * sim = new Simulation(); - Renderer * ren = new Renderer(ui::Engine::Ref().g, sim); + Renderer * ren = new Renderer(new Graphics(), sim); if (gameSave) { @@ -143,5 +143,3 @@ int main(int argc, char *argv[]) writeFile(pngFilename, pngFile); writeFile(pngSmallFilename, pngSmallFile); } - -#endif diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp index 35ee793d2..997ba730e 100644 --- a/src/PowderToySDL.cpp +++ b/src/PowderToySDL.cpp @@ -1,6 +1,6 @@ -#ifndef RENDERER - +#include "Config.h" #include "common/tpt-minmax.h" + #include #include #include @@ -25,10 +25,14 @@ #include #ifndef WIN -#include +# include #endif #ifdef MACOSX -#include +# ifdef DEBUG +# undef DEBUG +# define DEBUG 1 +# endif +# include #endif #include @@ -44,7 +48,6 @@ #include "gui/game/GameController.h" #include "gui/game/GameView.h" -#include "gui/font/FontEditor.h" #include "gui/dialogues/ErrorMessage.h" #include "gui/dialogues/ConfirmPrompt.h" #include "gui/interface/Keys.h" @@ -154,7 +157,7 @@ void blit(pixel * vid) } #endif -void RecreateWindow(); +bool RecreateWindow(); void SDLOpen() { if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) @@ -163,7 +166,11 @@ void SDLOpen() exit(-1); } - RecreateWindow(); + if (!RecreateWindow()) + { + fprintf(stderr, "Creating SDL window: %s\n", SDL_GetError()); + exit(-1); + } int displayIndex = SDL_GetWindowDisplayIndex(sdl_window); if (displayIndex >= 0) @@ -240,7 +247,7 @@ void SDLSetScreen(int scale_, bool resizable_, bool fullscreen_, bool altFullscr SDL_SetWindowResizable(sdl_window, resizable ? SDL_TRUE : SDL_FALSE); } -void RecreateWindow() +bool RecreateWindow() { unsigned int flags = 0; if (fullscreen) @@ -261,6 +268,18 @@ void RecreateWindow() sdl_window = SDL_CreateWindow("The Powder Toy", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOWW * scale, WINDOWH * scale, flags); sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); + if (!sdl_renderer) + { + fprintf(stderr, "SDL_CreateRenderer failed; available renderers:\n"); + int num = SDL_GetNumRenderDrivers(); + for (int i = 0; i < num; ++i) + { + SDL_RendererInfo info; + SDL_GetRenderDriverInfo(i, &info); + fprintf(stderr, " - %s\n", info.name); + } + return false; + } SDL_RenderSetLogicalSize(sdl_renderer, WINDOWW, WINDOWH); if (forceIntegerScaling && fullscreen) SDL_RenderSetIntegerScale(sdl_renderer, SDL_TRUE); @@ -272,6 +291,8 @@ void RecreateWindow() if (!Client::Ref().IsFirstRun()) LoadWindowPosition(); + + return true; } unsigned int GetTicks() @@ -294,6 +315,7 @@ std::map readArguments(int argc, char * argv[]) arguments["open"] = ""; arguments["ddir"] = ""; arguments["ptsave"] = ""; + arguments["font"] = ""; for (int i=1; i readArguments(int argc, char * argv[]) { arguments["scale"] = argv[i]+6; } + if (!strncmp(argv[i], "font:", 5) && argv[i]+5) + { + arguments["font"] = argv[i]+5; + } else if (!strncmp(argv[i], "proxy:", 6)) { if(argv[i]+6) @@ -670,7 +696,6 @@ int main(int argc, char * argv[]) fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); return 1; } - atexit(SDL_Quit); std::map arguments = readArguments(argc, argv); @@ -835,7 +860,6 @@ int main(int argc, char * argv[]) try { #endif -#ifndef FONTEDITOR gameController = new GameController(); engine->ShowWindow(gameController->GetView()); @@ -923,28 +947,8 @@ int main(int argc, char * argv[]) } } -#else // FONTEDITOR - if(argc <= 1) - throw std::runtime_error("Usage: \n" - " Edit the font:\n" - " " + ByteString(argv[0]) + " ./data/font.cpp\n" - " Copy characters from source to target:\n" - " " + ByteString(argv[0]) + " \n"); - if(argc <= 2) - { - engine->ShowWindow(new FontEditor(argv[1])); - EngineProcess(); - SaveWindowPosition(); - } - else - { - FontEditor(argv[1], argv[2]); - } -#endif -#ifndef FONTEDITOR EngineProcess(); SaveWindowPosition(); -#endif #if !defined(DEBUG) && !defined(_DEBUG) } @@ -961,5 +965,3 @@ int main(int argc, char * argv[]) Client::Ref().Shutdown(); return 0; } - -#endif diff --git a/src/Probability.h b/src/Probability.h index ff51e1156..32b76e47a 100644 --- a/src/Probability.h +++ b/src/Probability.h @@ -15,6 +15,7 @@ #ifndef tptmath_h #define tptmath_h +#include "Config.h" // This file is used for EMP, to simulate many EMP going off at once at the end of the frame diff --git a/src/SDLCompat.h b/src/SDLCompat.h index 3ae486eac..599b265ff 100644 --- a/src/SDLCompat.h +++ b/src/SDLCompat.h @@ -1,15 +1,7 @@ -#ifdef SDL_INC +#include "Config.h" #include "SDL2/SDL.h" -#else -#include "SDL.h" -#endif - #ifdef INCLUDE_SYSWM -#if defined(WIN) -#ifdef SDL_INC -#include -#else -#include -#endif -#endif // WIN +# if defined(WIN) +# include +# endif // WIN #endif // INCLUDE_SYSWM diff --git a/src/SDLMain.h b/src/SDLMain.h deleted file mode 100644 index c56d90cbe..000000000 --- a/src/SDLMain.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser - Non-NIB-Code & other changes: Max Horn - - Feel free to customize this file to suit your needs -*/ - -#ifndef _SDLMain_h_ -#define _SDLMain_h_ - -#import - -@interface SDLMain : NSObject -@end - -#endif /* _SDLMain_h_ */ diff --git a/src/SDLMain.m b/src/SDLMain.m deleted file mode 100644 index 605d92526..000000000 --- a/src/SDLMain.m +++ /dev/null @@ -1,433 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser - Non-NIB-Code & other changes: Max Horn - - Feel free to customize this file to suit your needs -*/ - -#include "SDLCompat.h" -#include "SDLMain.h" -#include /* for MAXPATHLEN */ -#include - -/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, - but the method still is there and works. To avoid warnings, we declare - it ourselves here. */ -@interface NSApplication(SDL_Missing_Methods) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -/* Use this flag to determine whether we use SDLMain.nib or not */ -#define SDL_USE_NIB_FILE 0 - -/* Use this flag to determine whether we use CPS (docking) or not */ -#define SDL_USE_CPS 1 -#ifdef SDL_USE_CPS -/* Portions of CPS.h */ -typedef struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -} CPSProcessSerNum; - -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); - -#endif /* SDL_USE_CPS */ - -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - -static NSString *getApplicationName(void) -{ - const NSDictionary *dict; - NSString *appName = 0; - - /* Determine the application name */ - dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); - if (dict) - appName = [dict objectForKey: @"CFBundleName"]; - - if (![appName length]) - appName = [[NSProcessInfo processInfo] processName]; - - return appName; -} - -#if SDL_USE_NIB_FILE -/* A helper category for NSString */ -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@end -#endif - -@interface NSApplication (SDLApplication) -@end - -@implementation NSApplication (SDLApplication) -/* Invoked from the Quit menu item */ -- (void)terminate:(id)sender -{ - /* Post a SDL_QUIT event */ - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); -} -@end - -/* The main class of the application, the application's delegate */ -@implementation SDLMain - -/* Set the working directory to Application Support */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir -{ - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); - if ([paths count] < 1) - return; - - NSString *appSupportPath = [paths objectAtIndex:0]; - BOOL isDir = NO; - NSError *error = nil; - NSString *appPath = [appSupportPath stringByAppendingPathComponent:@"The Powder Toy"]; - if (![[NSFileManager defaultManager] fileExistsAtPath:appPath isDirectory:&isDir] && isDir == NO) - { - if (![[NSFileManager defaultManager] createDirectoryAtPath:appPath withIntermediateDirectories:YES attributes:nil error:&error]) - { - NSLog(@"Could not set up working dir. Error: %@", error); - return; - } - } - chdir([appPath UTF8String]); -} - -#if SDL_USE_NIB_FILE - -/* Fix menu to contain the real app name instead of "SDL App" */ -- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName -{ - NSRange aRange; - NSEnumerator *enumerator; - NSMenuItem *menuItem; - - aRange = [[aMenu title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; - - enumerator = [[aMenu itemArray] objectEnumerator]; - while ((menuItem = [enumerator nextObject])) - { - aRange = [[menuItem title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; - if ([menuItem hasSubmenu]) - [self fixMenu:[menuItem submenu] withAppName:appName]; - } -} - -#else - -static void setApplicationMenu(void) -{ - /* warning: this code is very odd */ - NSMenu *appleMenu; - NSMenuItem *menuItem; - NSString *title; - NSString *appName; - - appName = getApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; - - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - - /* Finally give up our references to the objects */ - [appleMenu release]; - [menuItem release]; -} - -/* Create a window menu */ -static void setupWindowMenu(void) -{ - NSMenu *windowMenu; - NSMenuItem *windowMenuItem; - NSMenuItem *menuItem; - - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* "Minimize" item */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; - [windowMenu addItem:menuItem]; - [menuItem release]; - - /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [windowMenuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:windowMenuItem]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - - /* Finally give up our references to the objects */ - [windowMenu release]; - [windowMenuItem release]; -} - -/* Replacement for NSApplicationMain */ -static void CustomApplicationMain (int argc, char **argv) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; - - /* Ensure the application object is initialised */ - [NSApplication sharedApplication]; - -#ifdef SDL_USE_CPS - { - CPSProcessSerNum PSN; - /* Tell the dock about us */ - if (!CPSGetCurrentProcess(&PSN)) - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) - if (!CPSSetFrontProcess(&PSN)) - [NSApplication sharedApplication]; - } -#endif /* SDL_USE_CPS */ - - /* Set up the menubar */ - [NSApp setMainMenu:[[NSMenu alloc] init]]; - setApplicationMenu(); - setupWindowMenu(); - - /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; - - /* Start the main event loop */ - [NSApp run]; - - [sdlMain release]; - [pool release]; -} - -#endif - - -/* - * Catch document open requests...this lets us notice files when the app - * was launched by double-clicking a document, or when a document was - * dragged/dropped on the app's icon. You need to have a - * CFBundleDocumentsType section in your Info.plist to get this message, - * apparently. - * - * Files are added to gArgv, so to the app, they'll look like command line - * arguments. Previously, apps launched from the finder had nothing but - * an argv[0]. - * - * This message may be received multiple times to open several docs on launch. - * - * This message is ignored once the app's mainline has been called. - */ -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - const char *temparg; - size_t arglen; - char *arg; - char *openCommandArg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - openCommandArg = (char *) SDL_malloc(5); - if (openCommandArg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 3)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(openCommandArg, "open", 5); - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = "open"; - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; - return TRUE; -} - - -/* Called when the internal event loop has just started running */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - SInt32 versionMajor = 0, versionMinor = 0; - Gestalt(gestaltSystemVersionMajor, &versionMajor); - Gestalt(gestaltSystemVersionMinor, &versionMinor); - - /* using gFinderLaunch doesn't work in Mavericks and above, so always change it */ - if (versionMajor > 10 || versionMinor >= 9) - [self setupWorkingDirectory:TRUE]; - else - [self setupWorkingDirectory:gFinderLaunch]; - -#if SDL_USE_NIB_FILE - /* Set the main menu to contain the real app name instead of "SDL App" */ - [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; -#endif - - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main (gArgc, gArgv); - - /* We're done, thank you for playing */ - exit(status); -} -@end - - -@implementation NSString (ReplaceSubString) - -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString -{ - unsigned int bufferSize; - unsigned int selfLen = [self length]; - unsigned int aStringLen = [aString length]; - unichar *buffer; - NSRange localRange; - NSString *result; - - bufferSize = selfLen + aStringLen - aRange.length; - buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - - /* Get first part into buffer */ - localRange.location = 0; - localRange.length = aRange.location; - [self getCharacters:buffer range:localRange]; - - /* Get middle part into buffer */ - localRange.location = 0; - localRange.length = aStringLen; - [aString getCharacters:(buffer+aRange.location) range:localRange]; - - /* Get last part into buffer */ - localRange.location = aRange.location + aRange.length; - localRange.length = selfLen - localRange.location; - [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - - /* Build output string */ - result = [NSString stringWithCharacters:buffer length:bufferSize]; - - NSDeallocateMemoryPages(buffer, bufferSize); - - return result; -} - -@end - -//doesn't work on OS X 10.5 or below -char * readClipboard() -{ - NSPasteboard *clipboard = [NSPasteboard generalPasteboard]; - - NSArray *classes = [[NSArray alloc] initWithObjects:[NSString class], nil]; - NSDictionary *options = [NSDictionary dictionary]; - NSArray *clipboardItems = [clipboard readObjectsForClasses:classes options:options]; - - if(clipboardItems == nil || [clipboardItems count] == 0) return NULL; - - NSString *newString = [clipboardItems objectAtIndex:0]; - const char * clipboardData = [newString UTF8String]; - if(clipboardData == NULL) - clipboardData = ""; - - char *clipboardDataCopy = calloc([newString length]+1, 1); - SDL_strlcpy(clipboardDataCopy, clipboardData, [newString length]+1); - - return clipboardDataCopy; -} - -//doesn't work on OS X 10.5 or below -void writeClipboard(const char * clipboardData) -{ - NSPasteboard *clipboard = [NSPasteboard generalPasteboard]; - - NSString *newString = [NSString stringWithUTF8String: clipboardData]; - - [clipboard clearContents]; - [clipboard setString:newString forType:NSStringPboardType]; - -} - - -#ifdef main -# undef main -#endif - - -/* Main entry point to executable - should *not* be SDL_main! */ -int main (int argc, char **argv) -{ - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - -#if SDL_USE_NIB_FILE - NSApplicationMain (argc, argv); -#else - CustomApplicationMain (argc, argv); -#endif - return 0; -} - diff --git a/src/Update.h b/src/Update.h index fb2e6d2fd..f10fe57da 100644 --- a/src/Update.h +++ b/src/Update.h @@ -1,5 +1,6 @@ #ifndef UPDATE_H_ #define UPDATE_H_ +#include "Config.h" //char *exe_name(void); int update_start(char *data, unsigned int len); diff --git a/src/bson/BSON.cpp b/src/bson/BSON.cpp index ec4eee7dc..370cf76a0 100644 --- a/src/bson/BSON.cpp +++ b/src/bson/BSON.cpp @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "BSON.h" #include #include @@ -21,7 +22,6 @@ #include #include -#include "BSON.h" const int initialBufferSize = 128; diff --git a/src/bson/BSON.h b/src/bson/BSON.h index e6b6b1509..f275d5054 100644 --- a/src/bson/BSON.h +++ b/src/bson/BSON.h @@ -20,6 +20,7 @@ #ifndef _BSON_H_ #define _BSON_H_ +#include "Config.h" #include #include diff --git a/src/bson/meson.build b/src/bson/meson.build new file mode 100644 index 000000000..81b0bd10b --- /dev/null +++ b/src/bson/meson.build @@ -0,0 +1,3 @@ +common_files += files( + 'BSON.cpp', +) diff --git a/src/client/Client.cpp b/src/client/Client.cpp index d546d7586..771cd3bf3 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -11,8 +11,7 @@ #include #ifdef MACOSX -#include -#include +# include "common/macosx.h" #endif #ifdef WIN @@ -104,11 +103,13 @@ Client::Client(): void Client::Initialise(ByteString proxyString, bool disableNetwork) { +#if !defined(FONTEDITOR) && !defined(RENDERER) if (GetPrefBool("version.update", false)) { SetPref("version.update", false); update_finish(); } +#endif #ifndef NOHTTP if (!disableNetwork) diff --git a/src/client/Client.h b/src/client/Client.h index bce8f6670..18c60d954 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1,5 +1,6 @@ #ifndef CLIENT_H #define CLIENT_H +#include "Config.h" #include #include diff --git a/src/client/GameSave.cpp b/src/client/GameSave.cpp index 46fce50e0..f103115f1 100644 --- a/src/client/GameSave.cpp +++ b/src/client/GameSave.cpp @@ -15,6 +15,8 @@ #include "simulation/Simulation.h" #include "simulation/ElementClasses.h" +#include "common/tpt-minmax.h" + GameSave::GameSave(GameSave & save): majorVersion(save.majorVersion), waterEEnabled(save.waterEEnabled), diff --git a/src/client/GameSave.h b/src/client/GameSave.h index 45addf37a..09458a5be 100644 --- a/src/client/GameSave.h +++ b/src/client/GameSave.h @@ -1,9 +1,9 @@ #ifndef The_Powder_Toy_GameSave_h #define The_Powder_Toy_GameSave_h +#include "Config.h" #include #include "common/String.h" -#include "Config.h" #include "Misc.h" #include "bson/BSON.h" diff --git a/src/client/MD5.h b/src/client/MD5.h index a8ef123b2..05d129394 100644 --- a/src/client/MD5.h +++ b/src/client/MD5.h @@ -1,5 +1,6 @@ #ifndef MD5_H #define MD5_H +#include "Config.h" struct md5_context { diff --git a/src/client/SaveInfo.h b/src/client/SaveInfo.h index f3faac02c..9e32226da 100644 --- a/src/client/SaveInfo.h +++ b/src/client/SaveInfo.h @@ -1,5 +1,6 @@ #ifndef SAVE_H #define SAVE_H +#include "Config.h" #include #include "common/String.h" diff --git a/src/client/http/Request.h b/src/client/http/Request.h index 2a2c5bea5..1807b067d 100644 --- a/src/client/http/Request.h +++ b/src/client/http/Request.h @@ -1,5 +1,6 @@ #ifndef REQUEST_H #define REQUEST_H +#include "Config.h" #include "Config.h" #include diff --git a/src/client/http/RequestManager.h b/src/client/http/RequestManager.h index ebd814b41..5a614209f 100644 --- a/src/client/http/RequestManager.h +++ b/src/client/http/RequestManager.h @@ -1,3 +1,4 @@ +#include "Config.h" #ifndef NOHTTP #ifndef REQUESTMANAGER_H #define REQUESTMANAGER_H diff --git a/src/client/http/meson.build b/src/client/http/meson.build new file mode 100644 index 000000000..122aa7e23 --- /dev/null +++ b/src/client/http/meson.build @@ -0,0 +1,10 @@ +client_files += files( + 'APIRequest.cpp', + 'AvatarRequest.cpp', + 'GetUserInfoRequest.cpp', + 'ImageRequest.cpp', + 'Request.cpp', + 'RequestManager.cpp', + 'SaveUserInfoRequest.cpp', + 'ThumbnailRequest.cpp', +) diff --git a/src/client/meson.build b/src/client/meson.build new file mode 100644 index 000000000..e6711da8e --- /dev/null +++ b/src/client/meson.build @@ -0,0 +1,16 @@ +client_files = files( + 'MD5.cpp', + 'SaveFile.cpp', + 'SaveInfo.cpp', + 'ThumbnailRendererTask.cpp', + 'Client.cpp', + 'GameSave.cpp', +) + +subdir('http') + +powder_files += client_files + +render_files += files( + 'GameSave.cpp', +) diff --git a/src/common/String.h b/src/common/String.h index d0eee7507..b15c7422c 100644 --- a/src/common/String.h +++ b/src/common/String.h @@ -1,4 +1,5 @@ #pragma once +#include "Config.h" #include #include @@ -8,6 +9,8 @@ #include #include +#include "tpt-minmax.h" + /* There are two "string" classes: ByteString and String. They have nearly identical interfaces, except that one stores 8-bit octets (bytes) and diff --git a/src/common/macosx.h b/src/common/macosx.h new file mode 100644 index 000000000..d902c1ad0 --- /dev/null +++ b/src/common/macosx.h @@ -0,0 +1,10 @@ +#pragma once + +#ifdef DEBUG +# undef DEBUG +# define DEBUG 1 +#else +# define DEBUG 0 +#endif +#include +#include diff --git a/src/common/meson.build b/src/common/meson.build new file mode 100644 index 000000000..f4d8939e2 --- /dev/null +++ b/src/common/meson.build @@ -0,0 +1,4 @@ +common_files += files( + 'String.cpp', + 'tpt-rand.cpp', +) diff --git a/src/common/tpt-minmax.h b/src/common/tpt-minmax.h index cda40535a..6e549a8a4 100644 --- a/src/common/tpt-minmax.h +++ b/src/common/tpt-minmax.h @@ -18,19 +18,25 @@ #ifdef _MSC_VER // less than VS2013. Untested since I don't use VS2012 anymore -#if _MSC_VER < 1800 -#define fmin min -#define fminf min -#define fmax max -#define fmaxf max -#else +# if _MSC_VER < 1800 +# define fmin min +# define fminf min +# define fmax max +# define fmaxf max +# else // >= VS2013 -#include -#define NOMINMAX -#endif +# include +# define NOMINMAX +# ifdef min +# undef min +# endif +# ifdef max +# undef max +# endif +# endif #else // not using visual studio, std::min and std::max are normal -#include +# include #endif #endif diff --git a/src/common/tpt-rand.h b/src/common/tpt-rand.h index 3bd0aa402..045349a7a 100644 --- a/src/common/tpt-rand.h +++ b/src/common/tpt-rand.h @@ -1,5 +1,6 @@ #ifndef TPT_RAND_ #define TPT_RAND_ +#include "Config.h" #include #include "Singleton.h" diff --git a/src/debug/DebugInfo.h b/src/debug/DebugInfo.h index f2785d5e8..4c2346341 100644 --- a/src/debug/DebugInfo.h +++ b/src/debug/DebugInfo.h @@ -1,4 +1,5 @@ #pragma once +#include "Config.h" #include "gui/interface/Point.h" diff --git a/src/debug/meson.build b/src/debug/meson.build new file mode 100644 index 000000000..dacd1f818 --- /dev/null +++ b/src/debug/meson.build @@ -0,0 +1,6 @@ +powder_files += files( + 'DebugLines.cpp', + 'DebugParts.cpp', + 'ElementPopulation.cpp', + 'ParticleDebug.cpp', +) diff --git a/src/graphics/FontReader.cpp b/src/graphics/FontReader.cpp new file mode 100644 index 000000000..38ac1f546 --- /dev/null +++ b/src/graphics/FontReader.cpp @@ -0,0 +1,48 @@ +#include "FontReader.h" + +FontReader::FontReader(unsigned char const *_pointer): + pointer(_pointer + 1), + width(*_pointer), + pixels(0), + data(0) +{ +} + +unsigned char const *FontReader::lookupChar(String::value_type ch) +{ + size_t offset = 0; + for(int i = 0; font_ranges[i][1]; i++) + if(font_ranges[i][0] > ch) + break; + else if(font_ranges[i][1] >= ch) + return &font_data[font_ptrs[offset + (ch - font_ranges[i][0])]]; + else + offset += font_ranges[i][1] - font_ranges[i][0] + 1; + if(ch == 0xFFFD) + return &font_data[0]; + else + return lookupChar(0xFFFD); +} + +FontReader::FontReader(String::value_type ch): + FontReader(lookupChar(ch)) +{ +} + +int FontReader::GetWidth() const +{ + return width; +} + +int FontReader::NextPixel() +{ + if(!pixels) + { + data = *(pointer++); + pixels = 4; + } + int old = data; + pixels--; + data >>= 2; + return old & 0x3; +} diff --git a/src/graphics/FontReader.h b/src/graphics/FontReader.h index 89079a6b9..cd86e4a11 100644 --- a/src/graphics/FontReader.h +++ b/src/graphics/FontReader.h @@ -11,50 +11,11 @@ class FontReader int pixels; int data; - inline FontReader(unsigned char const *_pointer): - pointer(_pointer + 1), - width(*_pointer), - pixels(0), - data(0) - {} - - static inline unsigned char const *lookupChar(String::value_type ch) - { - size_t offset = 0; - for(int i = 0; font_ranges[i][1]; i++) - if(font_ranges[i][0] > ch) - break; - else if(font_ranges[i][1] >= ch) - return &font_data[font_ptrs[offset + (ch - font_ranges[i][0])]]; - else - offset += font_ranges[i][1] - font_ranges[i][0] + 1; - if(ch == 0xFFFD) - return &font_data[0]; - else - return lookupChar(0xFFFD); - } + FontReader(unsigned char const *_pointer); + static unsigned char const *lookupChar(String::value_type ch); public: - inline FontReader(String::value_type ch): - FontReader(lookupChar(ch)) - { - } - - inline int GetWidth() const - { - return width; - } - - inline int NextPixel() - { - if(!pixels) - { - data = *(pointer++); - pixels = 4; - } - int old = data; - pixels--; - data >>= 2; - return old & 0x3; - } + FontReader(String::value_type ch); + int GetWidth() const; + int NextPixel(); }; diff --git a/src/graphics/Graphics.h b/src/graphics/Graphics.h index 3b9c8a812..6bfe202fd 100644 --- a/src/graphics/Graphics.h +++ b/src/graphics/Graphics.h @@ -1,11 +1,11 @@ #ifndef GRAPHICS_H #define GRAPHICS_H +#include "Config.h" #include "common/String.h" #if defined(OGLI) #include "OpenGLHeaders.h" #endif -#include "Config.h" #include "common/tpt-inline.h" #include "Pixel.h" #include "Icons.h" diff --git a/src/graphics/OpenGLHeaders.h b/src/graphics/OpenGLHeaders.h index 40937a414..5d42449f9 100644 --- a/src/graphics/OpenGLHeaders.h +++ b/src/graphics/OpenGLHeaders.h @@ -1,29 +1,30 @@ +#include "Config.h" +#ifndef OPENGLHEADERS_H_ +#define OPENGLHEADERS_H_ + #ifdef MACOSX - -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_OS_X_VERSION_10_9 -#include -#ifndef GL_RGBA32F -#define GL_RGBA32F GL_RGBA32F_ARB -#endif -#elif __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 -#include -#include -#else +# if __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_OS_X_VERSION_10_9 +# include +# ifndef GL_RGBA32F +# define GL_RGBA32F GL_RGBA32F_ARB +# endif +# elif __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +# include +# include +# else //#include -#include -#include -#define GL_RGBA32F 0x8814 -#endif - +# include +# include +# define GL_RGBA32F 0x8814 +# endif #elif defined(WIN) - -#include -#include -#include - +# include +# include +# include #else - -#include -#include -#include +# include +# include +# include #endif + +#endif // OPENGLHEADERS_H_ diff --git a/src/graphics/Renderer.cpp b/src/graphics/Renderer.cpp index dd59c3139..24f083960 100644 --- a/src/graphics/Renderer.cpp +++ b/src/graphics/Renderer.cpp @@ -112,10 +112,12 @@ void Renderer::RenderBegin() std::fill(warpVid, warpVid+(VIDXRES*VIDYRES), 0); } +#ifndef FONTEDITOR draw_air(); draw_grav(); DrawWalls(); render_parts(); + if(display_mode & DISPLAY_PERS) { int i,r,g,b; @@ -138,6 +140,7 @@ void Renderer::RenderBegin() draw_other(); draw_grav_zones(); DrawSigns(); +#endif if(display_mode & DISPLAY_WARP) { @@ -523,11 +526,10 @@ void Renderer::RenderZoom() #endif } -std::vector Renderer_wtypes = LoadWalls(); - - +#ifndef FONTEDITOR VideoBuffer * Renderer::WallIcon(int wallID, int width, int height) { + static std::vector Renderer_wtypes = LoadWalls(); int i, j; int wt = wallID; if (wt<0 || wt>=(int)Renderer_wtypes.size()) @@ -688,6 +690,7 @@ VideoBuffer * Renderer::WallIcon(int wallID, int width, int height) } return newTexture; } +#endif void Renderer::DrawBlob(int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) { @@ -976,6 +979,7 @@ void Renderer::DrawWalls() #endif } +#ifndef FONTEDITOR void Renderer::DrawSigns() { int x, y, w, h; @@ -1023,6 +1027,7 @@ void Renderer::DrawSigns() glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prevFbo); #endif } +#endif void Renderer::render_gravlensing(pixel * source) { @@ -1191,6 +1196,7 @@ void Renderer::prepare_alpha(int size, float intensity) #endif } +#ifndef FONTEDITOR void Renderer::render_parts() { int deca, decr, decg, decb, cola, colr, colg, colb, firea, firer, fireg, fireb, pixel_mode, q, i, t, nx, ny, x, y, caddress; @@ -2330,6 +2336,7 @@ void Renderer::draw_other() // EMP effect #endif } } +#endif void Renderer::draw_grav() { diff --git a/src/graphics/Renderer.h b/src/graphics/Renderer.h index 71cbac112..0e84b03f0 100644 --- a/src/graphics/Renderer.h +++ b/src/graphics/Renderer.h @@ -1,5 +1,6 @@ #ifndef RENDERER_H #define RENDERER_H +#include "Config.h" #include #ifdef OGLR @@ -7,7 +8,6 @@ #endif #include "Graphics.h" -#include "Config.h" #include "gui/interface/Point.h" class RenderPreset; diff --git a/src/graphics/meson.build b/src/graphics/meson.build new file mode 100644 index 000000000..1a7e4fb9f --- /dev/null +++ b/src/graphics/meson.build @@ -0,0 +1,11 @@ +graphics_files = files( + 'Graphics.cpp', + #'OpenGLGraphics.cpp', # this is defunct right now + 'RasterGraphics.cpp', + 'FontReader.cpp', + 'Renderer.cpp', +) + +powder_files += graphics_files +render_files += graphics_files +font_files += graphics_files diff --git a/src/gui/Style.h b/src/gui/Style.h index 51d161bdd..6c26dbdda 100644 --- a/src/gui/Style.h +++ b/src/gui/Style.h @@ -1,5 +1,6 @@ #ifndef STYLE_H_ #define STYLE_H_ +#include "Config.h" #include "gui/interface/Colour.h" diff --git a/src/gui/colourpicker/meson.build b/src/gui/colourpicker/meson.build new file mode 100644 index 000000000..65e68d6aa --- /dev/null +++ b/src/gui/colourpicker/meson.build @@ -0,0 +1,3 @@ +powder_files += files( + 'ColourPickerActivity.cpp', +) diff --git a/src/gui/console/ConsoleController.h b/src/gui/console/ConsoleController.h index e6b08303e..656e952d4 100644 --- a/src/gui/console/ConsoleController.h +++ b/src/gui/console/ConsoleController.h @@ -1,5 +1,6 @@ #ifndef CONSOLECONTROLLER_H_ #define CONSOLECONTROLLER_H_ +#include "Config.h" #include "common/String.h" diff --git a/src/gui/console/ConsoleModel.h b/src/gui/console/ConsoleModel.h index 81f32d44e..7c56923b0 100644 --- a/src/gui/console/ConsoleModel.h +++ b/src/gui/console/ConsoleModel.h @@ -1,5 +1,6 @@ #ifndef CONSOLEMODEL_H_ #define CONSOLEMODEL_H_ +#include "Config.h" #include #include diff --git a/src/gui/console/meson.build b/src/gui/console/meson.build new file mode 100644 index 000000000..96591a800 --- /dev/null +++ b/src/gui/console/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'ConsoleController.cpp', + 'ConsoleModel.cpp', + 'ConsoleView.cpp', +) diff --git a/src/gui/dialogues/meson.build b/src/gui/dialogues/meson.build new file mode 100644 index 000000000..2c1fd04c2 --- /dev/null +++ b/src/gui/dialogues/meson.build @@ -0,0 +1,7 @@ +gui_files += files( + 'ConfirmPrompt.cpp', + 'ErrorMessage.cpp', + 'InformationMessage.cpp', + 'SaveIDMessage.cpp', + 'TextPrompt.cpp', +) diff --git a/src/gui/elementsearch/meson.build b/src/gui/elementsearch/meson.build new file mode 100644 index 000000000..e713f358f --- /dev/null +++ b/src/gui/elementsearch/meson.build @@ -0,0 +1,3 @@ +powder_files += files( + 'ElementSearchActivity.cpp', +) diff --git a/src/gui/filebrowser/meson.build b/src/gui/filebrowser/meson.build new file mode 100644 index 000000000..18144b743 --- /dev/null +++ b/src/gui/filebrowser/meson.build @@ -0,0 +1,3 @@ +powder_files += files( + 'FileBrowserActivity.cpp', +) diff --git a/src/gui/font/FontEditor.cpp b/src/gui/font/FontEditor.cpp index 4ba6480e6..71dcaba6e 100644 --- a/src/gui/font/FontEditor.cpp +++ b/src/gui/font/FontEditor.cpp @@ -16,7 +16,6 @@ #include "gui/interface/ScrollPanel.h" #include "graphics/Graphics.h" -#ifdef FONTEDITOR unsigned char *font_data; unsigned int *font_ptrs; unsigned int (*font_ranges)[2]; @@ -658,4 +657,3 @@ void FontEditor::Save() WriteDataFile(dataFile, tmpFontData, tmpFontPtrs, tmpFontRanges); savedButton->SetToggleState(true); } -#endif diff --git a/src/gui/font/meson.build b/src/gui/font/meson.build new file mode 100644 index 000000000..99becc481 --- /dev/null +++ b/src/gui/font/meson.build @@ -0,0 +1,3 @@ +font_files += files( + 'FontEditor.cpp', +) diff --git a/src/gui/game/Brush.h b/src/gui/game/Brush.h index aabe5d738..aa9b2b79d 100644 --- a/src/gui/game/Brush.h +++ b/src/gui/game/Brush.h @@ -1,5 +1,6 @@ #ifndef BRUSH_H_ #define BRUSH_H_ +#include "Config.h" #include "gui/interface/Point.h" diff --git a/src/gui/game/Favorite.h b/src/gui/game/Favorite.h index 1b5963160..5bf87ddce 100644 --- a/src/gui/game/Favorite.h +++ b/src/gui/game/Favorite.h @@ -1,5 +1,6 @@ #ifndef FAVORITE_H #define FAVORITE_H +#include "Config.h" #include "common/String.h" #include diff --git a/src/gui/game/GameController.h b/src/gui/game/GameController.h index 385f10e33..fece5979b 100644 --- a/src/gui/game/GameController.h +++ b/src/gui/game/GameController.h @@ -1,5 +1,6 @@ #ifndef GAMECONTROLLER_H #define GAMECONTROLLER_H +#include "Config.h" #include #include diff --git a/src/gui/game/GameModel.h b/src/gui/game/GameModel.h index 369aae1d5..5c454a395 100644 --- a/src/gui/game/GameModel.h +++ b/src/gui/game/GameModel.h @@ -1,5 +1,6 @@ #ifndef GAMEMODEL_H #define GAMEMODEL_H +#include "Config.h" #include #include diff --git a/src/gui/game/GameView.cpp b/src/gui/game/GameView.cpp index 006bfc6c0..d78140daf 100644 --- a/src/gui/game/GameView.cpp +++ b/src/gui/game/GameView.cpp @@ -38,6 +38,8 @@ #include "simulation/ElementDefs.h" #include "simulation/ElementClasses.h" +#include + #ifdef GetUserName # undef GetUserName // dammit windows #endif diff --git a/src/gui/game/Menu.h b/src/gui/game/Menu.h index 2625a1a5b..e52628306 100644 --- a/src/gui/game/Menu.h +++ b/src/gui/game/Menu.h @@ -1,5 +1,6 @@ #ifndef MENU_H_ #define MENU_H_ +#include "Config.h" #include "common/String.h" diff --git a/src/gui/game/QuickOption.h b/src/gui/game/QuickOption.h index 99f1e613c..67e1f011e 100644 --- a/src/gui/game/QuickOption.h +++ b/src/gui/game/QuickOption.h @@ -1,4 +1,5 @@ #pragma once +#include "Config.h" #include "common/String.h" diff --git a/src/gui/game/Tool.h b/src/gui/game/Tool.h index c2381394a..382d9ba90 100644 --- a/src/gui/game/Tool.h +++ b/src/gui/game/Tool.h @@ -1,5 +1,6 @@ #ifndef TOOL_H_ #define TOOL_H_ +#include "Config.h" #include "common/String.h" #include "gui/interface/Point.h" diff --git a/src/gui/game/meson.build b/src/gui/game/meson.build new file mode 100644 index 000000000..5fcecf0a5 --- /dev/null +++ b/src/gui/game/meson.build @@ -0,0 +1,17 @@ +powder_files += files( + 'BitmapBrush.cpp', + 'Brush.cpp', + 'DecorationTool.cpp', + 'Favorite.cpp', + 'GameController.cpp', + 'GameModel.cpp', + 'GameView.cpp', + 'GOLTool.cpp', + 'Menu.cpp', + 'PropertyTool.cpp', + 'QuickOptions.cpp', + 'SampleTool.cpp', + 'SignTool.cpp', + 'ToolButton.cpp', + 'Tool.cpp', +) diff --git a/src/gui/interface/Appearance.h b/src/gui/interface/Appearance.h index e46844070..2f6a7c7e7 100644 --- a/src/gui/interface/Appearance.h +++ b/src/gui/interface/Appearance.h @@ -1,5 +1,6 @@ #ifndef APPEARANCE_H_ #define APPEARANCE_H_ +#include "Config.h" #include "Border.h" #include "Colour.h" diff --git a/src/gui/interface/Component.h b/src/gui/interface/Component.h index 072252969..e8fc1887c 100644 --- a/src/gui/interface/Component.h +++ b/src/gui/interface/Component.h @@ -1,4 +1,5 @@ #pragma once +#include "Config.h" #include "common/String.h" #include "Appearance.h" diff --git a/src/gui/interface/Mouse.h b/src/gui/interface/Mouse.h index d89efb0b6..ecf572576 100644 --- a/src/gui/interface/Mouse.h +++ b/src/gui/interface/Mouse.h @@ -1,6 +1 @@ - -#ifdef SDL_INC #include "SDL2/SDL_mouse.h" -#else -#include "SDL_mouse.h" -#endif diff --git a/src/gui/interface/meson.build b/src/gui/interface/meson.build new file mode 100644 index 000000000..7a4efa8ac --- /dev/null +++ b/src/gui/interface/meson.build @@ -0,0 +1,25 @@ +gui_files += files( + 'Appearance.cpp', + 'Button.cpp', + 'Checkbox.cpp', + 'Component.cpp', + 'ContextMenu.cpp', + 'CopyTextButton.cpp', + 'DropDown.cpp', + 'Engine.cpp', + 'Label.cpp', + 'Panel.cpp', + 'ProgressBar.cpp', + 'ScrollPanel.cpp', + 'Slider.cpp', + 'Spinner.cpp', + 'Textbox.cpp', + 'TextWrapper.cpp', + 'Window.cpp', +) + +powder_files += files( + 'AvatarButton.cpp', + 'RichLabel.cpp', + 'SaveButton.cpp', +) diff --git a/src/gui/localbrowser/LocalBrowserController.h b/src/gui/localbrowser/LocalBrowserController.h index 8f41b80b3..e1050db11 100644 --- a/src/gui/localbrowser/LocalBrowserController.h +++ b/src/gui/localbrowser/LocalBrowserController.h @@ -1,5 +1,6 @@ #ifndef STAMPSCONTROLLER_H_ #define STAMPSCONTROLLER_H_ +#include "Config.h" #include "common/String.h" diff --git a/src/gui/localbrowser/LocalBrowserModel.h b/src/gui/localbrowser/LocalBrowserModel.h index f3ae6c829..613283c0f 100644 --- a/src/gui/localbrowser/LocalBrowserModel.h +++ b/src/gui/localbrowser/LocalBrowserModel.h @@ -1,5 +1,6 @@ #ifndef STAMPSMODEL_H_ #define STAMPSMODEL_H_ +#include "Config.h" #include #include "common/String.h" diff --git a/src/gui/localbrowser/meson.build b/src/gui/localbrowser/meson.build new file mode 100644 index 000000000..44068a034 --- /dev/null +++ b/src/gui/localbrowser/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'LocalBrowserController.cpp', + 'LocalBrowserModel.cpp', + 'LocalBrowserView.cpp', +) diff --git a/src/gui/login/LoginController.h b/src/gui/login/LoginController.h index 3c75f538e..7e3929dad 100644 --- a/src/gui/login/LoginController.h +++ b/src/gui/login/LoginController.h @@ -1,5 +1,6 @@ #ifndef LOGINCONTROLLER_H_ #define LOGINCONTROLLER_H_ +#include "Config.h" #include "common/String.h" #include "client/User.h" diff --git a/src/gui/login/LoginModel.h b/src/gui/login/LoginModel.h index 29229b825..3d4547be2 100644 --- a/src/gui/login/LoginModel.h +++ b/src/gui/login/LoginModel.h @@ -1,5 +1,6 @@ #ifndef LOGINMODEL_H_ #define LOGINMODEL_H_ +#include "Config.h" #include #include "common/String.h" diff --git a/src/gui/login/meson.build b/src/gui/login/meson.build new file mode 100644 index 000000000..428024746 --- /dev/null +++ b/src/gui/login/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'LoginController.cpp', + 'LoginModel.cpp', + 'LoginView.cpp', +) diff --git a/src/gui/meson.build b/src/gui/meson.build new file mode 100644 index 000000000..bcee43e58 --- /dev/null +++ b/src/gui/meson.build @@ -0,0 +1,25 @@ +gui_files = files( + 'Style.cpp', +) + +subdir('colourpicker') +subdir('console') +subdir('dialogues') +subdir('elementsearch') +subdir('filebrowser') +subdir('font') +subdir('game') +subdir('interface') +subdir('localbrowser') +subdir('login') +subdir('options') +subdir('preview') +subdir('profile') +subdir('render') +subdir('save') +subdir('search') +subdir('tags') +subdir('update') + +powder_files += gui_files +font_files += gui_files diff --git a/src/gui/options/OptionsController.h b/src/gui/options/OptionsController.h index bfcfb4a01..ff1a6f404 100644 --- a/src/gui/options/OptionsController.h +++ b/src/gui/options/OptionsController.h @@ -1,5 +1,6 @@ #ifndef OPTIONSCONTROLLER_H_ #define OPTIONSCONTROLLER_H_ +#include "Config.h" #include diff --git a/src/gui/options/OptionsModel.h b/src/gui/options/OptionsModel.h index 2e5bd9346..d0a6e3801 100644 --- a/src/gui/options/OptionsModel.h +++ b/src/gui/options/OptionsModel.h @@ -1,5 +1,6 @@ #ifndef OPTIONSMODEL_H_ #define OPTIONSMODEL_H_ +#include "Config.h" #include diff --git a/src/gui/options/OptionsView.cpp b/src/gui/options/OptionsView.cpp index 15cfed4b3..3577f9687 100644 --- a/src/gui/options/OptionsView.cpp +++ b/src/gui/options/OptionsView.cpp @@ -4,6 +4,7 @@ #include "OptionsModel.h" #include +#include #ifdef WIN #include #define getcwd _getcwd diff --git a/src/gui/options/meson.build b/src/gui/options/meson.build new file mode 100644 index 000000000..445f152c1 --- /dev/null +++ b/src/gui/options/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'OptionsController.cpp', + 'OptionsModel.cpp', + 'OptionsView.cpp', +) diff --git a/src/gui/preview/PreviewController.h b/src/gui/preview/PreviewController.h index fbfa08a10..37707a5ee 100644 --- a/src/gui/preview/PreviewController.h +++ b/src/gui/preview/PreviewController.h @@ -1,5 +1,6 @@ #ifndef PREVIEWCONTROLLER_H_ #define PREVIEWCONTROLLER_H_ +#include "Config.h" #include "client/ClientListener.h" diff --git a/src/gui/preview/PreviewModel.h b/src/gui/preview/PreviewModel.h index ac13a9bba..36332d4db 100644 --- a/src/gui/preview/PreviewModel.h +++ b/src/gui/preview/PreviewModel.h @@ -1,5 +1,6 @@ #ifndef PREVIEWMODEL_H #define PREVIEWMODEL_H +#include "Config.h" #include #include "common/String.h" diff --git a/src/gui/preview/meson.build b/src/gui/preview/meson.build new file mode 100644 index 000000000..952428ed7 --- /dev/null +++ b/src/gui/preview/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'PreviewController.cpp', + 'PreviewModel.cpp', + 'PreviewView.cpp', +) diff --git a/src/gui/profile/meson.build b/src/gui/profile/meson.build new file mode 100644 index 000000000..82b890ab9 --- /dev/null +++ b/src/gui/profile/meson.build @@ -0,0 +1,3 @@ +powder_files += files( + 'ProfileActivity.cpp', +) diff --git a/src/gui/render/RenderController.h b/src/gui/render/RenderController.h index d995a7d25..5d16642b6 100644 --- a/src/gui/render/RenderController.h +++ b/src/gui/render/RenderController.h @@ -1,5 +1,6 @@ #ifndef RENDERCONTROLLER_H_ #define RENDERCONTROLLER_H_ +#include "Config.h" #include diff --git a/src/gui/render/RenderModel.h b/src/gui/render/RenderModel.h index d612815b6..b46440e25 100644 --- a/src/gui/render/RenderModel.h +++ b/src/gui/render/RenderModel.h @@ -1,5 +1,6 @@ #ifndef RENDERMODEL_H_ #define RENDERMODEL_H_ +#include "Config.h" #include diff --git a/src/gui/render/meson.build b/src/gui/render/meson.build new file mode 100644 index 000000000..c36593e50 --- /dev/null +++ b/src/gui/render/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'RenderController.cpp', + 'RenderModel.cpp', + 'RenderView.cpp', +) diff --git a/src/gui/save/meson.build b/src/gui/save/meson.build new file mode 100644 index 000000000..00014d0a7 --- /dev/null +++ b/src/gui/save/meson.build @@ -0,0 +1,4 @@ +powder_files += files( + 'LocalSaveActivity.cpp', + 'ServerSaveActivity.cpp', +) diff --git a/src/gui/search/SearchController.h b/src/gui/search/SearchController.h index c1f6de635..cc11883c3 100644 --- a/src/gui/search/SearchController.h +++ b/src/gui/search/SearchController.h @@ -1,5 +1,6 @@ #ifndef SEARCHCONTROLLER_H #define SEARCHCONTROLLER_H +#include "Config.h" #include "common/String.h" diff --git a/src/gui/search/SearchModel.h b/src/gui/search/SearchModel.h index 2c2a46a26..d0249a661 100644 --- a/src/gui/search/SearchModel.h +++ b/src/gui/search/SearchModel.h @@ -1,5 +1,6 @@ #ifndef SEARCHMODEL_H #define SEARCHMODEL_H +#include "Config.h" #include #include "common/String.h" diff --git a/src/gui/search/meson.build b/src/gui/search/meson.build new file mode 100644 index 000000000..41acd6195 --- /dev/null +++ b/src/gui/search/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'SearchController.cpp', + 'SearchModel.cpp', + 'SearchView.cpp', +) diff --git a/src/gui/tags/TagsController.h b/src/gui/tags/TagsController.h index 6d7cc7101..44c0627d5 100644 --- a/src/gui/tags/TagsController.h +++ b/src/gui/tags/TagsController.h @@ -1,5 +1,6 @@ #ifndef TAGSCONTROLLER_H_ #define TAGSCONTROLLER_H_ +#include "Config.h" #include "common/String.h" diff --git a/src/gui/tags/TagsModel.h b/src/gui/tags/TagsModel.h index 9e66a0757..fdb109f13 100644 --- a/src/gui/tags/TagsModel.h +++ b/src/gui/tags/TagsModel.h @@ -1,5 +1,6 @@ #ifndef TAGSMODEL_H_ #define TAGSMODEL_H_ +#include "Config.h" #include #include "common/String.h" diff --git a/src/gui/tags/meson.build b/src/gui/tags/meson.build new file mode 100644 index 000000000..03f9bb319 --- /dev/null +++ b/src/gui/tags/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'TagsController.cpp', + 'TagsModel.cpp', + 'TagsView.cpp', +) diff --git a/src/gui/update/meson.build b/src/gui/update/meson.build new file mode 100644 index 000000000..86fd0a0ae --- /dev/null +++ b/src/gui/update/meson.build @@ -0,0 +1,3 @@ +powder_files += files( + 'UpdateActivity.cpp', +) diff --git a/src/json/meson.build b/src/json/meson.build new file mode 100644 index 000000000..3583a12bc --- /dev/null +++ b/src/json/meson.build @@ -0,0 +1,3 @@ +common_files += files( + 'jsoncpp.cpp', +) diff --git a/src/lua/CommandInterface.h b/src/lua/CommandInterface.h index cd98462cf..8ae32841a 100644 --- a/src/lua/CommandInterface.h +++ b/src/lua/CommandInterface.h @@ -1,5 +1,6 @@ #ifndef COMMANDINTERFACE_H_ #define COMMANDINTERFACE_H_ +#include "Config.h" #include "common/String.h" #include "lua/LuaEvents.h" diff --git a/src/lua/LegacyLuaAPI.cpp b/src/lua/LegacyLuaAPI.cpp index 9e1f54789..886fd9ea9 100644 --- a/src/lua/LegacyLuaAPI.cpp +++ b/src/lua/LegacyLuaAPI.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include #include diff --git a/src/lua/LuaBit.cpp b/src/lua/LuaBit.cpp index 52168c3bf..6f2afed25 100644 --- a/src/lua/LuaBit.cpp +++ b/src/lua/LuaBit.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE /* ** Lua BitOp -- a bit operations library for Lua 5.1/5.2. @@ -26,6 +27,7 @@ ** ** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] */ +#include "LuaBit.h" #define LUA_BITOP_VERSION "1.0.2" diff --git a/src/lua/LuaBit.h b/src/lua/LuaBit.h index 6d9c06878..0d001d970 100644 --- a/src/lua/LuaBit.h +++ b/src/lua/LuaBit.h @@ -26,7 +26,11 @@ ** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] */ +#pragma once +#include "Config.h" + #define LUA_BITOP_VERSION "1.0.2" -int luaopen_bit(lua_State *L); +struct lua_State; +extern "C" int luaopen_bit(lua_State *L); diff --git a/src/lua/LuaButton.cpp b/src/lua/LuaButton.cpp index b9a117cbb..16700bb4b 100644 --- a/src/lua/LuaButton.cpp +++ b/src/lua/LuaButton.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaButton.h" diff --git a/src/lua/LuaCheckbox.cpp b/src/lua/LuaCheckbox.cpp index 5f9b2bb7e..8766e65d5 100644 --- a/src/lua/LuaCheckbox.cpp +++ b/src/lua/LuaCheckbox.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaCheckbox.h" diff --git a/src/lua/LuaCompat.h b/src/lua/LuaCompat.h index 2335a36bd..8ff3ccf69 100644 --- a/src/lua/LuaCompat.h +++ b/src/lua/LuaCompat.h @@ -1,28 +1,15 @@ #ifndef LUAINC_H #define LUAINC_H +#include "Config.h" #ifdef __cplusplus extern "C" { #endif -#if defined(LUA_R_INCL) -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" -#elif defined(LUA_COMPAT_ALL) -#include "lua5.2/lua.h" -#include "lua5.2/lauxlib.h" -#include "lua5.2/lualib.h" -#elif defined(LUAJIT) -#include "luajit-2.0/lua.h" -#include "luajit-2.0/lauxlib.h" -#include "luajit-2.0/lualib.h" -#else -#include "lua5.1/lua.h" -#include "lua5.1/lauxlib.h" -#include "lua5.1/lualib.h" -#endif +#include +#include +#include LUALIB_API void tpt_lua_setmainthread(lua_State *L); LUALIB_API void tpt_lua_getmainthread(lua_State *L); diff --git a/src/lua/LuaComponent.cpp b/src/lua/LuaComponent.cpp index 98ee7c730..0c1e5954d 100644 --- a/src/lua/LuaComponent.cpp +++ b/src/lua/LuaComponent.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaComponent.h" diff --git a/src/lua/LuaEvents.h b/src/lua/LuaEvents.h index 17b5e8cca..66152cdd5 100644 --- a/src/lua/LuaEvents.h +++ b/src/lua/LuaEvents.h @@ -1,5 +1,6 @@ #ifndef LUAEVENTS_H #define LUAEVENTS_H +#include "Config.h" #include "common/String.h" @@ -15,6 +16,7 @@ protected: public: virtual int PushToStack(lua_State * l) = 0; + virtual ~Event() = default; }; class TextInputEvent : public Event diff --git a/src/lua/LuaLabel.cpp b/src/lua/LuaLabel.cpp index 3534b8307..8c321bbe5 100644 --- a/src/lua/LuaLabel.cpp +++ b/src/lua/LuaLabel.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaScriptInterface.h" diff --git a/src/lua/LuaProgressBar.cpp b/src/lua/LuaProgressBar.cpp index 6d38de40e..ea177ce4d 100644 --- a/src/lua/LuaProgressBar.cpp +++ b/src/lua/LuaProgressBar.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaProgressBar.h" diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index 36b0cf1b2..224d6f960 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaScriptInterface.h" @@ -6,7 +7,6 @@ #include #include -#include "Config.h" #include "Format.h" #include "Platform.h" #include "PowderToy.h" diff --git a/src/lua/LuaScriptInterface.h b/src/lua/LuaScriptInterface.h index 20097b9e6..61376bbe5 100644 --- a/src/lua/LuaScriptInterface.h +++ b/src/lua/LuaScriptInterface.h @@ -1,5 +1,6 @@ #ifndef LUASCRIPTINTERFACE_H_ #define LUASCRIPTINTERFACE_H_ +#include "Config.h" #include "LuaCompat.h" #include "LuaSmartRef.h" diff --git a/src/lua/LuaSlider.cpp b/src/lua/LuaSlider.cpp index a392cc587..c107e4ddd 100644 --- a/src/lua/LuaSlider.cpp +++ b/src/lua/LuaSlider.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaSlider.h" diff --git a/src/lua/LuaSmartRef.cpp b/src/lua/LuaSmartRef.cpp index 080dc0dfb..4503a7f77 100644 --- a/src/lua/LuaSmartRef.cpp +++ b/src/lua/LuaSmartRef.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaSmartRef.h" diff --git a/src/lua/LuaTextbox.cpp b/src/lua/LuaTextbox.cpp index fc2d5810f..9d0c05325 100644 --- a/src/lua/LuaTextbox.cpp +++ b/src/lua/LuaTextbox.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaTextbox.h" diff --git a/src/lua/LuaWindow.cpp b/src/lua/LuaWindow.cpp index 1451bd677..0150d7da2 100644 --- a/src/lua/LuaWindow.cpp +++ b/src/lua/LuaWindow.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #include "LuaWindow.h" diff --git a/src/lua/TPTSTypes.h b/src/lua/TPTSTypes.h index d83a119a0..3dfc67961 100644 --- a/src/lua/TPTSTypes.h +++ b/src/lua/TPTSTypes.h @@ -1,5 +1,6 @@ #ifndef TPTSTYPES_H_ #define TPTSTYPES_H_ +#include "Config.h" #include "common/String.h" #include "gui/interface/Point.h" diff --git a/src/lua/TPTScriptInterface.h b/src/lua/TPTScriptInterface.h index d04aacbe7..e9163c483 100644 --- a/src/lua/TPTScriptInterface.h +++ b/src/lua/TPTScriptInterface.h @@ -1,5 +1,6 @@ #ifndef TPTSCRIPTINTERFACE_H_ #define TPTSCRIPTINTERFACE_H_ +#include "Config.h" #include "CommandInterface.h" #include "TPTSTypes.h" diff --git a/src/lua/luascripts/eventcompat.lua.cpp b/src/lua/luascripts/eventcompat.lua.cpp index 9289bb41d..5db36101e 100644 --- a/src/lua/luascripts/eventcompat.lua.cpp +++ b/src/lua/luascripts/eventcompat.lua.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE #ifdef _MSC_VER #include "Platform.h" diff --git a/src/lua/luascripts/meson.build b/src/lua/luascripts/meson.build new file mode 100644 index 000000000..a594d87aa --- /dev/null +++ b/src/lua/luascripts/meson.build @@ -0,0 +1,3 @@ +resources_files += files( + 'eventcompat.lua', +) diff --git a/src/lua/meson.build b/src/lua/meson.build new file mode 100644 index 000000000..d30d299cd --- /dev/null +++ b/src/lua/meson.build @@ -0,0 +1,37 @@ +luaconsole_files = files( + 'CommandInterface.cpp', + 'LegacyLuaAPI.cpp', + 'LuaBit.cpp', + 'LuaButton.cpp', + 'LuaCheckbox.cpp', + 'LuaCompat.c', + 'LuaComponent.cpp', + 'LuaEvents.cpp', + 'LuaLabel.cpp', + 'LuaProgressBar.cpp', + 'LuaScriptInterface.cpp', + 'luascripts/eventcompat.lua.cpp', + 'LuaSlider.cpp', + 'LuaSmartRef.cpp', + 'LuaTextbox.cpp', + 'LuaWindow.cpp', + 'socket/auxiliar.c', + 'socket/buffer.c', + 'socket/except.c', + 'socket/inet.c', + 'socket/io.c', + 'socket/luasocket.c', + 'socket/options.c', + 'socket/select.c', + 'socket/socket.lua.cpp', + 'socket/tcp.c', + 'socket/timeout.c', + 'socket/udp.c', + 'TPTScriptInterface.cpp', + 'TPTSTypes.cpp', +) + +subdir('luascripts') +subdir('socket') + +powder_files += luaconsole_files diff --git a/src/lua/socket/meson.build b/src/lua/socket/meson.build new file mode 100644 index 000000000..bac6998ed --- /dev/null +++ b/src/lua/socket/meson.build @@ -0,0 +1,10 @@ +if copt_platform == 'windows' + luaconsole_files += files( + 'wsocket.c', + ) +else + luaconsole_files += files( + 'unix.c', + 'usocket.c', + ) +endif diff --git a/src/lua/socket/socket.lua.cpp b/src/lua/socket/socket.lua.cpp index ca5e61b1d..52ca1dea8 100644 --- a/src/lua/socket/socket.lua.cpp +++ b/src/lua/socket/socket.lua.cpp @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef LUACONSOLE // socket.lua from luasocket compiled into a cpp file #include "../LuaCompat.h" diff --git a/src/lua/socket/usocket.h b/src/lua/socket/usocket.h index 918c6643b..f2a89aa0d 100644 --- a/src/lua/socket/usocket.h +++ b/src/lua/socket/usocket.h @@ -1,4 +1,3 @@ -#ifndef WIN #ifndef USOCKET_H #define USOCKET_H /*=========================================================================*\ @@ -39,4 +38,3 @@ typedef t_socket *p_socket; #define SOCKET_INVALID (-1) #endif /* USOCKET_H */ -#endif diff --git a/src/lua/socket/wsocket.c b/src/lua/socket/wsocket.c index a38f2c82a..a66d703f9 100644 --- a/src/lua/socket/wsocket.c +++ b/src/lua/socket/wsocket.c @@ -1,4 +1,3 @@ -#ifdef WIN /*=========================================================================*\ * Socket compatibilization module for Win32 * LuaSocket toolkit @@ -400,4 +399,3 @@ static const char *wstrerror(int err) { default: return "Unknown error"; } } -#endif diff --git a/src/lua/socket/wsocket.h b/src/lua/socket/wsocket.h index 963742fe7..b53668368 100644 --- a/src/lua/socket/wsocket.h +++ b/src/lua/socket/wsocket.h @@ -1,4 +1,3 @@ -#ifdef WIN #ifndef WSOCKET_H #define WSOCKET_H /*=========================================================================*\ @@ -20,4 +19,3 @@ typedef t_socket *p_socket; #define SOCKET_INVALID (INVALID_SOCKET) #endif /* WSOCKET_H */ -#endif diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 000000000..2dc9fc160 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,67 @@ +configure_file( + input: 'Config.template.h', + output: 'Config.h', + configuration: conf_data +) + +powder_files = files( + 'SDLCompat.cpp', + 'Update.cpp', + 'PowderToySDL.cpp', +) + +render_files = files( + 'PowderToyRenderer.cpp', +) + +font_files = files( + 'PowderToyFontEditor.cpp', +) + +common_files = files( + 'Format.cpp', + 'Misc.cpp', + 'Platform.cpp', + 'Probability.cpp', +) + +subdir('bson') +subdir('client') +subdir('common') +subdir('debug') +subdir('graphics') +subdir('gui') +subdir('json') +subdir('lua') +subdir('powdertoyjava') +subdir('resampler') +subdir('simulation') +subdir('tasks') + +powder_files += common_files +render_files += common_files +font_files += common_files + +simulation_elem_defs = [] +foreach elem_name_id : simulation_elem_ids + simulation_elem_defs += 'ELEMENT_DEFINE(' + elem_name_id[0] + ', ' + elem_name_id[1].to_string() + ');' +endforeach +elements_conf_data = configuration_data() +elements_conf_data.set('element_defs', '\n'.join(simulation_elem_defs)) +configure_file( + input: 'simulation/ElementNumbers.template.h', + output: 'ElementNumbers.h', + configuration: elements_conf_data +) + +simulation_tool_defs = [] +foreach tool_name_id : simulation_tool_ids + simulation_tool_defs += 'TOOL_DEFINE(' + tool_name_id[0] + ', ' + tool_name_id[1].to_string() + ');' +endforeach +tools_conf_data = configuration_data() +tools_conf_data.set('tool_defs', '\n'.join(simulation_tool_defs)) +configure_file( + input: 'simulation/ToolNumbers.template.h', + output: 'ToolNumbers.h', + configuration: tools_conf_data +) diff --git a/src/powdertoyjava/OpenGLCanvasWin32.h b/src/powdertoyjava/OpenGLCanvasWin32.h index 16a0e379c..5039669ad 100644 --- a/src/powdertoyjava/OpenGLCanvasWin32.h +++ b/src/powdertoyjava/OpenGLCanvasWin32.h @@ -1,3 +1,4 @@ +#include "Config.h" #ifdef USE_JNI #import diff --git a/src/powdertoyjava/PowderToyJava.h b/src/powdertoyjava/PowderToyJava.h index d39a8a9dc..3c6edfd71 100644 --- a/src/powdertoyjava/PowderToyJava.h +++ b/src/powdertoyjava/PowderToyJava.h @@ -1,3 +1,4 @@ +#include "Config.h" #include #ifndef POWDERTOYJAVA diff --git a/src/powdertoyjava/meson.build b/src/powdertoyjava/meson.build new file mode 100644 index 000000000..cc189cd8e --- /dev/null +++ b/src/powdertoyjava/meson.build @@ -0,0 +1,4 @@ +powder_files += files( + 'OpenGLCanvasWin32.cpp', + 'PowderToyJava.cpp', +) diff --git a/src/resampler/meson.build b/src/resampler/meson.build new file mode 100644 index 000000000..16b1eb1e1 --- /dev/null +++ b/src/resampler/meson.build @@ -0,0 +1,7 @@ +resampler_files = files( + 'resampler.cpp', +) + +powder_files += resampler_files +render_files += resampler_files +font_files += resampler_files diff --git a/src/resampler/resampler.cpp b/src/resampler/resampler.cpp index 4672c6dd7..ba4b67184 100644 --- a/src/resampler/resampler.cpp +++ b/src/resampler/resampler.cpp @@ -1,4 +1,5 @@ -#include "Config.h" +#include "resampler.h" + #ifdef HIGH_QUALITY_RESAMPLE // http://code.google.com/p/imageresampler/ // resampler.cpp, Separable filtering image rescaler v2.21, Rich Geldreich - richgel99@gmail.com @@ -12,12 +13,11 @@ // Dec. 31, 2008: v2.2: Bit more cleanup, released as public domain. // June 4, 2012: v2.21: Switched to unlicense.org, integrated GCC fixes supplied by Peter Nagy , Anteru at anteru.net, and clay@coge.net, // added Codeblocks project (for testing with MinGW and GCC), VS2008 static code analysis pass. -#include + #include #include #include #include -#include "resampler.h" #define resampler_assert assert diff --git a/src/resampler/resampler.h b/src/resampler/resampler.h index b23bfd105..061b93555 100644 --- a/src/resampler/resampler.h +++ b/src/resampler/resampler.h @@ -3,6 +3,8 @@ // See unlicense.org text at the bottom of this file. #ifndef __RESAMPLER_H__ #define __RESAMPLER_H__ +#include "Config.h" +#include #define RESAMPLER_DEBUG_OPS 0 #define RESAMPLER_DEFAULT_FILTER "lanczos4" diff --git a/src/simulation/Element.h b/src/simulation/Element.h index 34c41ce29..75188153c 100644 --- a/src/simulation/Element.h +++ b/src/simulation/Element.h @@ -2,9 +2,9 @@ #define ELEMENTCLASS_H #include "graphics/Pixel.h" -#include "simulation/ElementDefs.h" -#include "simulation/Particle.h" -#include "simulation/StructProperty.h" +#include "ElementDefs.h" +#include "Particle.h" +#include "StructProperty.h" class Simulation; class Renderer; @@ -64,7 +64,6 @@ public: Particle DefaultProperties; Element(); - virtual ~Element() {} static int defaultGraphics(GRAPHICS_FUNC_ARGS); static int legacyUpdate(UPDATE_FUNC_ARGS); static bool basicCtypeDraw(CTYPEDRAW_FUNC_ARGS); diff --git a/src/simulation/ElementCommon.h b/src/simulation/ElementCommon.h index afec485b5..e10b770a1 100644 --- a/src/simulation/ElementCommon.h +++ b/src/simulation/ElementCommon.h @@ -1,5 +1,8 @@ #ifndef ELEMENTCOMMON_H #define ELEMENTCOMMON_H + +#include "Config.h" + // This header should be included by all files in src/elements/ #include diff --git a/src/simulation/ElementNumbers.h b/src/simulation/ElementNumbers.h deleted file mode 100644 index 5b09b8f11..000000000 --- a/src/simulation/ElementNumbers.h +++ /dev/null @@ -1,203 +0,0 @@ -#ifdef ELEMENT_NUMBERS_CALL -# define ELEMENT_DEFINE(name, id) elements[id].Element_ ## name () -#endif -#ifdef ELEMENT_NUMBERS_DECLARE -# define ELEMENT_DEFINE(name, id) void Element_ ## name () -#endif -#ifdef ELEMENT_NUMBERS_ENUMERATE -# define ELEMENT_DEFINE(name, id) constexpr int PT_ ## name = id -#endif - -ELEMENT_DEFINE(NONE, 0); -ELEMENT_DEFINE(DUST, 1); -ELEMENT_DEFINE(WATR, 2); -ELEMENT_DEFINE(OIL, 3); -ELEMENT_DEFINE(FIRE, 4); -ELEMENT_DEFINE(STNE, 5); -ELEMENT_DEFINE(LAVA, 6); -ELEMENT_DEFINE(GUNP, 7); -ELEMENT_DEFINE(NITR, 8); -ELEMENT_DEFINE(CLNE, 9); -ELEMENT_DEFINE(GAS, 10); -ELEMENT_DEFINE(PLEX, 11); -ELEMENT_DEFINE(GOO, 12); -ELEMENT_DEFINE(ICEI, 13); -ELEMENT_DEFINE(METL, 14); -ELEMENT_DEFINE(SPRK, 15); -ELEMENT_DEFINE(SNOW, 16); -ELEMENT_DEFINE(WOOD, 17); -ELEMENT_DEFINE(NEUT, 18); -ELEMENT_DEFINE(PLUT, 19); -ELEMENT_DEFINE(PLNT, 20); -ELEMENT_DEFINE(ACID, 21); -ELEMENT_DEFINE(VOID, 22); -ELEMENT_DEFINE(WTRV, 23); -ELEMENT_DEFINE(CNCT, 24); -ELEMENT_DEFINE(DSTW, 25); -ELEMENT_DEFINE(SALT, 26); -ELEMENT_DEFINE(SLTW, 27); -ELEMENT_DEFINE(DMND, 28); -ELEMENT_DEFINE(BMTL, 29); -ELEMENT_DEFINE(BRMT, 30); -ELEMENT_DEFINE(PHOT, 31); -ELEMENT_DEFINE(URAN, 32); -ELEMENT_DEFINE(WAX, 33); -ELEMENT_DEFINE(MWAX, 34); -ELEMENT_DEFINE(PSCN, 35); -ELEMENT_DEFINE(NSCN, 36); -ELEMENT_DEFINE(LNTG, 37); -ELEMENT_DEFINE(INSL, 38); -ELEMENT_DEFINE(BHOL, 39); -ELEMENT_DEFINE(WHOL, 40); -ELEMENT_DEFINE(RBDM, 41); -ELEMENT_DEFINE(LRBD, 42); -ELEMENT_DEFINE(NTCT, 43); -ELEMENT_DEFINE(SAND, 44); -ELEMENT_DEFINE(GLAS, 45); -ELEMENT_DEFINE(PTCT, 46); -ELEMENT_DEFINE(BGLA, 47); -ELEMENT_DEFINE(THDR, 48); -ELEMENT_DEFINE(PLSM, 49); -ELEMENT_DEFINE(ETRD, 50); -ELEMENT_DEFINE(NICE, 51); -ELEMENT_DEFINE(NBLE, 52); -ELEMENT_DEFINE(BTRY, 53); -ELEMENT_DEFINE(LCRY, 54); -ELEMENT_DEFINE(STKM, 55); -ELEMENT_DEFINE(SWCH, 56); -ELEMENT_DEFINE(SMKE, 57); -ELEMENT_DEFINE(DESL, 58); -ELEMENT_DEFINE(COAL, 59); -ELEMENT_DEFINE(LO2, 60); -ELEMENT_DEFINE(O2, 61); -ELEMENT_DEFINE(INWR, 62); -ELEMENT_DEFINE(YEST, 63); -ELEMENT_DEFINE(DYST, 64); -ELEMENT_DEFINE(THRM, 65); -ELEMENT_DEFINE(GLOW, 66); -ELEMENT_DEFINE(BRCK, 67); -ELEMENT_DEFINE(CFLM, 68); -ELEMENT_DEFINE(FIRW, 69); -ELEMENT_DEFINE(FUSE, 70); -ELEMENT_DEFINE(FSEP, 71); -ELEMENT_DEFINE(AMTR, 72); -ELEMENT_DEFINE(BCOL, 73); -ELEMENT_DEFINE(PCLN, 74); -ELEMENT_DEFINE(HSWC, 75); -ELEMENT_DEFINE(IRON, 76); -ELEMENT_DEFINE(MORT, 77); -ELEMENT_DEFINE(LIFE, 78); -ELEMENT_DEFINE(DLAY, 79); -ELEMENT_DEFINE(CO2, 80); -ELEMENT_DEFINE(DRIC, 81); -ELEMENT_DEFINE(CBNW, 82); -ELEMENT_DEFINE(STOR, 83); -ELEMENT_DEFINE(PVOD, 84); -ELEMENT_DEFINE(CONV, 85); -ELEMENT_DEFINE(CAUS, 86); -ELEMENT_DEFINE(LIGH, 87); -ELEMENT_DEFINE(TESC, 88); -ELEMENT_DEFINE(DEST, 89); -ELEMENT_DEFINE(SPNG, 90); -ELEMENT_DEFINE(RIME, 91); -ELEMENT_DEFINE(FOG, 92); -ELEMENT_DEFINE(BCLN, 93); -ELEMENT_DEFINE(LOVE, 94); -ELEMENT_DEFINE(DEUT, 95); -ELEMENT_DEFINE(WARP, 96); -ELEMENT_DEFINE(PUMP, 97); -ELEMENT_DEFINE(FWRK, 98); -ELEMENT_DEFINE(PIPE, 99); -ELEMENT_DEFINE(FRZZ, 100); -ELEMENT_DEFINE(FRZW, 101); -ELEMENT_DEFINE(GRAV, 102); -ELEMENT_DEFINE(BIZR, 103); -ELEMENT_DEFINE(BIZRG, 104); -ELEMENT_DEFINE(BIZRS, 105); -ELEMENT_DEFINE(INST, 106); -ELEMENT_DEFINE(ISOZ, 107); -ELEMENT_DEFINE(ISZS, 108); -ELEMENT_DEFINE(PRTI, 109); -ELEMENT_DEFINE(PRTO, 110); -ELEMENT_DEFINE(PSTE, 111); -ELEMENT_DEFINE(PSTS, 112); -ELEMENT_DEFINE(ANAR, 113); -ELEMENT_DEFINE(VINE, 114); -ELEMENT_DEFINE(INVIS, 115); -ELEMENT_DEFINE(E116, 116); -ELEMENT_DEFINE(SPAWN2, 117); -ELEMENT_DEFINE(SPAWN, 118); -ELEMENT_DEFINE(SHLD1, 119); -ELEMENT_DEFINE(SHLD2, 120); -ELEMENT_DEFINE(SHLD3, 121); -ELEMENT_DEFINE(SHLD4, 122); -ELEMENT_DEFINE(LOLZ, 123); -ELEMENT_DEFINE(WIFI, 124); -ELEMENT_DEFINE(FILT, 125); -ELEMENT_DEFINE(ARAY, 126); -ELEMENT_DEFINE(BRAY, 127); -ELEMENT_DEFINE(STKM2, 128); -ELEMENT_DEFINE(BOMB, 129); -ELEMENT_DEFINE(C5, 130); -ELEMENT_DEFINE(SING, 131); -ELEMENT_DEFINE(QRTZ, 132); -ELEMENT_DEFINE(PQRT, 133); -ELEMENT_DEFINE(EMP, 134); -ELEMENT_DEFINE(BREC, 135); -ELEMENT_DEFINE(ELEC, 136); -ELEMENT_DEFINE(ACEL, 137); -ELEMENT_DEFINE(DCEL, 138); -ELEMENT_DEFINE(BANG, 139); -ELEMENT_DEFINE(IGNT, 140); -ELEMENT_DEFINE(BOYL, 141); -ELEMENT_DEFINE(GEL, 142); -ELEMENT_DEFINE(TRON, 143); -ELEMENT_DEFINE(TTAN, 144); -ELEMENT_DEFINE(EXOT, 145); -ELEMENT_DEFINE(E146, 146); -ELEMENT_DEFINE(EMBR, 147); -ELEMENT_DEFINE(H2, 148); -ELEMENT_DEFINE(SOAP, 149); -ELEMENT_DEFINE(NBHL, 150); -ELEMENT_DEFINE(NWHL, 151); -ELEMENT_DEFINE(MERC, 152); -ELEMENT_DEFINE(PBCN, 153); -ELEMENT_DEFINE(GPMP, 154); -ELEMENT_DEFINE(CLST, 155); -ELEMENT_DEFINE(WIRE, 156); -ELEMENT_DEFINE(GBMB, 157); -ELEMENT_DEFINE(FIGH, 158); -ELEMENT_DEFINE(FRAY, 159); -ELEMENT_DEFINE(RPEL, 160); -ELEMENT_DEFINE(PPIP, 161); -ELEMENT_DEFINE(DTEC, 162); -ELEMENT_DEFINE(DMG, 163); -ELEMENT_DEFINE(TSNS, 164); -ELEMENT_DEFINE(VIBR, 165); -ELEMENT_DEFINE(BVBR, 166); -ELEMENT_DEFINE(CRAY, 167); -ELEMENT_DEFINE(PSTN, 168); -ELEMENT_DEFINE(FRME, 169); -ELEMENT_DEFINE(GOLD, 170); -ELEMENT_DEFINE(TUNG, 171); -ELEMENT_DEFINE(PSNS, 172); -ELEMENT_DEFINE(PROT, 173); -ELEMENT_DEFINE(VIRS, 174); -ELEMENT_DEFINE(VRSS, 175); -ELEMENT_DEFINE(VRSG, 176); -ELEMENT_DEFINE(GRVT, 177); -ELEMENT_DEFINE(DRAY, 178); -ELEMENT_DEFINE(CRMC, 179); -ELEMENT_DEFINE(HEAC, 180); -ELEMENT_DEFINE(SAWD, 181); -ELEMENT_DEFINE(POLO, 182); -ELEMENT_DEFINE(RFRG, 183); -ELEMENT_DEFINE(RFGL, 184); -ELEMENT_DEFINE(LSNS, 185); -ELEMENT_DEFINE(LDTC, 186); -ELEMENT_DEFINE(SLCN, 187); -ELEMENT_DEFINE(PTNM, 188); -ELEMENT_DEFINE(VSNS, 189); -ELEMENT_DEFINE(ROCK, 190); - -#undef ELEMENT_DEFINE diff --git a/src/simulation/ElementNumbers.template.h b/src/simulation/ElementNumbers.template.h new file mode 100644 index 000000000..73febb8d0 --- /dev/null +++ b/src/simulation/ElementNumbers.template.h @@ -0,0 +1,13 @@ +#ifdef ELEMENT_NUMBERS_CALL +# define ELEMENT_DEFINE(name, id) elements[id].Element_ ## name () +#endif +#ifdef ELEMENT_NUMBERS_DECLARE +# define ELEMENT_DEFINE(name, id) void Element_ ## name () +#endif +#ifdef ELEMENT_NUMBERS_ENUMERATE +# define ELEMENT_DEFINE(name, id) constexpr int PT_ ## name = id +#endif + +@element_defs@ + +#undef ELEMENT_DEFINE diff --git a/src/simulation/Gravity.cpp b/src/simulation/Gravity.cpp index cc51319ce..add6f298e 100755 --- a/src/simulation/Gravity.cpp +++ b/src/simulation/Gravity.cpp @@ -323,7 +323,7 @@ void Gravity::update_grav() void Gravity::update_grav(void) { - int x, y, i, j, changed = 0; + int x, y, i, j; float val, distance; th_gravchanged = 0; #ifndef GRAV_DIFF @@ -374,7 +374,6 @@ void Gravity::update_grav(void) } } } -fin: memcpy(th_ogravmap, th_gravmap, (XRES/CELL)*(YRES/CELL)*sizeof(float)); } #endif diff --git a/src/simulation/Gravity.h b/src/simulation/Gravity.h index 6ef35dd2c..ec3b83e4c 100644 --- a/src/simulation/Gravity.h +++ b/src/simulation/Gravity.h @@ -1,10 +1,10 @@ #ifndef GRAVITY_H #define GRAVITY_H +#include "Config.h" #include #include #include -#include "Config.h" #ifdef GRAVFFT #include diff --git a/src/simulation/Particle.h b/src/simulation/Particle.h index 23a47475a..eeb7cf3ba 100644 --- a/src/simulation/Particle.h +++ b/src/simulation/Particle.h @@ -1,5 +1,6 @@ #ifndef PARTICLE_H_ #define PARTICLE_H_ +#include "Config.h" #include #include "StructProperty.h" diff --git a/src/simulation/SaveRenderer.h b/src/simulation/SaveRenderer.h index c1eb08a87..3de11c257 100644 --- a/src/simulation/SaveRenderer.h +++ b/src/simulation/SaveRenderer.h @@ -1,5 +1,6 @@ #ifndef SAVERENDERER_H_ #define SAVERENDERER_H_ +#include "Config.h" #ifdef OGLI #include "graphics/OpenGLHeaders.h" #endif diff --git a/src/simulation/Sign.h b/src/simulation/Sign.h index 1eae163d9..4e7f933b1 100644 --- a/src/simulation/Sign.h +++ b/src/simulation/Sign.h @@ -1,5 +1,6 @@ #ifndef SIGN_H_ #define SIGN_H_ +#include "Config.h" #include "common/String.h" diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index 71d0c5523..890d0ca58 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -990,6 +990,7 @@ void Simulation::SetEdgeMode(int newEdgeMode) } } +#ifndef RENDERER void Simulation::ApplyDecoration(int x, int y, int colR_, int colG_, int colB_, int colA_, int mode) { int rp; @@ -1339,6 +1340,7 @@ void Simulation::ApplyDecorationFill(Renderer *ren, int x, int y, int colR, int } free(bitmap); } +#endif int Simulation::Tool(int x, int y, int tool, int brushX, int brushY, float strength) { @@ -1351,6 +1353,7 @@ int Simulation::Tool(int x, int y, int tool, int brushX, int brushY, float stren return tools[tool].Perform(this, cpart, x, y, brushX, brushY, strength); } +#ifndef RENDERER int Simulation::ToolBrush(int positionX, int positionY, int tool, Brush * cBrush, float strength) { if(cBrush) @@ -1439,6 +1442,7 @@ void Simulation::ToolBox(int x1, int y1, int x2, int y2, int tool, float strengt for (i=x1; i<=x2; i++) Tool(i, j, tool, brushX, brushY, strength); } +#endif int Simulation::CreateWalls(int x, int y, int rx, int ry, int wall, Brush * cBrush) { @@ -1630,6 +1634,7 @@ int Simulation::FloodWalls(int x, int y, int wall, int bm) return 1; } +#ifndef RENDERER int Simulation::CreateParts(int positionX, int positionY, int c, Brush * cBrush, int flags) { if (flags == -1) @@ -1759,6 +1764,7 @@ void Simulation::CreateLine(int x1, int y1, int x2, int y2, int c, Brush * cBrus } } } +#endif int Simulation::CreatePartFlags(int x, int y, int c, int flags) { @@ -1871,6 +1877,7 @@ void Simulation::CreateLine(int x1, int y1, int x2, int y2, int c) } } +#ifndef RENDERER void Simulation::CreateBox(int x1, int y1, int x2, int y2, int c, int flags) { int i, j; @@ -2016,6 +2023,7 @@ int Simulation::FloodParts(int x, int y, int fullc, int cm, int flags) free(coord_stack); return created_something; } +#endif void Simulation::orbitalparts_get(int block1, int block2, int resblock1[], int resblock2[]) { diff --git a/src/simulation/Simulation.h b/src/simulation/Simulation.h index 647bfb7d2..2ff0361cd 100644 --- a/src/simulation/Simulation.h +++ b/src/simulation/Simulation.h @@ -1,5 +1,6 @@ #ifndef SIMULATION_H #define SIMULATION_H +#include "Config.h" #include #include @@ -13,7 +14,6 @@ #include "ElementDefs.h" #include "BuiltinGOL.h" #include "MenuSection.h" - #include "CoordStack.h" #include "Element.h" diff --git a/src/simulation/SimulationData.h b/src/simulation/SimulationData.h index 766969ffb..ce7a57872 100644 --- a/src/simulation/SimulationData.h +++ b/src/simulation/SimulationData.h @@ -1,5 +1,6 @@ #ifndef SIMULATIONDATA_H #define SIMULATIONDATA_H +#include "Config.h" #include #include diff --git a/src/simulation/ToolCommon.h b/src/simulation/ToolCommon.h index 6019afb60..1b38e7d9b 100644 --- a/src/simulation/ToolCommon.h +++ b/src/simulation/ToolCommon.h @@ -1,6 +1,8 @@ #ifndef SIMTOOLCOMMON_H #define SIMTOOLCOMMON_H +#include "Config.h" + #include "ToolClasses.h" #include "Simulation.h" #include "graphics/Renderer.h" diff --git a/src/simulation/ToolNumbers.h b/src/simulation/ToolNumbers.template.h similarity index 65% rename from src/simulation/ToolNumbers.h rename to src/simulation/ToolNumbers.template.h index 0d1d6cfa9..d964fa2f1 100644 --- a/src/simulation/ToolNumbers.h +++ b/src/simulation/ToolNumbers.template.h @@ -8,13 +8,6 @@ # define TOOL_DEFINE(name, id) constexpr int TOOL_ ## name = id #endif -TOOL_DEFINE(HEAT, 0); -TOOL_DEFINE(COOL, 1); -TOOL_DEFINE(AIR, 2); -TOOL_DEFINE(VAC, 3); -TOOL_DEFINE(PGRV, 4); -TOOL_DEFINE(NGRV, 5); -TOOL_DEFINE(MIX, 6); -TOOL_DEFINE(CYCL, 7); +@tool_defs@ #undef TOOL_DEFINE diff --git a/src/simulation/elements/meson.build b/src/simulation/elements/meson.build new file mode 100644 index 000000000..9f981eea6 --- /dev/null +++ b/src/simulation/elements/meson.build @@ -0,0 +1,199 @@ +simulation_elem_ids = [ + [ 'NONE', 0 ], + [ 'DUST', 1 ], + [ 'WATR', 2 ], + [ 'OIL', 3 ], + [ 'FIRE', 4 ], + [ 'STNE', 5 ], + [ 'LAVA', 6 ], + [ 'GUNP', 7 ], + [ 'NITR', 8 ], + [ 'CLNE', 9 ], + [ 'GAS', 10 ], + [ 'PLEX', 11 ], + [ 'GOO', 12 ], + [ 'ICEI', 13 ], + [ 'METL', 14 ], + [ 'SPRK', 15 ], + [ 'SNOW', 16 ], + [ 'WOOD', 17 ], + [ 'NEUT', 18 ], + [ 'PLUT', 19 ], + [ 'PLNT', 20 ], + [ 'ACID', 21 ], + [ 'VOID', 22 ], + [ 'WTRV', 23 ], + [ 'CNCT', 24 ], + [ 'DSTW', 25 ], + [ 'SALT', 26 ], + [ 'SLTW', 27 ], + [ 'DMND', 28 ], + [ 'BMTL', 29 ], + [ 'BRMT', 30 ], + [ 'PHOT', 31 ], + [ 'URAN', 32 ], + [ 'WAX', 33 ], + [ 'MWAX', 34 ], + [ 'PSCN', 35 ], + [ 'NSCN', 36 ], + [ 'LNTG', 37 ], + [ 'INSL', 38 ], + [ 'BHOL', 39 ], + [ 'WHOL', 40 ], + [ 'RBDM', 41 ], + [ 'LRBD', 42 ], + [ 'NTCT', 43 ], + [ 'SAND', 44 ], + [ 'GLAS', 45 ], + [ 'PTCT', 46 ], + [ 'BGLA', 47 ], + [ 'THDR', 48 ], + [ 'PLSM', 49 ], + [ 'ETRD', 50 ], + [ 'NICE', 51 ], + [ 'NBLE', 52 ], + [ 'BTRY', 53 ], + [ 'LCRY', 54 ], + [ 'STKM', 55 ], + [ 'SWCH', 56 ], + [ 'SMKE', 57 ], + [ 'DESL', 58 ], + [ 'COAL', 59 ], + [ 'LO2', 60 ], + [ 'O2', 61 ], + [ 'INWR', 62 ], + [ 'YEST', 63 ], + [ 'DYST', 64 ], + [ 'THRM', 65 ], + [ 'GLOW', 66 ], + [ 'BRCK', 67 ], + [ 'CFLM', 68 ], + [ 'FIRW', 69 ], + [ 'FUSE', 70 ], + [ 'FSEP', 71 ], + [ 'AMTR', 72 ], + [ 'BCOL', 73 ], + [ 'PCLN', 74 ], + [ 'HSWC', 75 ], + [ 'IRON', 76 ], + [ 'MORT', 77 ], + [ 'LIFE', 78 ], + [ 'DLAY', 79 ], + [ 'CO2', 80 ], + [ 'DRIC', 81 ], + [ 'CBNW', 82 ], + [ 'STOR', 83 ], + [ 'PVOD', 84 ], + [ 'CONV', 85 ], + [ 'CAUS', 86 ], + [ 'LIGH', 87 ], + [ 'TESC', 88 ], + [ 'DEST', 89 ], + [ 'SPNG', 90 ], + [ 'RIME', 91 ], + [ 'FOG', 92 ], + [ 'BCLN', 93 ], + [ 'LOVE', 94 ], + [ 'DEUT', 95 ], + [ 'WARP', 96 ], + [ 'PUMP', 97 ], + [ 'FWRK', 98 ], + [ 'PIPE', 99 ], + [ 'FRZZ', 100 ], + [ 'FRZW', 101 ], + [ 'GRAV', 102 ], + [ 'BIZR', 103 ], + [ 'BIZRG', 104 ], + [ 'BIZRS', 105 ], + [ 'INST', 106 ], + [ 'ISOZ', 107 ], + [ 'ISZS', 108 ], + [ 'PRTI', 109 ], + [ 'PRTO', 110 ], + [ 'PSTE', 111 ], + [ 'PSTS', 112 ], + [ 'ANAR', 113 ], + [ 'VINE', 114 ], + [ 'INVIS', 115 ], + [ 'E116', 116 ], + [ 'SPAWN2', 117 ], + [ 'SPAWN', 118 ], + [ 'SHLD1', 119 ], + [ 'SHLD2', 120 ], + [ 'SHLD3', 121 ], + [ 'SHLD4', 122 ], + [ 'LOLZ', 123 ], + [ 'WIFI', 124 ], + [ 'FILT', 125 ], + [ 'ARAY', 126 ], + [ 'BRAY', 127 ], + [ 'STKM2', 128 ], + [ 'BOMB', 129 ], + [ 'C5', 130 ], + [ 'SING', 131 ], + [ 'QRTZ', 132 ], + [ 'PQRT', 133 ], + [ 'EMP', 134 ], + [ 'BREC', 135 ], + [ 'ELEC', 136 ], + [ 'ACEL', 137 ], + [ 'DCEL', 138 ], + [ 'BANG', 139 ], + [ 'IGNT', 140 ], + [ 'BOYL', 141 ], + [ 'GEL', 142 ], + [ 'TRON', 143 ], + [ 'TTAN', 144 ], + [ 'EXOT', 145 ], + [ 'E146', 146 ], + [ 'EMBR', 147 ], + [ 'H2', 148 ], + [ 'SOAP', 149 ], + [ 'NBHL', 150 ], + [ 'NWHL', 151 ], + [ 'MERC', 152 ], + [ 'PBCN', 153 ], + [ 'GPMP', 154 ], + [ 'CLST', 155 ], + [ 'WIRE', 156 ], + [ 'GBMB', 157 ], + [ 'FIGH', 158 ], + [ 'FRAY', 159 ], + [ 'RPEL', 160 ], + [ 'PPIP', 161 ], + [ 'DTEC', 162 ], + [ 'DMG', 163 ], + [ 'TSNS', 164 ], + [ 'VIBR', 165 ], + [ 'BVBR', 166 ], + [ 'CRAY', 167 ], + [ 'PSTN', 168 ], + [ 'FRME', 169 ], + [ 'GOLD', 170 ], + [ 'TUNG', 171 ], + [ 'PSNS', 172 ], + [ 'PROT', 173 ], + [ 'VIRS', 174 ], + [ 'VRSS', 175 ], + [ 'VRSG', 176 ], + [ 'GRVT', 177 ], + [ 'DRAY', 178 ], + [ 'CRMC', 179 ], + [ 'HEAC', 180 ], + [ 'SAWD', 181 ], + [ 'POLO', 182 ], + [ 'RFRG', 183 ], + [ 'RFGL', 184 ], + [ 'LSNS', 185 ], + [ 'LDTC', 186 ], + [ 'SLCN', 187 ], + [ 'PTNM', 188 ], + [ 'VSNS', 189 ], + [ 'ROCK', 190 ], +] + +simulation_elem_src = [] +foreach elem_name_id : simulation_elem_ids + simulation_elem_src += elem_name_id[0] + '.cpp' +endforeach +simulation_files += files(simulation_elem_src) diff --git a/src/simulation/meson.build b/src/simulation/meson.build new file mode 100644 index 000000000..a81cc12ab --- /dev/null +++ b/src/simulation/meson.build @@ -0,0 +1,20 @@ +simulation_files = files( + 'Air.cpp', + 'Element.cpp', + 'ElementClasses.cpp', + 'GOLString.cpp', + 'Gravity.cpp', + 'Particle.cpp', + 'SaveRenderer.cpp', + 'Sign.cpp', + 'SimTool.cpp', + 'SimulationData.cpp', + 'ToolClasses.cpp', + 'Simulation.cpp', +) + +subdir('elements') +subdir('simtools') + +powder_files += simulation_files +render_files += simulation_files diff --git a/src/simulation/simtools/meson.build b/src/simulation/simtools/meson.build new file mode 100644 index 000000000..a0c49db1b --- /dev/null +++ b/src/simulation/simtools/meson.build @@ -0,0 +1,16 @@ +simulation_tool_ids = [ + [ 'HEAT', 0 ], + [ 'COOL', 1 ], + [ 'AIR', 2 ], + [ 'VAC', 3 ], + [ 'PGRV', 4 ], + [ 'NGRV', 5 ], + [ 'MIX', 6 ], + [ 'CYCL', 7 ], +] + +simulation_tool_src = [] +foreach tool_name_id : simulation_tool_ids + simulation_tool_src += tool_name_id[0] + '.cpp' +endforeach +simulation_files += files(simulation_tool_src) diff --git a/src/tasks/Task.h b/src/tasks/Task.h index ae4abb769..7398bc6c9 100644 --- a/src/tasks/Task.h +++ b/src/tasks/Task.h @@ -1,5 +1,6 @@ #ifndef TASK_H_ #define TASK_H_ +#include "Config.h" #include "common/String.h" #include diff --git a/src/tasks/meson.build b/src/tasks/meson.build new file mode 100644 index 000000000..99ba36f2e --- /dev/null +++ b/src/tasks/meson.build @@ -0,0 +1,5 @@ +powder_files += files( + 'AbandonableTask.cpp', + 'Task.cpp', + 'TaskWindow.cpp', +) diff --git a/subprojects/.gitignore b/subprojects/.gitignore new file mode 100644 index 000000000..b51f0953d --- /dev/null +++ b/subprojects/.gitignore @@ -0,0 +1,2 @@ +tpt-libs-prebuilt-*/ +packagecache/ diff --git a/subprojects/tpt-bzip2/LICENSE b/subprojects/tpt-bzip2/LICENSE new file mode 100644 index 000000000..81a37eab7 --- /dev/null +++ b/subprojects/tpt-bzip2/LICENSE @@ -0,0 +1,42 @@ + +-------------------------------------------------------------------------- + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2019 Julian R Seward. All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Julian Seward, jseward@acm.org +bzip2/libbzip2 version 1.0.8 of 13 July 2019 + +-------------------------------------------------------------------------- diff --git a/subprojects/tpt-bzip2/Makefile b/subprojects/tpt-bzip2/Makefile new file mode 100644 index 000000000..f8a17722e --- /dev/null +++ b/subprojects/tpt-bzip2/Makefile @@ -0,0 +1,217 @@ +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.8 of 13 July 2019 +# Copyright (C) 1996-2019 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ------------------------------------------------------------------ + +SHELL=/bin/sh + +# To assist in cross-compiling +CC=gcc +AR=ar +RANLIB=ranlib +LDFLAGS= + +BIGFILES=-D_FILE_OFFSET_BITS=64 +CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) + +# Where you want it installed when you do 'make install' +PREFIX=/usr/local + + +OBJS= blocksort.o \ + huffman.o \ + crctable.o \ + randtable.o \ + compress.o \ + decompress.o \ + bzlib.o + +all: libbz2.a bzip2 bzip2recover test + +bzip2: libbz2.a bzip2.o + $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 + +bzip2recover: bzip2recover.o + $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o + +libbz2.a: $(OBJS) + rm -f libbz2.a + $(AR) cq libbz2.a $(OBJS) + @if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \ + -f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \ + echo $(RANLIB) libbz2.a ; \ + $(RANLIB) libbz2.a ; \ + fi + +check: test +test: bzip2 + @cat words1 + ./bzip2 -1 < sample1.ref > sample1.rb2 + ./bzip2 -2 < sample2.ref > sample2.rb2 + ./bzip2 -3 < sample3.ref > sample3.rb2 + ./bzip2 -d < sample1.bz2 > sample1.tst + ./bzip2 -d < sample2.bz2 > sample2.tst + ./bzip2 -ds < sample3.bz2 > sample3.tst + cmp sample1.bz2 sample1.rb2 + cmp sample2.bz2 sample2.rb2 + cmp sample3.bz2 sample3.rb2 + cmp sample1.tst sample1.ref + cmp sample2.tst sample2.ref + cmp sample3.tst sample3.ref + @cat words3 + +install: bzip2 bzip2recover + if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi + if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi + if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi + if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi + if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi + cp -f bzip2 $(PREFIX)/bin/bzip2 + cp -f bzip2 $(PREFIX)/bin/bunzip2 + cp -f bzip2 $(PREFIX)/bin/bzcat + cp -f bzip2recover $(PREFIX)/bin/bzip2recover + chmod a+x $(PREFIX)/bin/bzip2 + chmod a+x $(PREFIX)/bin/bunzip2 + chmod a+x $(PREFIX)/bin/bzcat + chmod a+x $(PREFIX)/bin/bzip2recover + cp -f bzip2.1 $(PREFIX)/man/man1 + chmod a+r $(PREFIX)/man/man1/bzip2.1 + cp -f bzlib.h $(PREFIX)/include + chmod a+r $(PREFIX)/include/bzlib.h + cp -f libbz2.a $(PREFIX)/lib + chmod a+r $(PREFIX)/lib/libbz2.a + cp -f bzgrep $(PREFIX)/bin/bzgrep + ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep + ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep + chmod a+x $(PREFIX)/bin/bzgrep + cp -f bzmore $(PREFIX)/bin/bzmore + ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless + chmod a+x $(PREFIX)/bin/bzmore + cp -f bzdiff $(PREFIX)/bin/bzdiff + ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp + chmod a+x $(PREFIX)/bin/bzdiff + cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1 + chmod a+r $(PREFIX)/man/man1/bzgrep.1 + chmod a+r $(PREFIX)/man/man1/bzmore.1 + chmod a+r $(PREFIX)/man/man1/bzdiff.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1 + echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1 + echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1 + +clean: + rm -f *.o libbz2.a bzip2 bzip2recover \ + sample1.rb2 sample2.rb2 sample3.rb2 \ + sample1.tst sample2.tst sample3.tst + +blocksort.o: blocksort.c + @cat words0 + $(CC) $(CFLAGS) -c blocksort.c +huffman.o: huffman.c + $(CC) $(CFLAGS) -c huffman.c +crctable.o: crctable.c + $(CC) $(CFLAGS) -c crctable.c +randtable.o: randtable.c + $(CC) $(CFLAGS) -c randtable.c +compress.o: compress.c + $(CC) $(CFLAGS) -c compress.c +decompress.o: decompress.c + $(CC) $(CFLAGS) -c decompress.c +bzlib.o: bzlib.c + $(CC) $(CFLAGS) -c bzlib.c +bzip2.o: bzip2.c + $(CC) $(CFLAGS) -c bzip2.c +bzip2recover.o: bzip2recover.c + $(CC) $(CFLAGS) -c bzip2recover.c + + +distclean: clean + rm -f manual.ps manual.html manual.pdf + +DISTNAME=bzip2-1.0.8 +dist: check manual + rm -f $(DISTNAME) + ln -s -f . $(DISTNAME) + tar cvf $(DISTNAME).tar \ + $(DISTNAME)/blocksort.c \ + $(DISTNAME)/huffman.c \ + $(DISTNAME)/crctable.c \ + $(DISTNAME)/randtable.c \ + $(DISTNAME)/compress.c \ + $(DISTNAME)/decompress.c \ + $(DISTNAME)/bzlib.c \ + $(DISTNAME)/bzip2.c \ + $(DISTNAME)/bzip2recover.c \ + $(DISTNAME)/bzlib.h \ + $(DISTNAME)/bzlib_private.h \ + $(DISTNAME)/Makefile \ + $(DISTNAME)/LICENSE \ + $(DISTNAME)/bzip2.1 \ + $(DISTNAME)/bzip2.1.preformatted \ + $(DISTNAME)/bzip2.txt \ + $(DISTNAME)/words0 \ + $(DISTNAME)/words1 \ + $(DISTNAME)/words2 \ + $(DISTNAME)/words3 \ + $(DISTNAME)/sample1.ref \ + $(DISTNAME)/sample2.ref \ + $(DISTNAME)/sample3.ref \ + $(DISTNAME)/sample1.bz2 \ + $(DISTNAME)/sample2.bz2 \ + $(DISTNAME)/sample3.bz2 \ + $(DISTNAME)/dlltest.c \ + $(DISTNAME)/manual.html \ + $(DISTNAME)/manual.pdf \ + $(DISTNAME)/manual.ps \ + $(DISTNAME)/README \ + $(DISTNAME)/README.COMPILATION.PROBLEMS \ + $(DISTNAME)/README.XML.STUFF \ + $(DISTNAME)/CHANGES \ + $(DISTNAME)/libbz2.def \ + $(DISTNAME)/libbz2.dsp \ + $(DISTNAME)/dlltest.dsp \ + $(DISTNAME)/makefile.msc \ + $(DISTNAME)/unzcrash.c \ + $(DISTNAME)/spewG.c \ + $(DISTNAME)/mk251.c \ + $(DISTNAME)/bzdiff \ + $(DISTNAME)/bzdiff.1 \ + $(DISTNAME)/bzmore \ + $(DISTNAME)/bzmore.1 \ + $(DISTNAME)/bzgrep \ + $(DISTNAME)/bzgrep.1 \ + $(DISTNAME)/Makefile-libbz2_so \ + $(DISTNAME)/bz-common.xsl \ + $(DISTNAME)/bz-fo.xsl \ + $(DISTNAME)/bz-html.xsl \ + $(DISTNAME)/bzip.css \ + $(DISTNAME)/entities.xml \ + $(DISTNAME)/manual.xml \ + $(DISTNAME)/format.pl \ + $(DISTNAME)/xmlproc.sh + gzip -v $(DISTNAME).tar + +# For rebuilding the manual from sources on my SuSE 9.1 box + +MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \ + entities.xml manual.xml + +manual: manual.html manual.ps manual.pdf + +manual.ps: $(MANUAL_SRCS) + ./xmlproc.sh -ps manual.xml + +manual.pdf: $(MANUAL_SRCS) + ./xmlproc.sh -pdf manual.xml + +manual.html: $(MANUAL_SRCS) + ./xmlproc.sh -html manual.xml diff --git a/subprojects/tpt-bzip2/include/bzlib.h b/subprojects/tpt-bzip2/include/bzlib.h new file mode 100644 index 000000000..8966a6c58 --- /dev/null +++ b/subprojects/tpt-bzip2/include/bzlib.h @@ -0,0 +1,282 @@ + +/*-------------------------------------------------------------*/ +/*--- Public header file for the library. ---*/ +/*--- bzlib.h ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#ifndef _BZLIB_H +#define _BZLIB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define BZ_RUN 0 +#define BZ_FLUSH 1 +#define BZ_FINISH 2 + +#define BZ_OK 0 +#define BZ_RUN_OK 1 +#define BZ_FLUSH_OK 2 +#define BZ_FINISH_OK 3 +#define BZ_STREAM_END 4 +#define BZ_SEQUENCE_ERROR (-1) +#define BZ_PARAM_ERROR (-2) +#define BZ_MEM_ERROR (-3) +#define BZ_DATA_ERROR (-4) +#define BZ_DATA_ERROR_MAGIC (-5) +#define BZ_IO_ERROR (-6) +#define BZ_UNEXPECTED_EOF (-7) +#define BZ_OUTBUFF_FULL (-8) +#define BZ_CONFIG_ERROR (-9) + +typedef + struct { + char *next_in; + unsigned int avail_in; + unsigned int total_in_lo32; + unsigned int total_in_hi32; + + char *next_out; + unsigned int avail_out; + unsigned int total_out_lo32; + unsigned int total_out_hi32; + + void *state; + + void *(*bzalloc)(void *,int,int); + void (*bzfree)(void *,void *); + void *opaque; + } + bz_stream; + + +#ifndef BZ_IMPORT +#define BZ_EXPORT +#endif + +#ifndef BZ_NO_STDIO +/* Need a definitition for FILE */ +#include +#endif + +#ifdef _WIN32 +# include +# ifdef small + /* windows.h define small to char */ +# undef small +# endif +# ifdef BZ_EXPORT +# define BZ_API(func) WINAPI func +# define BZ_EXTERN extern +# else + /* import windows dll dynamically */ +# define BZ_API(func) (WINAPI * func) +# define BZ_EXTERN +# endif +#else +# define BZ_API(func) func +# define BZ_EXTERN extern +#endif + + +/*-- Core (low-level) library functions --*/ + +BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( + bz_stream* strm, + int blockSize100k, + int verbosity, + int workFactor + ); + +BZ_EXTERN int BZ_API(BZ2_bzCompress) ( + bz_stream* strm, + int action + ); + +BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( + bz_stream* strm + ); + +BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( + bz_stream *strm, + int verbosity, + int small + ); + +BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( + bz_stream* strm + ); + +BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( + bz_stream *strm + ); + + + +/*-- High(er) level library functions --*/ + +#ifndef BZ_NO_STDIO +#define BZ_MAX_UNUSED 5000 + +typedef void BZFILE; + +BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( + int* bzerror, + FILE* f, + int verbosity, + int small, + void* unused, + int nUnused + ); + +BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( + int* bzerror, + BZFILE* b + ); + +BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( + int* bzerror, + BZFILE* b, + void** unused, + int* nUnused + ); + +BZ_EXTERN int BZ_API(BZ2_bzRead) ( + int* bzerror, + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( + int* bzerror, + FILE* f, + int blockSize100k, + int verbosity, + int workFactor + ); + +BZ_EXTERN void BZ_API(BZ2_bzWrite) ( + int* bzerror, + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( + int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in, + unsigned int* nbytes_out + ); + +BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( + int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in_lo32, + unsigned int* nbytes_in_hi32, + unsigned int* nbytes_out_lo32, + unsigned int* nbytes_out_hi32 + ); +#endif + + +/*-- Utility functions --*/ + +BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( + char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int blockSize100k, + int verbosity, + int workFactor + ); + +BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( + char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int small, + int verbosity + ); + + +/*-- + Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) + to support better zlib compatibility. + This code is not _officially_ part of libbzip2 (yet); + I haven't tested it, documented it, or considered the + threading-safeness of it. + If this code breaks, please contact both Yoshioka and me. +--*/ + +BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( + void + ); + +#ifndef BZ_NO_STDIO +BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( + const char *path, + const char *mode + ); + +BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( + int fd, + const char *mode + ); + +BZ_EXTERN int BZ_API(BZ2_bzread) ( + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN int BZ_API(BZ2_bzwrite) ( + BZFILE* b, + void* buf, + int len + ); + +BZ_EXTERN int BZ_API(BZ2_bzflush) ( + BZFILE* b + ); + +BZ_EXTERN void BZ_API(BZ2_bzclose) ( + BZFILE* b + ); + +BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( + BZFILE *b, + int *errnum + ); +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +/*-------------------------------------------------------------*/ +/*--- end bzlib.h ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/meson.build b/subprojects/tpt-bzip2/meson.build new file mode 100644 index 000000000..28e2b183c --- /dev/null +++ b/subprojects/tpt-bzip2/meson.build @@ -0,0 +1,14 @@ +project('tpt-bzip2', 'c') + +subdir('src') + +bzip2_inc = include_directories('include') +bzip2_sta = static_library( + 'bzip2', + sources: bzip2_src, + include_directories: bzip2_inc, +) +bzip2_dep = declare_dependency( + link_with: bzip2_sta, + include_directories: bzip2_inc, +) diff --git a/subprojects/tpt-bzip2/src/blocksort.c b/subprojects/tpt-bzip2/src/blocksort.c new file mode 100644 index 000000000..92d81fe28 --- /dev/null +++ b/subprojects/tpt-bzip2/src/blocksort.c @@ -0,0 +1,1094 @@ + +/*-------------------------------------------------------------*/ +/*--- Block sorting machinery ---*/ +/*--- blocksort.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + +/*---------------------------------------------*/ +/*--- Fallback O(N log(N)^2) sorting ---*/ +/*--- algorithm, for repetitive blocks ---*/ +/*---------------------------------------------*/ + +/*---------------------------------------------*/ +static +__inline__ +void fallbackSimpleSort ( UInt32* fmap, + UInt32* eclass, + Int32 lo, + Int32 hi ) +{ + Int32 i, j, tmp; + UInt32 ec_tmp; + + if (lo == hi) return; + + if (hi - lo > 3) { + for ( i = hi-4; i >= lo; i-- ) { + tmp = fmap[i]; + ec_tmp = eclass[tmp]; + for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) + fmap[j-4] = fmap[j]; + fmap[j-4] = tmp; + } + } + + for ( i = hi-1; i >= lo; i-- ) { + tmp = fmap[i]; + ec_tmp = eclass[tmp]; + for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) + fmap[j-1] = fmap[j]; + fmap[j-1] = tmp; + } +} + + +/*---------------------------------------------*/ +#define fswap(zz1, zz2) \ + { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } + +#define fvswap(zzp1, zzp2, zzn) \ +{ \ + Int32 yyp1 = (zzp1); \ + Int32 yyp2 = (zzp2); \ + Int32 yyn = (zzn); \ + while (yyn > 0) { \ + fswap(fmap[yyp1], fmap[yyp2]); \ + yyp1++; yyp2++; yyn--; \ + } \ +} + + +#define fmin(a,b) ((a) < (b)) ? (a) : (b) + +#define fpush(lz,hz) { stackLo[sp] = lz; \ + stackHi[sp] = hz; \ + sp++; } + +#define fpop(lz,hz) { sp--; \ + lz = stackLo[sp]; \ + hz = stackHi[sp]; } + +#define FALLBACK_QSORT_SMALL_THRESH 10 +#define FALLBACK_QSORT_STACK_SIZE 100 + + +static +void fallbackQSort3 ( UInt32* fmap, + UInt32* eclass, + Int32 loSt, + Int32 hiSt ) +{ + Int32 unLo, unHi, ltLo, gtHi, n, m; + Int32 sp, lo, hi; + UInt32 med, r, r3; + Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; + Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; + + r = 0; + + sp = 0; + fpush ( loSt, hiSt ); + + while (sp > 0) { + + AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 ); + + fpop ( lo, hi ); + if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { + fallbackSimpleSort ( fmap, eclass, lo, hi ); + continue; + } + + /* Random partitioning. Median of 3 sometimes fails to + avoid bad cases. Median of 9 seems to help but + looks rather expensive. This too seems to work but + is cheaper. Guidance for the magic constants + 7621 and 32768 is taken from Sedgewick's algorithms + book, chapter 35. + */ + r = ((r * 7621) + 1) % 32768; + r3 = r % 3; + if (r3 == 0) med = eclass[fmap[lo]]; else + if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else + med = eclass[fmap[hi]]; + + unLo = ltLo = lo; + unHi = gtHi = hi; + + while (1) { + while (1) { + if (unLo > unHi) break; + n = (Int32)eclass[fmap[unLo]] - (Int32)med; + if (n == 0) { + fswap(fmap[unLo], fmap[ltLo]); + ltLo++; unLo++; + continue; + }; + if (n > 0) break; + unLo++; + } + while (1) { + if (unLo > unHi) break; + n = (Int32)eclass[fmap[unHi]] - (Int32)med; + if (n == 0) { + fswap(fmap[unHi], fmap[gtHi]); + gtHi--; unHi--; + continue; + }; + if (n < 0) break; + unHi--; + } + if (unLo > unHi) break; + fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; + } + + AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); + + if (gtHi < ltLo) continue; + + n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); + m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); + + n = lo + unLo - ltLo - 1; + m = hi - (gtHi - unHi) + 1; + + if (n - lo > hi - m) { + fpush ( lo, n ); + fpush ( m, hi ); + } else { + fpush ( m, hi ); + fpush ( lo, n ); + } + } +} + +#undef fmin +#undef fpush +#undef fpop +#undef fswap +#undef fvswap +#undef FALLBACK_QSORT_SMALL_THRESH +#undef FALLBACK_QSORT_STACK_SIZE + + +/*---------------------------------------------*/ +/* Pre: + nblock > 0 + eclass exists for [0 .. nblock-1] + ((UChar*)eclass) [0 .. nblock-1] holds block + ptr exists for [0 .. nblock-1] + + Post: + ((UChar*)eclass) [0 .. nblock-1] holds block + All other areas of eclass destroyed + fmap [0 .. nblock-1] holds sorted order + bhtab [ 0 .. 2+(nblock/32) ] destroyed +*/ + +#define SET_BH(zz) bhtab[(zz) >> 5] |= ((UInt32)1 << ((zz) & 31)) +#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~((UInt32)1 << ((zz) & 31)) +#define ISSET_BH(zz) (bhtab[(zz) >> 5] & ((UInt32)1 << ((zz) & 31))) +#define WORD_BH(zz) bhtab[(zz) >> 5] +#define UNALIGNED_BH(zz) ((zz) & 0x01f) + +static +void fallbackSort ( UInt32* fmap, + UInt32* eclass, + UInt32* bhtab, + Int32 nblock, + Int32 verb ) +{ + Int32 ftab[257]; + Int32 ftabCopy[256]; + Int32 H, i, j, k, l, r, cc, cc1; + Int32 nNotDone; + Int32 nBhtab; + UChar* eclass8 = (UChar*)eclass; + + /*-- + Initial 1-char radix sort to generate + initial fmap and initial BH bits. + --*/ + if (verb >= 4) + VPrintf0 ( " bucket sorting ...\n" ); + for (i = 0; i < 257; i++) ftab[i] = 0; + for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; + for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; + for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; + + for (i = 0; i < nblock; i++) { + j = eclass8[i]; + k = ftab[j] - 1; + ftab[j] = k; + fmap[k] = i; + } + + nBhtab = 2 + (nblock / 32); + for (i = 0; i < nBhtab; i++) bhtab[i] = 0; + for (i = 0; i < 256; i++) SET_BH(ftab[i]); + + /*-- + Inductively refine the buckets. Kind-of an + "exponential radix sort" (!), inspired by the + Manber-Myers suffix array construction algorithm. + --*/ + + /*-- set sentinel bits for block-end detection --*/ + for (i = 0; i < 32; i++) { + SET_BH(nblock + 2*i); + CLEAR_BH(nblock + 2*i + 1); + } + + /*-- the log(N) loop --*/ + H = 1; + while (1) { + + if (verb >= 4) + VPrintf1 ( " depth %6d has ", H ); + + j = 0; + for (i = 0; i < nblock; i++) { + if (ISSET_BH(i)) j = i; + k = fmap[i] - H; if (k < 0) k += nblock; + eclass[k] = j; + } + + nNotDone = 0; + r = -1; + while (1) { + + /*-- find the next non-singleton bucket --*/ + k = r + 1; + while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; + if (ISSET_BH(k)) { + while (WORD_BH(k) == 0xffffffff) k += 32; + while (ISSET_BH(k)) k++; + } + l = k - 1; + if (l >= nblock) break; + while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; + if (!ISSET_BH(k)) { + while (WORD_BH(k) == 0x00000000) k += 32; + while (!ISSET_BH(k)) k++; + } + r = k - 1; + if (r >= nblock) break; + + /*-- now [l, r] bracket current bucket --*/ + if (r > l) { + nNotDone += (r - l + 1); + fallbackQSort3 ( fmap, eclass, l, r ); + + /*-- scan bucket and generate header bits-- */ + cc = -1; + for (i = l; i <= r; i++) { + cc1 = eclass[fmap[i]]; + if (cc != cc1) { SET_BH(i); cc = cc1; }; + } + } + } + + if (verb >= 4) + VPrintf1 ( "%6d unresolved strings\n", nNotDone ); + + H *= 2; + if (H > nblock || nNotDone == 0) break; + } + + /*-- + Reconstruct the original block in + eclass8 [0 .. nblock-1], since the + previous phase destroyed it. + --*/ + if (verb >= 4) + VPrintf0 ( " reconstructing block ...\n" ); + j = 0; + for (i = 0; i < nblock; i++) { + while (ftabCopy[j] == 0) j++; + ftabCopy[j]--; + eclass8[fmap[i]] = (UChar)j; + } + AssertH ( j < 256, 1005 ); +} + +#undef SET_BH +#undef CLEAR_BH +#undef ISSET_BH +#undef WORD_BH +#undef UNALIGNED_BH + + +/*---------------------------------------------*/ +/*--- The main, O(N^2 log(N)) sorting ---*/ +/*--- algorithm. Faster for "normal" ---*/ +/*--- non-repetitive blocks. ---*/ +/*---------------------------------------------*/ + +/*---------------------------------------------*/ +static +__inline__ +Bool mainGtU ( UInt32 i1, + UInt32 i2, + UChar* block, + UInt16* quadrant, + UInt32 nblock, + Int32* budget ) +{ + Int32 k; + UChar c1, c2; + UInt16 s1, s2; + + AssertD ( i1 != i2, "mainGtU" ); + /* 1 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 2 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 3 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 4 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 5 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 6 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 7 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 8 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 9 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 10 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 11 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + /* 12 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + i1++; i2++; + + k = nblock + 8; + + do { + /* 1 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 2 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 3 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 4 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 5 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 6 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 7 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + /* 8 */ + c1 = block[i1]; c2 = block[i2]; + if (c1 != c2) return (c1 > c2); + s1 = quadrant[i1]; s2 = quadrant[i2]; + if (s1 != s2) return (s1 > s2); + i1++; i2++; + + if (i1 >= nblock) i1 -= nblock; + if (i2 >= nblock) i2 -= nblock; + + k -= 8; + (*budget)--; + } + while (k >= 0); + + return False; +} + + +/*---------------------------------------------*/ +/*-- + Knuth's increments seem to work better + than Incerpi-Sedgewick here. Possibly + because the number of elems to sort is + usually small, typically <= 20. +--*/ +static +Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, + 9841, 29524, 88573, 265720, + 797161, 2391484 }; + +static +void mainSimpleSort ( UInt32* ptr, + UChar* block, + UInt16* quadrant, + Int32 nblock, + Int32 lo, + Int32 hi, + Int32 d, + Int32* budget ) +{ + Int32 i, j, h, bigN, hp; + UInt32 v; + + bigN = hi - lo + 1; + if (bigN < 2) return; + + hp = 0; + while (incs[hp] < bigN) hp++; + hp--; + + for (; hp >= 0; hp--) { + h = incs[hp]; + + i = lo + h; + while (True) { + + /*-- copy 1 --*/ + if (i > hi) break; + v = ptr[i]; + j = i; + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget + ) ) { + ptr[j] = ptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) break; + } + ptr[j] = v; + i++; + + /*-- copy 2 --*/ + if (i > hi) break; + v = ptr[i]; + j = i; + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget + ) ) { + ptr[j] = ptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) break; + } + ptr[j] = v; + i++; + + /*-- copy 3 --*/ + if (i > hi) break; + v = ptr[i]; + j = i; + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget + ) ) { + ptr[j] = ptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) break; + } + ptr[j] = v; + i++; + + if (*budget < 0) return; + } + } +} + + +/*---------------------------------------------*/ +/*-- + The following is an implementation of + an elegant 3-way quicksort for strings, + described in a paper "Fast Algorithms for + Sorting and Searching Strings", by Robert + Sedgewick and Jon L. Bentley. +--*/ + +#define mswap(zz1, zz2) \ + { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } + +#define mvswap(zzp1, zzp2, zzn) \ +{ \ + Int32 yyp1 = (zzp1); \ + Int32 yyp2 = (zzp2); \ + Int32 yyn = (zzn); \ + while (yyn > 0) { \ + mswap(ptr[yyp1], ptr[yyp2]); \ + yyp1++; yyp2++; yyn--; \ + } \ +} + +static +__inline__ +UChar mmed3 ( UChar a, UChar b, UChar c ) +{ + UChar t; + if (a > b) { t = a; a = b; b = t; }; + if (b > c) { + b = c; + if (a > b) b = a; + } + return b; +} + +#define mmin(a,b) ((a) < (b)) ? (a) : (b) + +#define mpush(lz,hz,dz) { stackLo[sp] = lz; \ + stackHi[sp] = hz; \ + stackD [sp] = dz; \ + sp++; } + +#define mpop(lz,hz,dz) { sp--; \ + lz = stackLo[sp]; \ + hz = stackHi[sp]; \ + dz = stackD [sp]; } + + +#define mnextsize(az) (nextHi[az]-nextLo[az]) + +#define mnextswap(az,bz) \ + { Int32 tz; \ + tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ + tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ + tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } + + +#define MAIN_QSORT_SMALL_THRESH 20 +#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) +#define MAIN_QSORT_STACK_SIZE 100 + +static +void mainQSort3 ( UInt32* ptr, + UChar* block, + UInt16* quadrant, + Int32 nblock, + Int32 loSt, + Int32 hiSt, + Int32 dSt, + Int32* budget ) +{ + Int32 unLo, unHi, ltLo, gtHi, n, m, med; + Int32 sp, lo, hi, d; + + Int32 stackLo[MAIN_QSORT_STACK_SIZE]; + Int32 stackHi[MAIN_QSORT_STACK_SIZE]; + Int32 stackD [MAIN_QSORT_STACK_SIZE]; + + Int32 nextLo[3]; + Int32 nextHi[3]; + Int32 nextD [3]; + + sp = 0; + mpush ( loSt, hiSt, dSt ); + + while (sp > 0) { + + AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 ); + + mpop ( lo, hi, d ); + if (hi - lo < MAIN_QSORT_SMALL_THRESH || + d > MAIN_QSORT_DEPTH_THRESH) { + mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); + if (*budget < 0) return; + continue; + } + + med = (Int32) + mmed3 ( block[ptr[ lo ]+d], + block[ptr[ hi ]+d], + block[ptr[ (lo+hi)>>1 ]+d] ); + + unLo = ltLo = lo; + unHi = gtHi = hi; + + while (True) { + while (True) { + if (unLo > unHi) break; + n = ((Int32)block[ptr[unLo]+d]) - med; + if (n == 0) { + mswap(ptr[unLo], ptr[ltLo]); + ltLo++; unLo++; continue; + }; + if (n > 0) break; + unLo++; + } + while (True) { + if (unLo > unHi) break; + n = ((Int32)block[ptr[unHi]+d]) - med; + if (n == 0) { + mswap(ptr[unHi], ptr[gtHi]); + gtHi--; unHi--; continue; + }; + if (n < 0) break; + unHi--; + } + if (unLo > unHi) break; + mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; + } + + AssertD ( unHi == unLo-1, "mainQSort3(2)" ); + + if (gtHi < ltLo) { + mpush(lo, hi, d+1 ); + continue; + } + + n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); + m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); + + n = lo + unLo - ltLo - 1; + m = hi - (gtHi - unHi) + 1; + + nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; + nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; + nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; + + if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); + if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); + if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); + + AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); + AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); + + mpush (nextLo[0], nextHi[0], nextD[0]); + mpush (nextLo[1], nextHi[1], nextD[1]); + mpush (nextLo[2], nextHi[2], nextD[2]); + } +} + +#undef mswap +#undef mvswap +#undef mpush +#undef mpop +#undef mmin +#undef mnextsize +#undef mnextswap +#undef MAIN_QSORT_SMALL_THRESH +#undef MAIN_QSORT_DEPTH_THRESH +#undef MAIN_QSORT_STACK_SIZE + + +/*---------------------------------------------*/ +/* Pre: + nblock > N_OVERSHOOT + block32 exists for [0 .. nblock-1 +N_OVERSHOOT] + ((UChar*)block32) [0 .. nblock-1] holds block + ptr exists for [0 .. nblock-1] + + Post: + ((UChar*)block32) [0 .. nblock-1] holds block + All other areas of block32 destroyed + ftab [0 .. 65536 ] destroyed + ptr [0 .. nblock-1] holds sorted order + if (*budget < 0), sorting was abandoned +*/ + +#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) +#define SETMASK (1 << 21) +#define CLEARMASK (~(SETMASK)) + +static +void mainSort ( UInt32* ptr, + UChar* block, + UInt16* quadrant, + UInt32* ftab, + Int32 nblock, + Int32 verb, + Int32* budget ) +{ + Int32 i, j, k, ss, sb; + Int32 runningOrder[256]; + Bool bigDone[256]; + Int32 copyStart[256]; + Int32 copyEnd [256]; + UChar c1; + Int32 numQSorted; + UInt16 s; + if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); + + /*-- set up the 2-byte frequency table --*/ + for (i = 65536; i >= 0; i--) ftab[i] = 0; + + j = block[0] << 8; + i = nblock-1; + for (; i >= 3; i -= 4) { + quadrant[i] = 0; + j = (j >> 8) | ( ((UInt16)block[i]) << 8); + ftab[j]++; + quadrant[i-1] = 0; + j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); + ftab[j]++; + quadrant[i-2] = 0; + j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); + ftab[j]++; + quadrant[i-3] = 0; + j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); + ftab[j]++; + } + for (; i >= 0; i--) { + quadrant[i] = 0; + j = (j >> 8) | ( ((UInt16)block[i]) << 8); + ftab[j]++; + } + + /*-- (emphasises close relationship of block & quadrant) --*/ + for (i = 0; i < BZ_N_OVERSHOOT; i++) { + block [nblock+i] = block[i]; + quadrant[nblock+i] = 0; + } + + if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); + + /*-- Complete the initial radix sort --*/ + for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; + + s = block[0] << 8; + i = nblock-1; + for (; i >= 3; i -= 4) { + s = (s >> 8) | (block[i] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i; + s = (s >> 8) | (block[i-1] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i-1; + s = (s >> 8) | (block[i-2] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i-2; + s = (s >> 8) | (block[i-3] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i-3; + } + for (; i >= 0; i--) { + s = (s >> 8) | (block[i] << 8); + j = ftab[s] -1; + ftab[s] = j; + ptr[j] = i; + } + + /*-- + Now ftab contains the first loc of every small bucket. + Calculate the running order, from smallest to largest + big bucket. + --*/ + for (i = 0; i <= 255; i++) { + bigDone [i] = False; + runningOrder[i] = i; + } + + { + Int32 vv; + Int32 h = 1; + do h = 3 * h + 1; while (h <= 256); + do { + h = h / 3; + for (i = h; i <= 255; i++) { + vv = runningOrder[i]; + j = i; + while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { + runningOrder[j] = runningOrder[j-h]; + j = j - h; + if (j <= (h - 1)) goto zero; + } + zero: + runningOrder[j] = vv; + } + } while (h != 1); + } + + /*-- + The main sorting loop. + --*/ + + numQSorted = 0; + + for (i = 0; i <= 255; i++) { + + /*-- + Process big buckets, starting with the least full. + Basically this is a 3-step process in which we call + mainQSort3 to sort the small buckets [ss, j], but + also make a big effort to avoid the calls if we can. + --*/ + ss = runningOrder[i]; + + /*-- + Step 1: + Complete the big bucket [ss] by quicksorting + any unsorted small buckets [ss, j], for j != ss. + Hopefully previous pointer-scanning phases have already + completed many of the small buckets [ss, j], so + we don't have to sort them at all. + --*/ + for (j = 0; j <= 255; j++) { + if (j != ss) { + sb = (ss << 8) + j; + if ( ! (ftab[sb] & SETMASK) ) { + Int32 lo = ftab[sb] & CLEARMASK; + Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; + if (hi > lo) { + if (verb >= 4) + VPrintf4 ( " qsort [0x%x, 0x%x] " + "done %d this %d\n", + ss, j, numQSorted, hi - lo + 1 ); + mainQSort3 ( + ptr, block, quadrant, nblock, + lo, hi, BZ_N_RADIX, budget + ); + numQSorted += (hi - lo + 1); + if (*budget < 0) return; + } + } + ftab[sb] |= SETMASK; + } + } + + AssertH ( !bigDone[ss], 1006 ); + + /*-- + Step 2: + Now scan this big bucket [ss] so as to synthesise the + sorted order for small buckets [t, ss] for all t, + including, magically, the bucket [ss,ss] too. + This will avoid doing Real Work in subsequent Step 1's. + --*/ + { + for (j = 0; j <= 255; j++) { + copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; + copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; + } + for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { + k = ptr[j]-1; if (k < 0) k += nblock; + c1 = block[k]; + if (!bigDone[c1]) + ptr[ copyStart[c1]++ ] = k; + } + for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { + k = ptr[j]-1; if (k < 0) k += nblock; + c1 = block[k]; + if (!bigDone[c1]) + ptr[ copyEnd[c1]-- ] = k; + } + } + + AssertH ( (copyStart[ss]-1 == copyEnd[ss]) + || + /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. + Necessity for this case is demonstrated by compressing + a sequence of approximately 48.5 million of character + 251; 1.0.0/1.0.1 will then die here. */ + (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), + 1007 ) + + for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; + + /*-- + Step 3: + The [ss] big bucket is now done. Record this fact, + and update the quadrant descriptors. Remember to + update quadrants in the overshoot area too, if + necessary. The "if (i < 255)" test merely skips + this updating for the last bucket processed, since + updating for the last bucket is pointless. + + The quadrant array provides a way to incrementally + cache sort orderings, as they appear, so as to + make subsequent comparisons in fullGtU() complete + faster. For repetitive blocks this makes a big + difference (but not big enough to be able to avoid + the fallback sorting mechanism, exponential radix sort). + + The precise meaning is: at all times: + + for 0 <= i < nblock and 0 <= j <= nblock + + if block[i] != block[j], + + then the relative values of quadrant[i] and + quadrant[j] are meaningless. + + else { + if quadrant[i] < quadrant[j] + then the string starting at i lexicographically + precedes the string starting at j + + else if quadrant[i] > quadrant[j] + then the string starting at j lexicographically + precedes the string starting at i + + else + the relative ordering of the strings starting + at i and j has not yet been determined. + } + --*/ + bigDone[ss] = True; + + if (i < 255) { + Int32 bbStart = ftab[ss << 8] & CLEARMASK; + Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; + Int32 shifts = 0; + + while ((bbSize >> shifts) > 65534) shifts++; + + for (j = bbSize-1; j >= 0; j--) { + Int32 a2update = ptr[bbStart + j]; + UInt16 qVal = (UInt16)(j >> shifts); + quadrant[a2update] = qVal; + if (a2update < BZ_N_OVERSHOOT) + quadrant[a2update + nblock] = qVal; + } + AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); + } + + } + + if (verb >= 4) + VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", + nblock, numQSorted, nblock - numQSorted ); +} + +#undef BIGFREQ +#undef SETMASK +#undef CLEARMASK + + +/*---------------------------------------------*/ +/* Pre: + nblock > 0 + arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] + ((UChar*)arr2) [0 .. nblock-1] holds block + arr1 exists for [0 .. nblock-1] + + Post: + ((UChar*)arr2) [0 .. nblock-1] holds block + All other areas of block destroyed + ftab [ 0 .. 65536 ] destroyed + arr1 [0 .. nblock-1] holds sorted order +*/ +void BZ2_blockSort ( EState* s ) +{ + UInt32* ptr = s->ptr; + UChar* block = s->block; + UInt32* ftab = s->ftab; + Int32 nblock = s->nblock; + Int32 verb = s->verbosity; + Int32 wfact = s->workFactor; + UInt16* quadrant; + Int32 budget; + Int32 budgetInit; + Int32 i; + + if (nblock < 10000) { + fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); + } else { + /* Calculate the location for quadrant, remembering to get + the alignment right. Assumes that &(block[0]) is at least + 2-byte aligned -- this should be ok since block is really + the first section of arr2. + */ + i = nblock+BZ_N_OVERSHOOT; + if (i & 1) i++; + quadrant = (UInt16*)(&(block[i])); + + /* (wfact-1) / 3 puts the default-factor-30 + transition point at very roughly the same place as + with v0.1 and v0.9.0. + Not that it particularly matters any more, since the + resulting compressed stream is now the same regardless + of whether or not we use the main sort or fallback sort. + */ + if (wfact < 1 ) wfact = 1; + if (wfact > 100) wfact = 100; + budgetInit = nblock * ((wfact-1) / 3); + budget = budgetInit; + + mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); + if (verb >= 3) + VPrintf3 ( " %d work, %d block, ratio %5.2f\n", + budgetInit - budget, + nblock, + (float)(budgetInit - budget) / + (float)(nblock==0 ? 1 : nblock) ); + if (budget < 0) { + if (verb >= 2) + VPrintf0 ( " too repetitive; using fallback" + " sorting algorithm\n" ); + fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); + } + } + + s->origPtr = -1; + for (i = 0; i < s->nblock; i++) + if (ptr[i] == 0) + { s->origPtr = i; break; }; + + AssertH( s->origPtr != -1, 1003 ); +} + + +/*-------------------------------------------------------------*/ +/*--- end blocksort.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/bzlib.c b/subprojects/tpt-bzip2/src/bzlib.c new file mode 100644 index 000000000..21786551b --- /dev/null +++ b/subprojects/tpt-bzip2/src/bzlib.c @@ -0,0 +1,1572 @@ + +/*-------------------------------------------------------------*/ +/*--- Library top-level functions. ---*/ +/*--- bzlib.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + +/* CHANGES + 0.9.0 -- original version. + 0.9.0a/b -- no changes in this file. + 0.9.0c -- made zero-length BZ_FLUSH work correctly in bzCompress(). + fixed bzWrite/bzRead to ignore zero-length requests. + fixed bzread to correctly handle read requests after EOF. + wrong parameter order in call to bzDecompressInit in + bzBuffToBuffDecompress. Fixed. +*/ + +#include "bzlib_private.h" + + +/*---------------------------------------------------*/ +/*--- Compression stuff ---*/ +/*---------------------------------------------------*/ + + +/*---------------------------------------------------*/ +#ifndef BZ_NO_STDIO +void BZ2_bz__AssertH__fail ( int errcode ) +{ + fprintf(stderr, + "\n\nbzip2/libbzip2: internal error number %d.\n" + "This is a bug in bzip2/libbzip2, %s.\n" + "Please report it to: bzip2-devel@sourceware.org. If this happened\n" + "when you were using some program which uses libbzip2 as a\n" + "component, you should also report this bug to the author(s)\n" + "of that program. Please make an effort to report this bug;\n" + "timely and accurate bug reports eventually lead to higher\n" + "quality software. Thanks.\n\n", + errcode, + BZ2_bzlibVersion() + ); + + if (errcode == 1007) { + fprintf(stderr, + "\n*** A special note about internal error number 1007 ***\n" + "\n" + "Experience suggests that a common cause of i.e. 1007\n" + "is unreliable memory or other hardware. The 1007 assertion\n" + "just happens to cross-check the results of huge numbers of\n" + "memory reads/writes, and so acts (unintendedly) as a stress\n" + "test of your memory system.\n" + "\n" + "I suggest the following: try compressing the file again,\n" + "possibly monitoring progress in detail with the -vv flag.\n" + "\n" + "* If the error cannot be reproduced, and/or happens at different\n" + " points in compression, you may have a flaky memory system.\n" + " Try a memory-test program. I have used Memtest86\n" + " (www.memtest86.com). At the time of writing it is free (GPLd).\n" + " Memtest86 tests memory much more thorougly than your BIOSs\n" + " power-on test, and may find failures that the BIOS doesn't.\n" + "\n" + "* If the error can be repeatably reproduced, this is a bug in\n" + " bzip2, and I would very much like to hear about it. Please\n" + " let me know, and, ideally, save a copy of the file causing the\n" + " problem -- without which I will be unable to investigate it.\n" + "\n" + ); + } + + exit(3); +} +#endif + + +/*---------------------------------------------------*/ +static +int bz_config_ok ( void ) +{ + if (sizeof(int) != 4) return 0; + if (sizeof(short) != 2) return 0; + if (sizeof(char) != 1) return 0; + return 1; +} + + +/*---------------------------------------------------*/ +static +void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) +{ + void* v = malloc ( items * size ); + return v; +} + +static +void default_bzfree ( void* opaque, void* addr ) +{ + if (addr != NULL) free ( addr ); +} + + +/*---------------------------------------------------*/ +static +void prepare_new_block ( EState* s ) +{ + Int32 i; + s->nblock = 0; + s->numZ = 0; + s->state_out_pos = 0; + BZ_INITIALISE_CRC ( s->blockCRC ); + for (i = 0; i < 256; i++) s->inUse[i] = False; + s->blockNo++; +} + + +/*---------------------------------------------------*/ +static +void init_RL ( EState* s ) +{ + s->state_in_ch = 256; + s->state_in_len = 0; +} + + +static +Bool isempty_RL ( EState* s ) +{ + if (s->state_in_ch < 256 && s->state_in_len > 0) + return False; else + return True; +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzCompressInit) + ( bz_stream* strm, + int blockSize100k, + int verbosity, + int workFactor ) +{ + Int32 n; + EState* s; + + if (!bz_config_ok()) return BZ_CONFIG_ERROR; + + if (strm == NULL || + blockSize100k < 1 || blockSize100k > 9 || + workFactor < 0 || workFactor > 250) + return BZ_PARAM_ERROR; + + if (workFactor == 0) workFactor = 30; + if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; + if (strm->bzfree == NULL) strm->bzfree = default_bzfree; + + s = BZALLOC( sizeof(EState) ); + if (s == NULL) return BZ_MEM_ERROR; + s->strm = strm; + + s->arr1 = NULL; + s->arr2 = NULL; + s->ftab = NULL; + + n = 100000 * blockSize100k; + s->arr1 = BZALLOC( n * sizeof(UInt32) ); + s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); + s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); + + if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { + if (s->arr1 != NULL) BZFREE(s->arr1); + if (s->arr2 != NULL) BZFREE(s->arr2); + if (s->ftab != NULL) BZFREE(s->ftab); + if (s != NULL) BZFREE(s); + return BZ_MEM_ERROR; + } + + s->blockNo = 0; + s->state = BZ_S_INPUT; + s->mode = BZ_M_RUNNING; + s->combinedCRC = 0; + s->blockSize100k = blockSize100k; + s->nblockMAX = 100000 * blockSize100k - 19; + s->verbosity = verbosity; + s->workFactor = workFactor; + + s->block = (UChar*)s->arr2; + s->mtfv = (UInt16*)s->arr1; + s->zbits = NULL; + s->ptr = (UInt32*)s->arr1; + + strm->state = s; + strm->total_in_lo32 = 0; + strm->total_in_hi32 = 0; + strm->total_out_lo32 = 0; + strm->total_out_hi32 = 0; + init_RL ( s ); + prepare_new_block ( s ); + return BZ_OK; +} + + +/*---------------------------------------------------*/ +static +void add_pair_to_block ( EState* s ) +{ + Int32 i; + UChar ch = (UChar)(s->state_in_ch); + for (i = 0; i < s->state_in_len; i++) { + BZ_UPDATE_CRC( s->blockCRC, ch ); + } + s->inUse[s->state_in_ch] = True; + switch (s->state_in_len) { + case 1: + s->block[s->nblock] = (UChar)ch; s->nblock++; + break; + case 2: + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + break; + case 3: + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + break; + default: + s->inUse[s->state_in_len-4] = True; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = (UChar)ch; s->nblock++; + s->block[s->nblock] = ((UChar)(s->state_in_len-4)); + s->nblock++; + break; + } +} + + +/*---------------------------------------------------*/ +static +void flush_RL ( EState* s ) +{ + if (s->state_in_ch < 256) add_pair_to_block ( s ); + init_RL ( s ); +} + + +/*---------------------------------------------------*/ +#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ +{ \ + UInt32 zchh = (UInt32)(zchh0); \ + /*-- fast track the common case --*/ \ + if (zchh != zs->state_in_ch && \ + zs->state_in_len == 1) { \ + UChar ch = (UChar)(zs->state_in_ch); \ + BZ_UPDATE_CRC( zs->blockCRC, ch ); \ + zs->inUse[zs->state_in_ch] = True; \ + zs->block[zs->nblock] = (UChar)ch; \ + zs->nblock++; \ + zs->state_in_ch = zchh; \ + } \ + else \ + /*-- general, uncommon cases --*/ \ + if (zchh != zs->state_in_ch || \ + zs->state_in_len == 255) { \ + if (zs->state_in_ch < 256) \ + add_pair_to_block ( zs ); \ + zs->state_in_ch = zchh; \ + zs->state_in_len = 1; \ + } else { \ + zs->state_in_len++; \ + } \ +} + + +/*---------------------------------------------------*/ +static +Bool copy_input_until_stop ( EState* s ) +{ + Bool progress_in = False; + + if (s->mode == BZ_M_RUNNING) { + + /*-- fast track the common case --*/ + while (True) { + /*-- block full? --*/ + if (s->nblock >= s->nblockMAX) break; + /*-- no input? --*/ + if (s->strm->avail_in == 0) break; + progress_in = True; + ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); + s->strm->next_in++; + s->strm->avail_in--; + s->strm->total_in_lo32++; + if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; + } + + } else { + + /*-- general, uncommon case --*/ + while (True) { + /*-- block full? --*/ + if (s->nblock >= s->nblockMAX) break; + /*-- no input? --*/ + if (s->strm->avail_in == 0) break; + /*-- flush/finish end? --*/ + if (s->avail_in_expect == 0) break; + progress_in = True; + ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); + s->strm->next_in++; + s->strm->avail_in--; + s->strm->total_in_lo32++; + if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; + s->avail_in_expect--; + } + } + return progress_in; +} + + +/*---------------------------------------------------*/ +static +Bool copy_output_until_stop ( EState* s ) +{ + Bool progress_out = False; + + while (True) { + + /*-- no output space? --*/ + if (s->strm->avail_out == 0) break; + + /*-- block done? --*/ + if (s->state_out_pos >= s->numZ) break; + + progress_out = True; + *(s->strm->next_out) = s->zbits[s->state_out_pos]; + s->state_out_pos++; + s->strm->avail_out--; + s->strm->next_out++; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + return progress_out; +} + + +/*---------------------------------------------------*/ +static +Bool handle_compress ( bz_stream* strm ) +{ + Bool progress_in = False; + Bool progress_out = False; + EState* s = strm->state; + + while (True) { + + if (s->state == BZ_S_OUTPUT) { + progress_out |= copy_output_until_stop ( s ); + if (s->state_out_pos < s->numZ) break; + if (s->mode == BZ_M_FINISHING && + s->avail_in_expect == 0 && + isempty_RL(s)) break; + prepare_new_block ( s ); + s->state = BZ_S_INPUT; + if (s->mode == BZ_M_FLUSHING && + s->avail_in_expect == 0 && + isempty_RL(s)) break; + } + + if (s->state == BZ_S_INPUT) { + progress_in |= copy_input_until_stop ( s ); + if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { + flush_RL ( s ); + BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); + s->state = BZ_S_OUTPUT; + } + else + if (s->nblock >= s->nblockMAX) { + BZ2_compressBlock ( s, False ); + s->state = BZ_S_OUTPUT; + } + else + if (s->strm->avail_in == 0) { + break; + } + } + + } + + return progress_in || progress_out; +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) +{ + Bool progress; + EState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + preswitch: + switch (s->mode) { + + case BZ_M_IDLE: + return BZ_SEQUENCE_ERROR; + + case BZ_M_RUNNING: + if (action == BZ_RUN) { + progress = handle_compress ( strm ); + return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; + } + else + if (action == BZ_FLUSH) { + s->avail_in_expect = strm->avail_in; + s->mode = BZ_M_FLUSHING; + goto preswitch; + } + else + if (action == BZ_FINISH) { + s->avail_in_expect = strm->avail_in; + s->mode = BZ_M_FINISHING; + goto preswitch; + } + else + return BZ_PARAM_ERROR; + + case BZ_M_FLUSHING: + if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; + if (s->avail_in_expect != s->strm->avail_in) + return BZ_SEQUENCE_ERROR; + progress = handle_compress ( strm ); + if (s->avail_in_expect > 0 || !isempty_RL(s) || + s->state_out_pos < s->numZ) return BZ_FLUSH_OK; + s->mode = BZ_M_RUNNING; + return BZ_RUN_OK; + + case BZ_M_FINISHING: + if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; + if (s->avail_in_expect != s->strm->avail_in) + return BZ_SEQUENCE_ERROR; + progress = handle_compress ( strm ); + if (!progress) return BZ_SEQUENCE_ERROR; + if (s->avail_in_expect > 0 || !isempty_RL(s) || + s->state_out_pos < s->numZ) return BZ_FINISH_OK; + s->mode = BZ_M_IDLE; + return BZ_STREAM_END; + } + return BZ_OK; /*--not reached--*/ +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) +{ + EState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + if (s->arr1 != NULL) BZFREE(s->arr1); + if (s->arr2 != NULL) BZFREE(s->arr2); + if (s->ftab != NULL) BZFREE(s->ftab); + BZFREE(strm->state); + + strm->state = NULL; + + return BZ_OK; +} + + +/*---------------------------------------------------*/ +/*--- Decompression stuff ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzDecompressInit) + ( bz_stream* strm, + int verbosity, + int small ) +{ + DState* s; + + if (!bz_config_ok()) return BZ_CONFIG_ERROR; + + if (strm == NULL) return BZ_PARAM_ERROR; + if (small != 0 && small != 1) return BZ_PARAM_ERROR; + if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; + + if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; + if (strm->bzfree == NULL) strm->bzfree = default_bzfree; + + s = BZALLOC( sizeof(DState) ); + if (s == NULL) return BZ_MEM_ERROR; + s->strm = strm; + strm->state = s; + s->state = BZ_X_MAGIC_1; + s->bsLive = 0; + s->bsBuff = 0; + s->calculatedCombinedCRC = 0; + strm->total_in_lo32 = 0; + strm->total_in_hi32 = 0; + strm->total_out_lo32 = 0; + strm->total_out_hi32 = 0; + s->smallDecompress = (Bool)small; + s->ll4 = NULL; + s->ll16 = NULL; + s->tt = NULL; + s->currBlockNo = 0; + s->verbosity = verbosity; + + return BZ_OK; +} + + +/*---------------------------------------------------*/ +/* Return True iff data corruption is discovered. + Returns False if there is no problem. +*/ +static +Bool unRLE_obuf_to_output_FAST ( DState* s ) +{ + UChar k1; + + if (s->blockRandomised) { + + while (True) { + /* try to finish existing run */ + while (True) { + if (s->strm->avail_out == 0) return False; + if (s->state_out_len == 0) break; + *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; + BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); + s->state_out_len--; + s->strm->next_out++; + s->strm->avail_out--; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + /* can a new run be started? */ + if (s->nblock_used == s->save_nblock+1) return False; + + /* Only caused by corrupt data stream? */ + if (s->nblock_used > s->save_nblock+1) + return True; + + s->state_out_len = 1; + s->state_out_ch = s->k0; + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 2; + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 3; + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + s->state_out_len = ((Int32)k1) + 4; + BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; + s->k0 ^= BZ_RAND_MASK; s->nblock_used++; + } + + } else { + + /* restore */ + UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; + UChar c_state_out_ch = s->state_out_ch; + Int32 c_state_out_len = s->state_out_len; + Int32 c_nblock_used = s->nblock_used; + Int32 c_k0 = s->k0; + UInt32* c_tt = s->tt; + UInt32 c_tPos = s->tPos; + char* cs_next_out = s->strm->next_out; + unsigned int cs_avail_out = s->strm->avail_out; + Int32 ro_blockSize100k = s->blockSize100k; + /* end restore */ + + UInt32 avail_out_INIT = cs_avail_out; + Int32 s_save_nblockPP = s->save_nblock+1; + unsigned int total_out_lo32_old; + + while (True) { + + /* try to finish existing run */ + if (c_state_out_len > 0) { + while (True) { + if (cs_avail_out == 0) goto return_notr; + if (c_state_out_len == 1) break; + *( (UChar*)(cs_next_out) ) = c_state_out_ch; + BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); + c_state_out_len--; + cs_next_out++; + cs_avail_out--; + } + s_state_out_len_eq_one: + { + if (cs_avail_out == 0) { + c_state_out_len = 1; goto return_notr; + }; + *( (UChar*)(cs_next_out) ) = c_state_out_ch; + BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); + cs_next_out++; + cs_avail_out--; + } + } + /* Only caused by corrupt data stream? */ + if (c_nblock_used > s_save_nblockPP) + return True; + + /* can a new run be started? */ + if (c_nblock_used == s_save_nblockPP) { + c_state_out_len = 0; goto return_notr; + }; + c_state_out_ch = c_k0; + BZ_GET_FAST_C(k1); c_nblock_used++; + if (k1 != c_k0) { + c_k0 = k1; goto s_state_out_len_eq_one; + }; + if (c_nblock_used == s_save_nblockPP) + goto s_state_out_len_eq_one; + + c_state_out_len = 2; + BZ_GET_FAST_C(k1); c_nblock_used++; + if (c_nblock_used == s_save_nblockPP) continue; + if (k1 != c_k0) { c_k0 = k1; continue; }; + + c_state_out_len = 3; + BZ_GET_FAST_C(k1); c_nblock_used++; + if (c_nblock_used == s_save_nblockPP) continue; + if (k1 != c_k0) { c_k0 = k1; continue; }; + + BZ_GET_FAST_C(k1); c_nblock_used++; + c_state_out_len = ((Int32)k1) + 4; + BZ_GET_FAST_C(c_k0); c_nblock_used++; + } + + return_notr: + total_out_lo32_old = s->strm->total_out_lo32; + s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); + if (s->strm->total_out_lo32 < total_out_lo32_old) + s->strm->total_out_hi32++; + + /* save */ + s->calculatedBlockCRC = c_calculatedBlockCRC; + s->state_out_ch = c_state_out_ch; + s->state_out_len = c_state_out_len; + s->nblock_used = c_nblock_used; + s->k0 = c_k0; + s->tt = c_tt; + s->tPos = c_tPos; + s->strm->next_out = cs_next_out; + s->strm->avail_out = cs_avail_out; + /* end save */ + } + return False; +} + + + +/*---------------------------------------------------*/ +__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) +{ + Int32 nb, na, mid; + nb = 0; + na = 256; + do { + mid = (nb + na) >> 1; + if (indx >= cftab[mid]) nb = mid; else na = mid; + } + while (na - nb != 1); + return nb; +} + + +/*---------------------------------------------------*/ +/* Return True iff data corruption is discovered. + Returns False if there is no problem. +*/ +static +Bool unRLE_obuf_to_output_SMALL ( DState* s ) +{ + UChar k1; + + if (s->blockRandomised) { + + while (True) { + /* try to finish existing run */ + while (True) { + if (s->strm->avail_out == 0) return False; + if (s->state_out_len == 0) break; + *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; + BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); + s->state_out_len--; + s->strm->next_out++; + s->strm->avail_out--; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + /* can a new run be started? */ + if (s->nblock_used == s->save_nblock+1) return False; + + /* Only caused by corrupt data stream? */ + if (s->nblock_used > s->save_nblock+1) + return True; + + s->state_out_len = 1; + s->state_out_ch = s->k0; + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 2; + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 3; + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; + k1 ^= BZ_RAND_MASK; s->nblock_used++; + s->state_out_len = ((Int32)k1) + 4; + BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; + s->k0 ^= BZ_RAND_MASK; s->nblock_used++; + } + + } else { + + while (True) { + /* try to finish existing run */ + while (True) { + if (s->strm->avail_out == 0) return False; + if (s->state_out_len == 0) break; + *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; + BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); + s->state_out_len--; + s->strm->next_out++; + s->strm->avail_out--; + s->strm->total_out_lo32++; + if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; + } + + /* can a new run be started? */ + if (s->nblock_used == s->save_nblock+1) return False; + + /* Only caused by corrupt data stream? */ + if (s->nblock_used > s->save_nblock+1) + return True; + + s->state_out_len = 1; + s->state_out_ch = s->k0; + BZ_GET_SMALL(k1); s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 2; + BZ_GET_SMALL(k1); s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + s->state_out_len = 3; + BZ_GET_SMALL(k1); s->nblock_used++; + if (s->nblock_used == s->save_nblock+1) continue; + if (k1 != s->k0) { s->k0 = k1; continue; }; + + BZ_GET_SMALL(k1); s->nblock_used++; + s->state_out_len = ((Int32)k1) + 4; + BZ_GET_SMALL(s->k0); s->nblock_used++; + } + + } +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) +{ + Bool corrupt; + DState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + while (True) { + if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; + if (s->state == BZ_X_OUTPUT) { + if (s->smallDecompress) + corrupt = unRLE_obuf_to_output_SMALL ( s ); else + corrupt = unRLE_obuf_to_output_FAST ( s ); + if (corrupt) return BZ_DATA_ERROR; + if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { + BZ_FINALISE_CRC ( s->calculatedBlockCRC ); + if (s->verbosity >= 3) + VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, + s->calculatedBlockCRC ); + if (s->verbosity >= 2) VPrintf0 ( "]" ); + if (s->calculatedBlockCRC != s->storedBlockCRC) + return BZ_DATA_ERROR; + s->calculatedCombinedCRC + = (s->calculatedCombinedCRC << 1) | + (s->calculatedCombinedCRC >> 31); + s->calculatedCombinedCRC ^= s->calculatedBlockCRC; + s->state = BZ_X_BLKHDR_1; + } else { + return BZ_OK; + } + } + if (s->state >= BZ_X_MAGIC_1) { + Int32 r = BZ2_decompress ( s ); + if (r == BZ_STREAM_END) { + if (s->verbosity >= 3) + VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", + s->storedCombinedCRC, s->calculatedCombinedCRC ); + if (s->calculatedCombinedCRC != s->storedCombinedCRC) + return BZ_DATA_ERROR; + return r; + } + if (s->state != BZ_X_OUTPUT) return r; + } + } + + AssertH ( 0, 6001 ); + + return 0; /*NOTREACHED*/ +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) +{ + DState* s; + if (strm == NULL) return BZ_PARAM_ERROR; + s = strm->state; + if (s == NULL) return BZ_PARAM_ERROR; + if (s->strm != strm) return BZ_PARAM_ERROR; + + if (s->tt != NULL) BZFREE(s->tt); + if (s->ll16 != NULL) BZFREE(s->ll16); + if (s->ll4 != NULL) BZFREE(s->ll4); + + BZFREE(strm->state); + strm->state = NULL; + + return BZ_OK; +} + + +#ifndef BZ_NO_STDIO +/*---------------------------------------------------*/ +/*--- File I/O stuff ---*/ +/*---------------------------------------------------*/ + +#define BZ_SETERR(eee) \ +{ \ + if (bzerror != NULL) *bzerror = eee; \ + if (bzf != NULL) bzf->lastErr = eee; \ +} + +typedef + struct { + FILE* handle; + Char buf[BZ_MAX_UNUSED]; + Int32 bufN; + Bool writing; + bz_stream strm; + Int32 lastErr; + Bool initialisedOk; + } + bzFile; + + +/*---------------------------------------------*/ +static Bool myfeof ( FILE* f ) +{ + Int32 c = fgetc ( f ); + if (c == EOF) return True; + ungetc ( c, f ); + return False; +} + + +/*---------------------------------------------------*/ +BZFILE* BZ_API(BZ2_bzWriteOpen) + ( int* bzerror, + FILE* f, + int blockSize100k, + int verbosity, + int workFactor ) +{ + Int32 ret; + bzFile* bzf = NULL; + + BZ_SETERR(BZ_OK); + + if (f == NULL || + (blockSize100k < 1 || blockSize100k > 9) || + (workFactor < 0 || workFactor > 250) || + (verbosity < 0 || verbosity > 4)) + { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; + + if (ferror(f)) + { BZ_SETERR(BZ_IO_ERROR); return NULL; }; + + bzf = malloc ( sizeof(bzFile) ); + if (bzf == NULL) + { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; + + BZ_SETERR(BZ_OK); + bzf->initialisedOk = False; + bzf->bufN = 0; + bzf->handle = f; + bzf->writing = True; + bzf->strm.bzalloc = NULL; + bzf->strm.bzfree = NULL; + bzf->strm.opaque = NULL; + + if (workFactor == 0) workFactor = 30; + ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, + verbosity, workFactor ); + if (ret != BZ_OK) + { BZ_SETERR(ret); free(bzf); return NULL; }; + + bzf->strm.avail_in = 0; + bzf->initialisedOk = True; + return bzf; +} + + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzWrite) + ( int* bzerror, + BZFILE* b, + void* buf, + int len ) +{ + Int32 n, n2, ret; + bzFile* bzf = (bzFile*)b; + + BZ_SETERR(BZ_OK); + if (bzf == NULL || buf == NULL || len < 0) + { BZ_SETERR(BZ_PARAM_ERROR); return; }; + if (!(bzf->writing)) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + + if (len == 0) + { BZ_SETERR(BZ_OK); return; }; + + bzf->strm.avail_in = len; + bzf->strm.next_in = buf; + + while (True) { + bzf->strm.avail_out = BZ_MAX_UNUSED; + bzf->strm.next_out = bzf->buf; + ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); + if (ret != BZ_RUN_OK) + { BZ_SETERR(ret); return; }; + + if (bzf->strm.avail_out < BZ_MAX_UNUSED) { + n = BZ_MAX_UNUSED - bzf->strm.avail_out; + n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), + n, bzf->handle ); + if (n != n2 || ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + } + + if (bzf->strm.avail_in == 0) + { BZ_SETERR(BZ_OK); return; }; + } +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzWriteClose) + ( int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in, + unsigned int* nbytes_out ) +{ + BZ2_bzWriteClose64 ( bzerror, b, abandon, + nbytes_in, NULL, nbytes_out, NULL ); +} + + +void BZ_API(BZ2_bzWriteClose64) + ( int* bzerror, + BZFILE* b, + int abandon, + unsigned int* nbytes_in_lo32, + unsigned int* nbytes_in_hi32, + unsigned int* nbytes_out_lo32, + unsigned int* nbytes_out_hi32 ) +{ + Int32 n, n2, ret; + bzFile* bzf = (bzFile*)b; + + if (bzf == NULL) + { BZ_SETERR(BZ_OK); return; }; + if (!(bzf->writing)) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + + if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; + if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; + if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; + if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; + + if ((!abandon) && bzf->lastErr == BZ_OK) { + while (True) { + bzf->strm.avail_out = BZ_MAX_UNUSED; + bzf->strm.next_out = bzf->buf; + ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); + if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) + { BZ_SETERR(ret); return; }; + + if (bzf->strm.avail_out < BZ_MAX_UNUSED) { + n = BZ_MAX_UNUSED - bzf->strm.avail_out; + n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), + n, bzf->handle ); + if (n != n2 || ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + } + + if (ret == BZ_STREAM_END) break; + } + } + + if ( !abandon && !ferror ( bzf->handle ) ) { + fflush ( bzf->handle ); + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return; }; + } + + if (nbytes_in_lo32 != NULL) + *nbytes_in_lo32 = bzf->strm.total_in_lo32; + if (nbytes_in_hi32 != NULL) + *nbytes_in_hi32 = bzf->strm.total_in_hi32; + if (nbytes_out_lo32 != NULL) + *nbytes_out_lo32 = bzf->strm.total_out_lo32; + if (nbytes_out_hi32 != NULL) + *nbytes_out_hi32 = bzf->strm.total_out_hi32; + + BZ_SETERR(BZ_OK); + BZ2_bzCompressEnd ( &(bzf->strm) ); + free ( bzf ); +} + + +/*---------------------------------------------------*/ +BZFILE* BZ_API(BZ2_bzReadOpen) + ( int* bzerror, + FILE* f, + int verbosity, + int small, + void* unused, + int nUnused ) +{ + bzFile* bzf = NULL; + int ret; + + BZ_SETERR(BZ_OK); + + if (f == NULL || + (small != 0 && small != 1) || + (verbosity < 0 || verbosity > 4) || + (unused == NULL && nUnused != 0) || + (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) + { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; + + if (ferror(f)) + { BZ_SETERR(BZ_IO_ERROR); return NULL; }; + + bzf = malloc ( sizeof(bzFile) ); + if (bzf == NULL) + { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; + + BZ_SETERR(BZ_OK); + + bzf->initialisedOk = False; + bzf->handle = f; + bzf->bufN = 0; + bzf->writing = False; + bzf->strm.bzalloc = NULL; + bzf->strm.bzfree = NULL; + bzf->strm.opaque = NULL; + + while (nUnused > 0) { + bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; + unused = ((void*)( 1 + ((UChar*)(unused)) )); + nUnused--; + } + + ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); + if (ret != BZ_OK) + { BZ_SETERR(ret); free(bzf); return NULL; }; + + bzf->strm.avail_in = bzf->bufN; + bzf->strm.next_in = bzf->buf; + + bzf->initialisedOk = True; + return bzf; +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) +{ + bzFile* bzf = (bzFile*)b; + + BZ_SETERR(BZ_OK); + if (bzf == NULL) + { BZ_SETERR(BZ_OK); return; }; + + if (bzf->writing) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + + if (bzf->initialisedOk) + (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); + free ( bzf ); +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzRead) + ( int* bzerror, + BZFILE* b, + void* buf, + int len ) +{ + Int32 n, ret; + bzFile* bzf = (bzFile*)b; + + BZ_SETERR(BZ_OK); + + if (bzf == NULL || buf == NULL || len < 0) + { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; + + if (bzf->writing) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; + + if (len == 0) + { BZ_SETERR(BZ_OK); return 0; }; + + bzf->strm.avail_out = len; + bzf->strm.next_out = buf; + + while (True) { + + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return 0; }; + + if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { + n = fread ( bzf->buf, sizeof(UChar), + BZ_MAX_UNUSED, bzf->handle ); + if (ferror(bzf->handle)) + { BZ_SETERR(BZ_IO_ERROR); return 0; }; + bzf->bufN = n; + bzf->strm.avail_in = bzf->bufN; + bzf->strm.next_in = bzf->buf; + } + + ret = BZ2_bzDecompress ( &(bzf->strm) ); + + if (ret != BZ_OK && ret != BZ_STREAM_END) + { BZ_SETERR(ret); return 0; }; + + if (ret == BZ_OK && myfeof(bzf->handle) && + bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) + { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; + + if (ret == BZ_STREAM_END) + { BZ_SETERR(BZ_STREAM_END); + return len - bzf->strm.avail_out; }; + if (bzf->strm.avail_out == 0) + { BZ_SETERR(BZ_OK); return len; }; + + } + + return 0; /*not reached*/ +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzReadGetUnused) + ( int* bzerror, + BZFILE* b, + void** unused, + int* nUnused ) +{ + bzFile* bzf = (bzFile*)b; + if (bzf == NULL) + { BZ_SETERR(BZ_PARAM_ERROR); return; }; + if (bzf->lastErr != BZ_STREAM_END) + { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; + if (unused == NULL || nUnused == NULL) + { BZ_SETERR(BZ_PARAM_ERROR); return; }; + + BZ_SETERR(BZ_OK); + *nUnused = bzf->strm.avail_in; + *unused = bzf->strm.next_in; +} +#endif + + +/*---------------------------------------------------*/ +/*--- Misc convenience stuff ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzBuffToBuffCompress) + ( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int blockSize100k, + int verbosity, + int workFactor ) +{ + bz_stream strm; + int ret; + + if (dest == NULL || destLen == NULL || + source == NULL || + blockSize100k < 1 || blockSize100k > 9 || + verbosity < 0 || verbosity > 4 || + workFactor < 0 || workFactor > 250) + return BZ_PARAM_ERROR; + + if (workFactor == 0) workFactor = 30; + strm.bzalloc = NULL; + strm.bzfree = NULL; + strm.opaque = NULL; + ret = BZ2_bzCompressInit ( &strm, blockSize100k, + verbosity, workFactor ); + if (ret != BZ_OK) return ret; + + strm.next_in = source; + strm.next_out = dest; + strm.avail_in = sourceLen; + strm.avail_out = *destLen; + + ret = BZ2_bzCompress ( &strm, BZ_FINISH ); + if (ret == BZ_FINISH_OK) goto output_overflow; + if (ret != BZ_STREAM_END) goto errhandler; + + /* normal termination */ + *destLen -= strm.avail_out; + BZ2_bzCompressEnd ( &strm ); + return BZ_OK; + + output_overflow: + BZ2_bzCompressEnd ( &strm ); + return BZ_OUTBUFF_FULL; + + errhandler: + BZ2_bzCompressEnd ( &strm ); + return ret; +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzBuffToBuffDecompress) + ( char* dest, + unsigned int* destLen, + char* source, + unsigned int sourceLen, + int small, + int verbosity ) +{ + bz_stream strm; + int ret; + + if (dest == NULL || destLen == NULL || + source == NULL || + (small != 0 && small != 1) || + verbosity < 0 || verbosity > 4) + return BZ_PARAM_ERROR; + + strm.bzalloc = NULL; + strm.bzfree = NULL; + strm.opaque = NULL; + ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); + if (ret != BZ_OK) return ret; + + strm.next_in = source; + strm.next_out = dest; + strm.avail_in = sourceLen; + strm.avail_out = *destLen; + + ret = BZ2_bzDecompress ( &strm ); + if (ret == BZ_OK) goto output_overflow_or_eof; + if (ret != BZ_STREAM_END) goto errhandler; + + /* normal termination */ + *destLen -= strm.avail_out; + BZ2_bzDecompressEnd ( &strm ); + return BZ_OK; + + output_overflow_or_eof: + if (strm.avail_out > 0) { + BZ2_bzDecompressEnd ( &strm ); + return BZ_UNEXPECTED_EOF; + } else { + BZ2_bzDecompressEnd ( &strm ); + return BZ_OUTBUFF_FULL; + }; + + errhandler: + BZ2_bzDecompressEnd ( &strm ); + return ret; +} + + +/*---------------------------------------------------*/ +/*-- + Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) + to support better zlib compatibility. + This code is not _officially_ part of libbzip2 (yet); + I haven't tested it, documented it, or considered the + threading-safeness of it. + If this code breaks, please contact both Yoshioka and me. +--*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +/*-- + return version like "0.9.5d, 4-Sept-1999". +--*/ +const char * BZ_API(BZ2_bzlibVersion)(void) +{ + return BZ_VERSION; +} + + +#ifndef BZ_NO_STDIO +/*---------------------------------------------------*/ + +#if defined(_WIN32) || defined(OS2) || defined(MSDOS) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif +static +BZFILE * bzopen_or_bzdopen + ( const char *path, /* no use when bzdopen */ + int fd, /* no use when bzdopen */ + const char *mode, + int open_mode) /* bzopen: 0, bzdopen:1 */ +{ + int bzerr; + char unused[BZ_MAX_UNUSED]; + int blockSize100k = 9; + int writing = 0; + char mode2[10] = ""; + FILE *fp = NULL; + BZFILE *bzfp = NULL; + int verbosity = 0; + int workFactor = 30; + int smallMode = 0; + int nUnused = 0; + + if (mode == NULL) return NULL; + while (*mode) { + switch (*mode) { + case 'r': + writing = 0; break; + case 'w': + writing = 1; break; + case 's': + smallMode = 1; break; + default: + if (isdigit((int)(*mode))) { + blockSize100k = *mode-BZ_HDR_0; + } + } + mode++; + } + strcat(mode2, writing ? "w" : "r" ); + strcat(mode2,"b"); /* binary mode */ + + if (open_mode==0) { + if (path==NULL || strcmp(path,"")==0) { + fp = (writing ? stdout : stdin); + SET_BINARY_MODE(fp); + } else { + fp = fopen(path,mode2); + } + } else { +#ifdef BZ_STRICT_ANSI + fp = NULL; +#else + fp = fdopen(fd,mode2); +#endif + } + if (fp == NULL) return NULL; + + if (writing) { + /* Guard against total chaos and anarchy -- JRS */ + if (blockSize100k < 1) blockSize100k = 1; + if (blockSize100k > 9) blockSize100k = 9; + bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, + verbosity,workFactor); + } else { + bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, + unused,nUnused); + } + if (bzfp == NULL) { + if (fp != stdin && fp != stdout) fclose(fp); + return NULL; + } + return bzfp; +} + + +/*---------------------------------------------------*/ +/*-- + open file for read or write. + ex) bzopen("file","w9") + case path="" or NULL => use stdin or stdout. +--*/ +BZFILE * BZ_API(BZ2_bzopen) + ( const char *path, + const char *mode ) +{ + return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); +} + + +/*---------------------------------------------------*/ +BZFILE * BZ_API(BZ2_bzdopen) + ( int fd, + const char *mode ) +{ + return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) +{ + int bzerr, nread; + if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; + nread = BZ2_bzRead(&bzerr,b,buf,len); + if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { + return nread; + } else { + return -1; + } +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) +{ + int bzerr; + + BZ2_bzWrite(&bzerr,b,buf,len); + if(bzerr == BZ_OK){ + return len; + }else{ + return -1; + } +} + + +/*---------------------------------------------------*/ +int BZ_API(BZ2_bzflush) (BZFILE *b) +{ + /* do nothing now... */ + return 0; +} + + +/*---------------------------------------------------*/ +void BZ_API(BZ2_bzclose) (BZFILE* b) +{ + int bzerr; + FILE *fp; + + if (b==NULL) {return;} + fp = ((bzFile *)b)->handle; + if(((bzFile*)b)->writing){ + BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); + if(bzerr != BZ_OK){ + BZ2_bzWriteClose(NULL,b,1,NULL,NULL); + } + }else{ + BZ2_bzReadClose(&bzerr,b); + } + if(fp!=stdin && fp!=stdout){ + fclose(fp); + } +} + + +/*---------------------------------------------------*/ +/*-- + return last error code +--*/ +static const char *bzerrorstrings[] = { + "OK" + ,"SEQUENCE_ERROR" + ,"PARAM_ERROR" + ,"MEM_ERROR" + ,"DATA_ERROR" + ,"DATA_ERROR_MAGIC" + ,"IO_ERROR" + ,"UNEXPECTED_EOF" + ,"OUTBUFF_FULL" + ,"CONFIG_ERROR" + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ +}; + + +const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) +{ + int err = ((bzFile *)b)->lastErr; + + if(err>0) err = 0; + *errnum = err; + return bzerrorstrings[err*-1]; +} +#endif + + +/*-------------------------------------------------------------*/ +/*--- end bzlib.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/bzlib_private.h b/subprojects/tpt-bzip2/src/bzlib_private.h new file mode 100644 index 000000000..3755a6f70 --- /dev/null +++ b/subprojects/tpt-bzip2/src/bzlib_private.h @@ -0,0 +1,509 @@ + +/*-------------------------------------------------------------*/ +/*--- Private header file for the library. ---*/ +/*--- bzlib_private.h ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#ifndef _BZLIB_PRIVATE_H +#define _BZLIB_PRIVATE_H + +#include + +#ifndef BZ_NO_STDIO +#include +#include +#include +#endif + +#include "bzlib.h" + + + +/*-- General stuff. --*/ + +#define BZ_VERSION "1.0.8, 13-Jul-2019" + +typedef char Char; +typedef unsigned char Bool; +typedef unsigned char UChar; +typedef int Int32; +typedef unsigned int UInt32; +typedef short Int16; +typedef unsigned short UInt16; + +#define True ((Bool)1) +#define False ((Bool)0) + +#ifndef __GNUC__ +#define __inline__ /* */ +#endif + +#ifndef BZ_NO_STDIO + +extern void BZ2_bz__AssertH__fail ( int errcode ); +#define AssertH(cond,errcode) \ + { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } + +#if BZ_DEBUG +#define AssertD(cond,msg) \ + { if (!(cond)) { \ + fprintf ( stderr, \ + "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ + exit(1); \ + }} +#else +#define AssertD(cond,msg) /* */ +#endif + +#define VPrintf0(zf) \ + fprintf(stderr,zf) +#define VPrintf1(zf,za1) \ + fprintf(stderr,zf,za1) +#define VPrintf2(zf,za1,za2) \ + fprintf(stderr,zf,za1,za2) +#define VPrintf3(zf,za1,za2,za3) \ + fprintf(stderr,zf,za1,za2,za3) +#define VPrintf4(zf,za1,za2,za3,za4) \ + fprintf(stderr,zf,za1,za2,za3,za4) +#define VPrintf5(zf,za1,za2,za3,za4,za5) \ + fprintf(stderr,zf,za1,za2,za3,za4,za5) + +#else + +extern void bz_internal_error ( int errcode ); +#define AssertH(cond,errcode) \ + { if (!(cond)) bz_internal_error ( errcode ); } +#define AssertD(cond,msg) do { } while (0) +#define VPrintf0(zf) do { } while (0) +#define VPrintf1(zf,za1) do { } while (0) +#define VPrintf2(zf,za1,za2) do { } while (0) +#define VPrintf3(zf,za1,za2,za3) do { } while (0) +#define VPrintf4(zf,za1,za2,za3,za4) do { } while (0) +#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0) + +#endif + + +#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) +#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) + + +/*-- Header bytes. --*/ + +#define BZ_HDR_B 0x42 /* 'B' */ +#define BZ_HDR_Z 0x5a /* 'Z' */ +#define BZ_HDR_h 0x68 /* 'h' */ +#define BZ_HDR_0 0x30 /* '0' */ + +/*-- Constants for the back end. --*/ + +#define BZ_MAX_ALPHA_SIZE 258 +#define BZ_MAX_CODE_LEN 23 + +#define BZ_RUNA 0 +#define BZ_RUNB 1 + +#define BZ_N_GROUPS 6 +#define BZ_G_SIZE 50 +#define BZ_N_ITERS 4 + +#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) + + + +/*-- Stuff for randomising repetitive blocks. --*/ + +extern Int32 BZ2_rNums[512]; + +#define BZ_RAND_DECLS \ + Int32 rNToGo; \ + Int32 rTPos \ + +#define BZ_RAND_INIT_MASK \ + s->rNToGo = 0; \ + s->rTPos = 0 \ + +#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) + +#define BZ_RAND_UPD_MASK \ + if (s->rNToGo == 0) { \ + s->rNToGo = BZ2_rNums[s->rTPos]; \ + s->rTPos++; \ + if (s->rTPos == 512) s->rTPos = 0; \ + } \ + s->rNToGo--; + + + +/*-- Stuff for doing CRCs. --*/ + +extern UInt32 BZ2_crc32Table[256]; + +#define BZ_INITIALISE_CRC(crcVar) \ +{ \ + crcVar = 0xffffffffL; \ +} + +#define BZ_FINALISE_CRC(crcVar) \ +{ \ + crcVar = ~(crcVar); \ +} + +#define BZ_UPDATE_CRC(crcVar,cha) \ +{ \ + crcVar = (crcVar << 8) ^ \ + BZ2_crc32Table[(crcVar >> 24) ^ \ + ((UChar)cha)]; \ +} + + + +/*-- States and modes for compression. --*/ + +#define BZ_M_IDLE 1 +#define BZ_M_RUNNING 2 +#define BZ_M_FLUSHING 3 +#define BZ_M_FINISHING 4 + +#define BZ_S_OUTPUT 1 +#define BZ_S_INPUT 2 + +#define BZ_N_RADIX 2 +#define BZ_N_QSORT 12 +#define BZ_N_SHELL 18 +#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) + + + + +/*-- Structure holding all the compression-side stuff. --*/ + +typedef + struct { + /* pointer back to the struct bz_stream */ + bz_stream* strm; + + /* mode this stream is in, and whether inputting */ + /* or outputting data */ + Int32 mode; + Int32 state; + + /* remembers avail_in when flush/finish requested */ + UInt32 avail_in_expect; + + /* for doing the block sorting */ + UInt32* arr1; + UInt32* arr2; + UInt32* ftab; + Int32 origPtr; + + /* aliases for arr1 and arr2 */ + UInt32* ptr; + UChar* block; + UInt16* mtfv; + UChar* zbits; + + /* for deciding when to use the fallback sorting algorithm */ + Int32 workFactor; + + /* run-length-encoding of the input */ + UInt32 state_in_ch; + Int32 state_in_len; + BZ_RAND_DECLS; + + /* input and output limits and current posns */ + Int32 nblock; + Int32 nblockMAX; + Int32 numZ; + Int32 state_out_pos; + + /* map of bytes used in block */ + Int32 nInUse; + Bool inUse[256]; + UChar unseqToSeq[256]; + + /* the buffer for bit stream creation */ + UInt32 bsBuff; + Int32 bsLive; + + /* block and combined CRCs */ + UInt32 blockCRC; + UInt32 combinedCRC; + + /* misc administratium */ + Int32 verbosity; + Int32 blockNo; + Int32 blockSize100k; + + /* stuff for coding the MTF values */ + Int32 nMTF; + Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; + UChar selector [BZ_MAX_SELECTORS]; + UChar selectorMtf[BZ_MAX_SELECTORS]; + + UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + /* second dimension: only 3 needed; 4 makes index calculations faster */ + UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; + + } + EState; + + + +/*-- externs for compression. --*/ + +extern void +BZ2_blockSort ( EState* ); + +extern void +BZ2_compressBlock ( EState*, Bool ); + +extern void +BZ2_bsInitWrite ( EState* ); + +extern void +BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); + +extern void +BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); + + + +/*-- states for decompression. --*/ + +#define BZ_X_IDLE 1 +#define BZ_X_OUTPUT 2 + +#define BZ_X_MAGIC_1 10 +#define BZ_X_MAGIC_2 11 +#define BZ_X_MAGIC_3 12 +#define BZ_X_MAGIC_4 13 +#define BZ_X_BLKHDR_1 14 +#define BZ_X_BLKHDR_2 15 +#define BZ_X_BLKHDR_3 16 +#define BZ_X_BLKHDR_4 17 +#define BZ_X_BLKHDR_5 18 +#define BZ_X_BLKHDR_6 19 +#define BZ_X_BCRC_1 20 +#define BZ_X_BCRC_2 21 +#define BZ_X_BCRC_3 22 +#define BZ_X_BCRC_4 23 +#define BZ_X_RANDBIT 24 +#define BZ_X_ORIGPTR_1 25 +#define BZ_X_ORIGPTR_2 26 +#define BZ_X_ORIGPTR_3 27 +#define BZ_X_MAPPING_1 28 +#define BZ_X_MAPPING_2 29 +#define BZ_X_SELECTOR_1 30 +#define BZ_X_SELECTOR_2 31 +#define BZ_X_SELECTOR_3 32 +#define BZ_X_CODING_1 33 +#define BZ_X_CODING_2 34 +#define BZ_X_CODING_3 35 +#define BZ_X_MTF_1 36 +#define BZ_X_MTF_2 37 +#define BZ_X_MTF_3 38 +#define BZ_X_MTF_4 39 +#define BZ_X_MTF_5 40 +#define BZ_X_MTF_6 41 +#define BZ_X_ENDHDR_2 42 +#define BZ_X_ENDHDR_3 43 +#define BZ_X_ENDHDR_4 44 +#define BZ_X_ENDHDR_5 45 +#define BZ_X_ENDHDR_6 46 +#define BZ_X_CCRC_1 47 +#define BZ_X_CCRC_2 48 +#define BZ_X_CCRC_3 49 +#define BZ_X_CCRC_4 50 + + + +/*-- Constants for the fast MTF decoder. --*/ + +#define MTFA_SIZE 4096 +#define MTFL_SIZE 16 + + + +/*-- Structure holding all the decompression-side stuff. --*/ + +typedef + struct { + /* pointer back to the struct bz_stream */ + bz_stream* strm; + + /* state indicator for this stream */ + Int32 state; + + /* for doing the final run-length decoding */ + UChar state_out_ch; + Int32 state_out_len; + Bool blockRandomised; + BZ_RAND_DECLS; + + /* the buffer for bit stream reading */ + UInt32 bsBuff; + Int32 bsLive; + + /* misc administratium */ + Int32 blockSize100k; + Bool smallDecompress; + Int32 currBlockNo; + Int32 verbosity; + + /* for undoing the Burrows-Wheeler transform */ + Int32 origPtr; + UInt32 tPos; + Int32 k0; + Int32 unzftab[256]; + Int32 nblock_used; + Int32 cftab[257]; + Int32 cftabCopy[257]; + + /* for undoing the Burrows-Wheeler transform (FAST) */ + UInt32 *tt; + + /* for undoing the Burrows-Wheeler transform (SMALL) */ + UInt16 *ll16; + UChar *ll4; + + /* stored and calculated CRCs */ + UInt32 storedBlockCRC; + UInt32 storedCombinedCRC; + UInt32 calculatedBlockCRC; + UInt32 calculatedCombinedCRC; + + /* map of bytes used in block */ + Int32 nInUse; + Bool inUse[256]; + Bool inUse16[16]; + UChar seqToUnseq[256]; + + /* for decoding the MTF values */ + UChar mtfa [MTFA_SIZE]; + Int32 mtfbase[256 / MTFL_SIZE]; + UChar selector [BZ_MAX_SELECTORS]; + UChar selectorMtf[BZ_MAX_SELECTORS]; + UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + + Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 minLens[BZ_N_GROUPS]; + + /* save area for scalars in the main decompress code */ + Int32 save_i; + Int32 save_j; + Int32 save_t; + Int32 save_alphaSize; + Int32 save_nGroups; + Int32 save_nSelectors; + Int32 save_EOB; + Int32 save_groupNo; + Int32 save_groupPos; + Int32 save_nextSym; + Int32 save_nblockMAX; + Int32 save_nblock; + Int32 save_es; + Int32 save_N; + Int32 save_curr; + Int32 save_zt; + Int32 save_zn; + Int32 save_zvec; + Int32 save_zj; + Int32 save_gSel; + Int32 save_gMinlen; + Int32* save_gLimit; + Int32* save_gBase; + Int32* save_gPerm; + + } + DState; + + + +/*-- Macros for decompression. --*/ + +#define BZ_GET_FAST(cccc) \ + /* c_tPos is unsigned, hence test < 0 is pointless. */ \ + if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ + s->tPos = s->tt[s->tPos]; \ + cccc = (UChar)(s->tPos & 0xff); \ + s->tPos >>= 8; + +#define BZ_GET_FAST_C(cccc) \ + /* c_tPos is unsigned, hence test < 0 is pointless. */ \ + if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \ + c_tPos = c_tt[c_tPos]; \ + cccc = (UChar)(c_tPos & 0xff); \ + c_tPos >>= 8; + +#define SET_LL4(i,n) \ + { if (((i) & 0x1) == 0) \ + s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ + s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ + } + +#define GET_LL4(i) \ + ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) + +#define SET_LL(i,n) \ + { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ + SET_LL4(i, n >> 16); \ + } + +#define GET_LL(i) \ + (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) + +#define BZ_GET_SMALL(cccc) \ + /* c_tPos is unsigned, hence test < 0 is pointless. */ \ + if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ + cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ + s->tPos = GET_LL(s->tPos); + + +/*-- externs for decompression. --*/ + +extern Int32 +BZ2_indexIntoF ( Int32, Int32* ); + +extern Int32 +BZ2_decompress ( DState* ); + +extern void +BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, + Int32, Int32, Int32 ); + + +#endif + + +/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ + +#ifdef BZ_NO_STDIO +#ifndef NULL +#define NULL 0 +#endif +#endif + + +/*-------------------------------------------------------------*/ +/*--- end bzlib_private.h ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/compress.c b/subprojects/tpt-bzip2/src/compress.c new file mode 100644 index 000000000..5dfa00231 --- /dev/null +++ b/subprojects/tpt-bzip2/src/compress.c @@ -0,0 +1,672 @@ + +/*-------------------------------------------------------------*/ +/*--- Compression machinery (not incl block sorting) ---*/ +/*--- compress.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +/* CHANGES + 0.9.0 -- original version. + 0.9.0a/b -- no changes in this file. + 0.9.0c -- changed setting of nGroups in sendMTFValues() + so as to do a bit better on small files +*/ + +#include "bzlib_private.h" + + +/*---------------------------------------------------*/ +/*--- Bit stream I/O ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +void BZ2_bsInitWrite ( EState* s ) +{ + s->bsLive = 0; + s->bsBuff = 0; +} + + +/*---------------------------------------------------*/ +static +void bsFinishWrite ( EState* s ) +{ + while (s->bsLive > 0) { + s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); + s->numZ++; + s->bsBuff <<= 8; + s->bsLive -= 8; + } +} + + +/*---------------------------------------------------*/ +#define bsNEEDW(nz) \ +{ \ + while (s->bsLive >= 8) { \ + s->zbits[s->numZ] \ + = (UChar)(s->bsBuff >> 24); \ + s->numZ++; \ + s->bsBuff <<= 8; \ + s->bsLive -= 8; \ + } \ +} + + +/*---------------------------------------------------*/ +static +__inline__ +void bsW ( EState* s, Int32 n, UInt32 v ) +{ + bsNEEDW ( n ); + s->bsBuff |= (v << (32 - s->bsLive - n)); + s->bsLive += n; +} + + +/*---------------------------------------------------*/ +static +void bsPutUInt32 ( EState* s, UInt32 u ) +{ + bsW ( s, 8, (u >> 24) & 0xffL ); + bsW ( s, 8, (u >> 16) & 0xffL ); + bsW ( s, 8, (u >> 8) & 0xffL ); + bsW ( s, 8, u & 0xffL ); +} + + +/*---------------------------------------------------*/ +static +void bsPutUChar ( EState* s, UChar c ) +{ + bsW( s, 8, (UInt32)c ); +} + + +/*---------------------------------------------------*/ +/*--- The back end proper ---*/ +/*---------------------------------------------------*/ + +/*---------------------------------------------------*/ +static +void makeMaps_e ( EState* s ) +{ + Int32 i; + s->nInUse = 0; + for (i = 0; i < 256; i++) + if (s->inUse[i]) { + s->unseqToSeq[i] = s->nInUse; + s->nInUse++; + } +} + + +/*---------------------------------------------------*/ +static +void generateMTFValues ( EState* s ) +{ + UChar yy[256]; + Int32 i, j; + Int32 zPend; + Int32 wr; + Int32 EOB; + + /* + After sorting (eg, here), + s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, + and + ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] + holds the original block data. + + The first thing to do is generate the MTF values, + and put them in + ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. + Because there are strictly fewer or equal MTF values + than block values, ptr values in this area are overwritten + with MTF values only when they are no longer needed. + + The final compressed bitstream is generated into the + area starting at + (UChar*) (&((UChar*)s->arr2)[s->nblock]) + + These storage aliases are set up in bzCompressInit(), + except for the last one, which is arranged in + compressBlock(). + */ + UInt32* ptr = s->ptr; + UChar* block = s->block; + UInt16* mtfv = s->mtfv; + + makeMaps_e ( s ); + EOB = s->nInUse+1; + + for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; + + wr = 0; + zPend = 0; + for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; + + for (i = 0; i < s->nblock; i++) { + UChar ll_i; + AssertD ( wr <= i, "generateMTFValues(1)" ); + j = ptr[i]-1; if (j < 0) j += s->nblock; + ll_i = s->unseqToSeq[block[j]]; + AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); + + if (yy[0] == ll_i) { + zPend++; + } else { + + if (zPend > 0) { + zPend--; + while (True) { + if (zPend & 1) { + mtfv[wr] = BZ_RUNB; wr++; + s->mtfFreq[BZ_RUNB]++; + } else { + mtfv[wr] = BZ_RUNA; wr++; + s->mtfFreq[BZ_RUNA]++; + } + if (zPend < 2) break; + zPend = (zPend - 2) / 2; + }; + zPend = 0; + } + { + register UChar rtmp; + register UChar* ryy_j; + register UChar rll_i; + rtmp = yy[1]; + yy[1] = yy[0]; + ryy_j = &(yy[1]); + rll_i = ll_i; + while ( rll_i != rtmp ) { + register UChar rtmp2; + ryy_j++; + rtmp2 = rtmp; + rtmp = *ryy_j; + *ryy_j = rtmp2; + }; + yy[0] = rtmp; + j = ryy_j - &(yy[0]); + mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; + } + + } + } + + if (zPend > 0) { + zPend--; + while (True) { + if (zPend & 1) { + mtfv[wr] = BZ_RUNB; wr++; + s->mtfFreq[BZ_RUNB]++; + } else { + mtfv[wr] = BZ_RUNA; wr++; + s->mtfFreq[BZ_RUNA]++; + } + if (zPend < 2) break; + zPend = (zPend - 2) / 2; + }; + zPend = 0; + } + + mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; + + s->nMTF = wr; +} + + +/*---------------------------------------------------*/ +#define BZ_LESSER_ICOST 0 +#define BZ_GREATER_ICOST 15 + +static +void sendMTFValues ( EState* s ) +{ + Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; + Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; + Int32 nGroups, nBytes; + + /*-- + UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + is a global since the decoder also needs it. + + Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; + are also globals only used in this proc. + Made global to keep stack frame size small. + --*/ + + + UInt16 cost[BZ_N_GROUPS]; + Int32 fave[BZ_N_GROUPS]; + + UInt16* mtfv = s->mtfv; + + if (s->verbosity >= 3) + VPrintf3( " %d in block, %d after MTF & 1-2 coding, " + "%d+2 syms in use\n", + s->nblock, s->nMTF, s->nInUse ); + + alphaSize = s->nInUse+2; + for (t = 0; t < BZ_N_GROUPS; t++) + for (v = 0; v < alphaSize; v++) + s->len[t][v] = BZ_GREATER_ICOST; + + /*--- Decide how many coding tables to use ---*/ + AssertH ( s->nMTF > 0, 3001 ); + if (s->nMTF < 200) nGroups = 2; else + if (s->nMTF < 600) nGroups = 3; else + if (s->nMTF < 1200) nGroups = 4; else + if (s->nMTF < 2400) nGroups = 5; else + nGroups = 6; + + /*--- Generate an initial set of coding tables ---*/ + { + Int32 nPart, remF, tFreq, aFreq; + + nPart = nGroups; + remF = s->nMTF; + gs = 0; + while (nPart > 0) { + tFreq = remF / nPart; + ge = gs-1; + aFreq = 0; + while (aFreq < tFreq && ge < alphaSize-1) { + ge++; + aFreq += s->mtfFreq[ge]; + } + + if (ge > gs + && nPart != nGroups && nPart != 1 + && ((nGroups-nPart) % 2 == 1)) { + aFreq -= s->mtfFreq[ge]; + ge--; + } + + if (s->verbosity >= 3) + VPrintf5( " initial group %d, [%d .. %d], " + "has %d syms (%4.1f%%)\n", + nPart, gs, ge, aFreq, + (100.0 * (float)aFreq) / (float)(s->nMTF) ); + + for (v = 0; v < alphaSize; v++) + if (v >= gs && v <= ge) + s->len[nPart-1][v] = BZ_LESSER_ICOST; else + s->len[nPart-1][v] = BZ_GREATER_ICOST; + + nPart--; + gs = ge+1; + remF -= aFreq; + } + } + + /*--- + Iterate up to BZ_N_ITERS times to improve the tables. + ---*/ + for (iter = 0; iter < BZ_N_ITERS; iter++) { + + for (t = 0; t < nGroups; t++) fave[t] = 0; + + for (t = 0; t < nGroups; t++) + for (v = 0; v < alphaSize; v++) + s->rfreq[t][v] = 0; + + /*--- + Set up an auxiliary length table which is used to fast-track + the common case (nGroups == 6). + ---*/ + if (nGroups == 6) { + for (v = 0; v < alphaSize; v++) { + s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; + s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; + s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; + } + } + + nSelectors = 0; + totc = 0; + gs = 0; + while (True) { + + /*--- Set group start & end marks. --*/ + if (gs >= s->nMTF) break; + ge = gs + BZ_G_SIZE - 1; + if (ge >= s->nMTF) ge = s->nMTF-1; + + /*-- + Calculate the cost of this group as coded + by each of the coding tables. + --*/ + for (t = 0; t < nGroups; t++) cost[t] = 0; + + if (nGroups == 6 && 50 == ge-gs+1) { + /*--- fast track the common case ---*/ + register UInt32 cost01, cost23, cost45; + register UInt16 icv; + cost01 = cost23 = cost45 = 0; + +# define BZ_ITER(nn) \ + icv = mtfv[gs+(nn)]; \ + cost01 += s->len_pack[icv][0]; \ + cost23 += s->len_pack[icv][1]; \ + cost45 += s->len_pack[icv][2]; \ + + BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); + BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); + BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); + BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); + BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); + BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); + BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); + BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); + BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); + BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); + +# undef BZ_ITER + + cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; + cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; + cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; + + } else { + /*--- slow version which correctly handles all situations ---*/ + for (i = gs; i <= ge; i++) { + UInt16 icv = mtfv[i]; + for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; + } + } + + /*-- + Find the coding table which is best for this group, + and record its identity in the selector table. + --*/ + bc = 999999999; bt = -1; + for (t = 0; t < nGroups; t++) + if (cost[t] < bc) { bc = cost[t]; bt = t; }; + totc += bc; + fave[bt]++; + s->selector[nSelectors] = bt; + nSelectors++; + + /*-- + Increment the symbol frequencies for the selected table. + --*/ + if (nGroups == 6 && 50 == ge-gs+1) { + /*--- fast track the common case ---*/ + +# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ + + BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); + BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); + BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); + BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); + BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); + BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); + BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); + BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); + BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); + BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); + +# undef BZ_ITUR + + } else { + /*--- slow version which correctly handles all situations ---*/ + for (i = gs; i <= ge; i++) + s->rfreq[bt][ mtfv[i] ]++; + } + + gs = ge+1; + } + if (s->verbosity >= 3) { + VPrintf2 ( " pass %d: size is %d, grp uses are ", + iter+1, totc/8 ); + for (t = 0; t < nGroups; t++) + VPrintf1 ( "%d ", fave[t] ); + VPrintf0 ( "\n" ); + } + + /*-- + Recompute the tables based on the accumulated frequencies. + --*/ + /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See + comment in huffman.c for details. */ + for (t = 0; t < nGroups; t++) + BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), + alphaSize, 17 /*20*/ ); + } + + + AssertH( nGroups < 8, 3002 ); + AssertH( nSelectors < 32768 && + nSelectors <= BZ_MAX_SELECTORS, + 3003 ); + + + /*--- Compute MTF values for the selectors. ---*/ + { + UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; + for (i = 0; i < nGroups; i++) pos[i] = i; + for (i = 0; i < nSelectors; i++) { + ll_i = s->selector[i]; + j = 0; + tmp = pos[j]; + while ( ll_i != tmp ) { + j++; + tmp2 = tmp; + tmp = pos[j]; + pos[j] = tmp2; + }; + pos[0] = tmp; + s->selectorMtf[i] = j; + } + }; + + /*--- Assign actual codes for the tables. --*/ + for (t = 0; t < nGroups; t++) { + minLen = 32; + maxLen = 0; + for (i = 0; i < alphaSize; i++) { + if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; + if (s->len[t][i] < minLen) minLen = s->len[t][i]; + } + AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); + AssertH ( !(minLen < 1), 3005 ); + BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), + minLen, maxLen, alphaSize ); + } + + /*--- Transmit the mapping table. ---*/ + { + Bool inUse16[16]; + for (i = 0; i < 16; i++) { + inUse16[i] = False; + for (j = 0; j < 16; j++) + if (s->inUse[i * 16 + j]) inUse16[i] = True; + } + + nBytes = s->numZ; + for (i = 0; i < 16; i++) + if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); + + for (i = 0; i < 16; i++) + if (inUse16[i]) + for (j = 0; j < 16; j++) { + if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); + } + + if (s->verbosity >= 3) + VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); + } + + /*--- Now the selectors. ---*/ + nBytes = s->numZ; + bsW ( s, 3, nGroups ); + bsW ( s, 15, nSelectors ); + for (i = 0; i < nSelectors; i++) { + for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); + bsW(s,1,0); + } + if (s->verbosity >= 3) + VPrintf1( "selectors %d, ", s->numZ-nBytes ); + + /*--- Now the coding tables. ---*/ + nBytes = s->numZ; + + for (t = 0; t < nGroups; t++) { + Int32 curr = s->len[t][0]; + bsW ( s, 5, curr ); + for (i = 0; i < alphaSize; i++) { + while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; + while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; + bsW ( s, 1, 0 ); + } + } + + if (s->verbosity >= 3) + VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); + + /*--- And finally, the block data proper ---*/ + nBytes = s->numZ; + selCtr = 0; + gs = 0; + while (True) { + if (gs >= s->nMTF) break; + ge = gs + BZ_G_SIZE - 1; + if (ge >= s->nMTF) ge = s->nMTF-1; + AssertH ( s->selector[selCtr] < nGroups, 3006 ); + + if (nGroups == 6 && 50 == ge-gs+1) { + /*--- fast track the common case ---*/ + UInt16 mtfv_i; + UChar* s_len_sel_selCtr + = &(s->len[s->selector[selCtr]][0]); + Int32* s_code_sel_selCtr + = &(s->code[s->selector[selCtr]][0]); + +# define BZ_ITAH(nn) \ + mtfv_i = mtfv[gs+(nn)]; \ + bsW ( s, \ + s_len_sel_selCtr[mtfv_i], \ + s_code_sel_selCtr[mtfv_i] ) + + BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); + BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); + BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); + BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); + BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); + BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); + BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); + BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); + BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); + BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); + +# undef BZ_ITAH + + } else { + /*--- slow version which correctly handles all situations ---*/ + for (i = gs; i <= ge; i++) { + bsW ( s, + s->len [s->selector[selCtr]] [mtfv[i]], + s->code [s->selector[selCtr]] [mtfv[i]] ); + } + } + + + gs = ge+1; + selCtr++; + } + AssertH( selCtr == nSelectors, 3007 ); + + if (s->verbosity >= 3) + VPrintf1( "codes %d\n", s->numZ-nBytes ); +} + + +/*---------------------------------------------------*/ +void BZ2_compressBlock ( EState* s, Bool is_last_block ) +{ + if (s->nblock > 0) { + + BZ_FINALISE_CRC ( s->blockCRC ); + s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); + s->combinedCRC ^= s->blockCRC; + if (s->blockNo > 1) s->numZ = 0; + + if (s->verbosity >= 2) + VPrintf4( " block %d: crc = 0x%08x, " + "combined CRC = 0x%08x, size = %d\n", + s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); + + BZ2_blockSort ( s ); + } + + s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); + + /*-- If this is the first block, create the stream header. --*/ + if (s->blockNo == 1) { + BZ2_bsInitWrite ( s ); + bsPutUChar ( s, BZ_HDR_B ); + bsPutUChar ( s, BZ_HDR_Z ); + bsPutUChar ( s, BZ_HDR_h ); + bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); + } + + if (s->nblock > 0) { + + bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); + bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); + bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); + + /*-- Now the block's CRC, so it is in a known place. --*/ + bsPutUInt32 ( s, s->blockCRC ); + + /*-- + Now a single bit indicating (non-)randomisation. + As of version 0.9.5, we use a better sorting algorithm + which makes randomisation unnecessary. So always set + the randomised bit to 'no'. Of course, the decoder + still needs to be able to handle randomised blocks + so as to maintain backwards compatibility with + older versions of bzip2. + --*/ + bsW(s,1,0); + + bsW ( s, 24, s->origPtr ); + generateMTFValues ( s ); + sendMTFValues ( s ); + } + + + /*-- If this is the last block, add the stream trailer. --*/ + if (is_last_block) { + + bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); + bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); + bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); + bsPutUInt32 ( s, s->combinedCRC ); + if (s->verbosity >= 2) + VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC ); + bsFinishWrite ( s ); + } +} + + +/*-------------------------------------------------------------*/ +/*--- end compress.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/crctable.c b/subprojects/tpt-bzip2/src/crctable.c new file mode 100644 index 000000000..2b33c2535 --- /dev/null +++ b/subprojects/tpt-bzip2/src/crctable.c @@ -0,0 +1,104 @@ + +/*-------------------------------------------------------------*/ +/*--- Table for doing CRCs ---*/ +/*--- crctable.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + +/*-- + I think this is an implementation of the AUTODIN-II, + Ethernet & FDDI 32-bit CRC standard. Vaguely derived + from code by Rob Warnock, in Section 51 of the + comp.compression FAQ. +--*/ + +UInt32 BZ2_crc32Table[256] = { + + /*-- Ugly, innit? --*/ + + 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, + 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, + 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, + 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, + 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, + 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, + 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, + 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, + 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, + 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, + 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, + 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, + 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, + 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, + 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, + 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, + 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, + 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, + 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, + 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, + 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, + 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, + 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, + 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, + 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, + 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, + 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, + 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, + 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, + 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, + 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, + 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, + 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, + 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, + 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, + 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, + 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, + 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, + 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, + 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, + 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, + 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, + 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, + 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, + 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, + 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, + 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, + 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, + 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, + 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, + 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, + 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, + 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, + 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, + 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, + 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, + 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, + 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, + 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, + 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, + 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, + 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, + 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, + 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L +}; + + +/*-------------------------------------------------------------*/ +/*--- end crctable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/decompress.c b/subprojects/tpt-bzip2/src/decompress.c new file mode 100644 index 000000000..a1a0bac89 --- /dev/null +++ b/subprojects/tpt-bzip2/src/decompress.c @@ -0,0 +1,652 @@ + +/*-------------------------------------------------------------*/ +/*--- Decompression machinery ---*/ +/*--- decompress.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------------*/ +static +void makeMaps_d ( DState* s ) +{ + Int32 i; + s->nInUse = 0; + for (i = 0; i < 256; i++) + if (s->inUse[i]) { + s->seqToUnseq[s->nInUse] = i; + s->nInUse++; + } +} + + +/*---------------------------------------------------*/ +#define RETURN(rrr) \ + { retVal = rrr; goto save_state_and_return; }; + +#define GET_BITS(lll,vvv,nnn) \ + case lll: s->state = lll; \ + while (True) { \ + if (s->bsLive >= nnn) { \ + UInt32 v; \ + v = (s->bsBuff >> \ + (s->bsLive-nnn)) & ((1 << nnn)-1); \ + s->bsLive -= nnn; \ + vvv = v; \ + break; \ + } \ + if (s->strm->avail_in == 0) RETURN(BZ_OK); \ + s->bsBuff \ + = (s->bsBuff << 8) | \ + ((UInt32) \ + (*((UChar*)(s->strm->next_in)))); \ + s->bsLive += 8; \ + s->strm->next_in++; \ + s->strm->avail_in--; \ + s->strm->total_in_lo32++; \ + if (s->strm->total_in_lo32 == 0) \ + s->strm->total_in_hi32++; \ + } + +#define GET_UCHAR(lll,uuu) \ + GET_BITS(lll,uuu,8) + +#define GET_BIT(lll,uuu) \ + GET_BITS(lll,uuu,1) + +/*---------------------------------------------------*/ +#define GET_MTF_VAL(label1,label2,lval) \ +{ \ + if (groupPos == 0) { \ + groupNo++; \ + if (groupNo >= nSelectors) \ + RETURN(BZ_DATA_ERROR); \ + groupPos = BZ_G_SIZE; \ + gSel = s->selector[groupNo]; \ + gMinlen = s->minLens[gSel]; \ + gLimit = &(s->limit[gSel][0]); \ + gPerm = &(s->perm[gSel][0]); \ + gBase = &(s->base[gSel][0]); \ + } \ + groupPos--; \ + zn = gMinlen; \ + GET_BITS(label1, zvec, zn); \ + while (1) { \ + if (zn > 20 /* the longest code */) \ + RETURN(BZ_DATA_ERROR); \ + if (zvec <= gLimit[zn]) break; \ + zn++; \ + GET_BIT(label2, zj); \ + zvec = (zvec << 1) | zj; \ + }; \ + if (zvec - gBase[zn] < 0 \ + || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ + RETURN(BZ_DATA_ERROR); \ + lval = gPerm[zvec - gBase[zn]]; \ +} + + +/*---------------------------------------------------*/ +Int32 BZ2_decompress ( DState* s ) +{ + UChar uc; + Int32 retVal; + Int32 minLen, maxLen; + bz_stream* strm = s->strm; + + /* stuff that needs to be saved/restored */ + Int32 i; + Int32 j; + Int32 t; + Int32 alphaSize; + Int32 nGroups; + Int32 nSelectors; + Int32 EOB; + Int32 groupNo; + Int32 groupPos; + Int32 nextSym; + Int32 nblockMAX; + Int32 nblock; + Int32 es; + Int32 N; + Int32 curr; + Int32 zt; + Int32 zn; + Int32 zvec; + Int32 zj; + Int32 gSel; + Int32 gMinlen; + Int32* gLimit; + Int32* gBase; + Int32* gPerm; + + if (s->state == BZ_X_MAGIC_1) { + /*initialise the save area*/ + s->save_i = 0; + s->save_j = 0; + s->save_t = 0; + s->save_alphaSize = 0; + s->save_nGroups = 0; + s->save_nSelectors = 0; + s->save_EOB = 0; + s->save_groupNo = 0; + s->save_groupPos = 0; + s->save_nextSym = 0; + s->save_nblockMAX = 0; + s->save_nblock = 0; + s->save_es = 0; + s->save_N = 0; + s->save_curr = 0; + s->save_zt = 0; + s->save_zn = 0; + s->save_zvec = 0; + s->save_zj = 0; + s->save_gSel = 0; + s->save_gMinlen = 0; + s->save_gLimit = NULL; + s->save_gBase = NULL; + s->save_gPerm = NULL; + } + + /*restore from the save area*/ + i = s->save_i; + j = s->save_j; + t = s->save_t; + alphaSize = s->save_alphaSize; + nGroups = s->save_nGroups; + nSelectors = s->save_nSelectors; + EOB = s->save_EOB; + groupNo = s->save_groupNo; + groupPos = s->save_groupPos; + nextSym = s->save_nextSym; + nblockMAX = s->save_nblockMAX; + nblock = s->save_nblock; + es = s->save_es; + N = s->save_N; + curr = s->save_curr; + zt = s->save_zt; + zn = s->save_zn; + zvec = s->save_zvec; + zj = s->save_zj; + gSel = s->save_gSel; + gMinlen = s->save_gMinlen; + gLimit = s->save_gLimit; + gBase = s->save_gBase; + gPerm = s->save_gPerm; + + retVal = BZ_OK; + + switch (s->state) { + + GET_UCHAR(BZ_X_MAGIC_1, uc); + if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); + + GET_UCHAR(BZ_X_MAGIC_2, uc); + if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); + + GET_UCHAR(BZ_X_MAGIC_3, uc) + if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); + + GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) + if (s->blockSize100k < (BZ_HDR_0 + 1) || + s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); + s->blockSize100k -= BZ_HDR_0; + + if (s->smallDecompress) { + s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); + s->ll4 = BZALLOC( + ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) + ); + if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); + } else { + s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); + if (s->tt == NULL) RETURN(BZ_MEM_ERROR); + } + + GET_UCHAR(BZ_X_BLKHDR_1, uc); + + if (uc == 0x17) goto endhdr_2; + if (uc != 0x31) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_2, uc); + if (uc != 0x41) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_3, uc); + if (uc != 0x59) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_4, uc); + if (uc != 0x26) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_5, uc); + if (uc != 0x53) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_BLKHDR_6, uc); + if (uc != 0x59) RETURN(BZ_DATA_ERROR); + + s->currBlockNo++; + if (s->verbosity >= 2) + VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); + + s->storedBlockCRC = 0; + GET_UCHAR(BZ_X_BCRC_1, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_BCRC_2, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_BCRC_3, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_BCRC_4, uc); + s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); + + GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); + + s->origPtr = 0; + GET_UCHAR(BZ_X_ORIGPTR_1, uc); + s->origPtr = (s->origPtr << 8) | ((Int32)uc); + GET_UCHAR(BZ_X_ORIGPTR_2, uc); + s->origPtr = (s->origPtr << 8) | ((Int32)uc); + GET_UCHAR(BZ_X_ORIGPTR_3, uc); + s->origPtr = (s->origPtr << 8) | ((Int32)uc); + + if (s->origPtr < 0) + RETURN(BZ_DATA_ERROR); + if (s->origPtr > 10 + 100000*s->blockSize100k) + RETURN(BZ_DATA_ERROR); + + /*--- Receive the mapping table ---*/ + for (i = 0; i < 16; i++) { + GET_BIT(BZ_X_MAPPING_1, uc); + if (uc == 1) + s->inUse16[i] = True; else + s->inUse16[i] = False; + } + + for (i = 0; i < 256; i++) s->inUse[i] = False; + + for (i = 0; i < 16; i++) + if (s->inUse16[i]) + for (j = 0; j < 16; j++) { + GET_BIT(BZ_X_MAPPING_2, uc); + if (uc == 1) s->inUse[i * 16 + j] = True; + } + makeMaps_d ( s ); + if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); + alphaSize = s->nInUse+2; + + /*--- Now the selectors ---*/ + GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); + if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR); + GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); + if (nSelectors < 1) RETURN(BZ_DATA_ERROR); + for (i = 0; i < nSelectors; i++) { + j = 0; + while (True) { + GET_BIT(BZ_X_SELECTOR_3, uc); + if (uc == 0) break; + j++; + if (j >= nGroups) RETURN(BZ_DATA_ERROR); + } + /* Having more than BZ_MAX_SELECTORS doesn't make much sense + since they will never be used, but some implementations might + "round up" the number of selectors, so just ignore those. */ + if (i < BZ_MAX_SELECTORS) + s->selectorMtf[i] = j; + } + if (nSelectors > BZ_MAX_SELECTORS) + nSelectors = BZ_MAX_SELECTORS; + + /*--- Undo the MTF values for the selectors. ---*/ + { + UChar pos[BZ_N_GROUPS], tmp, v; + for (v = 0; v < nGroups; v++) pos[v] = v; + + for (i = 0; i < nSelectors; i++) { + v = s->selectorMtf[i]; + tmp = pos[v]; + while (v > 0) { pos[v] = pos[v-1]; v--; } + pos[0] = tmp; + s->selector[i] = tmp; + } + } + + /*--- Now the coding tables ---*/ + for (t = 0; t < nGroups; t++) { + GET_BITS(BZ_X_CODING_1, curr, 5); + for (i = 0; i < alphaSize; i++) { + while (True) { + if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); + GET_BIT(BZ_X_CODING_2, uc); + if (uc == 0) break; + GET_BIT(BZ_X_CODING_3, uc); + if (uc == 0) curr++; else curr--; + } + s->len[t][i] = curr; + } + } + + /*--- Create the Huffman decoding tables ---*/ + for (t = 0; t < nGroups; t++) { + minLen = 32; + maxLen = 0; + for (i = 0; i < alphaSize; i++) { + if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; + if (s->len[t][i] < minLen) minLen = s->len[t][i]; + } + BZ2_hbCreateDecodeTables ( + &(s->limit[t][0]), + &(s->base[t][0]), + &(s->perm[t][0]), + &(s->len[t][0]), + minLen, maxLen, alphaSize + ); + s->minLens[t] = minLen; + } + + /*--- Now the MTF values ---*/ + + EOB = s->nInUse+1; + nblockMAX = 100000 * s->blockSize100k; + groupNo = -1; + groupPos = 0; + + for (i = 0; i <= 255; i++) s->unzftab[i] = 0; + + /*-- MTF init --*/ + { + Int32 ii, jj, kk; + kk = MTFA_SIZE-1; + for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { + for (jj = MTFL_SIZE-1; jj >= 0; jj--) { + s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); + kk--; + } + s->mtfbase[ii] = kk + 1; + } + } + /*-- end MTF init --*/ + + nblock = 0; + GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); + + while (True) { + + if (nextSym == EOB) break; + + if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { + + es = -1; + N = 1; + do { + /* Check that N doesn't get too big, so that es doesn't + go negative. The maximum value that can be + RUNA/RUNB encoded is equal to the block size (post + the initial RLE), viz, 900k, so bounding N at 2 + million should guard against overflow without + rejecting any legitimate inputs. */ + if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); + if (nextSym == BZ_RUNA) es = es + (0+1) * N; else + if (nextSym == BZ_RUNB) es = es + (1+1) * N; + N = N * 2; + GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); + } + while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); + + es++; + uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; + s->unzftab[uc] += es; + + if (s->smallDecompress) + while (es > 0) { + if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); + s->ll16[nblock] = (UInt16)uc; + nblock++; + es--; + } + else + while (es > 0) { + if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); + s->tt[nblock] = (UInt32)uc; + nblock++; + es--; + }; + + continue; + + } else { + + if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); + + /*-- uc = MTF ( nextSym-1 ) --*/ + { + Int32 ii, jj, kk, pp, lno, off; + UInt32 nn; + nn = (UInt32)(nextSym - 1); + + if (nn < MTFL_SIZE) { + /* avoid general-case expense */ + pp = s->mtfbase[0]; + uc = s->mtfa[pp+nn]; + while (nn > 3) { + Int32 z = pp+nn; + s->mtfa[(z) ] = s->mtfa[(z)-1]; + s->mtfa[(z)-1] = s->mtfa[(z)-2]; + s->mtfa[(z)-2] = s->mtfa[(z)-3]; + s->mtfa[(z)-3] = s->mtfa[(z)-4]; + nn -= 4; + } + while (nn > 0) { + s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; + }; + s->mtfa[pp] = uc; + } else { + /* general case */ + lno = nn / MTFL_SIZE; + off = nn % MTFL_SIZE; + pp = s->mtfbase[lno] + off; + uc = s->mtfa[pp]; + while (pp > s->mtfbase[lno]) { + s->mtfa[pp] = s->mtfa[pp-1]; pp--; + }; + s->mtfbase[lno]++; + while (lno > 0) { + s->mtfbase[lno]--; + s->mtfa[s->mtfbase[lno]] + = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; + lno--; + } + s->mtfbase[0]--; + s->mtfa[s->mtfbase[0]] = uc; + if (s->mtfbase[0] == 0) { + kk = MTFA_SIZE-1; + for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { + for (jj = MTFL_SIZE-1; jj >= 0; jj--) { + s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; + kk--; + } + s->mtfbase[ii] = kk + 1; + } + } + } + } + /*-- end uc = MTF ( nextSym-1 ) --*/ + + s->unzftab[s->seqToUnseq[uc]]++; + if (s->smallDecompress) + s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else + s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); + nblock++; + + GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); + continue; + } + } + + /* Now we know what nblock is, we can do a better sanity + check on s->origPtr. + */ + if (s->origPtr < 0 || s->origPtr >= nblock) + RETURN(BZ_DATA_ERROR); + + /*-- Set up cftab to facilitate generation of T^(-1) --*/ + /* Check: unzftab entries in range. */ + for (i = 0; i <= 255; i++) { + if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) + RETURN(BZ_DATA_ERROR); + } + /* Actually generate cftab. */ + s->cftab[0] = 0; + for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; + for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; + /* Check: cftab entries in range. */ + for (i = 0; i <= 256; i++) { + if (s->cftab[i] < 0 || s->cftab[i] > nblock) { + /* s->cftab[i] can legitimately be == nblock */ + RETURN(BZ_DATA_ERROR); + } + } + /* Check: cftab entries non-descending. */ + for (i = 1; i <= 256; i++) { + if (s->cftab[i-1] > s->cftab[i]) { + RETURN(BZ_DATA_ERROR); + } + } + + s->state_out_len = 0; + s->state_out_ch = 0; + BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); + s->state = BZ_X_OUTPUT; + if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); + + if (s->smallDecompress) { + + /*-- Make a copy of cftab, used in generation of T --*/ + for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; + + /*-- compute the T vector --*/ + for (i = 0; i < nblock; i++) { + uc = (UChar)(s->ll16[i]); + SET_LL(i, s->cftabCopy[uc]); + s->cftabCopy[uc]++; + } + + /*-- Compute T^(-1) by pointer reversal on T --*/ + i = s->origPtr; + j = GET_LL(i); + do { + Int32 tmp = GET_LL(j); + SET_LL(j, i); + i = j; + j = tmp; + } + while (i != s->origPtr); + + s->tPos = s->origPtr; + s->nblock_used = 0; + if (s->blockRandomised) { + BZ_RAND_INIT_MASK; + BZ_GET_SMALL(s->k0); s->nblock_used++; + BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; + } else { + BZ_GET_SMALL(s->k0); s->nblock_used++; + } + + } else { + + /*-- compute the T^(-1) vector --*/ + for (i = 0; i < nblock; i++) { + uc = (UChar)(s->tt[i] & 0xff); + s->tt[s->cftab[uc]] |= (i << 8); + s->cftab[uc]++; + } + + s->tPos = s->tt[s->origPtr] >> 8; + s->nblock_used = 0; + if (s->blockRandomised) { + BZ_RAND_INIT_MASK; + BZ_GET_FAST(s->k0); s->nblock_used++; + BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; + } else { + BZ_GET_FAST(s->k0); s->nblock_used++; + } + + } + + RETURN(BZ_OK); + + + + endhdr_2: + + GET_UCHAR(BZ_X_ENDHDR_2, uc); + if (uc != 0x72) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_3, uc); + if (uc != 0x45) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_4, uc); + if (uc != 0x38) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_5, uc); + if (uc != 0x50) RETURN(BZ_DATA_ERROR); + GET_UCHAR(BZ_X_ENDHDR_6, uc); + if (uc != 0x90) RETURN(BZ_DATA_ERROR); + + s->storedCombinedCRC = 0; + GET_UCHAR(BZ_X_CCRC_1, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_CCRC_2, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_CCRC_3, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + GET_UCHAR(BZ_X_CCRC_4, uc); + s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); + + s->state = BZ_X_IDLE; + RETURN(BZ_STREAM_END); + + default: AssertH ( False, 4001 ); + } + + AssertH ( False, 4002 ); + + save_state_and_return: + + s->save_i = i; + s->save_j = j; + s->save_t = t; + s->save_alphaSize = alphaSize; + s->save_nGroups = nGroups; + s->save_nSelectors = nSelectors; + s->save_EOB = EOB; + s->save_groupNo = groupNo; + s->save_groupPos = groupPos; + s->save_nextSym = nextSym; + s->save_nblockMAX = nblockMAX; + s->save_nblock = nblock; + s->save_es = es; + s->save_N = N; + s->save_curr = curr; + s->save_zt = zt; + s->save_zn = zn; + s->save_zvec = zvec; + s->save_zj = zj; + s->save_gSel = gSel; + s->save_gMinlen = gMinlen; + s->save_gLimit = gLimit; + s->save_gBase = gBase; + s->save_gPerm = gPerm; + + return retVal; +} + + +/*-------------------------------------------------------------*/ +/*--- end decompress.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/huffman.c b/subprojects/tpt-bzip2/src/huffman.c new file mode 100644 index 000000000..43a1899e4 --- /dev/null +++ b/subprojects/tpt-bzip2/src/huffman.c @@ -0,0 +1,205 @@ + +/*-------------------------------------------------------------*/ +/*--- Huffman coding low-level stuff ---*/ +/*--- huffman.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + +/*---------------------------------------------------*/ +#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) +#define DEPTHOF(zz1) ((zz1) & 0x000000ff) +#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) + +#define ADDWEIGHTS(zw1,zw2) \ + (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ + (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) + +#define UPHEAP(z) \ +{ \ + Int32 zz, tmp; \ + zz = z; tmp = heap[zz]; \ + while (weight[tmp] < weight[heap[zz >> 1]]) { \ + heap[zz] = heap[zz >> 1]; \ + zz >>= 1; \ + } \ + heap[zz] = tmp; \ +} + +#define DOWNHEAP(z) \ +{ \ + Int32 zz, yy, tmp; \ + zz = z; tmp = heap[zz]; \ + while (True) { \ + yy = zz << 1; \ + if (yy > nHeap) break; \ + if (yy < nHeap && \ + weight[heap[yy+1]] < weight[heap[yy]]) \ + yy++; \ + if (weight[tmp] < weight[heap[yy]]) break; \ + heap[zz] = heap[yy]; \ + zz = yy; \ + } \ + heap[zz] = tmp; \ +} + + +/*---------------------------------------------------*/ +void BZ2_hbMakeCodeLengths ( UChar *len, + Int32 *freq, + Int32 alphaSize, + Int32 maxLen ) +{ + /*-- + Nodes and heap entries run from 1. Entry 0 + for both the heap and nodes is a sentinel. + --*/ + Int32 nNodes, nHeap, n1, n2, i, j, k; + Bool tooLong; + + Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; + Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; + Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; + + for (i = 0; i < alphaSize; i++) + weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; + + while (True) { + + nNodes = alphaSize; + nHeap = 0; + + heap[0] = 0; + weight[0] = 0; + parent[0] = -2; + + for (i = 1; i <= alphaSize; i++) { + parent[i] = -1; + nHeap++; + heap[nHeap] = i; + UPHEAP(nHeap); + } + + AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); + + while (nHeap > 1) { + n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); + n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); + nNodes++; + parent[n1] = parent[n2] = nNodes; + weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); + parent[nNodes] = -1; + nHeap++; + heap[nHeap] = nNodes; + UPHEAP(nHeap); + } + + AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); + + tooLong = False; + for (i = 1; i <= alphaSize; i++) { + j = 0; + k = i; + while (parent[k] >= 0) { k = parent[k]; j++; } + len[i-1] = j; + if (j > maxLen) tooLong = True; + } + + if (! tooLong) break; + + /* 17 Oct 04: keep-going condition for the following loop used + to be 'i < alphaSize', which missed the last element, + theoretically leading to the possibility of the compressor + looping. However, this count-scaling step is only needed if + one of the generated Huffman code words is longer than + maxLen, which up to and including version 1.0.2 was 20 bits, + which is extremely unlikely. In version 1.0.3 maxLen was + changed to 17 bits, which has minimal effect on compression + ratio, but does mean this scaling step is used from time to + time, enough to verify that it works. + + This means that bzip2-1.0.3 and later will only produce + Huffman codes with a maximum length of 17 bits. However, in + order to preserve backwards compatibility with bitstreams + produced by versions pre-1.0.3, the decompressor must still + handle lengths of up to 20. */ + + for (i = 1; i <= alphaSize; i++) { + j = weight[i] >> 8; + j = 1 + (j / 2); + weight[i] = j << 8; + } + } +} + + +/*---------------------------------------------------*/ +void BZ2_hbAssignCodes ( Int32 *code, + UChar *length, + Int32 minLen, + Int32 maxLen, + Int32 alphaSize ) +{ + Int32 n, vec, i; + + vec = 0; + for (n = minLen; n <= maxLen; n++) { + for (i = 0; i < alphaSize; i++) + if (length[i] == n) { code[i] = vec; vec++; }; + vec <<= 1; + } +} + + +/*---------------------------------------------------*/ +void BZ2_hbCreateDecodeTables ( Int32 *limit, + Int32 *base, + Int32 *perm, + UChar *length, + Int32 minLen, + Int32 maxLen, + Int32 alphaSize ) +{ + Int32 pp, i, j, vec; + + pp = 0; + for (i = minLen; i <= maxLen; i++) + for (j = 0; j < alphaSize; j++) + if (length[j] == i) { perm[pp] = j; pp++; }; + + for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; + for (i = 0; i < alphaSize; i++) base[length[i]+1]++; + + for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; + + for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; + vec = 0; + + for (i = minLen; i <= maxLen; i++) { + vec += (base[i+1] - base[i]); + limit[i] = vec-1; + vec <<= 1; + } + for (i = minLen + 1; i <= maxLen; i++) + base[i] = ((limit[i-1] + 1) << 1) - base[i]; +} + + +/*-------------------------------------------------------------*/ +/*--- end huffman.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-bzip2/src/meson.build b/subprojects/tpt-bzip2/src/meson.build new file mode 100644 index 000000000..bc73dc68b --- /dev/null +++ b/subprojects/tpt-bzip2/src/meson.build @@ -0,0 +1,9 @@ +bzip2_src = files( + 'blocksort.c', + 'bzlib.c', + 'compress.c', + 'crctable.c', + 'decompress.c', + 'huffman.c', + 'randtable.c', +) diff --git a/subprojects/tpt-bzip2/src/randtable.c b/subprojects/tpt-bzip2/src/randtable.c new file mode 100644 index 000000000..bdc6d4a4c --- /dev/null +++ b/subprojects/tpt-bzip2/src/randtable.c @@ -0,0 +1,84 @@ + +/*-------------------------------------------------------------*/ +/*--- Table for randomising repetitive blocks ---*/ +/*--- randtable.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------*/ +Int32 BZ2_rNums[512] = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 +}; + + +/*-------------------------------------------------------------*/ +/*--- end randtable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/subprojects/tpt-libs-prebuilt-lin64-static.wrap b/subprojects/tpt-libs-prebuilt-lin64-static.wrap new file mode 100644 index 000000000..56faf8ae3 --- /dev/null +++ b/subprojects/tpt-libs-prebuilt-lin64-static.wrap @@ -0,0 +1,6 @@ +[wrap-file] +directory = tpt-libs-prebuilt-lin64-static + +source_url = https://github.com/The-Powder-Toy/tpt-libs/releases/download/v20201112223015/tpt-libs-prebuilt-lin64-static.zip +source_filename = tpt-libs-prebuilt-lin64-static.zip +source_hash = 6371e42dc5fc9c17ec822ca36501865db427b6f8362f96202bf6b1f1f04ee858 diff --git a/subprojects/tpt-libs-prebuilt-mac64-static.wrap b/subprojects/tpt-libs-prebuilt-mac64-static.wrap new file mode 100644 index 000000000..4aa4261e9 --- /dev/null +++ b/subprojects/tpt-libs-prebuilt-mac64-static.wrap @@ -0,0 +1,6 @@ +[wrap-file] +directory = tpt-libs-prebuilt-mac64-static + +source_url = https://github.com/The-Powder-Toy/tpt-libs/releases/download/v20201112223015/tpt-libs-prebuilt-mac64-static.zip +source_filename = tpt-libs-prebuilt-mac64-static.zip +source_hash = 8378755f2e749ffd6d15dee2f3a4fdab921ab9e0a747381b3d20ee08e306255c diff --git a/subprojects/tpt-libs-prebuilt-win64-dynamic.wrap b/subprojects/tpt-libs-prebuilt-win64-dynamic.wrap new file mode 100644 index 000000000..0d9fcec12 --- /dev/null +++ b/subprojects/tpt-libs-prebuilt-win64-dynamic.wrap @@ -0,0 +1,6 @@ +[wrap-file] +directory = tpt-libs-prebuilt-win64-dynamic + +source_url = https://github.com/The-Powder-Toy/tpt-libs/releases/download/v20201112223015/tpt-libs-prebuilt-win64-dynamic.zip +source_filename = tpt-libs-prebuilt-win64-dynamic.zip +source_hash = 967179cef84b7c6d8f70a01529628a93e4769993c681e15cfbe7b90880ae707f diff --git a/subprojects/tpt-libs-prebuilt-win64-static.wrap b/subprojects/tpt-libs-prebuilt-win64-static.wrap new file mode 100644 index 000000000..a56d611a9 --- /dev/null +++ b/subprojects/tpt-libs-prebuilt-win64-static.wrap @@ -0,0 +1,6 @@ +[wrap-file] +directory = tpt-libs-prebuilt-win64-static + +source_url = https://github.com/The-Powder-Toy/tpt-libs/releases/download/v20201112223015/tpt-libs-prebuilt-win64-static.zip +source_filename = tpt-libs-prebuilt-win64-static.zip +source_hash = 7aa6242f11fa6beba70f16a95e9376bc4e380029b7eb07ca69865e7cf8871205